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"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/child/image_decoder.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/renderer/resource_fetcher.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame;
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest;
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiResolutionImageResourceFetcher::MultiResolutionImageResourceFetcher(
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& image_url,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebFrame* frame,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    WebURLRequest::RequestContext request_context,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Callback& callback)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : callback_(callback),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_(id),
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      http_status_code_(0),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_url_(image_url) {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher_.reset(ResourceFetcher::Create(image_url));
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher_->Start(
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      frame,
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      request_context,
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      WebURLRequest::FrameTypeNone,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceFetcher::PLATFORM_LOADER,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&MultiResolutionImageResourceFetcher::OnURLFetchComplete,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiResolutionImageResourceFetcher::~MultiResolutionImageResourceFetcher() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MultiResolutionImageResourceFetcher::OnURLFetchComplete(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebURLResponse& response,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<SkBitmap> bitmaps;
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!response.isNull()) {
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    http_status_code_ = response.httpStatusCode();
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    GURL url(response.url());
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (http_status_code_ == 200 || url.SchemeIsFile()) {
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Request succeeded, try to convert it to an image.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bitmaps = ImageDecoder::DecodeAll(
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          reinterpret_cast<const unsigned char*>(data.data()), data.size());
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } // else case:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we get here, it means no image from server or couldn't decode the
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // response as an image. The delegate will see an empty vector.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take a reference to the callback as running the callback may lead to our
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Callback callback = callback_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(this, bitmaps);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}  // namespace content
68