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

Side by Side Diff: ios/web/web_state/ui/crw_web_controller.mm

Issue 1922833003: Use webView instance variable instead of getter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/web_state/ui/crw_web_controller.h" 5 #import "ios/web/web_state/ui/crw_web_controller.h"
6 6
7 #import <WebKit/WebKit.h> 7 #import <WebKit/WebKit.h>
8 8
9 #import <objc/runtime.h> 9 #import <objc/runtime.h>
10 #include <stddef.h> 10 #include <stddef.h>
(...skipping 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 return _UIDelegate.get(); 1117 return _UIDelegate.get();
1118 } 1118 }
1119 1119
1120 - (void)setUIDelegate:(id<CRWWebUserInterfaceDelegate>)UIDelegate { 1120 - (void)setUIDelegate:(id<CRWWebUserInterfaceDelegate>)UIDelegate {
1121 _UIDelegate.reset(UIDelegate); 1121 _UIDelegate.reset(UIDelegate);
1122 } 1122 }
1123 1123
1124 - (void)dealloc { 1124 - (void)dealloc {
1125 DCHECK([NSThread isMainThread]); 1125 DCHECK([NSThread isMainThread]);
1126 DCHECK(_isBeingDestroyed); // 'close' must have been called already. 1126 DCHECK(_isBeingDestroyed); // 'close' must have been called already.
1127 DCHECK(!self.webView); 1127 DCHECK(!_webView);
1128 _touchTrackingRecognizer.get().touchTrackingDelegate = nil; 1128 _touchTrackingRecognizer.get().touchTrackingDelegate = nil;
1129 [[_webViewProxy scrollViewProxy] removeObserver:self]; 1129 [[_webViewProxy scrollViewProxy] removeObserver:self];
1130 [[NSNotificationCenter defaultCenter] removeObserver:self]; 1130 [[NSNotificationCenter defaultCenter] removeObserver:self];
1131 [super dealloc]; 1131 [super dealloc];
1132 } 1132 }
1133 1133
1134 - (BOOL)runUnloadListenerBeforeClosing { 1134 - (BOOL)runUnloadListenerBeforeClosing {
1135 // There's not much that can be done since there's limited access to WebKit. 1135 // There's not much that can be done since there's limited access to WebKit.
1136 // Always return that it's ok to close immediately. 1136 // Always return that it's ok to close immediately.
1137 return YES; 1137 return YES;
1138 } 1138 }
1139 1139
1140 - (void)dismissKeyboard { 1140 - (void)dismissKeyboard {
1141 [self.webView endEditing:YES]; 1141 [_webView endEditing:YES];
1142 if ([self.nativeController respondsToSelector:@selector(dismissKeyboard)]) 1142 if ([self.nativeController respondsToSelector:@selector(dismissKeyboard)])
1143 [self.nativeController dismissKeyboard]; 1143 [self.nativeController dismissKeyboard];
1144 } 1144 }
1145 1145
1146 - (id<CRWNativeContent>)nativeController { 1146 - (id<CRWNativeContent>)nativeController {
1147 return [_containerView nativeController]; 1147 return [_containerView nativeController];
1148 } 1148 }
1149 1149
1150 - (void)setNativeController:(id<CRWNativeContent>)nativeController { 1150 - (void)setNativeController:(id<CRWNativeContent>)nativeController {
1151 // Check for pointer equality. 1151 // Check for pointer equality.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 1231
1232 - (void)handleLowMemory { 1232 - (void)handleLowMemory {
1233 [self removeWebViewAllowingCachedReconstruction:YES]; 1233 [self removeWebViewAllowingCachedReconstruction:YES];
1234 _touchTrackingRecognizer.get().touchTrackingDelegate = nil; 1234 _touchTrackingRecognizer.get().touchTrackingDelegate = nil;
1235 _touchTrackingRecognizer.reset(); 1235 _touchTrackingRecognizer.reset();
1236 [self resetContainerView]; 1236 [self resetContainerView];
1237 _usePlaceholderOverlay = YES; 1237 _usePlaceholderOverlay = YES;
1238 } 1238 }
1239 1239
1240 - (void)reinitializeWebViewAndReload:(BOOL)reload { 1240 - (void)reinitializeWebViewAndReload:(BOOL)reload {
1241 if (self.webView) { 1241 if (_webView) {
1242 [self removeWebViewAllowingCachedReconstruction:NO]; 1242 [self removeWebViewAllowingCachedReconstruction:NO];
1243 if (reload) { 1243 if (reload) {
1244 [self loadCurrentURLInWebView]; 1244 [self loadCurrentURLInWebView];
1245 } else { 1245 } else {
1246 // Clear the space for the web view to lazy load when needed. 1246 // Clear the space for the web view to lazy load when needed.
1247 _usePlaceholderOverlay = YES; 1247 _usePlaceholderOverlay = YES;
1248 _touchTrackingRecognizer.get().touchTrackingDelegate = nil; 1248 _touchTrackingRecognizer.get().touchTrackingDelegate = nil;
1249 _touchTrackingRecognizer.reset(); 1249 _touchTrackingRecognizer.reset();
1250 [self resetContainerView]; 1250 [self resetContainerView];
1251 } 1251 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 _isBeingDestroyed = YES; 1306 _isBeingDestroyed = YES;
1307 1307
1308 // Remove the web view now. Otherwise, delegate callbacks occur. 1308 // Remove the web view now. Otherwise, delegate callbacks occur.
1309 [self removeWebViewAllowingCachedReconstruction:NO]; 1309 [self removeWebViewAllowingCachedReconstruction:NO];
1310 1310
1311 _webStateImpl = nullptr; 1311 _webStateImpl = nullptr;
1312 } 1312 }
1313 1313
1314 - (void)checkLinkPresenceUnderGesture:(UIGestureRecognizer*)gestureRecognizer 1314 - (void)checkLinkPresenceUnderGesture:(UIGestureRecognizer*)gestureRecognizer
1315 completionHandler:(void (^)(BOOL))completionHandler { 1315 completionHandler:(void (^)(BOOL))completionHandler {
1316 CGPoint webViewPoint = [gestureRecognizer locationInView:self.webView]; 1316 CGPoint webViewPoint = [gestureRecognizer locationInView:_webView];
1317 base::WeakNSObject<CRWWebController> weakSelf(self); 1317 base::WeakNSObject<CRWWebController> weakSelf(self);
1318 [self 1318 [self
1319 fetchDOMElementAtPoint:webViewPoint 1319 fetchDOMElementAtPoint:webViewPoint
1320 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { 1320 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) {
1321 std::string link; 1321 std::string link;
1322 BOOL hasLink = 1322 BOOL hasLink =
1323 element && element->GetString("href", &link) && link.size(); 1323 element && element->GetString("href", &link) && link.size();
1324 completionHandler(hasLink); 1324 completionHandler(hasLink);
1325 }]; 1325 }];
1326 } 1326 }
(...skipping 10 matching lines...) Expand all
1337 1337
1338 // We don't want ongoing notification that the long press is held. 1338 // We don't want ongoing notification that the long press is held.
1339 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan) 1339 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan)
1340 return; 1340 return;
1341 1341
1342 if (!_DOMElementForLastTouch || _DOMElementForLastTouch->empty()) 1342 if (!_DOMElementForLastTouch || _DOMElementForLastTouch->empty())
1343 return; 1343 return;
1344 1344
1345 NSDictionary* info = 1345 NSDictionary* info =
1346 [self contextMenuInfoForElement:_DOMElementForLastTouch.get()]; 1346 [self contextMenuInfoForElement:_DOMElementForLastTouch.get()];
1347 CGPoint point = [gestureRecognizer locationInView:self.webView]; 1347 CGPoint point = [gestureRecognizer locationInView:_webView];
1348 1348
1349 // Cancelling all touches has the intended side effect of suppressing the 1349 // Cancelling all touches has the intended side effect of suppressing the
1350 // system's context menu. 1350 // system's context menu.
1351 [self cancelAllTouches]; 1351 [self cancelAllTouches];
1352 [self.UIDelegate webController:self 1352 [self.UIDelegate webController:self
1353 runContextMenu:info 1353 runContextMenu:info
1354 atPoint:point 1354 atPoint:point
1355 inView:self.webView]; 1355 inView:_webView];
1356 } 1356 }
1357 1357
1358 - (BOOL)supportsCustomContextMenu { 1358 - (BOOL)supportsCustomContextMenu {
1359 SEL runMenuSelector = @selector(webController:runContextMenu:atPoint:inView:); 1359 SEL runMenuSelector = @selector(webController:runContextMenu:atPoint:inView:);
1360 return [self.UIDelegate respondsToSelector:runMenuSelector]; 1360 return [self.UIDelegate respondsToSelector:runMenuSelector];
1361 } 1361 }
1362 1362
1363 - (void)cancelAllTouches { 1363 - (void)cancelAllTouches {
1364 // Disable web view scrolling. 1364 // Disable web view scrolling.
1365 CancelTouches(self.webScrollView.panGestureRecognizer); 1365 CancelTouches(self.webScrollView.panGestureRecognizer);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 } 1409 }
1410 1410
1411 - (CGPoint)scrollPosition { 1411 - (CGPoint)scrollPosition {
1412 CGPoint position = CGPointMake(0.0, 0.0); 1412 CGPoint position = CGPointMake(0.0, 0.0);
1413 if (!self.webScrollView) 1413 if (!self.webScrollView)
1414 return position; 1414 return position;
1415 return self.webScrollView.contentOffset; 1415 return self.webScrollView.contentOffset;
1416 } 1416 }
1417 1417
1418 - (BOOL)atTop { 1418 - (BOOL)atTop {
1419 if (!self.webView) 1419 if (!_webView)
1420 return YES; 1420 return YES;
1421 UIScrollView* scrollView = self.webScrollView; 1421 UIScrollView* scrollView = self.webScrollView;
1422 return scrollView.contentOffset.y == -scrollView.contentInset.top; 1422 return scrollView.contentOffset.y == -scrollView.contentInset.top;
1423 } 1423 }
1424 1424
1425 - (void)setShouldSuppressDialogs:(BOOL)shouldSuppressDialogs { 1425 - (void)setShouldSuppressDialogs:(BOOL)shouldSuppressDialogs {
1426 _shouldSuppressDialogs = shouldSuppressDialogs; 1426 _shouldSuppressDialogs = shouldSuppressDialogs;
1427 if (self.webView) { 1427 if (_webView) {
1428 NSString* const kSetSuppressDialogs = [NSString 1428 NSString* const kSetSuppressDialogs = [NSString
1429 stringWithFormat:@"__gCrWeb.setSuppressGeolocationDialogs(%d);", 1429 stringWithFormat:@"__gCrWeb.setSuppressGeolocationDialogs(%d);",
1430 shouldSuppressDialogs]; 1430 shouldSuppressDialogs];
1431 [self evaluateJavaScript:kSetSuppressDialogs stringResultHandler:nil]; 1431 [self evaluateJavaScript:kSetSuppressDialogs stringResultHandler:nil];
1432 } else { 1432 } else {
1433 _shouldSuppressDialogsOnWindowIDInjection = shouldSuppressDialogs; 1433 _shouldSuppressDialogsOnWindowIDInjection = shouldSuppressDialogs;
1434 } 1434 }
1435 } 1435 }
1436 1436
1437 - (GURL)currentURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel { 1437 - (GURL)currentURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel {
1438 DCHECK(trustLevel) << "Verification of the trustLevel state is mandatory"; 1438 DCHECK(trustLevel) << "Verification of the trustLevel state is mandatory";
1439 if (self.webView) { 1439 if (_webView) {
1440 GURL url([self webURLWithTrustLevel:trustLevel]); 1440 GURL url([self webURLWithTrustLevel:trustLevel]);
1441 // Web views treat all about: URLs as the same origin, which makes it 1441 // Web views treat all about: URLs as the same origin, which makes it
1442 // possible for pages to document.write into about:<foo> pages, where <foo> 1442 // possible for pages to document.write into about:<foo> pages, where <foo>
1443 // can be something misleading. Report any about: URL as about:blank to 1443 // can be something misleading. Report any about: URL as about:blank to
1444 // prevent that. See crbug.com/326118 1444 // prevent that. See crbug.com/326118
1445 if (url.scheme() == url::kAboutScheme) 1445 if (url.scheme() == url::kAboutScheme)
1446 return GURL(url::kAboutBlankURL); 1446 return GURL(url::kAboutBlankURL);
1447 return url; 1447 return url;
1448 } 1448 }
1449 // Any non-web URL source is trusted. 1449 // Any non-web URL source is trusted.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 case WKNavigationTypeOther: 1548 case WKNavigationTypeOther:
1549 return [self userClickedRecently]; 1549 return [self userClickedRecently];
1550 default: 1550 default:
1551 return NO; 1551 return NO;
1552 } 1552 }
1553 } 1553 }
1554 1554
1555 - (BOOL)isBackForwardListItemValid:(WKBackForwardListItem*)item { 1555 - (BOOL)isBackForwardListItemValid:(WKBackForwardListItem*)item {
1556 // The current back-forward list item MUST be in the WKWebView's back-forward 1556 // The current back-forward list item MUST be in the WKWebView's back-forward
1557 // list to be valid. 1557 // list to be valid.
1558 WKBackForwardList* list = [self.webView backForwardList]; 1558 WKBackForwardList* list = [_webView backForwardList];
1559 return list.currentItem == item || 1559 return list.currentItem == item ||
1560 [list.forwardList indexOfObject:item] != NSNotFound || 1560 [list.forwardList indexOfObject:item] != NSNotFound ||
1561 [list.backList indexOfObject:item] != NSNotFound; 1561 [list.backList indexOfObject:item] != NSNotFound;
1562 } 1562 }
1563 1563
1564 - (GURL)URLForHistoryNavigationFromItem:(web::NavigationItem*)fromItem 1564 - (GURL)URLForHistoryNavigationFromItem:(web::NavigationItem*)fromItem
1565 toItem:(web::NavigationItem*)toItem { 1565 toItem:(web::NavigationItem*)toItem {
1566 // If navigating with native API, i.e. using a back forward list item, 1566 // If navigating with native API, i.e. using a back forward list item,
1567 // hashchange events will be triggered automatically, so no URL tampering is 1567 // hashchange events will be triggered automatically, so no URL tampering is
1568 // required. 1568 // required.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1651 return _containerView; 1651 return _containerView;
1652 } 1652 }
1653 1653
1654 - (id<CRWWebViewProxy>)webViewProxy { 1654 - (id<CRWWebViewProxy>)webViewProxy {
1655 return _webViewProxy.get(); 1655 return _webViewProxy.get();
1656 } 1656 }
1657 1657
1658 - (UIView*)viewForPrinting { 1658 - (UIView*)viewForPrinting {
1659 // TODO(ios): crbug.com/227944. Printing is not supported for native 1659 // TODO(ios): crbug.com/227944. Printing is not supported for native
1660 // controllers. 1660 // controllers.
1661 return self.webView; 1661 return _webView;
1662 } 1662 }
1663 1663
1664 - (void)registerLoadRequest:(const GURL&)URL { 1664 - (void)registerLoadRequest:(const GURL&)URL {
1665 // Get the navigation type from the last main frame load request, and try to 1665 // Get the navigation type from the last main frame load request, and try to
1666 // map that to a PageTransition. 1666 // map that to a PageTransition.
1667 WKNavigationType navigationType = 1667 WKNavigationType navigationType =
1668 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType] 1668 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType]
1669 : WKNavigationTypeOther; 1669 : WKNavigationTypeOther;
1670 ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT; 1670 ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT;
1671 switch (navigationType) { 1671 switch (navigationType) {
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1878 // page, and should not be associated. 1878 // page, and should not be associated.
1879 if (_webUIManager) 1879 if (_webUIManager)
1880 return; 1880 return;
1881 1881
1882 web::WKBackForwardListItemHolder* holder = 1882 web::WKBackForwardListItemHolder* holder =
1883 [self currentBackForwardListItemHolder]; 1883 [self currentBackForwardListItemHolder];
1884 1884
1885 WKNavigationType navigationType = 1885 WKNavigationType navigationType =
1886 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType] 1886 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType]
1887 : WKNavigationTypeOther; 1887 : WKNavigationTypeOther;
1888 holder->set_back_forward_list_item( 1888 holder->set_back_forward_list_item([_webView backForwardList].currentItem);
1889 [self.webView backForwardList].currentItem);
1890 holder->set_navigation_type(navigationType); 1889 holder->set_navigation_type(navigationType);
1891 1890
1892 // Only update the MIME type in the holder if there was MIME type information 1891 // Only update the MIME type in the holder if there was MIME type information
1893 // as part of this pending load. It will be nil when doing a fast 1892 // as part of this pending load. It will be nil when doing a fast
1894 // back/forward navigation, for instance, because the callback that would 1893 // back/forward navigation, for instance, because the callback that would
1895 // populate it is not called in that flow. 1894 // populate it is not called in that flow.
1896 if ([_pendingNavigationInfo MIMEType]) 1895 if ([_pendingNavigationInfo MIMEType])
1897 holder->set_mime_type([_pendingNavigationInfo MIMEType]); 1896 holder->set_mime_type([_pendingNavigationInfo MIMEType]);
1898 } 1897 }
1899 1898
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
2098 } 2097 }
2099 2098
2100 // Display overlay view until current url has finished loading or delay and 2099 // Display overlay view until current url has finished loading or delay and
2101 // then transition away. 2100 // then transition away.
2102 if ((_overlayPreviewMode || _usePlaceholderOverlay) && !isChromeScheme) 2101 if ((_overlayPreviewMode || _usePlaceholderOverlay) && !isChromeScheme)
2103 [self addPlaceholderOverlay]; 2102 [self addPlaceholderOverlay];
2104 2103
2105 // Don't reset the overlay flag if in preview mode. 2104 // Don't reset the overlay flag if in preview mode.
2106 if (!_overlayPreviewMode) 2105 if (!_overlayPreviewMode)
2107 _usePlaceholderOverlay = NO; 2106 _usePlaceholderOverlay = NO;
2108 } else if (_requireReloadOnDisplay && self.webView) { 2107 } else if (_requireReloadOnDisplay && _webView) {
2109 _requireReloadOnDisplay = NO; 2108 _requireReloadOnDisplay = NO;
2110 [self addPlaceholderOverlay]; 2109 [self addPlaceholderOverlay];
2111 [self loadCurrentURL]; 2110 [self loadCurrentURL];
2112 } 2111 }
2113 } 2112 }
2114 2113
2115 - (BOOL)shouldReload:(const GURL&)destinationURL 2114 - (BOOL)shouldReload:(const GURL&)destinationURL
2116 transition:(ui::PageTransition)transition { 2115 transition:(ui::PageTransition)transition {
2117 // Do a reload if the user hits enter in the address bar or re-types a URL. 2116 // Do a reload if the user hits enter in the address bar or re-types a URL.
2118 CRWSessionController* sessionController = 2117 CRWSessionController* sessionController =
2119 _webStateImpl->GetNavigationManagerImpl().GetSessionController(); 2118 _webStateImpl->GetNavigationManagerImpl().GetSessionController();
2120 web::NavigationItem* item = 2119 web::NavigationItem* item =
2121 _webStateImpl->GetNavigationManagerImpl().GetVisibleItem(); 2120 _webStateImpl->GetNavigationManagerImpl().GetVisibleItem();
2122 return (transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) && item && 2121 return (transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) && item &&
2123 (destinationURL == item->GetURL() || 2122 (destinationURL == item->GetURL() ||
2124 destinationURL == [sessionController currentEntry].originalUrl); 2123 destinationURL == [sessionController currentEntry].originalUrl);
2125 } 2124 }
2126 2125
2127 // Reload either the web view or the native content depending on which is 2126 // Reload either the web view or the native content depending on which is
2128 // displayed. 2127 // displayed.
2129 - (void)reloadInternal { 2128 - (void)reloadInternal {
2130 // Clear last user interaction. 2129 // Clear last user interaction.
2131 // TODO(crbug.com/546337): Move to after the load commits, in the subclass 2130 // TODO(crbug.com/546337): Move to after the load commits, in the subclass
2132 // implementation. This will be inaccurate if the reload fails or is 2131 // implementation. This will be inaccurate if the reload fails or is
2133 // cancelled. 2132 // cancelled.
2134 _lastUserInteraction.reset(); 2133 _lastUserInteraction.reset();
2135 web::RecordAction(UserMetricsAction("Reload")); 2134 web::RecordAction(UserMetricsAction("Reload"));
2136 if (self.webView) { 2135 if (_webView) {
2137 web::NavigationItem* transientItem = 2136 web::NavigationItem* transientItem =
2138 _webStateImpl->GetNavigationManagerImpl().GetTransientItem(); 2137 _webStateImpl->GetNavigationManagerImpl().GetTransientItem();
2139 if (transientItem) { 2138 if (transientItem) {
2140 // If there's a transient item, a reload is considered a new navigation to 2139 // If there's a transient item, a reload is considered a new navigation to
2141 // the transient item's URL (as on other platforms). 2140 // the transient item's URL (as on other platforms).
2142 NavigationManager::WebLoadParams reloadParams(transientItem->GetURL()); 2141 NavigationManager::WebLoadParams reloadParams(transientItem->GetURL());
2143 reloadParams.transition_type = ui::PAGE_TRANSITION_RELOAD; 2142 reloadParams.transition_type = ui::PAGE_TRANSITION_RELOAD;
2144 reloadParams.extra_headers.reset( 2143 reloadParams.extra_headers.reset(
2145 [transientItem->GetHttpRequestHeaders() copy]); 2144 [transientItem->GetHttpRequestHeaders() copy]);
2146 [self loadWithParams:reloadParams]; 2145 [self loadWithParams:reloadParams];
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2201 break; 2200 break;
2202 case web::PAGE_LOADED: 2201 case web::PAGE_LOADED:
2203 break; 2202 break;
2204 } 2203 }
2205 } 2204 }
2206 2205
2207 - (void)prepareForGoBack { 2206 - (void)prepareForGoBack {
2208 // Make sure any transitions that may have occurred have been seen and acted 2207 // Make sure any transitions that may have occurred have been seen and acted
2209 // on by the CRWWebController, so the history stack and state of the 2208 // on by the CRWWebController, so the history stack and state of the
2210 // CRWWebController is 100% up to date before the stack navigation starts. 2209 // CRWWebController is 100% up to date before the stack navigation starts.
2211 if (self.webView) { 2210 if (_webView) {
2212 [self injectWindowID]; 2211 [self injectWindowID];
2213 } 2212 }
2214 2213
2215 bool wasShowingInterstitial = _webStateImpl->IsShowingWebInterstitial(); 2214 bool wasShowingInterstitial = _webStateImpl->IsShowingWebInterstitial();
2216 2215
2217 // Before changing the current session history entry, record the tab state. 2216 // Before changing the current session history entry, record the tab state.
2218 if (!wasShowingInterstitial) { 2217 if (!wasShowingInterstitial) {
2219 [self recordStateInHistory]; 2218 [self recordStateInHistory];
2220 } 2219 }
2221 } 2220 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 [self loadCompleteWithSuccess:YES]; 2270 [self loadCompleteWithSuccess:YES];
2272 } 2271 }
2273 2272
2274 - (void)loadCompleteWithSuccess:(BOOL)loadSuccess { 2273 - (void)loadCompleteWithSuccess:(BOOL)loadSuccess {
2275 [self removePlaceholderOverlay]; 2274 [self removePlaceholderOverlay];
2276 // The webView may have been torn down (or replaced by a native view). Be 2275 // The webView may have been torn down (or replaced by a native view). Be
2277 // safe and do nothing if that's happened. 2276 // safe and do nothing if that's happened.
2278 if (_loadPhase != web::PAGE_LOADING) 2277 if (_loadPhase != web::PAGE_LOADING)
2279 return; 2278 return;
2280 2279
2281 DCHECK(self.webView); 2280 DCHECK(_webView);
2282 2281
2283 const GURL currentURL([self currentURL]); 2282 const GURL currentURL([self currentURL]);
2284 2283
2285 _loadPhase = web::PAGE_LOADED; 2284 _loadPhase = web::PAGE_LOADED;
2286 2285
2287 [self optOutScrollsToTopForSubviews]; 2286 [self optOutScrollsToTopForSubviews];
2288 2287
2289 // Ensure the URL is as expected (and already reported to the delegate). 2288 // Ensure the URL is as expected (and already reported to the delegate).
2290 DCHECK(currentURL == _lastRegisteredRequestURL) 2289 DCHECK(currentURL == _lastRegisteredRequestURL)
2291 << std::endl 2290 << std::endl
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2371 base::JSONReader::Read(base::SysNSStringToUTF8(stringResult))); 2370 base::JSONReader::Read(base::SysNSStringToUTF8(stringResult)));
2372 handler(std::move(result), error); 2371 handler(std::move(result), error);
2373 } 2372 }
2374 }]; 2373 }];
2375 } 2374 }
2376 2375
2377 - (void)addGestureRecognizerToWebView:(UIGestureRecognizer*)recognizer { 2376 - (void)addGestureRecognizerToWebView:(UIGestureRecognizer*)recognizer {
2378 if ([_gestureRecognizers containsObject:recognizer]) 2377 if ([_gestureRecognizers containsObject:recognizer])
2379 return; 2378 return;
2380 2379
2381 [self.webView addGestureRecognizer:recognizer]; 2380 [_webView addGestureRecognizer:recognizer];
2382 [_gestureRecognizers addObject:recognizer]; 2381 [_gestureRecognizers addObject:recognizer];
2383 } 2382 }
2384 2383
2385 - (void)removeGestureRecognizerFromWebView:(UIGestureRecognizer*)recognizer { 2384 - (void)removeGestureRecognizerFromWebView:(UIGestureRecognizer*)recognizer {
2386 if (![_gestureRecognizers containsObject:recognizer]) 2385 if (![_gestureRecognizers containsObject:recognizer])
2387 return; 2386 return;
2388 2387
2389 [self.webView removeGestureRecognizer:recognizer]; 2388 [_webView removeGestureRecognizer:recognizer];
2390 [_gestureRecognizers removeObject:recognizer]; 2389 [_gestureRecognizers removeObject:recognizer];
2391 } 2390 }
2392 2391
2393 - (void)addToolbarViewToWebView:(UIView*)toolbarView { 2392 - (void)addToolbarViewToWebView:(UIView*)toolbarView {
2394 DCHECK(toolbarView); 2393 DCHECK(toolbarView);
2395 if ([_webViewToolbars containsObject:toolbarView]) 2394 if ([_webViewToolbars containsObject:toolbarView])
2396 return; 2395 return;
2397 [_webViewToolbars addObject:toolbarView]; 2396 [_webViewToolbars addObject:toolbarView];
2398 if (self.webView) 2397 if (_webView)
2399 [_containerView addToolbar:toolbarView]; 2398 [_containerView addToolbar:toolbarView];
2400 } 2399 }
2401 2400
2402 - (void)removeToolbarViewFromWebView:(UIView*)toolbarView { 2401 - (void)removeToolbarViewFromWebView:(UIView*)toolbarView {
2403 if (![_webViewToolbars containsObject:toolbarView]) 2402 if (![_webViewToolbars containsObject:toolbarView])
2404 return; 2403 return;
2405 [_webViewToolbars removeObject:toolbarView]; 2404 [_webViewToolbars removeObject:toolbarView];
2406 if (self.webView) 2405 if (_webView)
2407 [_containerView removeToolbar:toolbarView]; 2406 [_containerView removeToolbar:toolbarView];
2408 } 2407 }
2409 2408
2410 - (CRWJSInjectionReceiver*)jsInjectionReceiver { 2409 - (CRWJSInjectionReceiver*)jsInjectionReceiver {
2411 return _jsInjectionReceiver; 2410 return _jsInjectionReceiver;
2412 } 2411 }
2413 2412
2414 - (BOOL)shouldClosePageOnNativeApplicationLoad { 2413 - (BOOL)shouldClosePageOnNativeApplicationLoad {
2415 // The page should be closed if it was initiated by the DOM and there has been 2414 // The page should be closed if it was initiated by the DOM and there has been
2416 // no user interaction with the page since the web view was created, or if 2415 // no user interaction with the page since the web view was created, or if
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2467 (CRWWebControllerContainerView*)containerView { 2466 (CRWWebControllerContainerView*)containerView {
2468 return [self headerHeight]; 2467 return [self headerHeight];
2469 } 2468 }
2470 2469
2471 #pragma mark - 2470 #pragma mark -
2472 #pragma mark CRWJSInjectionEvaluator Methods 2471 #pragma mark CRWJSInjectionEvaluator Methods
2473 2472
2474 - (void)evaluateJavaScript:(NSString*)script 2473 - (void)evaluateJavaScript:(NSString*)script
2475 stringResultHandler:(web::JavaScriptCompletion)handler { 2474 stringResultHandler:(web::JavaScriptCompletion)handler {
2476 NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script]; 2475 NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script];
2477 web::EvaluateJavaScript(self.webView, safeScript, handler); 2476 web::EvaluateJavaScript(_webView, safeScript, handler);
2478 } 2477 }
2479 2478
2480 - (void)executeJavaScript:(NSString*)script 2479 - (void)executeJavaScript:(NSString*)script
2481 completionHandler:(web::JavaScriptResultBlock)completionHandler { 2480 completionHandler:(web::JavaScriptResultBlock)completionHandler {
2482 NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script]; 2481 NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script];
2483 web::ExecuteJavaScript(self.webView, safeScript, completionHandler); 2482 web::ExecuteJavaScript(_webView, safeScript, completionHandler);
2484 } 2483 }
2485 2484
2486 - (BOOL)scriptHasBeenInjectedForClass:(Class)JSInjectionManagerClass 2485 - (BOOL)scriptHasBeenInjectedForClass:(Class)JSInjectionManagerClass
2487 presenceBeacon:(NSString*)beacon { 2486 presenceBeacon:(NSString*)beacon {
2488 return [_injectedScriptManagers containsObject:JSInjectionManagerClass]; 2487 return [_injectedScriptManagers containsObject:JSInjectionManagerClass];
2489 } 2488 }
2490 2489
2491 - (void)injectScript:(NSString*)script forClass:(Class)JSInjectionManagerClass { 2490 - (void)injectScript:(NSString*)script forClass:(Class)JSInjectionManagerClass {
2492 // Skip evaluation if there's no content (e.g., if what's being injected is 2491 // Skip evaluation if there's no content (e.g., if what's being injected is
2493 // an umbrella manager). 2492 // an umbrella manager).
2494 if ([script length]) { 2493 if ([script length]) {
2495 // Every injection except windowID requires windowID check. 2494 // Every injection except windowID requires windowID check.
2496 if (JSInjectionManagerClass != [CRWJSWindowIdManager class]) 2495 if (JSInjectionManagerClass != [CRWJSWindowIdManager class])
2497 script = [self scriptByAddingWindowIDCheckForScript:script]; 2496 script = [self scriptByAddingWindowIDCheckForScript:script];
2498 web::ExecuteJavaScript(self.webView, script, nil); 2497 web::ExecuteJavaScript(_webView, script, nil);
2499 } 2498 }
2500 [_injectedScriptManagers addObject:JSInjectionManagerClass]; 2499 [_injectedScriptManagers addObject:JSInjectionManagerClass];
2501 } 2500 }
2502 2501
2503 #pragma mark - 2502 #pragma mark -
2504 2503
2505 - (void)evaluateUserJavaScript:(NSString*)script { 2504 - (void)evaluateUserJavaScript:(NSString*)script {
2506 [self setUserInteractionRegistered:YES]; 2505 [self setUserInteractionRegistered:YES];
2507 web::ExecuteJavaScript(self.webView, script, nil); 2506 web::ExecuteJavaScript(_webView, script, nil);
2508 } 2507 }
2509 2508
2510 - (BOOL)respondToMessage:(base::DictionaryValue*)message 2509 - (BOOL)respondToMessage:(base::DictionaryValue*)message
2511 userIsInteracting:(BOOL)userIsInteracting 2510 userIsInteracting:(BOOL)userIsInteracting
2512 originURL:(const GURL&)originURL { 2511 originURL:(const GURL&)originURL {
2513 std::string command; 2512 std::string command;
2514 if (!message->GetString("command", &command)) { 2513 if (!message->GetString("command", &command)) {
2515 DLOG(WARNING) << "JS message parameter not found: command"; 2514 DLOG(WARNING) << "JS message parameter not found: command";
2516 return NO; 2515 return NO;
2517 } 2516 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2630 return NO; 2629 return NO;
2631 } 2630 }
2632 base::DictionaryValue* command = nullptr; 2631 base::DictionaryValue* command = nullptr;
2633 if (!message->GetDictionary("crwCommand", &command)) { 2632 if (!message->GetDictionary("crwCommand", &command)) {
2634 return NO; 2633 return NO;
2635 } 2634 }
2636 if ([scriptMessage.name isEqualToString:kScriptImmediateName] || 2635 if ([scriptMessage.name isEqualToString:kScriptImmediateName] ||
2637 [scriptMessage.name isEqualToString:kScriptMessageName]) { 2636 [scriptMessage.name isEqualToString:kScriptMessageName]) {
2638 return [self respondToMessage:command 2637 return [self respondToMessage:command
2639 userIsInteracting:[self userIsInteracting] 2638 userIsInteracting:[self userIsInteracting]
2640 originURL:net::GURLWithNSURL([self.webView URL])]; 2639 originURL:net::GURLWithNSURL([_webView URL])];
2641 } 2640 }
2642 2641
2643 NOTREACHED(); 2642 NOTREACHED();
2644 return NO; 2643 return NO;
2645 } 2644 }
2646 2645
2647 #pragma mark - 2646 #pragma mark -
2648 #pragma mark JavaScript message handlers 2647 #pragma mark JavaScript message handlers
2649 2648
2650 - (BOOL)handleAddPluginPlaceholdersMessage:(base::DictionaryValue*)message 2649 - (BOOL)handleAddPluginPlaceholdersMessage:(base::DictionaryValue*)message
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
3289 if ([self shouldClosePageOnNativeApplicationLoad]) 3288 if ([self shouldClosePageOnNativeApplicationLoad])
3290 [_delegate webPageOrderedClose]; 3289 [_delegate webPageOrderedClose];
3291 [self stopLoading]; 3290 [self stopLoading];
3292 [_openedApplicationURL addObject:request.URL]; 3291 [_openedApplicationURL addObject:request.URL];
3293 return NO; 3292 return NO;
3294 } 3293 }
3295 3294
3296 // The WebDelegate may instruct the CRWWebController to stop loading, and 3295 // The WebDelegate may instruct the CRWWebController to stop loading, and
3297 // instead instruct the next page to be loaded in an animation. 3296 // instead instruct the next page to be loaded in an animation.
3298 GURL mainDocumentURL = net::GURLWithNSURL(request.mainDocumentURL); 3297 GURL mainDocumentURL = net::GURLWithNSURL(request.mainDocumentURL);
3299 DCHECK(self.webView); 3298 DCHECK(_webView);
3300 if (![self shouldOpenURL:requestURL 3299 if (![self shouldOpenURL:requestURL
3301 mainDocumentURL:mainDocumentURL 3300 mainDocumentURL:mainDocumentURL
3302 linkClicked:isLinkClick]) { 3301 linkClicked:isLinkClick]) {
3303 return NO; 3302 return NO;
3304 } 3303 }
3305 3304
3306 // If the URL doesn't look like one we can show, try to open the link with an 3305 // If the URL doesn't look like one we can show, try to open the link with an
3307 // external application. 3306 // external application.
3308 // TODO(droger): Check transition type before opening an external 3307 // TODO(droger): Check transition type before opening an external
3309 // application? For example, only allow it for TYPED and LINK transitions. 3308 // application? For example, only allow it for TYPED and LINK transitions.
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
3495 } 3494 }
3496 3495
3497 // This is custom long press gesture recognizer. By the time the gesture is 3496 // This is custom long press gesture recognizer. By the time the gesture is
3498 // recognized the web controller needs to know if there is a link under the 3497 // recognized the web controller needs to know if there is a link under the
3499 // touch. If there a link, the web controller will reject system's context 3498 // touch. If there a link, the web controller will reject system's context
3500 // menu and show another one. If for some reason context menu info is not 3499 // menu and show another one. If for some reason context menu info is not
3501 // fetched - system context menu will be shown. 3500 // fetched - system context menu will be shown.
3502 [self setDOMElementForLastTouch:nullptr]; 3501 [self setDOMElementForLastTouch:nullptr];
3503 base::WeakNSObject<CRWWebController> weakSelf(self); 3502 base::WeakNSObject<CRWWebController> weakSelf(self);
3504 [self 3503 [self
3505 fetchDOMElementAtPoint:[touch locationInView:self.webView] 3504 fetchDOMElementAtPoint:[touch locationInView:_webView]
3506 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { 3505 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) {
3507 [weakSelf setDOMElementForLastTouch:std::move(element)]; 3506 [weakSelf setDOMElementForLastTouch:std::move(element)];
3508 }]; 3507 }];
3509 return YES; 3508 return YES;
3510 } 3509 }
3511 3510
3512 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer { 3511 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
3513 // Expect only _contextMenuRecognizer. 3512 // Expect only _contextMenuRecognizer.
3514 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); 3513 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]);
3515 if (!self.webView || ![self supportsCustomContextMenu]) { 3514 if (!_webView || ![self supportsCustomContextMenu]) {
3516 // Show the context menu iff currently displaying a web view. 3515 // Show the context menu iff currently displaying a web view.
3517 // Do nothing for native views. 3516 // Do nothing for native views.
3518 return NO; 3517 return NO;
3519 } 3518 }
3520 3519
3521 // Fetching is considered as successful even if |_DOMElementForLastTouch| is 3520 // Fetching is considered as successful even if |_DOMElementForLastTouch| is
3522 // empty. However if |_DOMElementForLastTouch| is empty then custom context 3521 // empty. However if |_DOMElementForLastTouch| is empty then custom context
3523 // menu should not be shown. 3522 // menu should not be shown.
3524 UMA_HISTOGRAM_BOOLEAN("WebController.FetchContextMenuInfoAsyncSucceeded", 3523 UMA_HISTOGRAM_BOOLEAN("WebController.FetchContextMenuInfoAsyncSucceeded",
3525 !!_DOMElementForLastTouch); 3524 !!_DOMElementForLastTouch);
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
3850 if (!_overlayPreviewMode && _placeholderOverlayView) { 3849 if (!_overlayPreviewMode && _placeholderOverlayView) {
3851 [self resetContainerView]; 3850 [self resetContainerView];
3852 // Reset |_placeholderOverlayView| directly instead of calling 3851 // Reset |_placeholderOverlayView| directly instead of calling
3853 // -removePlaceholderOverlay, which removes |_placeholderOverlayView| in an 3852 // -removePlaceholderOverlay, which removes |_placeholderOverlayView| in an
3854 // animation. 3853 // animation.
3855 [_placeholderOverlayView removeFromSuperview]; 3854 [_placeholderOverlayView removeFromSuperview];
3856 _placeholderOverlayView.reset(); 3855 _placeholderOverlayView.reset();
3857 // There are cases when resetting the contentView, above, may happen after 3856 // There are cases when resetting the contentView, above, may happen after
3858 // the web view has been created. Re-add it here, rather than 3857 // the web view has been created. Re-add it here, rather than
3859 // relying on a subsequent call to loadCurrentURLInWebView. 3858 // relying on a subsequent call to loadCurrentURLInWebView.
3860 if (self.webView) { 3859 if (_webView) {
3861 [[self view] addSubview:self.webView]; 3860 [[self view] addSubview:_webView];
3862 } 3861 }
3863 } 3862 }
3864 } 3863 }
3865 3864
3866 #pragma mark - 3865 #pragma mark -
3867 #pragma mark Session Information 3866 #pragma mark Session Information
3868 3867
3869 - (CRWSessionController*)sessionController { 3868 - (CRWSessionController*)sessionController {
3870 return _webStateImpl 3869 return _webStateImpl
3871 ? _webStateImpl->GetNavigationManagerImpl().GetSessionController() 3870 ? _webStateImpl->GetNavigationManagerImpl().GetSessionController()
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3987 } 3986 }
3988 3987
3989 - (void)restoreStateFromHistory { 3988 - (void)restoreStateFromHistory {
3990 CRWSessionEntry* current = [self currentSessionEntry]; 3989 CRWSessionEntry* current = [self currentSessionEntry];
3991 if ([current navigationItem]) 3990 if ([current navigationItem])
3992 self.pageDisplayState = [current navigationItem]->GetPageDisplayState(); 3991 self.pageDisplayState = [current navigationItem]->GetPageDisplayState();
3993 } 3992 }
3994 3993
3995 - (web::PageDisplayState)pageDisplayState { 3994 - (web::PageDisplayState)pageDisplayState {
3996 web::PageDisplayState displayState; 3995 web::PageDisplayState displayState;
3997 if (self.webView) { 3996 if (_webView) {
3998 CGPoint scrollOffset = [self scrollPosition]; 3997 CGPoint scrollOffset = [self scrollPosition];
3999 displayState.scroll_state().set_offset_x(std::floor(scrollOffset.x)); 3998 displayState.scroll_state().set_offset_x(std::floor(scrollOffset.x));
4000 displayState.scroll_state().set_offset_y(std::floor(scrollOffset.y)); 3999 displayState.scroll_state().set_offset_y(std::floor(scrollOffset.y));
4001 UIScrollView* scrollView = self.webScrollView; 4000 UIScrollView* scrollView = self.webScrollView;
4002 displayState.zoom_state().set_minimum_zoom_scale( 4001 displayState.zoom_state().set_minimum_zoom_scale(
4003 scrollView.minimumZoomScale); 4002 scrollView.minimumZoomScale);
4004 displayState.zoom_state().set_maximum_zoom_scale( 4003 displayState.zoom_state().set_maximum_zoom_scale(
4005 scrollView.maximumZoomScale); 4004 scrollView.maximumZoomScale);
4006 displayState.zoom_state().set_zoom_scale(scrollView.zoomScale); 4005 displayState.zoom_state().set_zoom_scale(scrollView.zoomScale);
4007 } else { 4006 } else {
4008 // TODO(crbug.com/546146): Handle native views. 4007 // TODO(crbug.com/546146): Handle native views.
4009 } 4008 }
4010 return displayState; 4009 return displayState;
4011 } 4010 }
4012 4011
4013 - (void)setPageDisplayState:(web::PageDisplayState)displayState { 4012 - (void)setPageDisplayState:(web::PageDisplayState)displayState {
4014 if (!displayState.IsValid()) 4013 if (!displayState.IsValid())
4015 return; 4014 return;
4016 if (self.webView) { 4015 if (_webView) {
4017 // Page state is restored after a page load completes. If the user has 4016 // Page state is restored after a page load completes. If the user has
4018 // scrolled or changed the zoom scale while the page is still loading, don't 4017 // scrolled or changed the zoom scale while the page is still loading, don't
4019 // restore any state since it will confuse the user. 4018 // restore any state since it will confuse the user.
4020 web::PageDisplayState currentPageDisplayState = self.pageDisplayState; 4019 web::PageDisplayState currentPageDisplayState = self.pageDisplayState;
4021 if (currentPageDisplayState.scroll_state().offset_x() == 4020 if (currentPageDisplayState.scroll_state().offset_x() ==
4022 _displayStateOnStartLoading.scroll_state().offset_x() && 4021 _displayStateOnStartLoading.scroll_state().offset_x() &&
4023 currentPageDisplayState.scroll_state().offset_y() == 4022 currentPageDisplayState.scroll_state().offset_y() ==
4024 _displayStateOnStartLoading.scroll_state().offset_y() && 4023 _displayStateOnStartLoading.scroll_state().offset_y() &&
4025 !_pageHasZoomed) { 4024 !_pageHasZoomed) {
4026 [self applyPageDisplayState:displayState]; 4025 [self applyPageDisplayState:displayState];
(...skipping 27 matching lines...) Expand all
4054 4053
4055 - (void)orientationDidChange { 4054 - (void)orientationDidChange {
4056 // When rotating, the available zoom scale range may change, zoomScale's 4055 // When rotating, the available zoom scale range may change, zoomScale's
4057 // percentage into this range should remain constant. However, there are 4056 // percentage into this range should remain constant. However, there are
4058 // two known bugs with respect to adjusting the zoomScale on rotation: 4057 // two known bugs with respect to adjusting the zoomScale on rotation:
4059 // - WKWebView sometimes erroneously resets the scroll view's zoom scale to 4058 // - WKWebView sometimes erroneously resets the scroll view's zoom scale to
4060 // an incorrect value ( rdar://20100815 ). 4059 // an incorrect value ( rdar://20100815 ).
4061 // - After zooming occurs in a UIWebView that's displaying a page with a hard- 4060 // - After zooming occurs in a UIWebView that's displaying a page with a hard-
4062 // coded viewport width, the zoom will not be updated upon rotation 4061 // coded viewport width, the zoom will not be updated upon rotation
4063 // ( crbug.com/485055 ). 4062 // ( crbug.com/485055 ).
4064 if (!self.webView) 4063 if (!_webView)
4065 return; 4064 return;
4066 web::NavigationItem* currentItem = self.currentNavItem; 4065 web::NavigationItem* currentItem = self.currentNavItem;
4067 if (!currentItem) 4066 if (!currentItem)
4068 return; 4067 return;
4069 web::PageDisplayState displayState = currentItem->GetPageDisplayState(); 4068 web::PageDisplayState displayState = currentItem->GetPageDisplayState();
4070 if (!displayState.IsValid()) 4069 if (!displayState.IsValid())
4071 return; 4070 return;
4072 CGFloat zoomPercentage = (displayState.zoom_state().zoom_scale() - 4071 CGFloat zoomPercentage = (displayState.zoom_state().zoom_scale() -
4073 displayState.zoom_state().minimum_zoom_scale()) / 4072 displayState.zoom_state().minimum_zoom_scale()) /
4074 displayState.zoom_state().GetMinMaxZoomDifference(); 4073 displayState.zoom_state().GetMinMaxZoomDifference();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4110 if (isUserScalable) { 4109 if (isUserScalable) {
4111 [self prepareToApplyWebViewScrollZoomScale]; 4110 [self prepareToApplyWebViewScrollZoomScale];
4112 [self applyWebViewScrollZoomScaleFromZoomState:displayState.zoom_state()]; 4111 [self applyWebViewScrollZoomScaleFromZoomState:displayState.zoom_state()];
4113 [self finishApplyingWebViewScrollZoomScale]; 4112 [self finishApplyingWebViewScrollZoomScale];
4114 } 4113 }
4115 [self applyWebViewScrollOffsetFromScrollState:displayState.scroll_state()]; 4114 [self applyWebViewScrollOffsetFromScrollState:displayState.scroll_state()];
4116 _applyingPageState = NO; 4115 _applyingPageState = NO;
4117 } 4116 }
4118 4117
4119 - (void)prepareToApplyWebViewScrollZoomScale { 4118 - (void)prepareToApplyWebViewScrollZoomScale {
4120 id webView = self.webView; 4119 id webView = _webView;
4121 if (![webView respondsToSelector:@selector(viewForZoomingInScrollView:)]) { 4120 if (![webView respondsToSelector:@selector(viewForZoomingInScrollView:)]) {
4122 return; 4121 return;
4123 } 4122 }
4124 4123
4125 UIView* contentView = [webView viewForZoomingInScrollView:self.webScrollView]; 4124 UIView* contentView = [webView viewForZoomingInScrollView:self.webScrollView];
4126 4125
4127 if ([webView 4126 if ([webView
4128 respondsToSelector:@selector(scrollViewWillBeginZooming:withView:)]) { 4127 respondsToSelector:@selector(scrollViewWillBeginZooming:withView:)]) {
4129 [webView scrollViewWillBeginZooming:self.webScrollView 4128 [webView scrollViewWillBeginZooming:self.webScrollView
4130 withView:contentView]; 4129 withView:contentView];
4131 } 4130 }
4132 } 4131 }
4133 4132
4134 - (void)finishApplyingWebViewScrollZoomScale { 4133 - (void)finishApplyingWebViewScrollZoomScale {
4135 id webView = self.webView; 4134 id webView = _webView;
4136 if ([webView respondsToSelector:@selector(scrollViewDidEndZooming: 4135 if ([webView respondsToSelector:@selector(scrollViewDidEndZooming:
4137 withView: 4136 withView:
4138 atScale:)] && 4137 atScale:)] &&
4139 [webView respondsToSelector:@selector(viewForZoomingInScrollView:)]) { 4138 [webView respondsToSelector:@selector(viewForZoomingInScrollView:)]) {
4140 // This correctly sets the content's frame in the scroll view to 4139 // This correctly sets the content's frame in the scroll view to
4141 // fit the web page and upscales the content so that it isn't 4140 // fit the web page and upscales the content so that it isn't
4142 // blurry. 4141 // blurry.
4143 UIView* contentView = 4142 UIView* contentView =
4144 [webView viewForZoomingInScrollView:self.webScrollView]; 4143 [webView viewForZoomingInScrollView:self.webScrollView];
4145 [webView scrollViewDidEndZooming:self.webScrollView 4144 [webView scrollViewDidEndZooming:self.webScrollView
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4180 [weakScrollView setContentOffset:scrollOffset]; 4179 [weakScrollView setContentOffset:scrollOffset];
4181 } copy]); 4180 } copy]);
4182 [_pendingLoadCompleteActions addObject:action]; 4181 [_pendingLoadCompleteActions addObject:action];
4183 } 4182 }
4184 } 4183 }
4185 4184
4186 #pragma mark - 4185 #pragma mark -
4187 #pragma mark Web Page Features 4186 #pragma mark Web Page Features
4188 4187
4189 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler { 4188 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler {
4190 if (!self.webView) { 4189 if (!_webView) {
4191 handler(0); 4190 handler(0);
4192 return; 4191 return;
4193 } 4192 }
4194 4193
4195 [self evaluateJavaScript:@"__gCrWeb.getPageWidth();" 4194 [self evaluateJavaScript:@"__gCrWeb.getPageWidth();"
4196 stringResultHandler:^(NSString* pageWidthAsString, NSError*) { 4195 stringResultHandler:^(NSString* pageWidthAsString, NSError*) {
4197 handler([pageWidthAsString floatValue]); 4196 handler([pageWidthAsString floatValue]);
4198 }]; 4197 }];
4199 } 4198 }
4200 4199
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
4436 } 4435 }
4437 4436
4438 if (!_SSLStatusUpdater) { 4437 if (!_SSLStatusUpdater) {
4439 _SSLStatusUpdater.reset([[CRWSSLStatusUpdater alloc] 4438 _SSLStatusUpdater.reset([[CRWSSLStatusUpdater alloc]
4440 initWithDataSource:self 4439 initWithDataSource:self
4441 navigationManager:navManager 4440 navigationManager:navManager
4442 certGroupID:self.certGroupID]); 4441 certGroupID:self.certGroupID]);
4443 [_SSLStatusUpdater setDelegate:self]; 4442 [_SSLStatusUpdater setDelegate:self];
4444 } 4443 }
4445 NSString* host = base::SysUTF8ToNSString(_documentURL.host()); 4444 NSString* host = base::SysUTF8ToNSString(_documentURL.host());
4446 NSArray* certChain = [self.webView certificateChain]; 4445 NSArray* certChain = [_webView certificateChain];
4447 BOOL hasOnlySecureContent = [self.webView hasOnlySecureContent]; 4446 BOOL hasOnlySecureContent = [_webView hasOnlySecureContent];
4448 [_SSLStatusUpdater updateSSLStatusForNavigationItem:currentNavItem 4447 [_SSLStatusUpdater updateSSLStatusForNavigationItem:currentNavItem
4449 withCertHost:host 4448 withCertHost:host
4450 certChain:certChain 4449 certChain:certChain
4451 hasOnlySecureContent:hasOnlySecureContent]; 4450 hasOnlySecureContent:hasOnlySecureContent];
4452 } 4451 }
4453 4452
4454 - (void)didUpdateSSLStatusForCurrentNavigationItem { 4453 - (void)didUpdateSSLStatusForCurrentNavigationItem {
4455 if ([_delegate respondsToSelector: 4454 if ([_delegate respondsToSelector:
4456 @selector( 4455 @selector(
4457 webControllerDidUpdateSSLStatusForCurrentNavigationItem:)]) { 4456 webControllerDidUpdateSSLStatusForCurrentNavigationItem:)]) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
4545 [self ensureWebViewCreatedWithConfiguration:config]; 4544 [self ensureWebViewCreatedWithConfiguration:config];
4546 } 4545 }
4547 4546
4548 - (void)ensureWebViewCreatedWithConfiguration:(WKWebViewConfiguration*)config { 4547 - (void)ensureWebViewCreatedWithConfiguration:(WKWebViewConfiguration*)config {
4549 if (!_webView) { 4548 if (!_webView) {
4550 [self setWebView:[self createWebViewWithConfiguration:config]]; 4549 [self setWebView:[self createWebViewWithConfiguration:config]];
4551 // The following is not called in -setWebView: as the latter used in unit 4550 // The following is not called in -setWebView: as the latter used in unit
4552 // tests with fake web view, which cannot be added to view hierarchy. 4551 // tests with fake web view, which cannot be added to view hierarchy.
4553 CHECK(_webUsageEnabled) << "Tried to create a web view while suspended!"; 4552 CHECK(_webUsageEnabled) << "Tried to create a web view while suspended!";
4554 4553
4555 UIView* webView = self.webView; 4554 DCHECK(_webView);
4556 DCHECK(webView);
4557 4555
4558 [webView setTag:kWebViewTag]; 4556 [_webView setTag:kWebViewTag];
4559 [webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 4557 [_webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
4560 UIViewAutoresizingFlexibleHeight]; 4558 UIViewAutoresizingFlexibleHeight];
4561 [webView setBackgroundColor:[UIColor colorWithWhite:0.2 alpha:1.0]]; 4559 [_webView setBackgroundColor:[UIColor colorWithWhite:0.2 alpha:1.0]];
4562 4560
4563 // Create a dependency between the |webView| pan gesture and BVC side swipe 4561 // Create a dependency between the |webView| pan gesture and BVC side swipe
4564 // gestures. Note: This needs to be added before the longPress recognizers 4562 // gestures. Note: This needs to be added before the longPress recognizers
4565 // below, or the longPress appears to deadlock the remaining recognizers, 4563 // below, or the longPress appears to deadlock the remaining recognizers,
4566 // thereby breaking scroll. 4564 // thereby breaking scroll.
4567 NSSet* recognizers = [_swipeRecognizerProvider swipeRecognizers]; 4565 NSSet* recognizers = [_swipeRecognizerProvider swipeRecognizers];
4568 for (UISwipeGestureRecognizer* swipeRecognizer in recognizers) { 4566 for (UISwipeGestureRecognizer* swipeRecognizer in recognizers) {
4569 [self.webScrollView.panGestureRecognizer 4567 [self.webScrollView.panGestureRecognizer
4570 requireGestureRecognizerToFail:swipeRecognizer]; 4568 requireGestureRecognizerToFail:swipeRecognizer];
4571 } 4569 }
(...skipping 11 matching lines...) Expand all
4583 // detection duration a little lower than that (see 4581 // detection duration a little lower than that (see
4584 // kLongPressDurationSeconds). It also points the delegate to this class 4582 // kLongPressDurationSeconds). It also points the delegate to this class
4585 // that 4583 // that
4586 // allows simultaneously operate along with the other recognizers. 4584 // allows simultaneously operate along with the other recognizers.
4587 _contextMenuRecognizer.reset([[UILongPressGestureRecognizer alloc] 4585 _contextMenuRecognizer.reset([[UILongPressGestureRecognizer alloc]
4588 initWithTarget:self 4586 initWithTarget:self
4589 action:@selector(showContextMenu:)]); 4587 action:@selector(showContextMenu:)]);
4590 [_contextMenuRecognizer setMinimumPressDuration:kLongPressDurationSeconds]; 4588 [_contextMenuRecognizer setMinimumPressDuration:kLongPressDurationSeconds];
4591 [_contextMenuRecognizer setAllowableMovement:kLongPressMoveDeltaPixels]; 4589 [_contextMenuRecognizer setAllowableMovement:kLongPressMoveDeltaPixels];
4592 [_contextMenuRecognizer setDelegate:self]; 4590 [_contextMenuRecognizer setDelegate:self];
4593 [webView addGestureRecognizer:_contextMenuRecognizer]; 4591 [_webView addGestureRecognizer:_contextMenuRecognizer];
4594 // Certain system gesture handlers are known to conflict with our context 4592 // Certain system gesture handlers are known to conflict with our context
4595 // menu handler, causing extra events to fire when the context menu is 4593 // menu handler, causing extra events to fire when the context menu is
4596 // active. 4594 // active.
4597 4595
4598 // A number of solutions have been investigated. The lowest-risk solution 4596 // A number of solutions have been investigated. The lowest-risk solution
4599 // appears to be to recurse through the web controller's recognizers, 4597 // appears to be to recurse through the web controller's recognizers,
4600 // looking 4598 // looking
4601 // for fingerprints of the recognizers known to cause problems, which are 4599 // for fingerprints of the recognizers known to cause problems, which are
4602 // then 4600 // then
4603 // de-prioritized (below our own long click handler). 4601 // de-prioritized (below our own long click handler).
4604 // Hunting for description fragments of system recognizers is undeniably 4602 // Hunting for description fragments of system recognizers is undeniably
4605 // brittle for future versions of iOS. If it does break the context menu 4603 // brittle for future versions of iOS. If it does break the context menu
4606 // events may leak (regressing b/5310177), but the app will otherwise work. 4604 // events may leak (regressing b/5310177), but the app will otherwise work.
4607 [CRWWebController requireGestureRecognizerToFail:_contextMenuRecognizer 4605 [CRWWebController requireGestureRecognizerToFail:_contextMenuRecognizer
4608 inView:webView 4606 inView:_webView
4609 containingDescription: 4607 containingDescription:
4610 @"action=_highlightLongPressRecognized:"]; 4608 @"action=_highlightLongPressRecognized:"];
4611 4609
4612 // Add all additional gesture recognizers to the web view. 4610 // Add all additional gesture recognizers to the web view.
4613 for (UIGestureRecognizer* recognizer in _gestureRecognizers.get()) { 4611 for (UIGestureRecognizer* recognizer in _gestureRecognizers.get()) {
4614 [webView addGestureRecognizer:recognizer]; 4612 [_webView addGestureRecognizer:recognizer];
4615 } 4613 }
4616 4614
4617 _URLOnStartLoading = _defaultURL; 4615 _URLOnStartLoading = _defaultURL;
4618 4616
4619 // Add the web toolbars. 4617 // Add the web toolbars.
4620 [_containerView addToolbars:_webViewToolbars]; 4618 [_containerView addToolbars:_webViewToolbars];
4621 4619
4622 base::scoped_nsobject<CRWWebViewContentView> webViewContentView( 4620 base::scoped_nsobject<CRWWebViewContentView> webViewContentView(
4623 [[CRWWebViewContentView alloc] initWithWebView:self.webView 4621 [[CRWWebViewContentView alloc] initWithWebView:_webView
4624 scrollView:self.webScrollView]); 4622 scrollView:self.webScrollView]);
4625 [_containerView displayWebViewContentView:webViewContentView]; 4623 [_containerView displayWebViewContentView:webViewContentView];
4626 } 4624 }
4627 } 4625 }
4628 4626
4629 - (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config { 4627 - (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config {
4630 return [web::CreateWKWebView(CGRectZero, config, 4628 return [web::CreateWKWebView(CGRectZero, config,
4631 self.webStateImpl->GetBrowserState(), 4629 self.webStateImpl->GetBrowserState(),
4632 [self useDesktopUserAgent]) autorelease]; 4630 [self useDesktopUserAgent]) autorelease];
4633 } 4631 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4668 [_webView setNavigationDelegate:self]; 4666 [_webView setNavigationDelegate:self];
4669 [_webView setUIDelegate:self]; 4667 [_webView setUIDelegate:self];
4670 for (NSString* keyPath in self.WKWebViewObservers) { 4668 for (NSString* keyPath in self.WKWebViewObservers) {
4671 [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr]; 4669 [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr];
4672 } 4670 }
4673 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); 4671 _injectedScriptManagers.reset([[NSMutableSet alloc] init]);
4674 [self setDocumentURL:_defaultURL]; 4672 [self setDocumentURL:_defaultURL];
4675 } 4673 }
4676 4674
4677 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache { 4675 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache {
4678 if (!self.webView) 4676 if (!_webView)
4679 return; 4677 return;
4680 4678
4681 SEL cancelDialogsSelector = @selector(cancelDialogsForWebController:); 4679 SEL cancelDialogsSelector = @selector(cancelDialogsForWebController:);
4682 if ([self.UIDelegate respondsToSelector:cancelDialogsSelector]) 4680 if ([self.UIDelegate respondsToSelector:cancelDialogsSelector])
4683 [self.UIDelegate cancelDialogsForWebController:self]; 4681 [self.UIDelegate cancelDialogsForWebController:self];
4684 4682
4685 if (allowCache) 4683 if (allowCache)
4686 _expectedReconstructionURL = [self currentNavigationURL]; 4684 _expectedReconstructionURL = [self currentNavigationURL];
4687 else 4685 else
4688 _expectedReconstructionURL = GURL(); 4686 _expectedReconstructionURL = GURL();
4689 4687
4690 [self abortLoad]; 4688 [self abortLoad];
4691 [self.webView removeFromSuperview]; 4689 [_webView removeFromSuperview];
4692 [_containerView resetContent]; 4690 [_containerView resetContent];
4693 [self setWebView:nil]; 4691 [self setWebView:nil];
4694 } 4692 }
4695 4693
4696 - (void)webViewWebProcessDidCrash { 4694 - (void)webViewWebProcessDidCrash {
4697 _webProcessIsDead = YES; 4695 _webProcessIsDead = YES;
4698 4696
4699 SEL cancelDialogsSelector = @selector(cancelDialogsForWebController:); 4697 SEL cancelDialogsSelector = @selector(cancelDialogsForWebController:);
4700 if ([self.UIDelegate respondsToSelector:cancelDialogsSelector]) 4698 if ([self.UIDelegate respondsToSelector:cancelDialogsSelector])
4701 [self.UIDelegate cancelDialogsForWebController:self]; 4699 [self.UIDelegate cancelDialogsForWebController:self];
4702 4700
4703 SEL rendererCrashSelector = @selector(webControllerWebProcessDidCrash:); 4701 SEL rendererCrashSelector = @selector(webControllerWebProcessDidCrash:);
4704 if ([self.delegate respondsToSelector:rendererCrashSelector]) 4702 if ([self.delegate respondsToSelector:rendererCrashSelector])
4705 [self.delegate webControllerWebProcessDidCrash:self]; 4703 [self.delegate webControllerWebProcessDidCrash:self];
4706 } 4704 }
4707 4705
4708 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider { 4706 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider {
4709 web::BrowserState* browserState = self.webStateImpl->GetBrowserState(); 4707 web::BrowserState* browserState = self.webStateImpl->GetBrowserState();
4710 return web::WKWebViewConfigurationProvider::FromBrowserState(browserState); 4708 return web::WKWebViewConfigurationProvider::FromBrowserState(browserState);
4711 } 4709 }
4712 4710
4713 - (web::WebViewDocumentType)webViewDocumentType { 4711 - (web::WebViewDocumentType)webViewDocumentType {
4714 // This happens during tests. 4712 // This happens during tests.
4715 if (!self.webView) { 4713 if (!_webView) {
4716 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; 4714 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC;
4717 } 4715 }
4718 4716
4719 std::string MIMEType = self.webState->GetContentsMimeType(); 4717 std::string MIMEType = self.webState->GetContentsMimeType();
4720 return [self documentTypeFromMIMEType:base::SysUTF8ToNSString(MIMEType)]; 4718 return [self documentTypeFromMIMEType:base::SysUTF8ToNSString(MIMEType)];
4721 } 4719 }
4722 4720
4723 - (void)loadRequest:(NSMutableURLRequest*)request { 4721 - (void)loadRequest:(NSMutableURLRequest*)request {
4724 _latestWKNavigation.reset([[self.webView loadRequest:request] retain]); 4722 _latestWKNavigation.reset([[_webView loadRequest:request] retain]);
4725 } 4723 }
4726 4724
4727 - (void)loadPOSTRequest:(NSMutableURLRequest*)request { 4725 - (void)loadPOSTRequest:(NSMutableURLRequest*)request {
4728 if (!_POSTRequestLoader) { 4726 if (!_POSTRequestLoader) {
4729 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]); 4727 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]);
4730 } 4728 }
4731 4729
4732 CRWWKScriptMessageRouter* messageRouter = 4730 CRWWKScriptMessageRouter* messageRouter =
4733 [self webViewConfigurationProvider].GetScriptMessageRouter(); 4731 [self webViewConfigurationProvider].GetScriptMessageRouter();
4734 4732
4735 [_POSTRequestLoader loadPOSTRequest:request 4733 [_POSTRequestLoader loadPOSTRequest:request
4736 inWebView:_webView 4734 inWebView:_webView
4737 messageRouter:messageRouter 4735 messageRouter:messageRouter
4738 completionHandler:^(NSError* loadError) { 4736 completionHandler:^(NSError* loadError) {
4739 if (loadError) 4737 if (loadError)
4740 [self handleLoadError:loadError inMainFrame:YES]; 4738 [self handleLoadError:loadError inMainFrame:YES];
4741 else 4739 else
4742 self.webStateImpl->SetContentsMimeType("text/html"); 4740 self.webStateImpl->SetContentsMimeType("text/html");
4743 }]; 4741 }];
4744 } 4742 }
4745 4743
4746 - (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL { 4744 - (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL {
4747 // Remove the transient content view. 4745 // Remove the transient content view.
4748 [self clearTransientContentView]; 4746 [self clearTransientContentView];
4749 4747
4750 DLOG_IF(WARNING, !self.webView) 4748 DLOG_IF(WARNING, !_webView) << "_webView null while trying to load HTML";
4751 << "self.webView null while trying to load HTML";
4752 _loadPhase = web::LOAD_REQUESTED; 4749 _loadPhase = web::LOAD_REQUESTED;
4753 [self.webView loadHTMLString:HTML baseURL:net::NSURLWithGURL(URL)]; 4750 [_webView loadHTMLString:HTML baseURL:net::NSURLWithGURL(URL)];
4754 } 4751 }
4755 4752
4756 - (void)loadHTML:(NSString*)HTML forAppSpecificURL:(const GURL&)URL { 4753 - (void)loadHTML:(NSString*)HTML forAppSpecificURL:(const GURL&)URL {
4757 CHECK(web::GetWebClient()->IsAppSpecificURL(URL)); 4754 CHECK(web::GetWebClient()->IsAppSpecificURL(URL));
4758 [self loadHTML:HTML forURL:URL]; 4755 [self loadHTML:HTML forURL:URL];
4759 } 4756 }
4760 4757
4761 - (void)loadHTMLForCurrentURL:(NSString*)HTML { 4758 - (void)loadHTMLForCurrentURL:(NSString*)HTML {
4762 [self loadHTML:HTML forURL:self.currentURL]; 4759 [self loadHTML:HTML forURL:self.currentURL];
4763 } 4760 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4805 } 4802 }
4806 4803
4807 CRWWebController* child = [self createChildWebController]; 4804 CRWWebController* child = [self createChildWebController];
4808 // WKWebView requires WKUIDelegate to return a child view created with 4805 // WKWebView requires WKUIDelegate to return a child view created with
4809 // exactly the same |configuration| object (exception is raised if config is 4806 // exactly the same |configuration| object (exception is raised if config is
4810 // different). |configuration| param and config returned by 4807 // different). |configuration| param and config returned by
4811 // WKWebViewConfigurationProvider are different objects because WKWebView 4808 // WKWebViewConfigurationProvider are different objects because WKWebView
4812 // makes a shallow copy of the config inside init, so every WKWebView 4809 // makes a shallow copy of the config inside init, so every WKWebView
4813 // owns a separate shallow copy of WKWebViewConfiguration. 4810 // owns a separate shallow copy of WKWebViewConfiguration.
4814 [child ensureWebViewCreatedWithConfiguration:configuration]; 4811 [child ensureWebViewCreatedWithConfiguration:configuration];
4815 return [child webView]; 4812 return child.webView;
Eugene But (OOO till 7-30) 2016/04/26 18:00:41 child->_webView could work, but I would keep webVi
4816 } 4813 }
4817 4814
4818 - (void)webViewDidClose:(WKWebView*)webView { 4815 - (void)webViewDidClose:(WKWebView*)webView {
4819 if (self.sessionController.openedByDOM) { 4816 if (self.sessionController.openedByDOM) {
4820 [self.delegate webPageOrderedClose]; 4817 [self.delegate webPageOrderedClose];
4821 } 4818 }
4822 } 4819 }
4823 4820
4824 - (void)webView:(WKWebView*)webView 4821 - (void)webView:(WKWebView*)webView
4825 runJavaScriptAlertPanelWithMessage:(NSString*)message 4822 runJavaScriptAlertPanelWithMessage:(NSString*)message
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
5069 } 5066 }
5070 5067
5071 // This must be reset at the end, since code above may need information about 5068 // This must be reset at the end, since code above may need information about
5072 // the pending load. 5069 // the pending load.
5073 _pendingNavigationInfo.reset(); 5070 _pendingNavigationInfo.reset();
5074 _certVerificationErrors->Clear(); 5071 _certVerificationErrors->Clear();
5075 } 5072 }
5076 5073
5077 - (void)webView:(WKWebView*)webView 5074 - (void)webView:(WKWebView*)webView
5078 didCommitNavigation:(WKNavigation*)navigation { 5075 didCommitNavigation:(WKNavigation*)navigation {
5079 DCHECK_EQ(self.webView, webView); 5076 DCHECK_EQ(_webView, webView);
5080 _certVerificationErrors->Clear(); 5077 _certVerificationErrors->Clear();
5081 // This point should closely approximate the document object change, so reset 5078 // This point should closely approximate the document object change, so reset
5082 // the list of injected scripts to those that are automatically injected. 5079 // the list of injected scripts to those that are automatically injected.
5083 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); 5080 _injectedScriptManagers.reset([[NSMutableSet alloc] init]);
5084 [self injectWindowID]; 5081 [self injectWindowID];
5085 5082
5086 // This is the point where the document's URL has actually changed, and 5083 // This is the point where the document's URL has actually changed, and
5087 // pending navigation information should be applied to state information. 5084 // pending navigation information should be applied to state information.
5088 [self setDocumentURL:net::GURLWithNSURL([self.webView URL])]; 5085 [self setDocumentURL:net::GURLWithNSURL([_webView URL])];
5089 DCHECK(_documentURL == _lastRegisteredRequestURL); 5086 DCHECK(_documentURL == _lastRegisteredRequestURL);
5090 self.webStateImpl->OnNavigationCommitted(_documentURL); 5087 self.webStateImpl->OnNavigationCommitted(_documentURL);
5091 [self commitPendingNavigationInfo]; 5088 [self commitPendingNavigationInfo];
5092 if ([self currentBackForwardListItemHolder]->navigation_type() == 5089 if ([self currentBackForwardListItemHolder]->navigation_type() ==
5093 WKNavigationTypeBackForward) { 5090 WKNavigationTypeBackForward) {
5094 // A fast back/forward won't call decidePolicyForNavigationResponse, so 5091 // A fast back/forward won't call decidePolicyForNavigationResponse, so
5095 // the MIME type needs to be updated explicitly. 5092 // the MIME type needs to be updated explicitly.
5096 NSString* storedMIMEType = 5093 NSString* storedMIMEType =
5097 [self currentBackForwardListItemHolder]->mime_type(); 5094 [self currentBackForwardListItemHolder]->mime_type();
5098 if (storedMIMEType) { 5095 if (storedMIMEType) {
5099 self.webStateImpl->SetContentsMimeType( 5096 self.webStateImpl->SetContentsMimeType(
5100 base::SysNSStringToUTF8(storedMIMEType)); 5097 base::SysNSStringToUTF8(storedMIMEType));
5101 } 5098 }
5102 } 5099 }
5103 [self webPageChanged]; 5100 [self webPageChanged];
5104 5101
5105 [self updateSSLStatusForCurrentNavigationItem]; 5102 [self updateSSLStatusForCurrentNavigationItem];
5106 5103
5107 // Report cases where SSL cert is missing for a secure connection. 5104 // Report cases where SSL cert is missing for a secure connection.
5108 if (_documentURL.SchemeIsCryptographic()) { 5105 if (_documentURL.SchemeIsCryptographic()) {
5109 scoped_refptr<net::X509Certificate> cert = 5106 scoped_refptr<net::X509Certificate> cert =
5110 web::CreateCertFromChain([self.webView certificateChain]); 5107 web::CreateCertFromChain([_webView certificateChain]);
5111 UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection", 5108 UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection",
5112 cert); 5109 cert);
5113 } 5110 }
5114 } 5111 }
5115 5112
5116 - (void)webView:(WKWebView*)webView 5113 - (void)webView:(WKWebView*)webView
5117 didFinishNavigation:(WKNavigation*)navigation { 5114 didFinishNavigation:(WKNavigation*)navigation {
5118 DCHECK(!_isHalted); 5115 DCHECK(!_isHalted);
5119 // Trigger JavaScript driven post-document-load-completion tasks. 5116 // Trigger JavaScript driven post-document-load-completion tasks.
5120 // TODO(crbug.com/546350): Investigate using 5117 // TODO(crbug.com/546350): Investigate using
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
5230 - (void)webViewSecurityFeaturesDidChange { 5227 - (void)webViewSecurityFeaturesDidChange {
5231 if (self.loadPhase == web::LOAD_REQUESTED) { 5228 if (self.loadPhase == web::LOAD_REQUESTED) {
5232 // Do not update SSL Status for pending load. It will be updated in 5229 // Do not update SSL Status for pending load. It will be updated in
5233 // |webView:didCommitNavigation:| callback. 5230 // |webView:didCommitNavigation:| callback.
5234 return; 5231 return;
5235 } 5232 }
5236 [self updateSSLStatusForCurrentNavigationItem]; 5233 [self updateSSLStatusForCurrentNavigationItem];
5237 } 5234 }
5238 5235
5239 - (void)webViewLoadingStateDidChange { 5236 - (void)webViewLoadingStateDidChange {
5240 if ([self.webView isLoading]) { 5237 if ([_webView isLoading]) {
5241 [self addActivityIndicatorTask]; 5238 [self addActivityIndicatorTask];
5242 } else { 5239 } else {
5243 [self clearActivityIndicatorTasks]; 5240 [self clearActivityIndicatorTasks];
5244 if ([self currentNavItem] && 5241 if ([self currentNavItem] &&
5245 [self currentBackForwardListItemHolder]->navigation_type() == 5242 [self currentBackForwardListItemHolder]->navigation_type() ==
5246 WKNavigationTypeBackForward) { 5243 WKNavigationTypeBackForward) {
5247 // A fast back/forward may not call |webView:didFinishNavigation:|, so 5244 // A fast back/forward may not call |webView:didFinishNavigation:|, so
5248 // finishing the navigation should be signalled explicitly. 5245 // finishing the navigation should be signalled explicitly.
5249 [self didFinishNavigation]; 5246 [self didFinishNavigation];
5250 } 5247 }
(...skipping 11 matching lines...) Expand all
5262 if ([self.delegate 5259 if ([self.delegate
5263 respondsToSelector:@selector(webController:titleDidChange:)]) { 5260 respondsToSelector:@selector(webController:titleDidChange:)]) {
5264 DCHECK([_webView title]); 5261 DCHECK([_webView title]);
5265 [self.delegate webController:self titleDidChange:[_webView title]]; 5262 [self.delegate webController:self titleDidChange:[_webView title]];
5266 } 5263 }
5267 } 5264 }
5268 5265
5269 - (void)webViewURLDidChange { 5266 - (void)webViewURLDidChange {
5270 // TODO(stuartmorgan): Determine if there are any cases where this still 5267 // TODO(stuartmorgan): Determine if there are any cases where this still
5271 // happens, and if so whether anything should be done when it does. 5268 // happens, and if so whether anything should be done when it does.
5272 if (![self.webView URL]) { 5269 if (![_webView URL]) {
5273 DVLOG(1) << "Received nil URL callback"; 5270 DVLOG(1) << "Received nil URL callback";
5274 return; 5271 return;
5275 } 5272 }
5276 GURL URL(net::GURLWithNSURL([self.webView URL])); 5273 GURL URL(net::GURLWithNSURL([_webView URL]));
5277 // URL changes happen at three points: 5274 // URL changes happen at three points:
5278 // 1) When a load starts; at this point, the load is provisional, and 5275 // 1) When a load starts; at this point, the load is provisional, and
5279 // it should be ignored until it's committed, since the document/window 5276 // it should be ignored until it's committed, since the document/window
5280 // objects haven't changed yet. 5277 // objects haven't changed yet.
5281 // 2) When a non-document-changing URL change happens (hash change, 5278 // 2) When a non-document-changing URL change happens (hash change,
5282 // history.pushState, etc.). This URL change happens instantly, so should 5279 // history.pushState, etc.). This URL change happens instantly, so should
5283 // be reported. 5280 // be reported.
5284 // 3) When a navigation error occurs after provisional navigation starts, 5281 // 3) When a navigation error occurs after provisional navigation starts,
5285 // the URL reverts to the previous URL without triggering a new navigation. 5282 // the URL reverts to the previous URL without triggering a new navigation.
5286 // 5283 //
5287 // If |isLoading| is NO, then it must be case 2 or 3. If the last committed 5284 // If |isLoading| is NO, then it must be case 2 or 3. If the last committed
5288 // URL (_documentURL) matches the current URL, assume that it is a revert from 5285 // URL (_documentURL) matches the current URL, assume that it is a revert from
5289 // navigation failure and do nothing. If the URL does not match, assume it is 5286 // navigation failure and do nothing. If the URL does not match, assume it is
5290 // a non-document-changing URL change, and handle accordingly. 5287 // a non-document-changing URL change, and handle accordingly.
5291 // 5288 //
5292 // If |isLoading| is YES, then it could either be case 1, or it could be case 5289 // If |isLoading| is YES, then it could either be case 1, or it could be case
5293 // 2 on a page that hasn't finished loading yet. If it's possible that it 5290 // 2 on a page that hasn't finished loading yet. If it's possible that it
5294 // could be a same-page navigation (in which case there may not be any other 5291 // could be a same-page navigation (in which case there may not be any other
5295 // callback about the URL having changed), then check the actual page URL via 5292 // callback about the URL having changed), then check the actual page URL via
5296 // JavaScript. If the origin of the new URL matches the last committed URL, 5293 // JavaScript. If the origin of the new URL matches the last committed URL,
5297 // then check window.location.href, and if it matches, trust it. The origin 5294 // then check window.location.href, and if it matches, trust it. The origin
5298 // check ensures that if a site somehow corrupts window.location.href it can't 5295 // check ensures that if a site somehow corrupts window.location.href it can't
5299 // do a redirect to a slow-loading target page while it is still loading to 5296 // do a redirect to a slow-loading target page while it is still loading to
5300 // spoof the origin. On a document-changing URL change, the 5297 // spoof the origin. On a document-changing URL change, the
5301 // window.location.href will match the previous URL at this stage, not the web 5298 // window.location.href will match the previous URL at this stage, not the web
5302 // view's current URL. 5299 // view's current URL.
5303 if (![self.webView isLoading]) { 5300 if (![_webView isLoading]) {
5304 if (_documentURL == URL) 5301 if (_documentURL == URL)
5305 return; 5302 return;
5306 [self URLDidChangeWithoutDocumentChange:URL]; 5303 [self URLDidChangeWithoutDocumentChange:URL];
5307 } else if ([self isKVOChangePotentialSameDocumentNavigationToURL:URL]) { 5304 } else if ([self isKVOChangePotentialSameDocumentNavigationToURL:URL]) {
5308 [self.webView 5305 [_webView
5309 evaluateJavaScript:@"window.location.href" 5306 evaluateJavaScript:@"window.location.href"
5310 completionHandler:^(id result, NSError* error) { 5307 completionHandler:^(id result, NSError* error) {
5311 // If the web view has gone away, or the location 5308 // If the web view has gone away, or the location
5312 // couldn't be retrieved, abort. 5309 // couldn't be retrieved, abort.
5313 if (!self.webView || ![result isKindOfClass:[NSString class]]) { 5310 if (!_webView || ![result isKindOfClass:[NSString class]]) {
5314 return; 5311 return;
5315 } 5312 }
5316 GURL JSURL([result UTF8String]); 5313 GURL JSURL([result UTF8String]);
5317 // Check that window.location matches the new URL. If 5314 // Check that window.location matches the new URL. If
5318 // it does not, this is a document-changing URL change as 5315 // it does not, this is a document-changing URL change as
5319 // the window location would not have changed to the new 5316 // the window location would not have changed to the new
5320 // URL when the script was called. 5317 // URL when the script was called.
5321 BOOL windowLocationMatchesNewURL = JSURL == URL; 5318 BOOL windowLocationMatchesNewURL = JSURL == URL;
5322 // Re-check origin in case navigaton has occured since 5319 // Re-check origin in case navigaton has occured since
5323 // start of JavaScript evaluation. 5320 // start of JavaScript evaluation.
5324 BOOL newURLOriginMatchesDocumentURLOrigin = 5321 BOOL newURLOriginMatchesDocumentURLOrigin =
5325 _documentURL.GetOrigin() == URL.GetOrigin(); 5322 _documentURL.GetOrigin() == URL.GetOrigin();
5326 // Check that the web view URL still matches the new URL. 5323 // Check that the web view URL still matches the new URL.
5327 // TODO(crbug.com/563568): webViewURLMatchesNewURL check 5324 // TODO(crbug.com/563568): webViewURLMatchesNewURL check
5328 // may drop same document URL changes if pending URL 5325 // may drop same document URL changes if pending URL
5329 // change occurs immediately after. Revisit heuristics to 5326 // change occurs immediately after. Revisit heuristics to
5330 // prevent this. 5327 // prevent this.
5331 BOOL webViewURLMatchesNewURL = 5328 BOOL webViewURLMatchesNewURL =
5332 net::GURLWithNSURL([self.webView URL]) == URL; 5329 net::GURLWithNSURL([_webView URL]) == URL;
5333 // Check that the new URL is different from the current 5330 // Check that the new URL is different from the current
5334 // document URL. If not, URL change should not be reported. 5331 // document URL. If not, URL change should not be reported.
5335 BOOL URLDidChangeFromDocumentURL = URL != _documentURL; 5332 BOOL URLDidChangeFromDocumentURL = URL != _documentURL;
5336 if (windowLocationMatchesNewURL && 5333 if (windowLocationMatchesNewURL &&
5337 newURLOriginMatchesDocumentURLOrigin && 5334 newURLOriginMatchesDocumentURLOrigin &&
5338 webViewURLMatchesNewURL && URLDidChangeFromDocumentURL) { 5335 webViewURLMatchesNewURL && URLDidChangeFromDocumentURL) {
5339 [self URLDidChangeWithoutDocumentChange:URL]; 5336 [self URLDidChangeWithoutDocumentChange:URL];
5340 } 5337 }
5341 }]; 5338 }];
5342 } 5339 }
5343 } 5340 }
5344 5341
5345 - (BOOL)isKVOChangePotentialSameDocumentNavigationToURL:(const GURL&)newURL { 5342 - (BOOL)isKVOChangePotentialSameDocumentNavigationToURL:(const GURL&)newURL {
5346 DCHECK([self.webView isLoading]); 5343 DCHECK([_webView isLoading]);
5347 // If the origin changes, it can't be same-document. 5344 // If the origin changes, it can't be same-document.
5348 if (_documentURL.GetOrigin().is_empty() || 5345 if (_documentURL.GetOrigin().is_empty() ||
5349 _documentURL.GetOrigin() != newURL.GetOrigin()) { 5346 _documentURL.GetOrigin() != newURL.GetOrigin()) {
5350 return NO; 5347 return NO;
5351 } 5348 }
5352 if (self.loadPhase == web::LOAD_REQUESTED) { 5349 if (self.loadPhase == web::LOAD_REQUESTED) {
5353 // Normally LOAD_REQUESTED indicates that this is a regular, pending 5350 // Normally LOAD_REQUESTED indicates that this is a regular, pending
5354 // navigation, but it can also happen during a fast-back navigation across 5351 // navigation, but it can also happen during a fast-back navigation across
5355 // a hash change, so that case is potentially a same-document navigation. 5352 // a hash change, so that case is potentially a same-document navigation.
5356 return web::GURLByRemovingRefFromGURL(newURL) == 5353 return web::GURLByRemovingRefFromGURL(newURL) ==
5357 web::GURLByRemovingRefFromGURL(_documentURL); 5354 web::GURLByRemovingRefFromGURL(_documentURL);
5358 } 5355 }
5359 // If it passes all the checks above, it might be (but there's no guarantee 5356 // If it passes all the checks above, it might be (but there's no guarantee
5360 // that it is). 5357 // that it is).
5361 return YES; 5358 return YES;
5362 } 5359 }
5363 5360
5364 - (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL { 5361 - (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL {
5365 DCHECK(newURL == net::GURLWithNSURL([self.webView URL])); 5362 DCHECK(newURL == net::GURLWithNSURL([_webView URL]));
5366 DCHECK_EQ(_documentURL.host(), newURL.host()); 5363 DCHECK_EQ(_documentURL.host(), newURL.host());
5367 DCHECK(_documentURL != newURL); 5364 DCHECK(_documentURL != newURL);
5368 5365
5369 // If called during window.history.pushState or window.history.replaceState 5366 // If called during window.history.pushState or window.history.replaceState
5370 // JavaScript evaluation, only update the document URL. This callback does not 5367 // JavaScript evaluation, only update the document URL. This callback does not
5371 // have any information about the state object and cannot create (or edit) the 5368 // have any information about the state object and cannot create (or edit) the
5372 // navigation entry for this page change. Web controller will sync with 5369 // navigation entry for this page change. Web controller will sync with
5373 // history changes when a window.history.didPushState or 5370 // history changes when a window.history.didPushState or
5374 // window.history.didReplaceState message is received, which should happen in 5371 // window.history.didReplaceState message is received, which should happen in
5375 // the next runloop. 5372 // the next runloop.
(...skipping 23 matching lines...) Expand all
5399 - (BOOL)isLoadRequestPendingForURL:(const GURL&)targetURL { 5396 - (BOOL)isLoadRequestPendingForURL:(const GURL&)targetURL {
5400 if (self.loadPhase != web::LOAD_REQUESTED) 5397 if (self.loadPhase != web::LOAD_REQUESTED)
5401 return NO; 5398 return NO;
5402 5399
5403 web::NavigationItem* pendingItem = 5400 web::NavigationItem* pendingItem =
5404 self.webState->GetNavigationManager()->GetPendingItem(); 5401 self.webState->GetNavigationManager()->GetPendingItem();
5405 return pendingItem && pendingItem->GetURL() == targetURL; 5402 return pendingItem && pendingItem->GetURL() == targetURL;
5406 } 5403 }
5407 5404
5408 - (void)loadRequestForCurrentNavigationItem { 5405 - (void)loadRequestForCurrentNavigationItem {
5409 DCHECK(self.webView && !self.nativeController); 5406 DCHECK(_webView && !self.nativeController);
5410 DCHECK([self currentSessionEntry]); 5407 DCHECK([self currentSessionEntry]);
5411 // If a load is kicked off on a WKWebView with a frame whose size is {0, 0} or 5408 // If a load is kicked off on a WKWebView with a frame whose size is {0, 0} or
5412 // that has a negative dimension for a size, rendering issues occur that 5409 // that has a negative dimension for a size, rendering issues occur that
5413 // manifest in erroneous scrolling and tap handling (crbug.com/574996, 5410 // manifest in erroneous scrolling and tap handling (crbug.com/574996,
5414 // crbug.com/577793). 5411 // crbug.com/577793).
5415 DCHECK_GT(CGRectGetWidth(self.webView.frame), 0.0); 5412 DCHECK_GT(CGRectGetWidth([_webView frame]), 0.0);
5416 DCHECK_GT(CGRectGetHeight(self.webView.frame), 0.0); 5413 DCHECK_GT(CGRectGetHeight([_webView frame]), 0.0);
5417 5414
5418 web::WKBackForwardListItemHolder* holder = 5415 web::WKBackForwardListItemHolder* holder =
5419 [self currentBackForwardListItemHolder]; 5416 [self currentBackForwardListItemHolder];
5420 BOOL isFormResubmission = 5417 BOOL isFormResubmission =
5421 (holder->navigation_type() == WKNavigationTypeFormResubmitted || 5418 (holder->navigation_type() == WKNavigationTypeFormResubmitted ||
5422 holder->navigation_type() == WKNavigationTypeFormSubmitted); 5419 holder->navigation_type() == WKNavigationTypeFormSubmitted);
5423 web::NavigationItemImpl* currentItem = 5420 web::NavigationItemImpl* currentItem =
5424 [self currentSessionEntry].navigationItemImpl; 5421 [self currentSessionEntry].navigationItemImpl;
5425 NSData* POSTData = currentItem->GetPostData(); 5422 NSData* POSTData = currentItem->GetPostData();
5426 NSMutableURLRequest* request = [self requestForCurrentNavigationItem]; 5423 NSMutableURLRequest* request = [self requestForCurrentNavigationItem];
(...skipping 29 matching lines...) Expand all
5456 } 5453 }
5457 5454
5458 ProceduralBlock webViewNavigationBlock = ^{ 5455 ProceduralBlock webViewNavigationBlock = ^{
5459 // If the current navigation URL is the same as the URL of the visible 5456 // If the current navigation URL is the same as the URL of the visible
5460 // page, that means the user requested a reload. |goToBackForwardListItem| 5457 // page, that means the user requested a reload. |goToBackForwardListItem|
5461 // will be a no-op when it is passed the current back forward list item, 5458 // will be a no-op when it is passed the current back forward list item,
5462 // so |reload| must be explicitly called. 5459 // so |reload| must be explicitly called.
5463 [self registerLoadRequest:[self currentNavigationURL] 5460 [self registerLoadRequest:[self currentNavigationURL]
5464 referrer:[self currentSessionEntryReferrer] 5461 referrer:[self currentSessionEntryReferrer]
5465 transition:[self currentTransition]]; 5462 transition:[self currentTransition]];
5466 if ([self currentNavigationURL] == net::GURLWithNSURL([self.webView URL])) { 5463 if ([self currentNavigationURL] == net::GURLWithNSURL([_webView URL])) {
5467 [self.webView reload]; 5464 [_webView reload];
5468 } else { 5465 } else {
5469 [self.webView goToBackForwardListItem:holder->back_forward_list_item()]; 5466 [_webView goToBackForwardListItem:holder->back_forward_list_item()];
5470 } 5467 }
5471 }; 5468 };
5472 5469
5473 // If the request is not a form submission or resubmission, or the user 5470 // If the request is not a form submission or resubmission, or the user
5474 // doesn't need to confirm the load, then continue right away. 5471 // doesn't need to confirm the load, then continue right away.
5475 5472
5476 if (!isFormResubmission || 5473 if (!isFormResubmission ||
5477 currentItem->ShouldSkipResubmitDataConfirmation()) { 5474 currentItem->ShouldSkipResubmitDataConfirmation()) {
5478 webViewNavigationBlock(); 5475 webViewNavigationBlock();
5479 return; 5476 return;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
5573 } 5570 }
5574 5571
5575 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; 5572 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC;
5576 } 5573 }
5577 5574
5578 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { 5575 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action {
5579 return [action.request valueForHTTPHeaderField:@"Referer"]; 5576 return [action.request valueForHTTPHeaderField:@"Referer"];
5580 } 5577 }
5581 5578
5582 @end 5579 @end
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698