multi_resolution_image_resource_fetcher.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/renderer/fetchers/multi_resolution_image_resource_fetcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
10a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/image_decoder.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLRequest;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLResponse;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace content {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiResolutionImageResourceFetcher::MultiResolutionImageResourceFetcher(
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& image_url,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebFrame* frame,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebURLRequest::TargetType target_type,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Callback& callback)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : callback_(callback),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_(id),
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      http_status_code_(0),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_url_(image_url) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher_.reset(new ResourceFetcher(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_url, frame, target_type,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MultiResolutionImageResourceFetcher::OnURLFetchComplete,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this))));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiResolutionImageResourceFetcher::~MultiResolutionImageResourceFetcher() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!fetcher_->completed())
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher_->Cancel();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MultiResolutionImageResourceFetcher::OnURLFetchComplete(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebURLResponse& response,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<SkBitmap> bitmaps;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!response.isNull()) {
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    http_status_code_ = response.httpStatusCode();
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (http_status_code_ == 200) {
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Request succeeded, try to convert it to an image.
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bitmaps = webkit_glue::ImageDecoder::DecodeAll(
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          reinterpret_cast<const unsigned char*>(data.data()), data.size());
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } // else case:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we get here, it means no image from server or couldn't decode the
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // response as an image. The delegate will see an empty vector.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take a reference to the callback as running the callback may lead to our
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Callback callback = callback_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(this, bitmaps);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}  // namespace content
63