blob: 960b057e75bd86bf67fc24df0af9125c45ac2303 [file] [log] [blame]
// Copyright 2014 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.
// This class holds the URL to an image and the bitmap for the fetched image,
// and has code to fetch the bitmap from the URL.
#include "chrome/browser/image_holder.h"
#include "chrome/browser/profiles/profile.h"
#include "net/base/load_flags.h"
namespace chrome {
ImageHolder::ImageHolder(const GURL& low_dpi_url,
const GURL& high_dpi_url,
Profile* profile,
ImageHolderDelegate* delegate)
: low_dpi_url_(low_dpi_url),
high_dpi_url_(high_dpi_url),
low_dpi_fetched_(false),
high_dpi_fetched_(false),
delegate_(delegate),
profile_(profile) {
// If a URL is invalid, clear it so we don't try to fetch it.
if (!low_dpi_url_.is_valid()) {
low_dpi_url_ = GURL();
}
if (!high_dpi_url_.is_valid()) {
high_dpi_url_ = GURL();
}
// Create a featcher for each URL that is set.
if (!low_dpi_url_.is_empty()) {
CreateBitmapFetcher(low_dpi_url_);
}
if (!high_dpi_url_.is_empty()) {
CreateBitmapFetcher(high_dpi_url_);
}
}
ImageHolder::~ImageHolder() {}
// This will let us know if we have tried to fetch once and the try completed.
// Currently there is no logic for retries.
bool ImageHolder::IsFetchingDone() const {
return ((low_dpi_url_.is_empty() || low_dpi_fetched_) &&
(high_dpi_url_.is_empty() || high_dpi_fetched_));
}
// If this bitmap has a valid GURL, create a fetcher for it.
void ImageHolder::CreateBitmapFetcher(const GURL& url) {
// Check for dups, ignore any request for a dup.
ScopedVector<chrome::BitmapFetcher>::iterator iter;
for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
if ((*iter)->url() == url)
return;
}
if (url.is_valid()) {
fetchers_.push_back(new chrome::BitmapFetcher(url, this));
DVLOG(2) << __FUNCTION__ << "Pushing bitmap " << url;
}
}
void ImageHolder::StartFetch() {
// Now that we have queued them all, start the fetching.
ScopedVector<chrome::BitmapFetcher>::iterator iter;
for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
(*iter)->Start(
profile_->GetRequestContext(),
std::string(),
net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
net::LOAD_NORMAL);
}
}
// Method inherited from BitmapFetcher delegate.
void ImageHolder::OnFetchComplete(const GURL url, const SkBitmap* bitmap) {
// TODO(petewil): Should I retry if a fetch fails?
// Match the bitmap to the URL to put it into the image with the correct scale
// factor.
if (url == low_dpi_url_) {
low_dpi_fetched_ = true;
if (bitmap != NULL)
image_.AddRepresentation(gfx::ImageSkiaRep(*bitmap, 1.0));
} else if (url == high_dpi_url_) {
high_dpi_fetched_ = true;
if (bitmap != NULL)
image_.AddRepresentation(gfx::ImageSkiaRep(*bitmap, 2.0));
} else {
DVLOG(2) << __FUNCTION__ << "Unmatched bitmap arrived " << url;
}
// Notify callback of bitmap arrival.
delegate_->OnFetchComplete();
}
} // namespace chrome.