| Index: ios/web/public/image_fetcher/image_data_fetcher.mm
|
| diff --git a/ios/web/public/image_fetcher/image_data_fetcher.mm b/ios/web/public/image_fetcher/image_data_fetcher.mm
|
| deleted file mode 100644
|
| index 11a237a12ce0908b0f2f66a4d39b7f48e477dd93..0000000000000000000000000000000000000000
|
| --- a/ios/web/public/image_fetcher/image_data_fetcher.mm
|
| +++ /dev/null
|
| @@ -1,179 +0,0 @@
|
| -// Copyright 2012 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.
|
| -
|
| -#import "ios/web/public/image_fetcher/image_data_fetcher.h"
|
| -
|
| -#import <Foundation/Foundation.h>
|
| -#include <stddef.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#import "base/mac/scoped_nsobject.h"
|
| -#include "base/task_runner.h"
|
| -#include "base/task_runner_util.h"
|
| -#import "ios/web/public/image_fetcher/webp_decoder.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/url_request/url_fetcher.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -
|
| -#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| -#error "This file requires ARC support."
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -class WebpDecoderDelegate : public webp_transcode::WebpDecoder::Delegate {
|
| - public:
|
| - NSData* data() const { return decoded_image_; }
|
| -
|
| - // WebpDecoder::Delegate methods
|
| - void OnFinishedDecoding(bool success) override {
|
| - if (!success)
|
| - decoded_image_.reset();
|
| - }
|
| - void SetImageFeatures(
|
| - size_t total_size,
|
| - webp_transcode::WebpDecoder::DecodedImageFormat format) override {
|
| - decoded_image_.reset([[NSMutableData alloc] initWithCapacity:total_size]);
|
| - }
|
| - void OnDataDecoded(NSData* data) override {
|
| - DCHECK(decoded_image_);
|
| - [decoded_image_ appendData:data];
|
| - }
|
| -
|
| - private:
|
| - ~WebpDecoderDelegate() override {}
|
| - base::scoped_nsobject<NSMutableData> decoded_image_;
|
| -};
|
| -
|
| -// Content-type header for WebP images.
|
| -static const char kWEBPMimeType[] = "image/webp";
|
| -
|
| -// Returns a NSData object containing the decoded image.
|
| -// Returns nil in case of failure.
|
| -base::scoped_nsobject<NSData> DecodeWebpImage(
|
| - const base::scoped_nsobject<NSData>& webp_image) {
|
| - scoped_refptr<WebpDecoderDelegate> delegate(new WebpDecoderDelegate);
|
| - scoped_refptr<webp_transcode::WebpDecoder> decoder(
|
| - new webp_transcode::WebpDecoder(delegate.get()));
|
| - decoder->OnDataReceived(webp_image);
|
| - DLOG_IF(ERROR, !delegate->data()) << "WebP image decoding failed.";
|
| - return base::scoped_nsobject<NSData>(delegate->data());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace web {
|
| -
|
| -ImageDataFetcher::ImageDataFetcher(
|
| - const scoped_refptr<base::TaskRunner>& task_runner)
|
| - : request_context_getter_(nullptr),
|
| - task_runner_(task_runner),
|
| - weak_factory_(this) {
|
| - DCHECK(task_runner_.get());
|
| -}
|
| -
|
| -ImageDataFetcher::~ImageDataFetcher() {
|
| - // Delete all the entries in the |downloads_in_progress_| map. This will in
|
| - // turn cancel all of the requests.
|
| - for (const auto& pair : downloads_in_progress_) {
|
| - delete pair.first;
|
| - }
|
| -}
|
| -
|
| -void ImageDataFetcher::StartDownload(
|
| - const GURL& url,
|
| - ImageFetchedCallback callback,
|
| - const std::string& referrer,
|
| - net::URLRequest::ReferrerPolicy referrer_policy) {
|
| - DCHECK(request_context_getter_.get());
|
| - net::URLFetcher* fetcher =
|
| - net::URLFetcher::Create(url, net::URLFetcher::GET, this).release();
|
| - downloads_in_progress_[fetcher] = [callback copy];
|
| - fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
|
| - net::LOAD_DO_NOT_SAVE_COOKIES |
|
| - net::LOAD_DO_NOT_SEND_AUTH_DATA);
|
| - fetcher->SetRequestContext(request_context_getter_.get());
|
| - fetcher->SetReferrer(referrer);
|
| - fetcher->SetReferrerPolicy(referrer_policy);
|
| - fetcher->Start();
|
| -}
|
| -
|
| -void ImageDataFetcher::StartDownload(const GURL& url,
|
| - ImageFetchedCallback callback) {
|
| - ImageDataFetcher::StartDownload(url, callback, std::string(),
|
| - net::URLRequest::NEVER_CLEAR_REFERRER);
|
| -}
|
| -
|
| -// Delegate callback that is called when URLFetcher completes. If the image
|
| -// was fetched successfully, creates a new NSData and returns it to the
|
| -// callback, otherwise returns nil to the callback.
|
| -void ImageDataFetcher::OnURLFetchComplete(const net::URLFetcher* fetcher) {
|
| - if (downloads_in_progress_.find(fetcher) == downloads_in_progress_.end()) {
|
| - LOG(ERROR) << "Received callback for unknown URLFetcher " << fetcher;
|
| - return;
|
| - }
|
| -
|
| - // Ensures that |fetcher| will be deleted in the event of early return.
|
| - std::unique_ptr<const net::URLFetcher> fetcher_deleter(fetcher);
|
| -
|
| - // Retrieves the callback and ensures that it will be deleted in the event
|
| - // of early return.
|
| - base::mac::ScopedBlock<ImageFetchedCallback> callback(
|
| - downloads_in_progress_[fetcher]);
|
| -
|
| - // Remove |fetcher| from the map.
|
| - downloads_in_progress_.erase(fetcher);
|
| -
|
| - // Make sure the request was successful. For "data" requests, the response
|
| - // code has no meaning, because there is no actual server (data is encoded
|
| - // directly in the URL). In that case, set the response code to 200 (OK).
|
| - const GURL& original_url = fetcher->GetOriginalURL();
|
| - const int http_response_code =
|
| - original_url.SchemeIs("data") ? 200 : fetcher->GetResponseCode();
|
| - if (http_response_code != 200) {
|
| - (callback.get())(original_url, http_response_code, nil);
|
| - return;
|
| - }
|
| -
|
| - std::string response;
|
| - if (!fetcher->GetResponseAsString(&response)) {
|
| - (callback.get())(original_url, http_response_code, nil);
|
| - return;
|
| - }
|
| -
|
| - // Create a NSData from the returned data and notify the callback.
|
| - base::scoped_nsobject<NSData> data([[NSData alloc]
|
| - initWithBytes:reinterpret_cast<const unsigned char*>(response.data())
|
| - length:response.size()]);
|
| -
|
| - if (fetcher->GetResponseHeaders()) {
|
| - std::string mime_type;
|
| - fetcher->GetResponseHeaders()->GetMimeType(&mime_type);
|
| - if (mime_type == kWEBPMimeType) {
|
| - base::PostTaskAndReplyWithResult(
|
| - task_runner_.get(), FROM_HERE, base::Bind(&DecodeWebpImage, data),
|
| - base::Bind(&ImageDataFetcher::RunCallback, weak_factory_.GetWeakPtr(),
|
| - callback, original_url, http_response_code));
|
| - return;
|
| - }
|
| - }
|
| - (callback.get())(original_url, http_response_code, data);
|
| -}
|
| -
|
| -void ImageDataFetcher::RunCallback(
|
| - const base::mac::ScopedBlock<ImageFetchedCallback>& callback,
|
| - const GURL& url,
|
| - int http_response_code,
|
| - NSData* data) {
|
| - (callback.get())(url, http_response_code, data);
|
| -}
|
| -
|
| -void ImageDataFetcher::SetRequestContextGetter(
|
| - const scoped_refptr<net::URLRequestContextGetter>& request_context_getter) {
|
| - request_context_getter_ = request_context_getter;
|
| -}
|
| -
|
| -} // namespace web
|
|
|