| Index: components/webp_transcode/webp_network_client.mm
|
| diff --git a/components/webp_transcode/webp_network_client.mm b/components/webp_transcode/webp_network_client.mm
|
| deleted file mode 100644
|
| index 9a9bd4043480b7ee04c5f1786f323fb1d02d8183..0000000000000000000000000000000000000000
|
| --- a/components/webp_transcode/webp_network_client.mm
|
| +++ /dev/null
|
| @@ -1,231 +0,0 @@
|
| -// Copyright 2013 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 "components/webp_transcode/webp_network_client.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/location.h"
|
| -#include "base/logging.h"
|
| -#include "base/mac/bind_objc_block.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| -#include "base/sequenced_task_runner.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "components/webp_transcode/webp_decoder.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/http/http_request_headers.h"
|
| -#include "net/url_request/url_request.h"
|
| -
|
| -namespace net {
|
| -class URLRequest;
|
| -}
|
| -
|
| -using namespace webp_transcode;
|
| -
|
| -namespace {
|
| -
|
| -// MIME type for WebP images.
|
| -const char kWebPMimeType[] = "image/webp";
|
| -NSString* const kNSWebPMimeType = @"image/webp";
|
| -
|
| -NSURLResponse* NewImageResponse(NSURLResponse* webp_response,
|
| - size_t content_length,
|
| - WebpDecoder::DecodedImageFormat format) {
|
| - DCHECK(webp_response);
|
| -
|
| - NSString* mime_type = nil;
|
| - switch (format) {
|
| - case WebpDecoder::JPEG:
|
| - mime_type = @"image/jpeg";
|
| - break;
|
| - case WebpDecoder::PNG:
|
| - mime_type = @"image/png";
|
| - break;
|
| - case WebpDecoder::TIFF:
|
| - mime_type = @"image/tiff";
|
| - break;
|
| - case WebpDecoder::DECODED_FORMAT_COUNT:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - DCHECK(mime_type);
|
| -
|
| - if ([webp_response isKindOfClass:[NSHTTPURLResponse class]]) {
|
| - NSHTTPURLResponse* http_response =
|
| - static_cast<NSHTTPURLResponse*>(webp_response);
|
| - NSMutableDictionary* header_fields = [NSMutableDictionary
|
| - dictionaryWithDictionary:[http_response allHeaderFields]];
|
| - [header_fields setObject:[NSString stringWithFormat:@"%zu", content_length]
|
| - forKey:@"Content-Length"];
|
| - [header_fields setObject:mime_type forKey:@"Content-Type"];
|
| - return [[NSHTTPURLResponse alloc] initWithURL:[http_response URL]
|
| - statusCode:[http_response statusCode]
|
| - HTTPVersion:@"HTTP/1.1"
|
| - headerFields:header_fields];
|
| - } else {
|
| - return [[NSURLResponse alloc] initWithURL:[webp_response URL]
|
| - MIMEType:mime_type
|
| - expectedContentLength:content_length
|
| - textEncodingName:[webp_response textEncodingName]];
|
| - }
|
| -}
|
| -
|
| -class WebpDecoderDelegate : public WebpDecoder::Delegate {
|
| - public:
|
| - WebpDecoderDelegate(id<CRNNetworkClientProtocol> client,
|
| - const base::Time& request_creation_time,
|
| - const scoped_refptr<base::TaskRunner>& callback_runner)
|
| - : underlying_client_([client retain]),
|
| - callback_task_runner_(callback_runner),
|
| - request_creation_time_(request_creation_time) {
|
| - DCHECK(underlying_client_.get());
|
| - }
|
| -
|
| - void SetOriginalResponse(
|
| - const base::scoped_nsobject<NSURLResponse>& response) {
|
| - original_response_.reset([response retain]);
|
| - }
|
| -
|
| - // WebpDecoder::Delegate methods.
|
| - void OnFinishedDecoding(bool success) override {
|
| - base::scoped_nsprotocol<id<CRNNetworkClientProtocol>> block_client(
|
| - [underlying_client_ retain]);
|
| - if (success) {
|
| - callback_task_runner_->PostTask(FROM_HERE, base::BindBlock(^{
|
| - [block_client didFinishLoading];
|
| - }));
|
| - } else {
|
| - DLOG(WARNING) << "WebP decoding failed "
|
| - << base::SysNSStringToUTF8(
|
| - [[original_response_ URL] absoluteString]);
|
| - void (^errorBlock)(void) = ^{
|
| - [block_client didFailWithNSErrorCode:NSURLErrorCannotDecodeContentData
|
| - netErrorCode:net::ERR_CONTENT_DECODING_FAILED];
|
| - };
|
| - callback_task_runner_->PostTask(FROM_HERE, base::BindBlock(errorBlock));
|
| - }
|
| - }
|
| -
|
| - void SetImageFeatures(size_t total_size,
|
| - WebpDecoder::DecodedImageFormat format) override {
|
| - base::scoped_nsobject<NSURLResponse> imageResponse(
|
| - NewImageResponse(original_response_, total_size, format));
|
| - DCHECK(imageResponse);
|
| - base::scoped_nsprotocol<id<CRNNetworkClientProtocol>> block_client(
|
| - [underlying_client_ retain]);
|
| - callback_task_runner_->PostTask(FROM_HERE, base::BindBlock(^{
|
| - [block_client didReceiveResponse:imageResponse];
|
| - }));
|
| - }
|
| -
|
| - void OnDataDecoded(NSData* data) override {
|
| - base::scoped_nsprotocol<id<CRNNetworkClientProtocol>> block_client(
|
| - [underlying_client_ retain]);
|
| - callback_task_runner_->PostTask(FROM_HERE, base::BindBlock(^{
|
| - [block_client didLoadData:data];
|
| - }));
|
| - }
|
| -
|
| - private:
|
| - ~WebpDecoderDelegate() override {}
|
| -
|
| - base::scoped_nsprotocol<id<CRNNetworkClientProtocol>> underlying_client_;
|
| - base::scoped_nsobject<NSURLResponse> original_response_;
|
| - scoped_refptr<base::TaskRunner> callback_task_runner_;
|
| - base::Time request_creation_time_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -@interface WebPNetworkClient () {
|
| - scoped_refptr<webp_transcode::WebpDecoder> _webpDecoder;
|
| - scoped_refptr<WebpDecoderDelegate> _webpDecoderDelegate;
|
| - scoped_refptr<base::SequencedTaskRunner> _taskRunner;
|
| - base::Time _requestCreationTime;
|
| -}
|
| -@end
|
| -
|
| -@implementation WebPNetworkClient
|
| -
|
| -- (instancetype)init {
|
| - NOTREACHED() << "Use |-initWithTaskRunner:| instead";
|
| - return nil;
|
| -}
|
| -
|
| -- (instancetype)initWithTaskRunner:
|
| - (const scoped_refptr<base::SequencedTaskRunner>&)runner {
|
| - if (self = [super init]) {
|
| - DCHECK(runner);
|
| - _taskRunner = runner;
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)didCreateNativeRequest:(net::URLRequest*)nativeRequest {
|
| - // Append 'image/webp' to the outgoing 'Accept' header.
|
| - const net::HttpRequestHeaders& headers =
|
| - nativeRequest->extra_request_headers();
|
| - std::string acceptHeader;
|
| - if (headers.GetHeader("Accept", &acceptHeader)) {
|
| - // Add 'image/webp' if it isn't in the Accept header yet.
|
| - if (acceptHeader.find(kWebPMimeType) == std::string::npos) {
|
| - acceptHeader += std::string(",") + kWebPMimeType;
|
| - nativeRequest->SetExtraRequestHeaderByName("Accept", acceptHeader, true);
|
| - }
|
| - } else {
|
| - // All requests should already have an Accept: header, so this case
|
| - // should never happen outside of unit tests.
|
| - nativeRequest->SetExtraRequestHeaderByName("Accept", kWebPMimeType, false);
|
| - }
|
| - [super didCreateNativeRequest:nativeRequest];
|
| -}
|
| -
|
| -- (void)didLoadData:(NSData*)data {
|
| - if (_webpDecoder.get()) {
|
| - // |data| is assumed to be immutable.
|
| - base::scoped_nsobject<NSData> scopedData([data retain]);
|
| - _taskRunner->PostTask(FROM_HERE, base::Bind(&WebpDecoder::OnDataReceived,
|
| - _webpDecoder, scopedData));
|
| - } else {
|
| - [super didLoadData:data];
|
| - }
|
| -}
|
| -
|
| -- (void)didReceiveResponse:(NSURLResponse*)response {
|
| - DCHECK(self.underlyingClient);
|
| - NSString* responseMimeType = [response MIMEType];
|
| - if (responseMimeType &&
|
| - [responseMimeType caseInsensitiveCompare:kNSWebPMimeType] ==
|
| - NSOrderedSame) {
|
| - _webpDecoderDelegate =
|
| - new WebpDecoderDelegate(self.underlyingClient, _requestCreationTime,
|
| - base::ThreadTaskRunnerHandle::Get());
|
| - _webpDecoder = new webp_transcode::WebpDecoder(_webpDecoderDelegate.get());
|
| - base::scoped_nsobject<NSURLResponse> scoped_response([response copy]);
|
| - _taskRunner->PostTask(FROM_HERE,
|
| - base::Bind(&WebpDecoderDelegate::SetOriginalResponse,
|
| - _webpDecoderDelegate, scoped_response));
|
| - // Do not call super here, the WebpDecoderDelegate will update the mime type
|
| - // and call |-didReceiveResponse:|.
|
| - } else {
|
| - // If this isn't a WebP, pass the call up the chain.
|
| - [super didReceiveResponse:response];
|
| - }
|
| -}
|
| -
|
| -- (void)didFinishLoading {
|
| - if (_webpDecoder.get()) {
|
| - _taskRunner->PostTask(FROM_HERE,
|
| - base::Bind(&WebpDecoder::Stop, _webpDecoder));
|
| - } else {
|
| - [super didFinishLoading];
|
| - }
|
| -}
|
| -
|
| -@end
|
|
|