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