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

Unified Diff: ios/web/web_state/ui/crw_static_file_web_view.mm

Issue 1043243003: Upstream most of ios/web/net (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove accidentally-added clients Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: ios/web/web_state/ui/crw_static_file_web_view.mm
diff --git a/ios/web/web_state/ui/crw_static_file_web_view.mm b/ios/web/web_state/ui/crw_static_file_web_view.mm
new file mode 100644
index 0000000000000000000000000000000000000000..e40a0af5369ecc83effcbd0755730b19c2d628cd
--- /dev/null
+++ b/ios/web/web_state/ui/crw_static_file_web_view.mm
@@ -0,0 +1,149 @@
+// 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/web_state/ui/crw_static_file_web_view.h"
+
+#include "base/logging.h"
+#include "ios/web/net/request_group_util.h"
+#include "ios/web/net/request_tracker_impl.h"
+#include "ios/web/public/browser_state.h"
+#import "ios/web/ui_web_view_util.h"
+#include "net/http/http_response_headers.h"
+
+namespace {
+NSString* const kStaticFileUserAgent = @"UIWebViewForStaticFileContent";
+}
+
+@interface CRWStaticFileWebView () {
+ // Saves the user agent in order to set it on future requests.
+ base::scoped_nsobject<NSString> userAgent_;
+ // Saves the identification assigned to this web view for request
+ // tracking. This identifiation is required for terminating request
+ // tracking.
+ scoped_refptr<web::RequestTrackerImpl> requestTracker_;
+}
+
+// Whether the User-Agent is the allowed user agent.
++ (BOOL)isStaticFileUserAgent:(NSString*)userAgent;
+@end
+
+@implementation CRWStaticFileWebView
+
+- (instancetype)initWithFrame:(CGRect)frame
+ browserState:(web::BrowserState*)browserState {
+ // Register the user agent before instantiating the UIWebView.
+ NSString* requestGroupID = nil;
+ NSString* userAgent = kStaticFileUserAgent;
+ if (browserState) {
+ requestGroupID = web::GenerateNewRequestGroupID();
+ userAgent = web::AddRequestGroupIDToUserAgent(userAgent, requestGroupID);
+ }
+ web::RegisterUserAgentForUIWebView(userAgent);
+ self = [super initWithFrame:frame];
+ if (self) {
+ DCHECK(!browserState || [requestGroupID length]);
+ if (browserState) {
+ userAgent_.reset([userAgent copy]);
+ // If |browserState| is not nullptr, associate this UIWebView with the
+ // given |requestGroupID| which cannot be nil or zero-length.
+ // RequestTracker keeps track of requests to this requestGroupID until
+ // this UIWebView is deallocated. UIWebViews not associated with a
+ // requestGroupID will issue requests in the global request context.
+ base::scoped_nsobject<NSString> requestGroupIDCopy([requestGroupID copy]);
+ requestTracker_ = web::RequestTrackerImpl::CreateTrackerForRequestGroupID(
+ requestGroupIDCopy,
+ browserState,
+ browserState->GetRequestContext(),
+ self);
+ }
+ }
+ return self;
+}
+
+- (void)dealloc {
+ if (requestTracker_.get())
+ requestTracker_->Close();
+ [super dealloc];
+}
+
++ (BOOL)isStaticFileRequest:(NSURLRequest*)request {
+ NSString* userAgent = [request allHTTPHeaderFields][@"User-Agent"];
+ if (userAgent) {
+ return [CRWStaticFileWebView isStaticFileUserAgent:userAgent];
+ }
+
+ // If a request originated from another file:/// page, the User-Agent
+ // will not be there. To be safe, check that the request is for image
+ // resources only.
+ // TODO(pkl): This current test to allow nil User-Agent and images to
+ // be loaded. A more air-tight implementation should inline images as
+ // "data" instead. See crbug.com/228603
+ NSString* suffix = [[request URL] pathExtension];
+ return [@[ @"png", @"jpg", @"jpeg" ] containsObject:[suffix lowercaseString]];
+}
+
++ (BOOL)isStaticFileUserAgent:(NSString*)userAgent {
+ return [userAgent hasPrefix:kStaticFileUserAgent];
+}
+
+#pragma mark -
+#pragma mark UIWebView
+
+// On iOS 6.0, UIWebView does not set the user agent for static file requests.
+// The solution consists of overriding |loadRequest:| and setting the user agent
+// before loading the request.
+- (void)loadRequest:(NSURLRequest*)request {
+ base::scoped_nsobject<NSMutableURLRequest> mutableRequest(
+ (NSMutableURLRequest*)[request mutableCopy]);
+ [mutableRequest setValue:userAgent_ forHTTPHeaderField:@"User-Agent"];
+ [super loadRequest:mutableRequest];
+}
+
+#pragma mark -
+#pragma mark CRWRequestTrackerDelegate
+
+- (BOOL)isForStaticFileRequests {
+ return YES;
+}
+
+- (void)handleResponseHeaders:(net::HttpResponseHeaders*)headers
+ requestUrl:(const GURL&)requestUrl {
+ std::string mimeType;
+ DCHECK(headers->GetMimeType(&mimeType) && mimeType == "text/html");
+ DCHECK(!headers->HasHeader("X-Auto-Login"));
+ DCHECK(!headers->HasHeader("content-disposition"));
+}
+
+// The following delegate functions are not expected to be called since
+// the page is intended to be a static HTML page.
+
+- (void)updatedSSLStatus:(const web::SSLStatus&)sslStatus
+ forPageUrl:(const GURL&)url
+ userInfo:(id)userInfo {
+ NOTREACHED();
+}
+
+- (void)presentSSLError:(const net::SSLInfo&)info
+ forSSLStatus:(const web::SSLStatus&)status
+ onUrl:(const GURL&)url
+ recoverable:(BOOL)recoverable
+ callback:(SSLErrorCallback)shouldContinue {
+ NOTREACHED();
+}
+
+- (void)updatedProgress:(float)progress {
+ NOTREACHED();
+}
+
+- (void)certificateUsed:(net::X509Certificate*)certificate
+ forHost:(const std::string&)host
+ status:(net::CertStatus)status {
+ NOTREACHED();
+}
+
+- (void)clearCertificates {
+ NOTREACHED();
+}
+
+@end
« no previous file with comments | « ios/web/web_state/ui/crw_static_file_web_view.h ('k') | ios/web/web_state/ui/crw_static_file_web_view_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698