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 "webkit/glue/image_resource_fetcher.h" 6 7 #include "base/callback.h" 8 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 9 #include "ui/gfx/size.h" 10 #include "webkit/glue/image_decoder.h" 11 #include "third_party/skia/include/core/SkBitmap.h" 12 13 using WebKit::WebFrame; 14 using WebKit::WebURLRequest; 15 using WebKit::WebURLResponse; 16 17 namespace webkit_glue { 18 19 ImageResourceFetcher::ImageResourceFetcher( 20 const GURL& image_url, 21 WebFrame* frame, 22 int id, 23 int image_size, 24 WebURLRequest::TargetType target_type, 25 Callback* callback) 26 : callback_(callback), 27 id_(id), 28 image_url_(image_url), 29 image_size_(image_size) { 30 fetcher_.reset(new ResourceFetcher( 31 image_url, frame, target_type, 32 NewCallback(this, &ImageResourceFetcher::OnURLFetchComplete))); 33 } 34 35 ImageResourceFetcher::~ImageResourceFetcher() { 36 if (!fetcher_->completed()) 37 fetcher_->Cancel(); 38 } 39 40 void ImageResourceFetcher::OnURLFetchComplete( 41 const WebURLResponse& response, 42 const std::string& data) { 43 SkBitmap bitmap; 44 if (!response.isNull() && response.httpStatusCode() == 200) { 45 // Request succeeded, try to convert it to an image. 46 ImageDecoder decoder(gfx::Size(image_size_, image_size_)); 47 bitmap = decoder.Decode( 48 reinterpret_cast<const unsigned char*>(data.data()), data.size()); 49 } // else case: 50 // If we get here, it means no image from server or couldn't decode the 51 // response as an image. The delegate will see a null image, indicating 52 // that an error occurred. 53 54 // Take care to clear callback_ before running the callback as it may lead to 55 // our destruction. 56 scoped_ptr<Callback> callback; 57 callback.swap(callback_); 58 callback->Run(this, bitmap); 59 } 60 61 } // namespace webkit_glue 62