blob: 1fbc21252bc237e1a7cfaf0b1231dcfb7e9ee202 [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.
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_context_getter.h"
#include "net/url_request/url_request_status.h"
BitmapFetcher::BitmapFetcher(
const GURL& url,
BitmapFetcherDelegate* delegate,
const net::NetworkTrafficAnnotationTag& traffic_annotation)
: url_(url), delegate_(delegate), traffic_annotation_(traffic_annotation) {}
BitmapFetcher::~BitmapFetcher() {
}
void BitmapFetcher::Init(const std::string& referrer,
net::URLRequest::ReferrerPolicy referrer_policy,
int load_flags) {
if (simple_loader_ != NULL)
return;
auto resource_request = std::make_unique<network::ResourceRequest>();
resource_request->url = url_;
resource_request->referrer = GURL(referrer);
resource_request->referrer_policy = referrer_policy;
resource_request->load_flags = load_flags;
simple_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
traffic_annotation_);
}
void BitmapFetcher::Start(network::mojom::URLLoaderFactory* loader_factory) {
if (simple_loader_) {
network::SimpleURLLoader::BodyAsStringCallback callback = base::BindOnce(
&BitmapFetcher::OnSimpleLoaderComplete, base::Unretained(this));
simple_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
loader_factory, std::move(callback));
}
}
void BitmapFetcher::OnSimpleLoaderComplete(
std::unique_ptr<std::string> response_body) {
if (!response_body) {
ReportFailure();
return;
}
// Call start to begin decoding. The ImageDecoder will call OnImageDecoded
// with the data when it is done.
ImageDecoder::Start(this, *response_body);
}
// Methods inherited from ImageDecoder::ImageRequest.
void BitmapFetcher::OnImageDecoded(const SkBitmap& decoded_image) {
// Report success.
delegate_->OnFetchComplete(url_, &decoded_image);
}
void BitmapFetcher::OnDecodeImageFailed() {
ReportFailure();
}
void BitmapFetcher::ReportFailure() {
delegate_->OnFetchComplete(url_, NULL);
}