| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/image_fetcher/image_fetcher_impl.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "net/base/load_flags.h" | |
| 11 #include "net/url_request/url_request_context_getter.h" | |
| 12 | |
| 13 namespace image_fetcher { | |
| 14 | |
| 15 ImageFetcherImpl::ImageFetcherImpl( | |
| 16 std::unique_ptr<ImageDecoder> image_decoder, | |
| 17 net::URLRequestContextGetter* url_request_context) | |
| 18 : delegate_(nullptr), url_request_context_(url_request_context), | |
| 19 image_decoder_(std::move(image_decoder)), | |
| 20 image_data_fetcher_(new ImageDataFetcher(url_request_context_.get())) { | |
| 21 } | |
| 22 | |
| 23 ImageFetcherImpl::~ImageFetcherImpl() {} | |
| 24 | |
| 25 ImageFetcherImpl::ImageRequest::ImageRequest() {} | |
| 26 | |
| 27 ImageFetcherImpl::ImageRequest::ImageRequest(const ImageRequest& other) = | |
| 28 default; | |
| 29 | |
| 30 ImageFetcherImpl::ImageRequest::~ImageRequest() { } | |
| 31 | |
| 32 void ImageFetcherImpl::SetImageFetcherDelegate(ImageFetcherDelegate* delegate) { | |
| 33 DCHECK(delegate); | |
| 34 delegate_ = delegate; | |
| 35 } | |
| 36 | |
| 37 void ImageFetcherImpl::SetDataUseServiceName( | |
| 38 DataUseServiceName data_use_service_name) { | |
| 39 image_data_fetcher_->SetDataUseServiceName(data_use_service_name); | |
| 40 } | |
| 41 | |
| 42 void ImageFetcherImpl::SetDesiredImageFrameSize(const gfx::Size& size) { | |
| 43 desired_image_frame_size_ = size; | |
| 44 } | |
| 45 | |
| 46 void ImageFetcherImpl::StartOrQueueNetworkRequest( | |
| 47 const std::string& id, | |
| 48 const GURL& image_url, | |
| 49 const ImageFetcherCallback& callback) { | |
| 50 // Before starting to fetch the image. Look for a request in progress for | |
| 51 // |image_url|, and queue if appropriate. | |
| 52 ImageRequestMap::iterator it = pending_net_requests_.find(image_url); | |
| 53 if (it == pending_net_requests_.end()) { | |
| 54 ImageRequest request; | |
| 55 request.id = id; | |
| 56 request.callbacks.push_back(callback); | |
| 57 pending_net_requests_[image_url].swap(&request); | |
| 58 | |
| 59 image_data_fetcher_->FetchImageData( | |
| 60 image_url, | |
| 61 base::Bind(&ImageFetcherImpl::OnImageURLFetched, | |
| 62 base::Unretained(this), image_url)); | |
| 63 } else { | |
| 64 // Request in progress. Register as an interested callback. | |
| 65 it->second.callbacks.push_back(callback); | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 void ImageFetcherImpl::OnImageURLFetched(const GURL& image_url, | |
| 70 const std::string& image_data, | |
| 71 const RequestMetadata& metadata) { | |
| 72 // Inform the ImageFetcherDelegate. | |
| 73 if (delegate_) { | |
| 74 auto it = pending_net_requests_.find(image_url); | |
| 75 DCHECK(it != pending_net_requests_.end()); | |
| 76 delegate_->OnImageDataFetched(it->second.id, image_data); | |
| 77 } | |
| 78 | |
| 79 image_decoder_->DecodeImage( | |
| 80 image_data, desired_image_frame_size_, | |
| 81 base::Bind(&ImageFetcherImpl::OnImageDecoded, base::Unretained(this), | |
| 82 image_url, metadata)); | |
| 83 } | |
| 84 | |
| 85 void ImageFetcherImpl::OnImageDecoded(const GURL& image_url, | |
| 86 const RequestMetadata& metadata, | |
| 87 const gfx::Image& image) { | |
| 88 // Get request for the given image_url from the request queue. | |
| 89 ImageRequestMap::iterator image_iter = pending_net_requests_.find(image_url); | |
| 90 DCHECK(image_iter != pending_net_requests_.end()); | |
| 91 ImageRequest* request = &image_iter->second; | |
| 92 | |
| 93 // Run all callbacks | |
| 94 for (const auto& callback : request->callbacks) { | |
| 95 callback.Run(request->id, image, metadata); | |
| 96 } | |
| 97 | |
| 98 // Inform the ImageFetcherDelegate. | |
| 99 if (delegate_) { | |
| 100 delegate_->OnImageFetched(request->id, image); | |
| 101 } | |
| 102 | |
| 103 // Erase the completed ImageRequest. | |
| 104 pending_net_requests_.erase(image_iter); | |
| 105 } | |
| 106 | |
| 107 ImageDecoder* ImageFetcherImpl::GetImageDecoder() { | |
| 108 return image_decoder_.get(); | |
| 109 } | |
| 110 | |
| 111 } // namespace image_fetcher | |
| OLD | NEW |