Index: chrome/browser/safe_image_fetcher.cc |
diff --git a/chrome/browser/safe_image_fetcher.cc b/chrome/browser/safe_image_fetcher.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..52abecb505ace4f60661d36d507d10360fac02a2 |
--- /dev/null |
+++ b/chrome/browser/safe_image_fetcher.cc |
@@ -0,0 +1,63 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/safe_image_fetcher.h" |
+ |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/message_loop/message_loop_proxy.h" |
+#include "net/base/load_flags.h" |
+#include "net/url_request/url_fetcher.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+ |
+SafeImageFetcher::SafeImageFetcher( |
+ const GURL& url, |
+ net::URLRequestContextGetter* context_getter, |
+ const GetImageCallback& callback) |
+ : ImageRequest(base::MessageLoopProxy::current()), |
+ callback_(callback) { |
+ if (url.is_valid()) { |
+ DCHECK(context_getter); |
+ url_fetcher_.reset(net::URLFetcher::Create( |
+ url, net::URLFetcher::GET, this)); |
+ url_fetcher_->SetRequestContext(context_getter); |
+ url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
+ net::LOAD_DO_NOT_SEND_COOKIES); |
+ |
+ url_fetcher_->Start(); |
+ // We'll get called back in OnURLFetchComplete. |
+ } else { |
+ base::MessageLoopProxy::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&SafeImageFetcher::OnDecodeImageFailed, |
+ base::Unretained(this))); |
asargent_no_longer_on_chrome
2015/03/26 18:12:50
What if this object is deleted by its owner before
Marc Treib
2015/03/27 11:52:12
Hm, just adding a comment feels like asking for tr
|
+ } |
+} |
+ |
+SafeImageFetcher::~SafeImageFetcher() { |
+} |
+ |
+void SafeImageFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
+ DCHECK_EQ(url_fetcher_.get(), source); |
+ int response_code = |
+ source->GetStatus().is_success() ? source->GetResponseCode() : 0; |
+ if (!source->GetStatus().is_success() || |
+ response_code / 100 == 4 || response_code / 100 == 5) { |
+ OnDecodeImageFailed(); |
+ } else { |
+ std::string response_data; |
+ source->GetResponseAsString(&response_data); |
+ |
+ ImageDecoder::Start(this, response_data); |
+ } |
+ url_fetcher_.reset(); |
+} |
+ |
+void SafeImageFetcher::OnImageDecoded(const SkBitmap& decoded_image) { |
+ callback_.Run(decoded_image); |
+} |
+ |
+void SafeImageFetcher::OnDecodeImageFailed() { |
+ callback_.Run(SkBitmap()); |
+} |