Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(577)

Side by Side Diff: ios/web/net/clients/crw_js_injection_network_client.mm

Issue 2247303009: Converts ios/web/net to ARC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ios-web
Patch Set: Removes web_arc_transition temporary target Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/web/net/clients/crw_js_injection_network_client.h" 5 #import "ios/web/net/clients/crw_js_injection_network_client.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/mac/objc_property_releaser.h"
12 #include "base/mac/scoped_nsobject.h" 11 #include "base/mac/scoped_nsobject.h"
13 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
14 #import "ios/net/crn_http_url_response.h" 13 #import "ios/net/crn_http_url_response.h"
15 #import "ios/third_party/blink/src/html_tokenizer.h" 14 #import "ios/third_party/blink/src/html_tokenizer.h"
16 15
16 #if !defined(__has_feature) || !__has_feature(objc_arc)
Eugene But (OOO till 7-30) 2016/08/19 16:34:50 We don't need network clients code with WKWebView.
17 #error "This file requires ARC support."
18 #endif
19
17 // CRWJSInjectionNetworkClient injects an external script tag reference for 20 // CRWJSInjectionNetworkClient injects an external script tag reference for
18 // crweb.js into HTML and XHTML documents. To do this correctly, three data 21 // crweb.js into HTML and XHTML documents. To do this correctly, three data
19 // points are needed: where to inject the script tag, what encoding the content 22 // points are needed: where to inject the script tag, what encoding the content
20 // is in (ASCII compatible, UTF32, UTF16 and big or little endian) and the byte 23 // is in (ASCII compatible, UTF32, UTF16 and big or little endian) and the byte
21 // length of the injection tag itself. 24 // length of the injection tag itself.
22 // 25 //
23 // The content encoding is handled first. As data is received, 26 // The content encoding is handled first. As data is received,
24 // CRWJSInjectionNetworkClient will look at the beginning few bytes of the 27 // CRWJSInjectionNetworkClient will look at the beginning few bytes of the
25 // content for either a byte-order mark or an XML declaration. If present, they 28 // content for either a byte-order mark or an XML declaration. If present, they
26 // will be matched to a known set of patterns to determine the encoding. If not 29 // will be matched to a known set of patterns to determine the encoding. If not
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 base::scoped_nsobject<NSMutableDictionary> all_headers_mutable; 142 base::scoped_nsobject<NSMutableDictionary> all_headers_mutable;
140 all_headers_mutable.reset([all_headers mutableCopy]); 143 all_headers_mutable.reset([all_headers mutableCopy]);
141 [all_headers_mutable setObject:content_length_value forKey:kContentLength]; 144 [all_headers_mutable setObject:content_length_value forKey:kContentLength];
142 145
143 CRNHTTPURLResponse* update_response = 146 CRNHTTPURLResponse* update_response =
144 [[CRNHTTPURLResponse alloc] initWithURL:[response URL] 147 [[CRNHTTPURLResponse alloc] initWithURL:[response URL]
145 statusCode:[response statusCode] 148 statusCode:[response statusCode]
146 HTTPVersion:[response cr_HTTPVersion] 149 HTTPVersion:[response cr_HTTPVersion]
147 headerFields:all_headers_mutable]; 150 headerFields:all_headers_mutable];
148 151
149 return [update_response autorelease]; 152 return update_response;
150 } 153 }
151 } // namespace 154 } // namespace
152 155
153 @interface CRWJSInjectionNetworkClient () { 156 @interface CRWJSInjectionNetworkClient () {
154 // The CRNHTTPURLResponse that is held until it is determined if the content 157 // The CRNHTTPURLResponse that is held until it is determined if the content
155 // will have JavaScript injected. 158 // will have JavaScript injected.
156 base::scoped_nsobject<CRNHTTPURLResponse> _pendingResponse; 159 base::scoped_nsobject<CRNHTTPURLResponse> _pendingResponse;
157 160
158 // An array of data that is buffered until a determination is made about 161 // An array of data that is buffered until a determination is made about
159 // injecting JavaScript. 162 // injecting JavaScript.
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 [static_cast<NSHTTPURLResponse*>(response) allHeaderFields])); 294 [static_cast<NSHTTPURLResponse*>(response) allHeaderFields]));
292 DCHECK([CRWJSInjectionNetworkClient canHandleResponse:response]); 295 DCHECK([CRWJSInjectionNetworkClient canHandleResponse:response]);
293 296
294 // If response does not come with Content-Length header field (i.e. the 297 // If response does not come with Content-Length header field (i.e. the
295 // Transfer-Encoding header field has value 'chunked'), response does not have 298 // Transfer-Encoding header field has value 'chunked'), response does not have
296 // to be updated. 299 // to be updated.
297 if ([response expectedContentLength] == -1) { 300 if ([response expectedContentLength] == -1) {
298 [super didReceiveResponse:response]; 301 [super didReceiveResponse:response];
299 } else { 302 } else {
300 // Client calls [super didReceiveResponse:] in sendPendingResponse. 303 // Client calls [super didReceiveResponse:] in sendPendingResponse.
301 _pendingResponse.reset([static_cast<CRNHTTPURLResponse*>(response) retain]); 304 _pendingResponse.reset(static_cast<CRNHTTPURLResponse*>(response));
302 } 305 }
303 } 306 }
304 307
305 - (void)didFinishLoading { 308 - (void)didFinishLoading {
306 [self recordHistogramResult]; 309 [self recordHistogramResult];
307 [self sendPendingResponse]; 310 [self sendPendingResponse];
308 [self sendPendingData]; 311 [self sendPendingData];
309 [super didFinishLoading]; 312 [super didFinishLoading];
310 } 313 }
311 314
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 } 346 }
344 347
345 - (NSData*)jsInjectionContent { 348 - (NSData*)jsInjectionContent {
346 DCHECK(_proceedWithInjection); 349 DCHECK(_proceedWithInjection);
347 if (_jsInjectionContent) 350 if (_jsInjectionContent)
348 return _jsInjectionContent; 351 return _jsInjectionContent;
349 352
350 NSString* jsContentString = [NSString 353 NSString* jsContentString = [NSString
351 stringWithFormat:kJSContentTemplate, [[NSUUID UUID] UUIDString]]; 354 stringWithFormat:kJSContentTemplate, [[NSUUID UUID] UUIDString]];
352 _jsInjectionContent.reset( 355 _jsInjectionContent.reset(
353 [[jsContentString dataUsingEncoding:_contentEncoding] retain]); 356 [jsContentString dataUsingEncoding:_contentEncoding]);
354 357
355 return _jsInjectionContent; 358 return _jsInjectionContent;
356 } 359 }
357 360
358 - (void)sendInjectedResponseIfNeeded { 361 - (void)sendInjectedResponseIfNeeded {
359 if (!_proceedWithInjection) 362 if (!_proceedWithInjection)
360 return; 363 return;
361 364
362 NSData* firstData = [_pendingData firstObject]; 365 NSData* firstData = [_pendingData firstObject];
363 NSUInteger dataLength = [firstData length]; 366 NSUInteger dataLength = [firstData length];
(...skipping 22 matching lines...) Expand all
386 } 389 }
387 390
388 - (void)sendPendingResponse { 391 - (void)sendPendingResponse {
389 if (!_pendingResponse) 392 if (!_pendingResponse)
390 return; 393 return;
391 394
392 if (_proceedWithInjection) { 395 if (_proceedWithInjection) {
393 NSUInteger additionalLength = [[self jsInjectionContent] length]; 396 NSUInteger additionalLength = [[self jsInjectionContent] length];
394 CRNHTTPURLResponse* responseToSend = 397 CRNHTTPURLResponse* responseToSend =
395 ResponseWithUpdatedContentSize(_pendingResponse, additionalLength); 398 ResponseWithUpdatedContentSize(_pendingResponse, additionalLength);
396 _pendingResponse.reset([responseToSend retain]); 399 _pendingResponse.reset(responseToSend);
397 } 400 }
398 401
399 [super didReceiveResponse:_pendingResponse]; 402 [super didReceiveResponse:_pendingResponse];
400 _pendingResponse.reset(); 403 _pendingResponse.reset();
401 } 404 }
402 405
403 - (void)sendPendingData { 406 - (void)sendPendingData {
404 if (![_pendingData count]) 407 if (![_pendingData count])
405 return; 408 return;
406 409
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 } 630 }
628 } 631 }
629 632
630 // There is an early exit case right at the end of the start-tag from the 633 // There is an early exit case right at the end of the start-tag from the
631 // WebCore::HTMLTokenizer::nextToken(), so double check to see if we hit 634 // WebCore::HTMLTokenizer::nextToken(), so double check to see if we hit
632 // the limit. 635 // the limit.
633 [self checkIfByteLimitPassed:provider]; 636 [self checkIfByteLimitPassed:provider];
634 } 637 }
635 638
636 @end 639 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698