summaryrefslogtreecommitdiff
path: root/chromium/components/image_fetcher/core/image_data_fetcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/image_fetcher/core/image_data_fetcher.h')
-rw-r--r--chromium/components/image_fetcher/core/image_data_fetcher.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/chromium/components/image_fetcher/core/image_data_fetcher.h b/chromium/components/image_fetcher/core/image_data_fetcher.h
new file mode 100644
index 00000000000..169ad54d2ce
--- /dev/null
+++ b/chromium/components/image_fetcher/core/image_data_fetcher.h
@@ -0,0 +1,101 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_DATA_FETCHER_H_
+#define COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_DATA_FETCHER_H_
+
+#include <map>
+#include <memory>
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/optional.h"
+#include "components/data_use_measurement/core/data_use_user_data.h"
+#include "components/image_fetcher/core/request_metadata.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request.h"
+#include "url/gurl.h"
+
+namespace net {
+class URLFetcher;
+class URLRequestContextGetter;
+} // namespace net
+
+namespace image_fetcher {
+
+class ImageDataFetcher : public net::URLFetcherDelegate {
+ public:
+ // Callback with the |image_data|. If an error prevented a http response,
+ // |request_metadata.response_code| will be RESPONSE_CODE_INVALID.
+ // TODO(treib): Pass |image_data| out by value, or use RefCountedBytes, to
+ // avoid copying.
+ using ImageDataFetcherCallback =
+ base::Callback<void(const std::string& image_data,
+ const RequestMetadata& request_metadata)>;
+
+ using DataUseServiceName = data_use_measurement::DataUseUserData::ServiceName;
+
+ explicit ImageDataFetcher(
+ net::URLRequestContextGetter* url_request_context_getter);
+ ~ImageDataFetcher() override;
+
+ // Sets a service name against which to track data usage.
+ void SetDataUseServiceName(DataUseServiceName data_use_service_name);
+
+ // Sets an upper limit for image downloads.
+ // Already running downloads are affected.
+ void SetImageDownloadLimit(base::Optional<int64_t> max_download_bytes);
+
+ // Fetches the raw image bytes from the given |image_url| and calls the given
+ // |callback|. The callback is run even if fetching the URL fails. In case
+ // of an error an empty string is passed to the callback.
+ void FetchImageData(const GURL& image_url,
+ const ImageDataFetcherCallback& callback);
+
+ // Like above, but lets the caller set a referrer.
+ void FetchImageData(const GURL& image_url,
+ const ImageDataFetcherCallback& callback,
+ const std::string& referrer,
+ net::URLRequest::ReferrerPolicy referrer_policy);
+
+ private:
+ struct ImageDataFetcherRequest;
+
+ // Methods inherited from URLFetcherDelegate
+ void OnURLFetchComplete(const net::URLFetcher* source) override;
+ void OnURLFetchDownloadProgress(const net::URLFetcher* source,
+ int64_t current,
+ int64_t total,
+ int64_t current_network_bytes) override;
+
+ void FinishRequest(const net::URLFetcher* source,
+ const RequestMetadata& metadata,
+ const std::string& image_data);
+
+ // All active image url requests.
+ std::map<const net::URLFetcher*, std::unique_ptr<ImageDataFetcherRequest>>
+ pending_requests_;
+
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
+
+ DataUseServiceName data_use_service_name_;
+
+ // The next ID to use for a newly created URLFetcher. Each URLFetcher gets an
+ // id when it is created. The |url_fetcher_id_| is incremented by one for each
+ // newly created URLFetcher. The URLFetcher ID can be used during testing to
+ // get individual URLFetchers and modify their state. Outside of tests this ID
+ // is not used.
+ int next_url_fetcher_id_;
+
+ // Upper limit for the number of bytes to download per image.
+ base::Optional<int64_t> max_download_bytes_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImageDataFetcher);
+};
+
+} // namespace image_fetcher
+
+#endif // COMPONENTS_IMAGE_FETCHER_CORE_IMAGE_DATA_FETCHER_H_