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 // This class holds the URL to an image and the bitmap for the fetched image, 6 // and has code to fetch the bitmap from the URL. 7 8 #include "chrome/browser/image_holder.h" 9 10 #include "chrome/browser/profiles/profile.h" 11 #include "net/base/load_flags.h" 12 13 namespace chrome { 14 15 ImageHolder::ImageHolder(const GURL& low_dpi_url, 16 const GURL& high_dpi_url, 17 Profile* profile, 18 ImageHolderDelegate* delegate) 19 : low_dpi_url_(low_dpi_url), 20 high_dpi_url_(high_dpi_url), 21 low_dpi_fetched_(false), 22 high_dpi_fetched_(false), 23 delegate_(delegate), 24 profile_(profile) { 25 26 // If a URL is invalid, clear it so we don't try to fetch it. 27 if (!low_dpi_url_.is_valid()) { 28 low_dpi_url_ = GURL(); 29 } 30 if (!high_dpi_url_.is_valid()) { 31 high_dpi_url_ = GURL(); 32 } 33 34 // Create a featcher for each URL that is set. 35 if (!low_dpi_url_.is_empty()) { 36 CreateBitmapFetcher(low_dpi_url_); 37 } 38 if (!high_dpi_url_.is_empty()) { 39 CreateBitmapFetcher(high_dpi_url_); 40 } 41 } 42 43 ImageHolder::~ImageHolder() {} 44 45 // This will let us know if we have tried to fetch once and the try completed. 46 // Currently there is no logic for retries. 47 bool ImageHolder::IsFetchingDone() const { 48 return ((low_dpi_url_.is_empty() || low_dpi_fetched_) && 49 (high_dpi_url_.is_empty() || high_dpi_fetched_)); 50 } 51 52 // If this bitmap has a valid GURL, create a fetcher for it. 53 void ImageHolder::CreateBitmapFetcher(const GURL& url) { 54 // Check for dups, ignore any request for a dup. 55 ScopedVector<chrome::BitmapFetcher>::iterator iter; 56 for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) { 57 if ((*iter)->url() == url) 58 return; 59 } 60 61 if (url.is_valid()) { 62 fetchers_.push_back(new chrome::BitmapFetcher(url, this)); 63 DVLOG(2) << __FUNCTION__ << "Pushing bitmap " << url; 64 } 65 } 66 67 void ImageHolder::StartFetch() { 68 // Now that we have queued them all, start the fetching. 69 ScopedVector<chrome::BitmapFetcher>::iterator iter; 70 for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) { 71 (*iter)->Start( 72 profile_->GetRequestContext(), 73 std::string(), 74 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE, 75 net::LOAD_NORMAL); 76 } 77 } 78 79 // Method inherited from BitmapFetcher delegate. 80 void ImageHolder::OnFetchComplete(const GURL url, const SkBitmap* bitmap) { 81 // TODO(petewil): Should I retry if a fetch fails? 82 // Match the bitmap to the URL to put it into the image with the correct scale 83 // factor. 84 if (url == low_dpi_url_) { 85 low_dpi_fetched_ = true; 86 if (bitmap != NULL) 87 image_.AddRepresentation(gfx::ImageSkiaRep(*bitmap, 1.0)); 88 } else if (url == high_dpi_url_) { 89 high_dpi_fetched_ = true; 90 if (bitmap != NULL) 91 image_.AddRepresentation(gfx::ImageSkiaRep(*bitmap, 2.0)); 92 } else { 93 DVLOG(2) << __FUNCTION__ << "Unmatched bitmap arrived " << url; 94 } 95 96 // Notify callback of bitmap arrival. 97 delegate_->OnFetchComplete(); 98 } 99 100 } // namespace chrome. 101