Chromium Code Reviews| Index: components/image_fetcher/image_data_fetcher.cc |
| diff --git a/components/image_fetcher/image_data_fetcher.cc b/components/image_fetcher/image_data_fetcher.cc |
| index 8be7dcb0efad9af365e13958b848633e0e255068..e4b54e656b21c24b0472b382dc67e2f1b117867b 100644 |
| --- a/components/image_fetcher/image_data_fetcher.cc |
| +++ b/components/image_fetcher/image_data_fetcher.cc |
| @@ -6,7 +6,6 @@ |
| #include "net/base/load_flags.h" |
| #include "net/url_request/url_fetcher.h" |
| -#include "net/url_request/url_fetcher_delegate.h" |
| #include "net/url_request/url_request.h" |
| #include "net/url_request/url_request_context_getter.h" |
| #include "net/url_request/url_request_status.h" |
| @@ -14,69 +13,25 @@ |
| namespace image_fetcher { |
| -// An active image URL fetcher request. The class contains any related request |
| -// state and logic for handling a single image url request. |
| -class ImageDataFetcher::ImageDataFetcherRequest |
| - : public net::URLFetcherDelegate { |
| - public: |
| - ImageDataFetcherRequest(const GURL& url, |
| - const ImageDataFetcherCallback& callback, |
| - ImageDataFetcher* image_url_fetcher); |
| - ~ImageDataFetcherRequest() override {} |
| - |
| - // Sends the URL requests. |
| - void Start(net::URLRequestContextGetter* request_context); |
| - |
| - private: |
| - // Method inherited from URLFetcherDelegate |
| - void OnURLFetchComplete(const net::URLFetcher* source) override; |
| - |
| - // The URL of the image to fetch. |
| - const GURL url_; |
| +// An active image URL fetcher request. The struct contains the related requests |
| +// state. |
| +struct ImageDataFetcher::ImageDataFetcherRequest { |
| + ImageDataFetcherRequest(const ImageDataFetcherCallback& callback, |
| + std::unique_ptr<net::URLFetcher> url_fetcher); |
| + ~ImageDataFetcherRequest() {} |
| // The callback to run after the image data was fetched. The callback will |
| // be run even if the image data could not be fetched successfully. |
| - ImageDataFetcherCallback callback_; |
| + ImageDataFetcherCallback callback; |
| - // The ImageDataFetcher that owns the ImageDataFetcherRequest. |
| - ImageDataFetcher* image_url_fetcher_; |
| - |
| - std::unique_ptr<net::URLFetcher> url_fetcher_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(ImageDataFetcherRequest); |
| + std::unique_ptr<net::URLFetcher> url_fetcher; |
| }; |
| ImageDataFetcher::ImageDataFetcherRequest::ImageDataFetcherRequest( |
| - const GURL& url, |
| const ImageDataFetcherCallback& callback, |
| - ImageDataFetcher* image_url_fetcher) |
| - : url_(url), |
| - callback_(callback), |
| - image_url_fetcher_(image_url_fetcher) { |
| -} |
| - |
| -void ImageDataFetcher::ImageDataFetcherRequest::Start( |
| - net::URLRequestContextGetter* request_context) { |
| - DCHECK(!url_fetcher_); |
| - |
| - url_fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this); |
| - url_fetcher_->SetRequestContext(request_context); |
| - url_fetcher_->Start(); |
| -} |
| - |
| -void ImageDataFetcher::ImageDataFetcherRequest::OnURLFetchComplete( |
| - const net::URLFetcher* source) { |
| - // An empty string is passed to the callback in case on an unsuccessfull URL |
| - // request. |
| - std::string image_data; |
| - if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS) { |
| - source->GetResponseAsString(&image_data); |
| - } |
| - callback_.Run(image_data); |
| - |
| - // Remove the completed ImageDataFetcherRequest from the internal request |
| - // queue. This must be last in the method. |
| - image_url_fetcher_->RemoveImageDataFetcherRequest(url_); |
| + std::unique_ptr<net::URLFetcher> url_fetcher) |
| + : callback(callback), |
| + url_fetcher(std::move(url_fetcher)) { |
|
Marc Treib
2016/06/16 11:52:09
optional: You could just inline this above.
|
| } |
| ImageDataFetcher::ImageDataFetcher( |
| @@ -87,15 +42,30 @@ ImageDataFetcher::~ImageDataFetcher() {} |
| void ImageDataFetcher::FetchImageData( |
| const GURL& url, const ImageDataFetcherCallback& callback) { |
| + |
| + std::unique_ptr<net::URLFetcher> url_fetcher = |
| + net::URLFetcher::Create(url, net::URLFetcher::GET, this); |
| + |
| std::unique_ptr<ImageDataFetcherRequest> request( |
| - new ImageDataFetcherRequest(url, callback, this)); |
| - request->Start(url_request_context_getter_.get()); |
| - pending_requests_[url] = std::move(request); |
| + new ImageDataFetcherRequest(callback, std::move(url_fetcher))); |
| + request->url_fetcher->SetRequestContext(url_request_context_getter_.get()); |
| + request->url_fetcher->Start(); |
| + |
| + pending_requests_[request->url_fetcher.get()] = std::move(request); |
| } |
| -void ImageDataFetcher::RemoveImageDataFetcherRequest(const GURL& image_url) { |
| - size_t count = pending_requests_.erase(image_url); |
| - DCHECK(count); |
| +void ImageDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
| + auto request_iter = pending_requests_.find(source); |
| + DCHECK(request_iter != pending_requests_.end()); |
| + |
| + std::string image_data; |
| + if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS) { |
| + source->GetResponseAsString(&image_data); |
| + } |
| + request_iter->second->callback.Run(image_data); |
| + |
| + // Remove the finished request. |
| + pending_requests_.erase(request_iter); |
| } |
| } // namespace image_fetcher |