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.
5 #include "chrome/browser/search/suggestions/image_fetcher_impl.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "net/base/load_flags.h"
11 #include "net/url_request/url_request_context_getter.h"
13 namespace suggestions
{
15 ImageFetcherImpl::ImageFetcherImpl(
16 net::URLRequestContextGetter
* url_request_context
)
17 : url_request_context_(url_request_context
) {}
19 ImageFetcherImpl::~ImageFetcherImpl() {}
21 ImageFetcherImpl::ImageRequest::ImageRequest() : fetcher(NULL
) {}
23 ImageFetcherImpl::ImageRequest::ImageRequest(chrome::BitmapFetcher
* f
)
26 ImageFetcherImpl::ImageRequest::~ImageRequest() { delete fetcher
; }
28 void ImageFetcherImpl::SetImageFetcherDelegate(ImageFetcherDelegate
* delegate
) {
33 void ImageFetcherImpl::StartOrQueueNetworkRequest(
34 const GURL
& url
, const GURL
& image_url
,
35 base::Callback
<void(const GURL
&, const SkBitmap
*)> callback
) {
36 // Before starting to fetch the image. Look for a request in progress for
37 // |image_url|, and queue if appropriate.
38 ImageRequestMap::iterator it
= pending_net_requests_
.find(image_url
);
39 if (it
== pending_net_requests_
.end()) {
40 // |image_url| is not being fetched, so create a request and initiate
42 ImageRequest
request(new chrome::BitmapFetcher(image_url
, this));
44 request
.callbacks
.push_back(callback
);
45 request
.fetcher
->Start(
46 url_request_context_
, std::string(),
47 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE
,
49 pending_net_requests_
[image_url
].swap(&request
);
51 // Request in progress. Register as an interested callback.
52 it
->second
.callbacks
.push_back(callback
);
56 void ImageFetcherImpl::OnFetchComplete(const GURL
& image_url
,
57 const SkBitmap
* bitmap
) {
58 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI
));
60 ImageRequestMap::iterator image_iter
= pending_net_requests_
.find(image_url
);
61 DCHECK(image_iter
!= pending_net_requests_
.end());
63 ImageRequest
* request
= &image_iter
->second
;
65 // Here |bitmap| could be NULL or a pointer to a bitmap which is owned by the
66 // BitmapFetcher and which ceases to exist after this function. Pass the
67 // un-owned pointer to the registered callbacks.
68 for (CallbackVector::iterator callback_iter
= request
->callbacks
.begin();
69 callback_iter
!= request
->callbacks
.end(); ++callback_iter
) {
70 callback_iter
->Run(request
->url
, bitmap
);
73 // Inform the ImageFetcherDelegate.
75 delegate_
->OnImageFetched(request
->url
, bitmap
);
78 // Erase the completed ImageRequest.
79 pending_net_requests_
.erase(image_iter
);
82 } // namespace suggestions