1// Copyright (c) 2011 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 "content/renderer/fetchers/image_resource_fetcher.h" 6 7#include "base/bind.h" 8#include "base/bind_helpers.h" 9#include "base/debug/crash_logging.h" 10#include "content/child/image_decoder.h" 11#include "content/public/renderer/resource_fetcher.h" 12#include "third_party/WebKit/public/platform/WebURLResponse.h" 13#include "third_party/WebKit/public/web/WebFrame.h" 14#include "third_party/skia/include/core/SkBitmap.h" 15#include "ui/gfx/size.h" 16 17using blink::WebFrame; 18using blink::WebURLRequest; 19using blink::WebURLResponse; 20 21namespace content { 22 23ImageResourceFetcher::ImageResourceFetcher( 24 const GURL& image_url, 25 WebFrame* frame, 26 int id, 27 int image_size, 28 WebURLRequest::RequestContext request_context, 29 const Callback& callback) 30 : callback_(callback), 31 id_(id), 32 image_url_(image_url), 33 image_size_(image_size) { 34 fetcher_.reset(ResourceFetcher::Create(image_url)); 35 fetcher_->Start(frame, 36 request_context, 37 WebURLRequest::FrameTypeNone, 38 ResourceFetcher::PLATFORM_LOADER, 39 base::Bind(&ImageResourceFetcher::OnURLFetchComplete, 40 base::Unretained(this))); 41 42 // Set subresource URL for crash reporting. 43 base::debug::SetCrashKeyValue("subresource_url", image_url.spec()); 44} 45 46ImageResourceFetcher::~ImageResourceFetcher() { 47} 48 49void ImageResourceFetcher::OnURLFetchComplete( 50 const WebURLResponse& response, 51 const std::string& data) { 52 SkBitmap bitmap; 53 if (!response.isNull() && response.httpStatusCode() == 200) { 54 // Request succeeded, try to convert it to an image. 55 ImageDecoder decoder(gfx::Size(image_size_, image_size_)); 56 bitmap = decoder.Decode( 57 reinterpret_cast<const unsigned char*>(data.data()), data.size()); 58 } // else case: 59 // If we get here, it means no image from server or couldn't decode the 60 // response as an image. The delegate will see a null image, indicating 61 // that an error occurred. 62 63 // Take a reference to the callback as running the callback may lead to our 64 // destruction. 65 Callback callback = callback_; 66 callback.Run(this, bitmap); 67} 68 69} // namespace content 70