Home | History | Annotate | Download | only in fetchers
      1 // Copyright (c) 2012 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/multi_resolution_image_resource_fetcher.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "content/child/image_decoder.h"
     10 #include "third_party/WebKit/public/web/WebFrame.h"
     11 #include "third_party/skia/include/core/SkBitmap.h"
     12 #include "ui/gfx/size.h"
     13 
     14 using WebKit::WebFrame;
     15 using WebKit::WebURLRequest;
     16 using WebKit::WebURLResponse;
     17 
     18 namespace content {
     19 
     20 MultiResolutionImageResourceFetcher::MultiResolutionImageResourceFetcher(
     21     const GURL& image_url,
     22     WebFrame* frame,
     23     int id,
     24     WebURLRequest::TargetType target_type,
     25     const Callback& callback)
     26     : callback_(callback),
     27       id_(id),
     28       http_status_code_(0),
     29       image_url_(image_url) {
     30   fetcher_.reset(new ResourceFetcher(
     31       image_url, frame, target_type,
     32       base::Bind(&MultiResolutionImageResourceFetcher::OnURLFetchComplete,
     33                  base::Unretained(this))));
     34 }
     35 
     36 MultiResolutionImageResourceFetcher::~MultiResolutionImageResourceFetcher() {
     37   if (!fetcher_->completed())
     38     fetcher_->Cancel();
     39 }
     40 
     41 void MultiResolutionImageResourceFetcher::OnURLFetchComplete(
     42     const WebURLResponse& response,
     43     const std::string& data) {
     44   std::vector<SkBitmap> bitmaps;
     45   if (!response.isNull()) {
     46     http_status_code_ = response.httpStatusCode();
     47     GURL url(response.url());
     48     if (http_status_code_ == 200 || url.SchemeIsFile()) {
     49       // Request succeeded, try to convert it to an image.
     50       bitmaps = ImageDecoder::DecodeAll(
     51           reinterpret_cast<const unsigned char*>(data.data()), data.size());
     52     }
     53   } // else case:
     54     // If we get here, it means no image from server or couldn't decode the
     55     // response as an image. The delegate will see an empty vector.
     56 
     57   // Take a reference to the callback as running the callback may lead to our
     58   // destruction.
     59   Callback callback = callback_;
     60   callback.Run(this, bitmaps);
     61 }
     62 
     63 }  // namespace content
     64