OLD | NEW |
---|---|
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 25 matching lines...) Expand all Loading... | |
36 #include "base/strings/sys_string_conversions.h" | 36 #include "base/strings/sys_string_conversions.h" |
37 #include "base/strings/utf_string_conversions.h" | 37 #include "base/strings/utf_string_conversions.h" |
38 #include "base/time/time.h" | 38 #include "base/time/time.h" |
39 #include "base/values.h" | 39 #include "base/values.h" |
40 #import "ios/net/http_response_headers_util.h" | 40 #import "ios/net/http_response_headers_util.h" |
41 #import "ios/net/nsurlrequest_util.h" | 41 #import "ios/net/nsurlrequest_util.h" |
42 #include "ios/web/history_state_util.h" | 42 #include "ios/web/history_state_util.h" |
43 #import "ios/web/interstitials/web_interstitial_impl.h" | 43 #import "ios/web/interstitials/web_interstitial_impl.h" |
44 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" | 44 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" |
45 #import "ios/web/navigation/crw_session_controller.h" | 45 #import "ios/web/navigation/crw_session_controller.h" |
46 #import "ios/web/navigation/crw_session_entry.h" | |
47 #import "ios/web/navigation/navigation_item_impl.h" | 46 #import "ios/web/navigation/navigation_item_impl.h" |
48 #import "ios/web/navigation/navigation_manager_impl.h" | 47 #import "ios/web/navigation/navigation_manager_impl.h" |
49 #include "ios/web/net/cert_host_pair.h" | 48 #include "ios/web/net/cert_host_pair.h" |
50 #import "ios/web/net/crw_cert_verification_controller.h" | 49 #import "ios/web/net/crw_cert_verification_controller.h" |
51 #import "ios/web/net/crw_ssl_status_updater.h" | 50 #import "ios/web/net/crw_ssl_status_updater.h" |
52 #include "ios/web/public/browser_state.h" | 51 #include "ios/web/public/browser_state.h" |
53 #include "ios/web/public/favicon_url.h" | 52 #include "ios/web/public/favicon_url.h" |
54 #import "ios/web/public/java_script_dialog_presenter.h" | 53 #import "ios/web/public/java_script_dialog_presenter.h" |
55 #import "ios/web/public/navigation_item.h" | 54 #import "ios/web/public/navigation_item.h" |
56 #import "ios/web/public/navigation_manager.h" | 55 #import "ios/web/public/navigation_manager.h" |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
456 | 455 |
457 // Returns YES if the user interacted with the page recently. | 456 // Returns YES if the user interacted with the page recently. |
458 @property(nonatomic, readonly) BOOL userClickedRecently; | 457 @property(nonatomic, readonly) BOOL userClickedRecently; |
459 // Returns whether the desktop user agent should be used when setting the user | 458 // Returns whether the desktop user agent should be used when setting the user |
460 // agent. | 459 // agent. |
461 @property(nonatomic, readonly) BOOL useDesktopUserAgent; | 460 @property(nonatomic, readonly) BOOL useDesktopUserAgent; |
462 | 461 |
463 // Facade for Mojo API. | 462 // Facade for Mojo API. |
464 @property(nonatomic, readonly) web::MojoFacade* mojoFacade; | 463 @property(nonatomic, readonly) web::MojoFacade* mojoFacade; |
465 | 464 |
466 // Updates Desktop User Agent and calls webWillFinishHistoryNavigationFromEntry: | 465 // TODO(crbug.com/692871): Remove these functions and replace with more |
466 // appropriate NavigationItem getters. | |
467 // Returns the navigation item for the current page. | |
468 @property(nonatomic, readonly) web::NavigationItemImpl* currentNavItem; | |
469 // Returns the current transition type. | |
470 @property(nonatomic, readonly) ui::PageTransition currentTransition; | |
471 // Returns the referrer for current navigation item. May be empty. | |
472 @property(nonatomic, readonly) web::Referrer currentNavItemReferrer; | |
473 // The HTTP headers associated with the current navigation item. These are nil | |
474 // unless the request was a POST. | |
475 @property(nonatomic, readonly) NSDictionary* currentHTTPHeaders; | |
476 | |
477 // Updates Desktop User Agent and calls webWillFinishHistoryNavigation | |
467 // on CRWWebDelegate. TODO(crbug.com/684098): Remove this method and inline its | 478 // on CRWWebDelegate. TODO(crbug.com/684098): Remove this method and inline its |
468 // content. | 479 // content. |
469 - (void)webWillFinishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry; | 480 - (void)webWillFinishHistoryNavigationFromItem:(web::NavigationItem*)item; |
470 // Recreates web view if |entry| and |fromEntry| have different value for | |
471 // IsOverridingUserAgent() flag. | |
472 - (void)updateDesktopUserAgentForEntry:(CRWSessionEntry*)entry | |
473 fromEntry:(CRWSessionEntry*)fromEntry; | |
474 // Removes the container view from the hierarchy and resets the ivar. | 481 // Removes the container view from the hierarchy and resets the ivar. |
475 - (void)resetContainerView; | 482 - (void)resetContainerView; |
476 // Called when the web page has changed document and/or URL, and so the page | 483 // Called when the web page has changed document and/or URL, and so the page |
477 // navigation should be reported to the delegate, and internal state updated to | 484 // navigation should be reported to the delegate, and internal state updated to |
478 // reflect the fact that the navigation has occurred. | 485 // reflect the fact that the navigation has occurred. |
479 // TODO(stuartmorgan): The code conflates URL changes and document object | 486 // TODO(stuartmorgan): The code conflates URL changes and document object |
480 // changes; the two need to be separated and handled differently. | 487 // changes; the two need to be separated and handled differently. |
481 - (void)webPageChanged; | 488 - (void)webPageChanged; |
482 // Resets any state that is associated with a specific document object (e.g., | 489 // Resets any state that is associated with a specific document object (e.g., |
483 // page interaction tracking). | 490 // page interaction tracking). |
484 - (void)resetDocumentSpecificState; | 491 - (void)resetDocumentSpecificState; |
485 // Called when a page (native or web) has actually started loading (i.e., for | 492 // Called when a page (native or web) has actually started loading (i.e., for |
486 // a web page the document has actually changed), or after the load request has | 493 // a web page the document has actually changed), or after the load request has |
487 // been registered for a non-document-changing URL change. Updates internal | 494 // been registered for a non-document-changing URL change. Updates internal |
488 // state not specific to web pages, and informs the delegate. | 495 // state not specific to web pages, and informs the delegate. |
489 - (void)didStartLoadingURL:(const GURL&)URL updateHistory:(BOOL)updateHistory; | 496 - (void)didStartLoadingURL:(const GURL&)URL updateHistory:(BOOL)updateHistory; |
490 // Returns YES if the URL looks like it is one CRWWebController can show. | 497 // Returns YES if the URL looks like it is one CRWWebController can show. |
491 + (BOOL)webControllerCanShow:(const GURL&)url; | 498 + (BOOL)webControllerCanShow:(const GURL&)url; |
492 // Clears the currently-displayed transient content view. | 499 // Clears the currently-displayed transient content view. |
493 - (void)clearTransientContentView; | 500 - (void)clearTransientContentView; |
494 // Returns a lazily created CRWTouchTrackingRecognizer. | 501 // Returns a lazily created CRWTouchTrackingRecognizer. |
495 - (CRWTouchTrackingRecognizer*)touchTrackingRecognizer; | 502 - (CRWTouchTrackingRecognizer*)touchTrackingRecognizer; |
496 // Shows placeholder overlay. | 503 // Shows placeholder overlay. |
497 - (void)addPlaceholderOverlay; | 504 - (void)addPlaceholderOverlay; |
498 // Removes placeholder overlay. | 505 // Removes placeholder overlay. |
499 - (void)removePlaceholderOverlay; | 506 - (void)removePlaceholderOverlay; |
500 | 507 |
501 // Returns the current entry from the underlying session controller. | |
502 // TODO(stuartmorgan): Audit all calls to these methods; these are just wrappers | |
503 // around the same logic as GetActiveEntry, so should probably not be used for | |
504 // the same reason that GetActiveEntry is deprecated. (E.g., page operations | |
505 // should generally be dealing with the last commited entry, not a pending | |
506 // entry). | |
507 - (CRWSessionEntry*)currentSessionEntry; | |
508 // Returns the navigation item for the current page. | |
509 - (web::NavigationItem*)currentNavItem; | |
510 // Returns the current transition type. | |
511 - (ui::PageTransition)currentTransition; | |
512 // Returns the referrer for current navigation item. May be empty. | |
513 - (web::Referrer)currentSessionEntryReferrer; | |
514 // The HTTP headers associated with the current navigation item. These are nil | |
515 // unless the request was a POST. | |
516 - (NSDictionary*)currentHTTPHeaders; | |
517 | |
518 // Creates a web view if it's not yet created. | 508 // Creates a web view if it's not yet created. |
519 - (void)ensureWebViewCreated; | 509 - (void)ensureWebViewCreated; |
520 // Creates a web view with given |config|. No-op if web view is already created. | 510 // Creates a web view with given |config|. No-op if web view is already created. |
521 - (void)ensureWebViewCreatedWithConfiguration:(WKWebViewConfiguration*)config; | 511 - (void)ensureWebViewCreatedWithConfiguration:(WKWebViewConfiguration*)config; |
522 // Returns a new autoreleased web view created with given configuration. | 512 // Returns a new autoreleased web view created with given configuration. |
523 - (WKWebView*)webViewWithConfiguration:(WKWebViewConfiguration*)config; | 513 - (WKWebView*)webViewWithConfiguration:(WKWebViewConfiguration*)config; |
524 // Sets the value of the webView property, and performs its basic setup. | 514 // Sets the value of the webView property, and performs its basic setup. |
525 - (void)setWebView:(WKWebView*)webView; | 515 - (void)setWebView:(WKWebView*)webView; |
526 // Removes webView, optionally tracking the URL of the evicted | 516 // Removes webView, optionally tracking the URL of the evicted |
527 // page for later cache-based reconstruction. | 517 // page for later cache-based reconstruction. |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
599 // Update the appropriate parts of the model and broadcast to the embedder. This | 589 // Update the appropriate parts of the model and broadcast to the embedder. This |
600 // may be called multiple times and thus must be idempotent. | 590 // may be called multiple times and thus must be idempotent. |
601 - (void)loadCompleteWithSuccess:(BOOL)loadSuccess; | 591 - (void)loadCompleteWithSuccess:(BOOL)loadSuccess; |
602 // Called after URL is finished loading and _loadPhase is set to PAGE_LOADED. | 592 // Called after URL is finished loading and _loadPhase is set to PAGE_LOADED. |
603 - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess; | 593 - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess; |
604 // Navigates forwards or backwards by |delta| pages. No-op if delta is out of | 594 // Navigates forwards or backwards by |delta| pages. No-op if delta is out of |
605 // bounds. Reloads if delta is 0. | 595 // bounds. Reloads if delta is 0. |
606 // TODO(crbug.com/661316): Move this method to NavigationManager. | 596 // TODO(crbug.com/661316): Move this method to NavigationManager. |
607 - (void)goDelta:(int)delta; | 597 - (void)goDelta:(int)delta; |
608 // Loads a new URL if the current entry is not from a pushState() navigation. | 598 // Loads a new URL if the current entry is not from a pushState() navigation. |
609 // |fromEntry| is the CRWSessionEntry that was the current entry prior to the | 599 // |item| is the NavigationItem that was the current entry prior to the |
610 // navigation. | 600 // navigation. |
611 - (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry; | 601 - (void)finishHistoryNavigationFromItem:(web::NavigationItem*)item; |
612 // Informs the native controller if web usage is allowed or not. | 602 // Informs the native controller if web usage is allowed or not. |
613 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled; | 603 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled; |
614 // Called when web controller receives a new message from the web page. | 604 // Called when web controller receives a new message from the web page. |
615 - (void)didReceiveScriptMessage:(WKScriptMessage*)message; | 605 - (void)didReceiveScriptMessage:(WKScriptMessage*)message; |
616 // Returns a new script which wraps |script| with windowID check so |script| is | 606 // Returns a new script which wraps |script| with windowID check so |script| is |
617 // not evaluated on windowID mismatch. | 607 // not evaluated on windowID mismatch. |
618 - (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script; | 608 - (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script; |
619 // Attempts to handle a script message. Returns YES on success, NO otherwise. | 609 // Attempts to handle a script message. Returns YES on success, NO otherwise. |
620 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; | 610 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; |
621 // Registers load request with empty referrer and link or client redirect | 611 // Registers load request with empty referrer and link or client redirect |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1285 } | 1275 } |
1286 // Any non-web URL source is trusted. | 1276 // Any non-web URL source is trusted. |
1287 *trustLevel = web::URLVerificationTrustLevel::kAbsolute; | 1277 *trustLevel = web::URLVerificationTrustLevel::kAbsolute; |
1288 if (self.nativeController) { | 1278 if (self.nativeController) { |
1289 if ([self.nativeController respondsToSelector:@selector(virtualURL)]) { | 1279 if ([self.nativeController respondsToSelector:@selector(virtualURL)]) { |
1290 return [self.nativeController virtualURL]; | 1280 return [self.nativeController virtualURL]; |
1291 } else { | 1281 } else { |
1292 return [self.nativeController url]; | 1282 return [self.nativeController url]; |
1293 } | 1283 } |
1294 } | 1284 } |
1295 web::NavigationItem* item = [self currentNavItem]; | 1285 web::NavigationItem* item = self.currentNavItem; |
1296 return item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1286 return item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
1297 } | 1287 } |
1298 | 1288 |
1299 - (WKWebView*)webView { | 1289 - (WKWebView*)webView { |
1300 return _webView.get(); | 1290 return _webView.get(); |
1301 } | 1291 } |
1302 | 1292 |
1303 - (UIScrollView*)webScrollView { | 1293 - (UIScrollView*)webScrollView { |
1304 return [_webView scrollView]; | 1294 return [_webView scrollView]; |
1305 } | 1295 } |
1306 | 1296 |
1307 - (GURL)currentURL { | 1297 - (GURL)currentURL { |
1308 web::URLVerificationTrustLevel trustLevel = | 1298 web::URLVerificationTrustLevel trustLevel = |
1309 web::URLVerificationTrustLevel::kNone; | 1299 web::URLVerificationTrustLevel::kNone; |
1310 return [self currentURLWithTrustLevel:&trustLevel]; | 1300 return [self currentURLWithTrustLevel:&trustLevel]; |
1311 } | 1301 } |
1312 | 1302 |
1313 - (web::Referrer)currentReferrer { | 1303 - (web::Referrer)currentReferrer { |
1314 // Referrer string doesn't include the fragment, so in cases where the | 1304 // Referrer string doesn't include the fragment, so in cases where the |
1315 // previous URL is equal to the current referrer plus the fragment the | 1305 // previous URL is equal to the current referrer plus the fragment the |
1316 // previous URL is returned as current referrer. | 1306 // previous URL is returned as current referrer. |
1317 NSString* referrerString = _currentReferrerString; | 1307 NSString* referrerString = _currentReferrerString; |
1318 | 1308 |
1319 // In case of an error evaluating the JavaScript simply return empty string. | 1309 // In case of an error evaluating the JavaScript simply return empty string. |
1320 if ([referrerString length] == 0) | 1310 if ([referrerString length] == 0) |
1321 return web::Referrer(); | 1311 return web::Referrer(); |
1322 | 1312 |
1323 web::NavigationItem* item = [self currentNavItem]; | 1313 web::NavigationItem* item = self.currentNavItem; |
1324 GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1314 GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
1325 NSString* previousURLString = base::SysUTF8ToNSString(navigationURL.spec()); | 1315 NSString* previousURLString = base::SysUTF8ToNSString(navigationURL.spec()); |
1326 // Check if the referrer is equal to the previous URL minus the hash symbol. | 1316 // Check if the referrer is equal to the previous URL minus the hash symbol. |
1327 // L'#' is used to convert the char '#' to a unichar. | 1317 // L'#' is used to convert the char '#' to a unichar. |
1328 if ([previousURLString length] > [referrerString length] && | 1318 if ([previousURLString length] > [referrerString length] && |
1329 [previousURLString hasPrefix:referrerString] && | 1319 [previousURLString hasPrefix:referrerString] && |
1330 [previousURLString characterAtIndex:[referrerString length]] == L'#') { | 1320 [previousURLString characterAtIndex:[referrerString length]] == L'#') { |
1331 referrerString = previousURLString; | 1321 referrerString = previousURLString; |
1332 } | 1322 } |
1333 // Since referrer is being extracted from the destination page, the correct | 1323 // Since referrer is being extracted from the destination page, the correct |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1400 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods | 1390 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods |
1401 // were not called. | 1391 // were not called. |
1402 NSString* HTTPMethod = | 1392 NSString* HTTPMethod = |
1403 _pendingNavigationInfo | 1393 _pendingNavigationInfo |
1404 ? [_pendingNavigationInfo HTTPMethod] | 1394 ? [_pendingNavigationInfo HTTPMethod] |
1405 : [self currentBackForwardListItemHolder]->http_method(); | 1395 : [self currentBackForwardListItemHolder]->http_method(); |
1406 return [HTTPMethod isEqual:@"POST"]; | 1396 return [HTTPMethod isEqual:@"POST"]; |
1407 } | 1397 } |
1408 | 1398 |
1409 - (BOOL)isCurrentNavigationBackForward { | 1399 - (BOOL)isCurrentNavigationBackForward { |
1410 if (![self currentNavItem]) | 1400 if (!self.currentNavItem) |
1411 return NO; | 1401 return NO; |
1412 WKNavigationType currentNavigationType = | 1402 WKNavigationType currentNavigationType = |
1413 [self currentBackForwardListItemHolder]->navigation_type(); | 1403 [self currentBackForwardListItemHolder]->navigation_type(); |
1414 return currentNavigationType == WKNavigationTypeBackForward; | 1404 return currentNavigationType == WKNavigationTypeBackForward; |
1415 } | 1405 } |
1416 | 1406 |
1417 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType { | 1407 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType { |
1418 switch (navigationType) { | 1408 switch (navigationType) { |
1419 case WKNavigationTypeLinkActivated: | 1409 case WKNavigationTypeLinkActivated: |
1420 return YES; | 1410 return YES; |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1581 [[self sessionController] addPendingItem:requestURL | 1571 [[self sessionController] addPendingItem:requestURL |
1582 referrer:referrer | 1572 referrer:referrer |
1583 transition:transition | 1573 transition:transition |
1584 rendererInitiated:YES]; | 1574 rendererInitiated:YES]; |
1585 } | 1575 } |
1586 _webStateImpl->SetIsLoading(true); | 1576 _webStateImpl->SetIsLoading(true); |
1587 _webStateImpl->OnProvisionalNavigationStarted(requestURL); | 1577 _webStateImpl->OnProvisionalNavigationStarted(requestURL); |
1588 } | 1578 } |
1589 | 1579 |
1590 - (void)updateHTML5HistoryState { | 1580 - (void)updateHTML5HistoryState { |
1591 web::NavigationItemImpl* currentItem = | 1581 web::NavigationItemImpl* currentItem = self.currentNavItem; |
1592 static_cast<web::NavigationItemImpl*>([self currentNavItem]); | |
1593 if (!currentItem) | 1582 if (!currentItem) |
1594 return; | 1583 return; |
1595 | 1584 |
1596 // Same-document navigations must trigger a popState event. | 1585 // Same-document navigations must trigger a popState event. |
1597 CRWSessionController* sessionController = self.sessionController; | 1586 CRWSessionController* sessionController = self.sessionController; |
1598 BOOL sameDocumentNavigation = [sessionController | 1587 BOOL sameDocumentNavigation = [sessionController |
1599 isSameDocumentNavigationBetweenItem:sessionController.currentItem | 1588 isSameDocumentNavigationBetweenItem:sessionController.currentItem |
1600 andItem:sessionController.previousItem]; | 1589 andItem:sessionController.previousItem]; |
1601 // WKWebView doesn't send hashchange events for same-document non-BFLI | 1590 // WKWebView doesn't send hashchange events for same-document non-BFLI |
1602 // navigations, so one must be dispatched manually for hash change same- | 1591 // navigations, so one must be dispatched manually for hash change same- |
1603 // document navigations. | 1592 // document navigations. |
1604 web::NavigationItem* previousItem = | |
1605 self.sessionController.previousEntry.navigationItem; | |
1606 const GURL URL = currentItem->GetURL(); | 1593 const GURL URL = currentItem->GetURL(); |
1594 web::NavigationItem* previousItem = self.sessionController.previousItem; | |
1607 const GURL oldURL = previousItem ? previousItem->GetURL() : GURL(); | 1595 const GURL oldURL = previousItem ? previousItem->GetURL() : GURL(); |
1608 BOOL shouldDispatchHashchange = sameDocumentNavigation && previousItem && | 1596 BOOL shouldDispatchHashchange = sameDocumentNavigation && previousItem && |
1609 (web::GURLByRemovingRefFromGURL(URL) == | 1597 (web::GURLByRemovingRefFromGURL(URL) == |
1610 web::GURLByRemovingRefFromGURL(oldURL)); | 1598 web::GURLByRemovingRefFromGURL(oldURL)); |
1611 // The URL and state object must be set for same-document navigations and | 1599 // The URL and state object must be set for same-document navigations and |
1612 // NavigationItems that were created or updated by calls to pushState() or | 1600 // NavigationItems that were created or updated by calls to pushState() or |
1613 // replaceState(). | 1601 // replaceState(). |
1614 BOOL shouldUpdateState = sameDocumentNavigation || | 1602 BOOL shouldUpdateState = sameDocumentNavigation || |
1615 currentItem->IsCreatedFromPushState() || | 1603 currentItem->IsCreatedFromPushState() || |
1616 currentItem->HasStateBeenReplaced(); | 1604 currentItem->HasStateBeenReplaced(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1649 | 1637 |
1650 - (NSString*)javaScriptToDispatchHashChangeWithOldURL:(const GURL&)oldURL | 1638 - (NSString*)javaScriptToDispatchHashChangeWithOldURL:(const GURL&)oldURL |
1651 newURL:(const GURL&)newURL { | 1639 newURL:(const GURL&)newURL { |
1652 return [NSString | 1640 return [NSString |
1653 stringWithFormat:@"__gCrWeb.dispatchHashchangeEvent(\'%s\', \'%s\');", | 1641 stringWithFormat:@"__gCrWeb.dispatchHashchangeEvent(\'%s\', \'%s\');", |
1654 oldURL.spec().c_str(), newURL.spec().c_str()]; | 1642 oldURL.spec().c_str(), newURL.spec().c_str()]; |
1655 } | 1643 } |
1656 | 1644 |
1657 - (void)injectHTML5HistoryScriptWithHashChange:(BOOL)dispatchHashChange | 1645 - (void)injectHTML5HistoryScriptWithHashChange:(BOOL)dispatchHashChange |
1658 sameDocumentNavigation:(BOOL)sameDocumentNavigation { | 1646 sameDocumentNavigation:(BOOL)sameDocumentNavigation { |
1659 web::NavigationItemImpl* currentItem = | 1647 web::NavigationItemImpl* currentItem = self.currentNavItem; |
1660 static_cast<web::NavigationItemImpl*>([self currentNavItem]); | |
1661 if (!currentItem) | 1648 if (!currentItem) |
1662 return; | 1649 return; |
1663 | 1650 |
1664 const GURL URL = currentItem->GetURL(); | 1651 const GURL URL = currentItem->GetURL(); |
1665 NSString* stateObject = currentItem->GetSerializedStateObject(); | 1652 NSString* stateObject = currentItem->GetSerializedStateObject(); |
1666 NSMutableString* script = [NSMutableString | 1653 NSMutableString* script = [NSMutableString |
1667 stringWithString:[self javaScriptToReplaceWebViewURL:URL | 1654 stringWithString:[self javaScriptToReplaceWebViewURL:URL |
1668 stateObjectJSON:stateObject]]; | 1655 stateObjectJSON:stateObject]]; |
1669 if (sameDocumentNavigation) { | 1656 if (sameDocumentNavigation) { |
1670 [script | 1657 [script |
1671 appendString:[self javaScriptToDispatchPopStateWithObject:stateObject]]; | 1658 appendString:[self javaScriptToDispatchPopStateWithObject:stateObject]]; |
1672 } | 1659 } |
1673 if (dispatchHashChange) { | 1660 if (dispatchHashChange) { |
1674 web::NavigationItemImpl* previousItem = | 1661 web::NavigationItemImpl* previousItem = |
1675 self.sessionController.previousEntry.navigationItemImpl; | 1662 self.sessionController.previousItem; |
1676 const GURL oldURL = previousItem ? previousItem->GetURL() : GURL(); | 1663 const GURL oldURL = previousItem ? previousItem->GetURL() : GURL(); |
1677 [script appendString:[self javaScriptToDispatchHashChangeWithOldURL:oldURL | 1664 [script appendString:[self javaScriptToDispatchHashChangeWithOldURL:oldURL |
1678 newURL:URL]]; | 1665 newURL:URL]]; |
1679 } | 1666 } |
1680 base::WeakNSObject<CRWWebController> weakSelf(self); | 1667 base::WeakNSObject<CRWWebController> weakSelf(self); |
1681 [self executeJavaScript:script | 1668 [self executeJavaScript:script |
1682 completionHandler:^(id, NSError*) { | 1669 completionHandler:^(id, NSError*) { |
1683 if (!weakSelf || weakSelf.get()->_isBeingDestroyed) | 1670 if (!weakSelf || weakSelf.get()->_isBeingDestroyed) |
1684 return; | 1671 return; |
1685 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); | 1672 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); |
1686 strongSelf.get()->_URLOnStartLoading = URL; | 1673 strongSelf.get()->_URLOnStartLoading = URL; |
1687 strongSelf.get()->_lastRegisteredRequestURL = URL; | 1674 strongSelf.get()->_lastRegisteredRequestURL = URL; |
1688 }]; | 1675 }]; |
1689 } | 1676 } |
1690 | 1677 |
1691 // Load the current URL in a web view, first ensuring the web view is visible. | 1678 // Load the current URL in a web view, first ensuring the web view is visible. |
1692 - (void)loadCurrentURLInWebView { | 1679 - (void)loadCurrentURLInWebView { |
1693 // Clear the set of URLs opened in external applications. | 1680 // Clear the set of URLs opened in external applications. |
1694 _openedApplicationURL.reset([[NSMutableSet alloc] init]); | 1681 _openedApplicationURL.reset([[NSMutableSet alloc] init]); |
1695 | 1682 |
1696 web::NavigationItem* item = [self currentNavItem]; | 1683 web::NavigationItem* item = self.currentNavItem; |
1697 GURL targetURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1684 GURL targetURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
1698 // Load the url. The UIWebView delegate callbacks take care of updating the | 1685 // Load the url. The UIWebView delegate callbacks take care of updating the |
1699 // session history and UI. | 1686 // session history and UI. |
1700 if (!targetURL.is_valid()) { | 1687 if (!targetURL.is_valid()) { |
1701 [self didFinishWithURL:targetURL loadSuccess:NO]; | 1688 [self didFinishWithURL:targetURL loadSuccess:NO]; |
1702 return; | 1689 return; |
1703 } | 1690 } |
1704 | 1691 |
1705 // JavaScript should never be evaluated here. User-entered JS should be | 1692 // JavaScript should never be evaluated here. User-entered JS should be |
1706 // evaluated via stringByEvaluatingUserJavaScriptFromString. | 1693 // evaluated via stringByEvaluatingUserJavaScriptFromString. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1741 if ([_pendingNavigationInfo MIMEType]) { | 1728 if ([_pendingNavigationInfo MIMEType]) { |
1742 self.webStateImpl->SetContentsMimeType( | 1729 self.webStateImpl->SetContentsMimeType( |
1743 base::SysNSStringToUTF8([_pendingNavigationInfo MIMEType])); | 1730 base::SysNSStringToUTF8([_pendingNavigationInfo MIMEType])); |
1744 } | 1731 } |
1745 [self updateCurrentBackForwardListItemHolder]; | 1732 [self updateCurrentBackForwardListItemHolder]; |
1746 | 1733 |
1747 _pendingNavigationInfo.reset(); | 1734 _pendingNavigationInfo.reset(); |
1748 } | 1735 } |
1749 | 1736 |
1750 - (NSMutableURLRequest*)requestForCurrentNavigationItem { | 1737 - (NSMutableURLRequest*)requestForCurrentNavigationItem { |
1751 web::NavigationItem* item = [self currentNavItem]; | 1738 web::NavigationItem* item = self.currentNavItem; |
1752 const GURL currentNavigationURL = | 1739 const GURL currentNavigationURL = |
1753 item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1740 item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
1754 NSMutableURLRequest* request = [NSMutableURLRequest | 1741 NSMutableURLRequest* request = [NSMutableURLRequest |
1755 requestWithURL:net::NSURLWithGURL(currentNavigationURL)]; | 1742 requestWithURL:net::NSURLWithGURL(currentNavigationURL)]; |
1756 const web::Referrer referrer([self currentSessionEntryReferrer]); | 1743 const web::Referrer referrer(self.currentNavItemReferrer); |
1757 if (referrer.url.is_valid()) { | 1744 if (referrer.url.is_valid()) { |
1758 std::string referrerValue = | 1745 std::string referrerValue = |
1759 web::ReferrerHeaderValueForNavigation(currentNavigationURL, referrer); | 1746 web::ReferrerHeaderValueForNavigation(currentNavigationURL, referrer); |
1760 if (!referrerValue.empty()) { | 1747 if (!referrerValue.empty()) { |
1761 [request setValue:base::SysUTF8ToNSString(referrerValue) | 1748 [request setValue:base::SysUTF8ToNSString(referrerValue) |
1762 forHTTPHeaderField:kReferrerHeaderName]; | 1749 forHTTPHeaderField:kReferrerHeaderName]; |
1763 } | 1750 } |
1764 } | 1751 } |
1765 | 1752 |
1766 // If there are headers in the current session entry add them to |request|. | 1753 // If there are headers in the current session entry add them to |request|. |
1767 // Headers that would overwrite fields already present in |request| are | 1754 // Headers that would overwrite fields already present in |request| are |
1768 // skipped. | 1755 // skipped. |
1769 NSDictionary* headers = [self currentHTTPHeaders]; | 1756 NSDictionary* headers = self.currentHTTPHeaders; |
1770 for (NSString* headerName in headers) { | 1757 for (NSString* headerName in headers) { |
1771 if (![request valueForHTTPHeaderField:headerName]) { | 1758 if (![request valueForHTTPHeaderField:headerName]) { |
1772 [request setValue:[headers objectForKey:headerName] | 1759 [request setValue:[headers objectForKey:headerName] |
1773 forHTTPHeaderField:headerName]; | 1760 forHTTPHeaderField:headerName]; |
1774 } | 1761 } |
1775 } | 1762 } |
1776 | 1763 |
1777 return request; | 1764 return request; |
1778 } | 1765 } |
1779 | 1766 |
1780 - (web::WKBackForwardListItemHolder*)currentBackForwardListItemHolder { | 1767 - (web::WKBackForwardListItemHolder*)currentBackForwardListItemHolder { |
1781 web::NavigationItem* item = [self currentSessionEntry].navigationItemImpl; | 1768 web::NavigationItem* item = self.currentNavItem; |
1782 DCHECK(item); | 1769 DCHECK(item); |
1783 web::WKBackForwardListItemHolder* holder = | 1770 web::WKBackForwardListItemHolder* holder = |
1784 web::WKBackForwardListItemHolder::FromNavigationItem(item); | 1771 web::WKBackForwardListItemHolder::FromNavigationItem(item); |
1785 DCHECK(holder); | 1772 DCHECK(holder); |
1786 return holder; | 1773 return holder; |
1787 } | 1774 } |
1788 | 1775 |
1789 - (void)updateCurrentBackForwardListItemHolder { | 1776 - (void)updateCurrentBackForwardListItemHolder { |
1790 // WebUI pages (which are loaded via loadHTMLString:baseURL:) have no entry | 1777 // WebUI pages (which are loaded via loadHTMLString:baseURL:) have no entry |
1791 // in the back/forward list, so the current item will still be the previous | 1778 // in the back/forward list, so the current item will still be the previous |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1827 // delegate. | 1814 // delegate. |
1828 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { | 1815 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { |
1829 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { | 1816 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { |
1830 [self.nativeController setDelegate:self]; | 1817 [self.nativeController setDelegate:self]; |
1831 } | 1818 } |
1832 } | 1819 } |
1833 } | 1820 } |
1834 | 1821 |
1835 - (void)loadErrorInNativeView:(NSError*)error { | 1822 - (void)loadErrorInNativeView:(NSError*)error { |
1836 [self removeWebViewAllowingCachedReconstruction:NO]; | 1823 [self removeWebViewAllowingCachedReconstruction:NO]; |
1837 web::NavigationItem* item = [self currentNavItem]; | 1824 web::NavigationItem* item = self.currentNavItem; |
1838 const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1825 const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
1839 | 1826 |
1840 if (web::IsWKWebViewSSLCertError(error)) { | 1827 if (web::IsWKWebViewSSLCertError(error)) { |
1841 // This could happen only if certificate is absent or could not be parsed. | 1828 // This could happen only if certificate is absent or could not be parsed. |
1842 error = web::NetErrorFromError(error, net::ERR_SSL_SERVER_CERT_BAD_FORMAT); | 1829 error = web::NetErrorFromError(error, net::ERR_SSL_SERVER_CERT_BAD_FORMAT); |
1843 #if defined(DEBUG) | 1830 #if defined(DEBUG) |
1844 net::SSLInfo info; | 1831 net::SSLInfo info; |
1845 web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); | 1832 web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); |
1846 CHECK(!error.cert); | 1833 CHECK(!error.cert); |
1847 #endif | 1834 #endif |
1848 } else { | 1835 } else { |
1849 error = web::NetErrorFromError(error); | 1836 error = web::NetErrorFromError(error); |
1850 } | 1837 } |
1851 | 1838 |
1852 BOOL isPost = [self isCurrentNavigationItemPOST]; | 1839 BOOL isPost = [self isCurrentNavigationItemPOST]; |
1853 [self setNativeController:[_nativeProvider controllerForURL:currentURL | 1840 [self setNativeController:[_nativeProvider controllerForURL:currentURL |
1854 withError:error | 1841 withError:error |
1855 isPost:isPost]]; | 1842 isPost:isPost]]; |
1856 [self loadNativeViewWithSuccess:NO]; | 1843 [self loadNativeViewWithSuccess:NO]; |
1857 } | 1844 } |
1858 | 1845 |
1859 // Load the current URL in a native controller, retrieved from the native | 1846 // Load the current URL in a native controller, retrieved from the native |
1860 // provider. Call |loadNativeViewWithSuccess:YES| to load the native controller. | 1847 // provider. Call |loadNativeViewWithSuccess:YES| to load the native controller. |
1861 - (void)loadCurrentURLInNativeView { | 1848 - (void)loadCurrentURLInNativeView { |
1862 // Free the web view. | 1849 // Free the web view. |
1863 [self removeWebViewAllowingCachedReconstruction:NO]; | 1850 [self removeWebViewAllowingCachedReconstruction:NO]; |
1864 | 1851 |
1865 web::NavigationItem* item = [self currentNavItem]; | 1852 web::NavigationItem* item = self.currentNavItem; |
1866 const GURL targetURL = item ? item->GetURL() : GURL::EmptyGURL(); | 1853 const GURL targetURL = item ? item->GetURL() : GURL::EmptyGURL(); |
1867 const web::Referrer referrer; | 1854 const web::Referrer referrer; |
1868 id<CRWNativeContent> nativeContent = | 1855 id<CRWNativeContent> nativeContent = |
1869 [_nativeProvider controllerForURL:targetURL webState:self.webState]; | 1856 [_nativeProvider controllerForURL:targetURL webState:self.webState]; |
1870 // Unlike the WebView case, always create a new controller and view. | 1857 // Unlike the WebView case, always create a new controller and view. |
1871 // TODO(pinkerton): What to do if this does return nil? | 1858 // TODO(pinkerton): What to do if this does return nil? |
1872 [self setNativeController:nativeContent]; | 1859 [self setNativeController:nativeContent]; |
1873 if ([nativeContent respondsToSelector:@selector(virtualURL)]) { | 1860 if ([nativeContent respondsToSelector:@selector(virtualURL)]) { |
1874 item->SetVirtualURL([nativeContent virtualURL]); | 1861 item->SetVirtualURL([nativeContent virtualURL]); |
1875 } | 1862 } |
1876 | 1863 |
1877 [self registerLoadRequest:targetURL | 1864 [self registerLoadRequest:targetURL |
1878 referrer:referrer | 1865 referrer:referrer |
1879 transition:[self currentTransition]]; | 1866 transition:self.currentTransition]; |
1880 [self loadNativeViewWithSuccess:YES]; | 1867 [self loadNativeViewWithSuccess:YES]; |
1881 } | 1868 } |
1882 | 1869 |
1883 - (void)loadWithParams:(const NavigationManager::WebLoadParams&)originalParams { | 1870 - (void)loadWithParams:(const NavigationManager::WebLoadParams&)originalParams { |
1884 // Make a copy of |params|, as some of the delegate methods may modify it. | 1871 // Make a copy of |params|, as some of the delegate methods may modify it. |
1885 NavigationManager::WebLoadParams params(originalParams); | 1872 NavigationManager::WebLoadParams params(originalParams); |
1886 | 1873 |
1887 // Initiating a navigation from the UI, record the current page state before | 1874 // Initiating a navigation from the UI, record the current page state before |
1888 // the new page loads. Don't record for back/forward, as the current entry | 1875 // the new page loads. Don't record for back/forward, as the current entry |
1889 // has already been moved to the next entry in the history. Do, however, | 1876 // has already been moved to the next entry in the history. Do, however, |
(...skipping 20 matching lines...) Expand all Loading... | |
1910 // manager. TODO(stuartmorgan): Drive Transient Item clearing from | 1897 // manager. TODO(stuartmorgan): Drive Transient Item clearing from |
1911 // navigation system, rather than from WebController. | 1898 // navigation system, rather than from WebController. |
1912 [self clearTransientContentView]; | 1899 [self clearTransientContentView]; |
1913 | 1900 |
1914 // TODO(stuartmorgan): Why doesn't recordStateInHistory get called for | 1901 // TODO(stuartmorgan): Why doesn't recordStateInHistory get called for |
1915 // forward/back transitions? | 1902 // forward/back transitions? |
1916 [self recordStateInHistory]; | 1903 [self recordStateInHistory]; |
1917 | 1904 |
1918 CRWSessionController* history = | 1905 CRWSessionController* history = |
1919 _webStateImpl->GetNavigationManagerImpl().GetSessionController(); | 1906 _webStateImpl->GetNavigationManagerImpl().GetSessionController(); |
1920 if (!self.currentSessionEntry) | 1907 if (!history.currentItem) |
1921 initialNavigation = YES; | 1908 initialNavigation = YES; |
1922 [history addPendingItem:navUrl | 1909 [history addPendingItem:navUrl |
1923 referrer:params.referrer | 1910 referrer:params.referrer |
1924 transition:transition | 1911 transition:transition |
1925 rendererInitiated:params.is_renderer_initiated]; | 1912 rendererInitiated:params.is_renderer_initiated]; |
1926 web::NavigationItemImpl* addedItem = | 1913 web::NavigationItemImpl* addedItem = history.currentItem; |
1927 [self currentSessionEntry].navigationItemImpl; | |
1928 DCHECK(addedItem); | 1914 DCHECK(addedItem); |
1929 if (params.extra_headers) | 1915 if (params.extra_headers) |
1930 addedItem->AddHttpRequestHeaders(params.extra_headers); | 1916 addedItem->AddHttpRequestHeaders(params.extra_headers); |
1931 if (params.post_data) { | 1917 if (params.post_data) { |
1932 DCHECK([addedItem->GetHttpRequestHeaders() objectForKey:@"Content-Type"]) | 1918 DCHECK([addedItem->GetHttpRequestHeaders() objectForKey:@"Content-Type"]) |
1933 << "Post data should have an associated content type"; | 1919 << "Post data should have an associated content type"; |
1934 addedItem->SetPostData(params.post_data); | 1920 addedItem->SetPostData(params.post_data); |
1935 addedItem->SetShouldSkipRepostFormConfirmation(true); | 1921 addedItem->SetShouldSkipRepostFormConfirmation(true); |
1936 } | 1922 } |
1937 } | 1923 } |
(...skipping 15 matching lines...) Expand all Loading... | |
1953 | 1939 |
1954 // Abort any outstanding page load. This ensures the delegate gets informed | 1940 // Abort any outstanding page load. This ensures the delegate gets informed |
1955 // about the outgoing page, and further messages from the page are suppressed. | 1941 // about the outgoing page, and further messages from the page are suppressed. |
1956 if (_loadPhase != web::PAGE_LOADED) | 1942 if (_loadPhase != web::PAGE_LOADED) |
1957 [self abortLoad]; | 1943 [self abortLoad]; |
1958 | 1944 |
1959 DCHECK(!_isHalted); | 1945 DCHECK(!_isHalted); |
1960 // Remove the transient content view. | 1946 // Remove the transient content view. |
1961 [self clearTransientContentView]; | 1947 [self clearTransientContentView]; |
1962 | 1948 |
1963 web::NavigationItem* item = [self currentNavItem]; | 1949 web::NavigationItem* item = self.currentNavItem; |
1964 const GURL currentURL = item ? item->GetURL() : GURL::EmptyGURL(); | 1950 const GURL currentURL = item ? item->GetURL() : GURL::EmptyGURL(); |
1965 // If it's a chrome URL, but not a native one, create the WebUI instance. | 1951 // If it's a chrome URL, but not a native one, create the WebUI instance. |
1966 if (web::GetWebClient()->IsAppSpecificURL(currentURL) && | 1952 if (web::GetWebClient()->IsAppSpecificURL(currentURL) && |
1967 ![_nativeProvider hasControllerForURL:currentURL]) { | 1953 ![_nativeProvider hasControllerForURL:currentURL]) { |
1968 if (!(item->GetTransitionType() & ui::PAGE_TRANSITION_TYPED || | 1954 if (!(item->GetTransitionType() & ui::PAGE_TRANSITION_TYPED || |
1969 item->GetTransitionType() & ui::PAGE_TRANSITION_AUTO_BOOKMARK) && | 1955 item->GetTransitionType() & ui::PAGE_TRANSITION_AUTO_BOOKMARK) && |
1970 self.sessionController.openedByDOM) { | 1956 self.sessionController.openedByDOM) { |
1971 // WebUI URLs can not be opened by DOM to prevent cross-site scripting as | 1957 // WebUI URLs can not be opened by DOM to prevent cross-site scripting as |
1972 // they have increased power. WebUI URLs may only be opened when the user | 1958 // they have increased power. WebUI URLs may only be opened when the user |
1973 // types in the URL or use bookmarks. | 1959 // types in the URL or use bookmarks. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2021 CGFloat statusBarHeight = | 2007 CGFloat statusBarHeight = |
2022 [[UIApplication sharedApplication] statusBarFrame].size.height; | 2008 [[UIApplication sharedApplication] statusBarFrame].size.height; |
2023 CGRect containerViewFrame = [UIScreen mainScreen].bounds; | 2009 CGRect containerViewFrame = [UIScreen mainScreen].bounds; |
2024 containerViewFrame.origin.y += statusBarHeight; | 2010 containerViewFrame.origin.y += statusBarHeight; |
2025 containerViewFrame.size.height -= statusBarHeight; | 2011 containerViewFrame.size.height -= statusBarHeight; |
2026 _containerView.get().frame = containerViewFrame; | 2012 _containerView.get().frame = containerViewFrame; |
2027 DCHECK(!CGRectIsEmpty(_containerView.get().frame)); | 2013 DCHECK(!CGRectIsEmpty(_containerView.get().frame)); |
2028 | 2014 |
2029 [_containerView addGestureRecognizer:[self touchTrackingRecognizer]]; | 2015 [_containerView addGestureRecognizer:[self touchTrackingRecognizer]]; |
2030 // Is |currentUrl| a web scheme or native chrome scheme. | 2016 // Is |currentUrl| a web scheme or native chrome scheme. |
2031 web::NavigationItem* item = [self currentNavItem]; | 2017 web::NavigationItem* item = self.currentNavItem; |
2032 const GURL currentNavigationURL = | 2018 const GURL currentNavigationURL = |
2033 item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 2019 item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
2034 BOOL isChromeScheme = | 2020 BOOL isChromeScheme = |
2035 web::GetWebClient()->IsAppSpecificURL(currentNavigationURL); | 2021 web::GetWebClient()->IsAppSpecificURL(currentNavigationURL); |
2036 | 2022 |
2037 // Don't immediately load the web page if in overlay mode. Always load if | 2023 // Don't immediately load the web page if in overlay mode. Always load if |
2038 // native. | 2024 // native. |
2039 if (isChromeScheme || !_overlayPreviewMode) { | 2025 if (isChromeScheme || !_overlayPreviewMode) { |
2040 // TODO(jimblackler): end the practice of calling |loadCurrentURL| when it | 2026 // TODO(jimblackler): end the practice of calling |loadCurrentURL| when it |
2041 // is possible there is no current URL. If the call performs necessary | 2027 // is possible there is no current URL. If the call performs necessary |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2136 } | 2122 } |
2137 [_delegate webLoadCancelled:_URLOnStartLoading]; | 2123 [_delegate webLoadCancelled:_URLOnStartLoading]; |
2138 break; | 2124 break; |
2139 case web::PAGE_LOADED: | 2125 case web::PAGE_LOADED: |
2140 break; | 2126 break; |
2141 } | 2127 } |
2142 } | 2128 } |
2143 | 2129 |
2144 - (void)goToItemAtIndex:(int)index { | 2130 - (void)goToItemAtIndex:(int)index { |
2145 CRWSessionController* sessionController = self.sessionController; | 2131 CRWSessionController* sessionController = self.sessionController; |
2146 NSArray* entries = sessionController.entries; | 2132 web::NavigationItemList items = sessionController.items; |
2147 if (index < 0 || index >= static_cast<int>(entries.count)) { | 2133 if (index < 0 || index >= static_cast<int>(items.size())) { |
2148 NOTREACHED(); | 2134 NOTREACHED(); |
2149 return; | 2135 return; |
2150 } | 2136 } |
2151 | 2137 |
2152 if (!_webStateImpl->IsShowingWebInterstitial()) | 2138 if (!_webStateImpl->IsShowingWebInterstitial()) |
2153 [self recordStateInHistory]; | 2139 [self recordStateInHistory]; |
2154 CRWSessionEntry* fromEntry = sessionController.currentEntry; | 2140 web::NavigationItem* fromItem = sessionController.currentItem; |
2155 CRWSessionEntry* toEntry = entries[index]; | 2141 web::NavigationItem* toItem = items[index]; |
2156 | 2142 |
2157 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; | 2143 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; |
2158 if (![userDefaults boolForKey:@"PendingIndexNavigationDisabled"]) { | 2144 if (![userDefaults boolForKey:@"PendingIndexNavigationDisabled"]) { |
2159 [self clearTransientContentView]; | 2145 [self clearTransientContentView]; |
2160 | 2146 |
2161 BOOL sameDocumentNavigation = [sessionController | 2147 BOOL sameDocumentNavigation = [sessionController |
2162 isSameDocumentNavigationBetweenItem:fromEntry.navigationItem | 2148 isSameDocumentNavigationBetweenItem:fromItem |
2163 andItem:toEntry.navigationItem]; | 2149 andItem:toItem]; |
2164 if (sameDocumentNavigation) { | 2150 if (sameDocumentNavigation) { |
2165 [self.sessionController goToItemAtIndex:index]; | 2151 [self.sessionController goToItemAtIndex:index]; |
2166 // TODO(crbug.com/684098): move this call out this block to avoid code | 2152 // TODO(crbug.com/684098): move this call out this block to avoid code |
2167 // duplication. | 2153 // duplication. |
2168 [self webWillFinishHistoryNavigationFromEntry:fromEntry]; | 2154 [self webWillFinishHistoryNavigationFromItem:fromItem]; |
2169 [self updateHTML5HistoryState]; | 2155 [self updateHTML5HistoryState]; |
2170 } else { | 2156 } else { |
2171 [sessionController discardNonCommittedItems]; | 2157 [sessionController discardNonCommittedItems]; |
2172 [sessionController setPendingItemIndex:index]; | 2158 [sessionController setPendingItemIndex:index]; |
2173 | 2159 |
2174 // TODO(crbug.com/684098): move this call out this block to avoid code | 2160 // TODO(crbug.com/684098): move this call out this block to avoid code |
2175 // duplication. | 2161 // duplication. |
2176 [self webWillFinishHistoryNavigationFromEntry:fromEntry]; | 2162 [self webWillFinishHistoryNavigationFromItem:fromItem]; |
2177 | 2163 |
2178 web::NavigationItemImpl* pendingItem = | 2164 web::NavigationItemImpl* pendingItem = sessionController.pendingItem; |
2179 sessionController.pendingEntry.navigationItemImpl; | |
2180 pendingItem->SetTransitionType(ui::PageTransitionFromInt( | 2165 pendingItem->SetTransitionType(ui::PageTransitionFromInt( |
2181 pendingItem->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK)); | 2166 pendingItem->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK)); |
2182 | 2167 |
2183 [self loadCurrentURL]; | 2168 [self loadCurrentURL]; |
2184 } | 2169 } |
2185 } else { | 2170 } else { |
2186 [self.sessionController goToItemAtIndex:index]; | 2171 [self.sessionController goToItemAtIndex:index]; |
2187 if (fromEntry) | 2172 if (fromItem) |
2188 [self finishHistoryNavigationFromEntry:fromEntry]; | 2173 [self finishHistoryNavigationFromItem:fromItem]; |
2189 } | 2174 } |
2190 } | 2175 } |
2191 | 2176 |
2192 - (BOOL)isLoaded { | 2177 - (BOOL)isLoaded { |
2193 return _loadPhase == web::PAGE_LOADED; | 2178 return _loadPhase == web::PAGE_LOADED; |
2194 } | 2179 } |
2195 | 2180 |
2196 - (void)didFinishNavigation { | 2181 - (void)didFinishNavigation { |
2197 // This can be called at multiple times after the document has loaded. Do | 2182 // This can be called at multiple times after the document has loaded. Do |
2198 // nothing if the document has already loaded. | 2183 // nothing if the document has already loaded. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2242 // WKWebView will cache the WebUI HTML in the previous WKBackForwardListItem | 2227 // WKWebView will cache the WebUI HTML in the previous WKBackForwardListItem |
2243 // since it's loaded via |-loadHTML:forURL:| instead of an NSURLRequest. As a | 2228 // since it's loaded via |-loadHTML:forURL:| instead of an NSURLRequest. As a |
2244 // result, the WebUI's HTML and URL will be loaded when navigating to that | 2229 // result, the WebUI's HTML and URL will be loaded when navigating to that |
2245 // WKBackForwardListItem, causing a mismatch between the visible content and | 2230 // WKBackForwardListItem, causing a mismatch between the visible content and |
2246 // the visible URL (WebUI page will be visible, but URL will be the previous | 2231 // the visible URL (WebUI page will be visible, but URL will be the previous |
2247 // page's URL). To prevent this potential URL spoofing vulnerability, reset | 2232 // page's URL). To prevent this potential URL spoofing vulnerability, reset |
2248 // the previous NavigationItem's WKBackForwardListItem to force loading via | 2233 // the previous NavigationItem's WKBackForwardListItem to force loading via |
2249 // NSURLRequest. | 2234 // NSURLRequest. |
2250 if (_webUIManager) { | 2235 if (_webUIManager) { |
2251 web::NavigationItem* lastNavigationItem = | 2236 web::NavigationItem* lastNavigationItem = |
2252 self.sessionController.previousEntry.navigationItem; | 2237 self.sessionController.previousItem; |
2253 if (lastNavigationItem) { | 2238 if (lastNavigationItem) { |
2254 web::WKBackForwardListItemHolder* holder = | 2239 web::WKBackForwardListItemHolder* holder = |
2255 web::WKBackForwardListItemHolder::FromNavigationItem( | 2240 web::WKBackForwardListItemHolder::FromNavigationItem( |
2256 lastNavigationItem); | 2241 lastNavigationItem); |
2257 DCHECK(holder); | 2242 DCHECK(holder); |
2258 holder->set_back_forward_list_item(nil); | 2243 holder->set_back_forward_list_item(nil); |
2259 } | 2244 } |
2260 } | 2245 } |
2261 | 2246 |
2262 [self restoreStateFromHistory]; | 2247 [self restoreStateFromHistory]; |
(...skipping 10 matching lines...) Expand all Loading... | |
2273 return; | 2258 return; |
2274 } | 2259 } |
2275 | 2260 |
2276 web::NavigationManagerImpl& navigationManager = | 2261 web::NavigationManagerImpl& navigationManager = |
2277 _webStateImpl->GetNavigationManagerImpl(); | 2262 _webStateImpl->GetNavigationManagerImpl(); |
2278 if (navigationManager.CanGoToOffset(delta)) { | 2263 if (navigationManager.CanGoToOffset(delta)) { |
2279 [self goToItemAtIndex:navigationManager.GetIndexForOffset(delta)]; | 2264 [self goToItemAtIndex:navigationManager.GetIndexForOffset(delta)]; |
2280 } | 2265 } |
2281 } | 2266 } |
2282 | 2267 |
2283 - (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry { | 2268 - (void)finishHistoryNavigationFromItem:(web::NavigationItem*)item { |
2284 [self webWillFinishHistoryNavigationFromEntry:fromEntry]; | 2269 [self webWillFinishHistoryNavigationFromItem:item]; |
2285 | 2270 |
2286 // Only load the new URL if it has a different document than |fromEntry| to | 2271 // Only load the new URL if it has a different document than |fromEntry| to |
2287 // prevent extra page loads from NavigationItems created by hash changes or | 2272 // prevent extra page loads from NavigationItems created by hash changes or |
2288 // calls to window.history.pushState(). | 2273 // calls to window.history.pushState(). |
2289 BOOL shouldLoadURL = | 2274 BOOL shouldLoadURL = |
2290 ![_webStateImpl->GetNavigationManagerImpl().GetSessionController() | 2275 ![_webStateImpl->GetNavigationManagerImpl().GetSessionController() |
2291 isSameDocumentNavigationBetweenItem:fromEntry.navigationItem | 2276 isSameDocumentNavigationBetweenItem:item |
2292 andItem:self.currentNavItem]; | 2277 andItem:self.currentNavItem]; |
2293 web::NavigationItemImpl* currentItem = | 2278 web::NavigationItemImpl* currentItem = self.currentNavItem; |
2294 self.currentSessionEntry.navigationItemImpl; | 2279 GURL endURL = [self URLForHistoryNavigationFromItem:item |
2295 GURL endURL = [self URLForHistoryNavigationFromItem:fromEntry.navigationItem | |
2296 toItem:currentItem]; | 2280 toItem:currentItem]; |
2297 if (shouldLoadURL) { | 2281 if (shouldLoadURL) { |
2298 ui::PageTransition transition = ui::PageTransitionFromInt( | 2282 ui::PageTransition transition = ui::PageTransitionFromInt( |
2299 ui::PAGE_TRANSITION_RELOAD | ui::PAGE_TRANSITION_FORWARD_BACK); | 2283 ui::PAGE_TRANSITION_RELOAD | ui::PAGE_TRANSITION_FORWARD_BACK); |
2300 | 2284 |
2301 NavigationManager::WebLoadParams params(endURL); | 2285 NavigationManager::WebLoadParams params(endURL); |
2302 if (currentItem) { | 2286 if (currentItem) { |
2303 params.referrer = currentItem->GetReferrer(); | 2287 params.referrer = currentItem->GetReferrer(); |
2304 } | 2288 } |
2305 params.transition_type = transition; | 2289 params.transition_type = transition; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2357 // the page has no navigation items, as occurs when an App Store link is | 2341 // the page has no navigation items, as occurs when an App Store link is |
2358 // opened from another application. | 2342 // opened from another application. |
2359 BOOL rendererInitiatedWithoutInteraction = | 2343 BOOL rendererInitiatedWithoutInteraction = |
2360 self.sessionController.openedByDOM && !_userInteractedWithWebController; | 2344 self.sessionController.openedByDOM && !_userInteractedWithWebController; |
2361 BOOL noNavigationItems = | 2345 BOOL noNavigationItems = |
2362 !_webStateImpl->GetNavigationManagerImpl().GetItemCount(); | 2346 !_webStateImpl->GetNavigationManagerImpl().GetItemCount(); |
2363 return rendererInitiatedWithoutInteraction || noNavigationItems; | 2347 return rendererInitiatedWithoutInteraction || noNavigationItems; |
2364 } | 2348 } |
2365 | 2349 |
2366 - (BOOL)useDesktopUserAgent { | 2350 - (BOOL)useDesktopUserAgent { |
2367 web::NavigationItem* item = [self currentNavItem]; | 2351 web::NavigationItem* item = self.currentNavItem; |
2368 return item && item->IsOverridingUserAgent(); | 2352 return item && item->IsOverridingUserAgent(); |
2369 } | 2353 } |
2370 | 2354 |
2371 - (web::MojoFacade*)mojoFacade { | 2355 - (web::MojoFacade*)mojoFacade { |
2372 if (!_mojoFacade) { | 2356 if (!_mojoFacade) { |
2373 service_manager::mojom::InterfaceProvider* interfaceProvider = | 2357 service_manager::mojom::InterfaceProvider* interfaceProvider = |
2374 _webStateImpl->GetMojoInterfaceRegistry(); | 2358 _webStateImpl->GetMojoInterfaceRegistry(); |
2375 _mojoFacade.reset(new web::MojoFacade(interfaceProvider, self)); | 2359 _mojoFacade.reset(new web::MojoFacade(interfaceProvider, self)); |
2376 } | 2360 } |
2377 return _mojoFacade.get(); | 2361 return _mojoFacade.get(); |
(...skipping 19 matching lines...) Expand all Loading... | |
2397 [delegate webController:strongSelf didLoadPassKitObject:data]; | 2381 [delegate webController:strongSelf didLoadPassKitObject:data]; |
2398 } | 2382 } |
2399 }; | 2383 }; |
2400 web::BrowserState* browserState = self.webStateImpl->GetBrowserState(); | 2384 web::BrowserState* browserState = self.webStateImpl->GetBrowserState(); |
2401 _passKitDownloader.reset([[CRWPassKitDownloader alloc] | 2385 _passKitDownloader.reset([[CRWPassKitDownloader alloc] |
2402 initWithContextGetter:browserState->GetRequestContext() | 2386 initWithContextGetter:browserState->GetRequestContext() |
2403 completionHandler:passKitCompletion]); | 2387 completionHandler:passKitCompletion]); |
2404 return _passKitDownloader.get(); | 2388 return _passKitDownloader.get(); |
2405 } | 2389 } |
2406 | 2390 |
2407 - (void)webWillFinishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry { | 2391 - (void)webWillFinishHistoryNavigationFromItem:(web::NavigationItem*)item { |
2408 DCHECK(fromEntry); | 2392 DCHECK(item); |
2409 [self updateDesktopUserAgentForEntry:self.currentSessionEntry | 2393 // Require page reconstruction if the current NavigationItem and |item| have |
2410 fromEntry:fromEntry]; | 2394 // a different user agent. |
2411 [_delegate webWillFinishHistoryNavigationFromEntry:fromEntry]; | 2395 if (self.currentNavItem->IsOverridingUserAgent() != |
2412 } | 2396 item->IsOverridingUserAgent()) { |
2413 | |
2414 - (void)updateDesktopUserAgentForEntry:(CRWSessionEntry*)entry | |
2415 fromEntry:(CRWSessionEntry*)fromEntry { | |
2416 web::NavigationItemImpl* item = entry.navigationItemImpl; | |
2417 web::NavigationItemImpl* fromItem = fromEntry.navigationItemImpl; | |
2418 if (!item || !fromItem) | |
2419 return; | |
2420 bool useDesktopUserAgent = item->IsOverridingUserAgent(); | |
2421 if (useDesktopUserAgent != fromItem->IsOverridingUserAgent()) { | |
2422 [self requirePageReconstruction]; | 2397 [self requirePageReconstruction]; |
2423 } | 2398 } |
2399 // Inform the delegate. | |
2400 [_delegate webWillFinishHistoryNavigation]; | |
2424 } | 2401 } |
2425 | 2402 |
2426 #pragma mark - | 2403 #pragma mark - |
2427 #pragma mark CRWWebControllerContainerViewDelegate | 2404 #pragma mark CRWWebControllerContainerViewDelegate |
2428 | 2405 |
2429 - (CRWWebViewProxyImpl*)contentViewProxyForContainerView: | 2406 - (CRWWebViewProxyImpl*)contentViewProxyForContainerView: |
2430 (CRWWebControllerContainerView*)containerView { | 2407 (CRWWebControllerContainerView*)containerView { |
2431 return _webViewProxy.get(); | 2408 return _webViewProxy.get(); |
2432 } | 2409 } |
2433 | 2410 |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2864 [self executeJavaScript:@"__gCrWeb.sendFaviconsToHost();" | 2841 [self executeJavaScript:@"__gCrWeb.sendFaviconsToHost();" |
2865 completionHandler:nil]; | 2842 completionHandler:nil]; |
2866 | 2843 |
2867 // Record that the current NavigationItem was created by a hash change, but | 2844 // Record that the current NavigationItem was created by a hash change, but |
2868 // ignore hashchange events that are manually dispatched for same-document | 2845 // ignore hashchange events that are manually dispatched for same-document |
2869 // navigations. | 2846 // navigations. |
2870 if (_dispatchingSameDocumentHashChangeEvent) { | 2847 if (_dispatchingSameDocumentHashChangeEvent) { |
2871 _dispatchingSameDocumentHashChangeEvent = NO; | 2848 _dispatchingSameDocumentHashChangeEvent = NO; |
2872 } else { | 2849 } else { |
2873 web::NavigationItemImpl* item = | 2850 web::NavigationItemImpl* item = |
2874 static_cast<web::NavigationItemImpl*>([self currentNavItem]); | 2851 static_cast<web::NavigationItemImpl*>(self.currentNavItem); |
Eugene But (OOO till 7-30)
2017/02/21 23:29:24
Do you need this cast? |currentNavItem| returns we
kkhorimoto
2017/03/02 22:01:11
Removed
| |
2875 DCHECK(item); | 2852 DCHECK(item); |
2876 item->SetIsCreatedFromHashChange(true); | 2853 item->SetIsCreatedFromHashChange(true); |
2877 } | 2854 } |
2878 | 2855 |
2879 // Notify the observers. | 2856 // Notify the observers. |
2880 _webStateImpl->OnUrlHashChanged(); | 2857 _webStateImpl->OnUrlHashChanged(); |
2881 return YES; | 2858 return YES; |
2882 } | 2859 } |
2883 | 2860 |
2884 - (BOOL)handleWindowHistoryBackMessage:(base::DictionaryValue*)message | 2861 - (BOOL)handleWindowHistoryBackMessage:(base::DictionaryValue*)message |
(...skipping 27 matching lines...) Expand all Loading... | |
2912 - (BOOL)handleWindowHistoryDidPushStateMessage:(base::DictionaryValue*)message | 2889 - (BOOL)handleWindowHistoryDidPushStateMessage:(base::DictionaryValue*)message |
2913 context:(NSDictionary*)context { | 2890 context:(NSDictionary*)context { |
2914 DCHECK(_changingHistoryState); | 2891 DCHECK(_changingHistoryState); |
2915 _changingHistoryState = NO; | 2892 _changingHistoryState = NO; |
2916 | 2893 |
2917 // If there is a pending entry, a new navigation has been registered but | 2894 // If there is a pending entry, a new navigation has been registered but |
2918 // hasn't begun loading. Since the pushState message is coming from the | 2895 // hasn't begun loading. Since the pushState message is coming from the |
2919 // previous page, ignore it and allow the previously registered navigation to | 2896 // previous page, ignore it and allow the previously registered navigation to |
2920 // continue. This can ocur if a pushState is issued from an anchor tag | 2897 // continue. This can ocur if a pushState is issued from an anchor tag |
2921 // onClick event, as the click would have already been registered. | 2898 // onClick event, as the click would have already been registered. |
2922 if ([self sessionController].pendingEntry) | 2899 if ([self sessionController].pendingItem) |
2923 return NO; | 2900 return NO; |
2924 | 2901 |
2925 std::string pageURL; | 2902 std::string pageURL; |
2926 std::string baseURL; | 2903 std::string baseURL; |
2927 if (!message->GetString("pageUrl", &pageURL) || | 2904 if (!message->GetString("pageUrl", &pageURL) || |
2928 !message->GetString("baseUrl", &baseURL)) { | 2905 !message->GetString("baseUrl", &baseURL)) { |
2929 DLOG(WARNING) << "JS message parameter not found: pageUrl or baseUrl"; | 2906 DLOG(WARNING) << "JS message parameter not found: pageUrl or baseUrl"; |
2930 return NO; | 2907 return NO; |
2931 } | 2908 } |
2932 GURL pushURL = web::history_state_util::GetHistoryStateChangeUrl( | 2909 GURL pushURL = web::history_state_util::GetHistoryStateChangeUrl( |
2933 [self currentURL], GURL(baseURL), pageURL); | 2910 [self currentURL], GURL(baseURL), pageURL); |
2934 // UIWebView seems to choke on unicode characters that haven't been | 2911 // UIWebView seems to choke on unicode characters that haven't been |
2935 // escaped; escape the URL now so the expected load URL is correct. | 2912 // escaped; escape the URL now so the expected load URL is correct. |
2936 pushURL = URLEscapedForHistory(pushURL); | 2913 pushURL = URLEscapedForHistory(pushURL); |
2937 if (!pushURL.is_valid()) | 2914 if (!pushURL.is_valid()) |
2938 return YES; | 2915 return YES; |
2939 web::NavigationItem* navItem = [self currentNavItem]; | 2916 web::NavigationItem* navItem = self.currentNavItem; |
2940 // PushState happened before first navigation entry or called when the | 2917 // PushState happened before first navigation entry or called when the |
2941 // navigation entry does not contain a valid URL. | 2918 // navigation entry does not contain a valid URL. |
2942 if (!navItem || !navItem->GetURL().is_valid()) | 2919 if (!navItem || !navItem->GetURL().is_valid()) |
2943 return YES; | 2920 return YES; |
2944 if (!web::history_state_util::IsHistoryStateChangeValid( | 2921 if (!web::history_state_util::IsHistoryStateChangeValid( |
2945 [self currentNavItem]->GetURL(), pushURL)) { | 2922 self.currentNavItem->GetURL(), pushURL)) { |
2946 // If the current session entry URL origin still doesn't match pushURL's | 2923 // If the current session entry URL origin still doesn't match pushURL's |
2947 // origin, ignore the pushState. This can happen if a new URL is loaded | 2924 // origin, ignore the pushState. This can happen if a new URL is loaded |
2948 // just before the pushState. | 2925 // just before the pushState. |
2949 return YES; | 2926 return YES; |
2950 } | 2927 } |
2951 std::string stateObjectJSON; | 2928 std::string stateObjectJSON; |
2952 if (!message->GetString("stateObject", &stateObjectJSON)) { | 2929 if (!message->GetString("stateObject", &stateObjectJSON)) { |
2953 DLOG(WARNING) << "JS message parameter not found: stateObject"; | 2930 DLOG(WARNING) << "JS message parameter not found: stateObject"; |
2954 return NO; | 2931 return NO; |
2955 } | 2932 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2998 } | 2975 } |
2999 GURL replaceURL = web::history_state_util::GetHistoryStateChangeUrl( | 2976 GURL replaceURL = web::history_state_util::GetHistoryStateChangeUrl( |
3000 [self currentURL], GURL(baseURL), pageURL); | 2977 [self currentURL], GURL(baseURL), pageURL); |
3001 // UIWebView seems to choke on unicode characters that haven't been | 2978 // UIWebView seems to choke on unicode characters that haven't been |
3002 // escaped; escape the URL now so the expected load URL is correct. | 2979 // escaped; escape the URL now so the expected load URL is correct. |
3003 replaceURL = URLEscapedForHistory(replaceURL); | 2980 replaceURL = URLEscapedForHistory(replaceURL); |
3004 if (!replaceURL.is_valid()) | 2981 if (!replaceURL.is_valid()) |
3005 return YES; | 2982 return YES; |
3006 const NavigationManagerImpl& navigationManager = | 2983 const NavigationManagerImpl& navigationManager = |
3007 _webStateImpl->GetNavigationManagerImpl(); | 2984 _webStateImpl->GetNavigationManagerImpl(); |
3008 web::NavigationItem* navItem = [self currentNavItem]; | 2985 web::NavigationItem* navItem = self.currentNavItem; |
3009 // ReplaceState happened before first navigation entry or called right | 2986 // ReplaceState happened before first navigation entry or called right |
3010 // after window.open when the url is empty/not valid. | 2987 // after window.open when the url is empty/not valid. |
3011 if (!navItem || | 2988 if (!navItem || |
3012 (navigationManager.GetItemCount() <= 1 && navItem->GetURL().is_empty())) | 2989 (navigationManager.GetItemCount() <= 1 && navItem->GetURL().is_empty())) |
3013 return YES; | 2990 return YES; |
3014 if (!web::history_state_util::IsHistoryStateChangeValid( | 2991 if (!web::history_state_util::IsHistoryStateChangeValid( |
3015 [self currentNavItem]->GetURL(), replaceURL)) { | 2992 self.currentNavItem->GetURL(), replaceURL)) { |
3016 // If the current session entry URL origin still doesn't match | 2993 // If the current session entry URL origin still doesn't match |
3017 // replaceURL's origin, ignore the replaceState. This can happen if a | 2994 // replaceURL's origin, ignore the replaceState. This can happen if a |
3018 // new URL is loaded just before the replaceState. | 2995 // new URL is loaded just before the replaceState. |
3019 return YES; | 2996 return YES; |
3020 } | 2997 } |
3021 std::string stateObjectJSON; | 2998 std::string stateObjectJSON; |
3022 if (!message->GetString("stateObject", &stateObjectJSON)) { | 2999 if (!message->GetString("stateObject", &stateObjectJSON)) { |
3023 DLOG(WARNING) << "JS message parameter not found: stateObject"; | 3000 DLOG(WARNING) << "JS message parameter not found: stateObject"; |
3024 return NO; | 3001 return NO; |
3025 } | 3002 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3061 // we should be distinguishing better, and be clear about the expected | 3038 // we should be distinguishing better, and be clear about the expected |
3062 // WebDelegate and WCO callbacks in each case. | 3039 // WebDelegate and WCO callbacks in each case. |
3063 - (void)webPageChanged { | 3040 - (void)webPageChanged { |
3064 DCHECK(_loadPhase == web::LOAD_REQUESTED); | 3041 DCHECK(_loadPhase == web::LOAD_REQUESTED); |
3065 | 3042 |
3066 const GURL currentURL([self currentURL]); | 3043 const GURL currentURL([self currentURL]); |
3067 web::Referrer referrer = [self currentReferrer]; | 3044 web::Referrer referrer = [self currentReferrer]; |
3068 // If no referrer was known in advance, record it now. (If there was one, | 3045 // If no referrer was known in advance, record it now. (If there was one, |
3069 // keep it since it will have a more accurate URL and policy than what can | 3046 // keep it since it will have a more accurate URL and policy than what can |
3070 // be extracted from the landing page.) | 3047 // be extracted from the landing page.) |
3071 web::NavigationItem* currentItem = [self currentNavItem]; | 3048 web::NavigationItem* currentItem = self.currentNavItem; |
3072 if (!currentItem->GetReferrer().url.is_valid()) { | 3049 if (!currentItem->GetReferrer().url.is_valid()) { |
3073 currentItem->SetReferrer(referrer); | 3050 currentItem->SetReferrer(referrer); |
3074 } | 3051 } |
3075 | 3052 |
3076 // TODO(stuartmorgan): This shouldn't be called for hash state or | 3053 // TODO(stuartmorgan): This shouldn't be called for hash state or |
3077 // push/replaceState. | 3054 // push/replaceState. |
3078 [self resetDocumentSpecificState]; | 3055 [self resetDocumentSpecificState]; |
3079 | 3056 |
3080 [self didStartLoadingURL:currentURL updateHistory:YES]; | 3057 [self didStartLoadingURL:currentURL updateHistory:YES]; |
3081 } | 3058 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3121 _userInteractionRegistered = flag; | 3098 _userInteractionRegistered = flag; |
3122 if (flag) | 3099 if (flag) |
3123 _interactionRegisteredSinceLastURLChange = YES; | 3100 _interactionRegisteredSinceLastURLChange = YES; |
3124 } | 3101 } |
3125 | 3102 |
3126 - (BOOL)userInteractionRegistered { | 3103 - (BOOL)userInteractionRegistered { |
3127 return _userInteractionRegistered; | 3104 return _userInteractionRegistered; |
3128 } | 3105 } |
3129 | 3106 |
3130 - (void)cachePOSTDataForRequest:(NSURLRequest*)request | 3107 - (void)cachePOSTDataForRequest:(NSURLRequest*)request |
3131 inSessionEntry:(CRWSessionEntry*)currentSessionEntry { | 3108 inNavigationItem:(web::NavigationItemImpl*)item { |
3132 NSUInteger maxPOSTDataSizeInBytes = 4096; | 3109 NSUInteger maxPOSTDataSizeInBytes = 4096; |
3133 NSString* cookieHeaderName = @"cookie"; | 3110 NSString* cookieHeaderName = @"cookie"; |
3134 | 3111 |
3135 web::NavigationItemImpl* currentItem = currentSessionEntry.navigationItemImpl; | 3112 DCHECK(item); |
3136 DCHECK(currentItem); | |
3137 const bool shouldUpdateEntry = | 3113 const bool shouldUpdateEntry = |
3138 ui::PageTransitionCoreTypeIs(currentItem->GetTransitionType(), | 3114 ui::PageTransitionCoreTypeIs(item->GetTransitionType(), |
3139 ui::PAGE_TRANSITION_FORM_SUBMIT) && | 3115 ui::PAGE_TRANSITION_FORM_SUBMIT) && |
3140 ![request HTTPBodyStream] && // Don't cache streams. | 3116 ![request HTTPBodyStream] && // Don't cache streams. |
3141 !currentItem->HasPostData() && | 3117 !item->HasPostData() && |
3142 currentItem->GetURL() == net::GURLWithNSURL([request URL]); | 3118 item->GetURL() == net::GURLWithNSURL([request URL]); |
3143 const bool belowSizeCap = | 3119 const bool belowSizeCap = |
3144 [[request HTTPBody] length] < maxPOSTDataSizeInBytes; | 3120 [[request HTTPBody] length] < maxPOSTDataSizeInBytes; |
3145 DLOG_IF(WARNING, shouldUpdateEntry && !belowSizeCap) | 3121 DLOG_IF(WARNING, shouldUpdateEntry && !belowSizeCap) |
3146 << "Data in POST request exceeds the size cap (" << maxPOSTDataSizeInBytes | 3122 << "Data in POST request exceeds the size cap (" << maxPOSTDataSizeInBytes |
3147 << " bytes), and will not be cached."; | 3123 << " bytes), and will not be cached."; |
3148 | 3124 |
3149 if (shouldUpdateEntry && belowSizeCap) { | 3125 if (shouldUpdateEntry && belowSizeCap) { |
3150 currentItem->SetPostData([request HTTPBody]); | 3126 item->SetPostData([request HTTPBody]); |
3151 currentItem->ResetHttpRequestHeaders(); | 3127 item->ResetHttpRequestHeaders(); |
3152 currentItem->AddHttpRequestHeaders([request allHTTPHeaderFields]); | 3128 item->AddHttpRequestHeaders([request allHTTPHeaderFields]); |
3153 // Don't cache the "Cookie" header. | 3129 // Don't cache the "Cookie" header. |
3154 // According to NSURLRequest documentation, |-valueForHTTPHeaderField:| is | 3130 // According to NSURLRequest documentation, |-valueForHTTPHeaderField:| is |
3155 // case insensitive, so it's enough to test the lower case only. | 3131 // case insensitive, so it's enough to test the lower case only. |
3156 if ([request valueForHTTPHeaderField:cookieHeaderName]) { | 3132 if ([request valueForHTTPHeaderField:cookieHeaderName]) { |
3157 // Case insensitive search in |headers|. | 3133 // Case insensitive search in |headers|. |
3158 NSSet* cookieKeys = [currentItem->GetHttpRequestHeaders() | 3134 NSSet* cookieKeys = [item->GetHttpRequestHeaders() |
3159 keysOfEntriesPassingTest:^(id key, id obj, BOOL* stop) { | 3135 keysOfEntriesPassingTest:^(id key, id obj, BOOL* stop) { |
3160 NSString* header = (NSString*)key; | 3136 NSString* header = (NSString*)key; |
3161 const BOOL found = | 3137 const BOOL found = |
3162 [header caseInsensitiveCompare:cookieHeaderName] == | 3138 [header caseInsensitiveCompare:cookieHeaderName] == |
3163 NSOrderedSame; | 3139 NSOrderedSame; |
3164 *stop = found; | 3140 *stop = found; |
3165 return found; | 3141 return found; |
3166 }]; | 3142 }]; |
3167 DCHECK_EQ(1u, [cookieKeys count]); | 3143 DCHECK_EQ(1u, [cookieKeys count]); |
3168 currentItem->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]); | 3144 item->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]); |
3169 } | 3145 } |
3170 } | 3146 } |
3171 } | 3147 } |
3172 | 3148 |
3173 // TODO(stuartmorgan): This is mostly logic from the original UIWebView delegate | 3149 // TODO(stuartmorgan): This is mostly logic from the original UIWebView delegate |
3174 // method, which provides less information than the WKWebView version. Audit | 3150 // method, which provides less information than the WKWebView version. Audit |
3175 // this for things that should be handled in the subclass instead. | 3151 // this for things that should be handled in the subclass instead. |
3176 - (BOOL)shouldAllowLoadWithNavigationAction:(WKNavigationAction*)action { | 3152 - (BOOL)shouldAllowLoadWithNavigationAction:(WKNavigationAction*)action { |
3177 NSURLRequest* request = action.request; | 3153 NSURLRequest* request = action.request; |
3178 GURL requestURL = net::GURLWithNSURL(request.URL); | 3154 GURL requestURL = net::GURLWithNSURL(request.URL); |
3179 | 3155 |
3180 // External application launcher needs |isNavigationTypeLinkActivated| to | 3156 // External application launcher needs |isNavigationTypeLinkActivated| to |
3181 // decide if the user intended to open the application by clicking on a link. | 3157 // decide if the user intended to open the application by clicking on a link. |
3182 BOOL isNavigationTypeLinkActivated = | 3158 BOOL isNavigationTypeLinkActivated = |
3183 action.navigationType == WKNavigationTypeLinkActivated; | 3159 action.navigationType == WKNavigationTypeLinkActivated; |
3184 | 3160 |
3185 // Check if the link navigation leads to a launch of an external app. | 3161 // Check if the link navigation leads to a launch of an external app. |
3186 // TODO(crbug.com/607780): Revise the logic of allowing external app launch | 3162 // TODO(crbug.com/607780): Revise the logic of allowing external app launch |
3187 // and move it to externalAppLauncher. | 3163 // and move it to externalAppLauncher. |
3188 BOOL isOpenInNewTabNavigation = | 3164 BOOL isOpenInNewTabNavigation = |
3189 !_webStateImpl->GetNavigationManager()->GetItemCount(); | 3165 !_webStateImpl->GetNavigationManager()->GetItemCount(); |
3190 BOOL isPossibleLinkClick = [self isLinkNavigation:action.navigationType]; | 3166 BOOL isPossibleLinkClick = [self isLinkNavigation:action.navigationType]; |
3191 if (isPossibleLinkClick || isOpenInNewTabNavigation || | 3167 if (isPossibleLinkClick || isOpenInNewTabNavigation || |
3192 PageTransitionCoreTypeIs([self currentTransition], | 3168 PageTransitionCoreTypeIs(self.currentTransition, |
3193 ui::PAGE_TRANSITION_AUTO_BOOKMARK)) { | 3169 ui::PAGE_TRANSITION_AUTO_BOOKMARK)) { |
3194 web::NavigationItem* item = [self currentNavItem]; | 3170 web::NavigationItem* item = self.currentNavItem; |
3195 const GURL currentNavigationURL = | 3171 const GURL currentNavigationURL = |
3196 item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 3172 item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
3197 // Check If the URL is handled by a native app. | 3173 // Check If the URL is handled by a native app. |
3198 if ([self urlTriggersNativeAppLaunch:requestURL | 3174 if ([self urlTriggersNativeAppLaunch:requestURL |
3199 sourceURL:currentNavigationURL | 3175 sourceURL:currentNavigationURL |
3200 linkActivatedNavigation:isNavigationTypeLinkActivated]) { | 3176 linkActivatedNavigation:isNavigationTypeLinkActivated]) { |
3201 // External app has been launched successfully. Stop the current page | 3177 // External app has been launched successfully. Stop the current page |
3202 // load operation (e.g. notifying all observers) and record the URL so | 3178 // load operation (e.g. notifying all observers) and record the URL so |
3203 // that errors reported following the 'NO' reply can be safely ignored. | 3179 // that errors reported following the 'NO' reply can be safely ignored. |
3204 if ([self shouldClosePageOnNativeApplicationLoad]) | 3180 if ([self shouldClosePageOnNativeApplicationLoad]) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3252 // Record the URL so that errors reported following the 'NO' reply can be | 3228 // Record the URL so that errors reported following the 'NO' reply can be |
3253 // safely ignored. | 3229 // safely ignored. |
3254 [_openedApplicationURL addObject:request.URL]; | 3230 [_openedApplicationURL addObject:request.URL]; |
3255 if ([self shouldClosePageOnNativeApplicationLoad]) | 3231 if ([self shouldClosePageOnNativeApplicationLoad]) |
3256 [_delegate webPageOrderedClose]; | 3232 [_delegate webPageOrderedClose]; |
3257 } | 3233 } |
3258 return NO; | 3234 return NO; |
3259 } | 3235 } |
3260 | 3236 |
3261 if ([[request HTTPMethod] isEqualToString:@"POST"]) { | 3237 if ([[request HTTPMethod] isEqualToString:@"POST"]) { |
3262 CRWSessionEntry* currentEntry = [self currentSessionEntry]; | 3238 web::NavigationItemImpl* item = self.currentNavItem; |
3263 // TODO(crbug.com/570699): Remove this check once it's no longer possible to | 3239 // TODO(crbug.com/570699): Remove this check once it's no longer possible to |
3264 // have no current entries. | 3240 // have no current entries. |
3265 if (currentEntry) | 3241 if (item) |
3266 [self cachePOSTDataForRequest:request inSessionEntry:currentEntry]; | 3242 [self cachePOSTDataForRequest:request inNavigationItem:item]; |
3267 } | 3243 } |
3268 | 3244 |
3269 return YES; | 3245 return YES; |
3270 } | 3246 } |
3271 | 3247 |
3272 - (void)handleLoadError:(NSError*)error inMainFrame:(BOOL)inMainFrame { | 3248 - (void)handleLoadError:(NSError*)error inMainFrame:(BOOL)inMainFrame { |
3273 NSString* MIMEType = [_pendingNavigationInfo MIMEType]; | 3249 NSString* MIMEType = [_pendingNavigationInfo MIMEType]; |
3274 if ([_passKitDownloader isMIMETypePassKitType:MIMEType]) | 3250 if ([_passKitDownloader isMIMETypePassKitType:MIMEType]) |
3275 return; | 3251 return; |
3276 if ([error code] == NSURLErrorUnsupportedURL) | 3252 if ([error code] == NSURLErrorUnsupportedURL) |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3655 | 3631 |
3656 #pragma mark - | 3632 #pragma mark - |
3657 #pragma mark Session Information | 3633 #pragma mark Session Information |
3658 | 3634 |
3659 - (CRWSessionController*)sessionController { | 3635 - (CRWSessionController*)sessionController { |
3660 return _webStateImpl | 3636 return _webStateImpl |
3661 ? _webStateImpl->GetNavigationManagerImpl().GetSessionController() | 3637 ? _webStateImpl->GetNavigationManagerImpl().GetSessionController() |
3662 : nil; | 3638 : nil; |
3663 } | 3639 } |
3664 | 3640 |
3665 - (CRWSessionEntry*)currentSessionEntry { | 3641 - (web::NavigationItemImpl*)currentNavItem { |
3666 return [[self sessionController] currentEntry]; | |
3667 } | |
3668 | |
3669 - (web::NavigationItem*)currentNavItem { | |
3670 // This goes through the legacy Session* interface rather than Navigation* | 3642 // This goes through the legacy Session* interface rather than Navigation* |
3671 // because it is itself a legacy method that should not exist, and this | 3643 // because it is itself a legacy method that should not exist, and this |
3672 // avoids needing to add a GetActiveItem to NavigationManager. If/when this | 3644 // avoids needing to add a GetActiveItem to NavigationManager. If/when this |
3673 // method chain becomes a blocker to eliminating SessionController, the logic | 3645 // method chain becomes a blocker to eliminating SessionController, the logic |
3674 // can be moved here, using public NavigationManager getters. That's not | 3646 // can be moved here, using public NavigationManager getters. That's not |
3675 // done now in order to avoid code duplication. | 3647 // done now in order to avoid code duplication. |
3676 return [[self currentSessionEntry] navigationItem]; | 3648 return [[self sessionController] currentItem]; |
3677 } | 3649 } |
3678 | 3650 |
3679 - (ui::PageTransition)currentTransition { | 3651 - (ui::PageTransition)currentTransition { |
3680 if ([self currentNavItem]) | 3652 if (self.currentNavItem) |
3681 return [self currentNavItem]->GetTransitionType(); | 3653 return self.currentNavItem->GetTransitionType(); |
3682 else | 3654 else |
3683 return ui::PageTransitionFromInt(0); | 3655 return ui::PageTransitionFromInt(0); |
3684 } | 3656 } |
3685 | 3657 |
3686 - (web::Referrer)currentSessionEntryReferrer { | 3658 - (web::Referrer)currentNavItemReferrer { |
3687 web::NavigationItem* currentItem = [self currentNavItem]; | 3659 web::NavigationItem* currentItem = self.currentNavItem; |
3688 return currentItem ? currentItem->GetReferrer() : web::Referrer(); | 3660 return currentItem ? currentItem->GetReferrer() : web::Referrer(); |
3689 } | 3661 } |
3690 | 3662 |
3691 - (NSDictionary*)currentHTTPHeaders { | 3663 - (NSDictionary*)currentHTTPHeaders { |
3692 DCHECK([self currentSessionEntry]); | 3664 web::NavigationItem* currentItem = self.currentNavItem; |
3693 return [self currentSessionEntry].navigationItem->GetHttpRequestHeaders(); | 3665 return currentItem ? currentItem->GetHttpRequestHeaders() : nil; |
3694 } | 3666 } |
3695 | 3667 |
3696 #pragma mark - | 3668 #pragma mark - |
3697 #pragma mark CRWWebViewScrollViewProxyObserver | 3669 #pragma mark CRWWebViewScrollViewProxyObserver |
3698 | 3670 |
3699 - (void)webViewScrollViewDidZoom: | 3671 - (void)webViewScrollViewDidZoom: |
3700 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { | 3672 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { |
3701 _pageHasZoomed = YES; | 3673 _pageHasZoomed = YES; |
3702 | 3674 |
3703 base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); | 3675 base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); |
3704 [self extractViewportTagWithCompletion:^( | 3676 [self extractViewportTagWithCompletion:^( |
3705 const web::PageViewportState* viewportState) { | 3677 const web::PageViewportState* viewportState) { |
3706 if (!weakScrollView) | 3678 if (!weakScrollView) |
3707 return; | 3679 return; |
3708 base::scoped_nsobject<UIScrollView> scrollView([weakScrollView retain]); | 3680 base::scoped_nsobject<UIScrollView> scrollView([weakScrollView retain]); |
3709 if (viewportState && !viewportState->viewport_tag_present() && | 3681 if (viewportState && !viewportState->viewport_tag_present() && |
3710 [scrollView minimumZoomScale] == [scrollView maximumZoomScale] && | 3682 [scrollView minimumZoomScale] == [scrollView maximumZoomScale] && |
3711 [scrollView zoomScale] > 1.0) { | 3683 [scrollView zoomScale] > 1.0) { |
3712 UMA_HISTOGRAM_BOOLEAN(kUMAViewportZoomBugCount, true); | 3684 UMA_HISTOGRAM_BOOLEAN(kUMAViewportZoomBugCount, true); |
3713 } | 3685 } |
3714 }]; | 3686 }]; |
3715 } | 3687 } |
3716 | 3688 |
3717 - (void)webViewScrollViewDidResetContentSize: | 3689 - (void)webViewScrollViewDidResetContentSize: |
3718 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { | 3690 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { |
3719 web::NavigationItem* currentItem = [self currentNavItem]; | 3691 web::NavigationItem* currentItem = self.currentNavItem; |
3720 if (webViewScrollViewProxy.isZooming || _applyingPageState || !currentItem) | 3692 if (webViewScrollViewProxy.isZooming || _applyingPageState || !currentItem) |
3721 return; | 3693 return; |
3722 CGSize contentSize = webViewScrollViewProxy.contentSize; | 3694 CGSize contentSize = webViewScrollViewProxy.contentSize; |
3723 if (contentSize.width < CGRectGetWidth(webViewScrollViewProxy.frame)) { | 3695 if (contentSize.width < CGRectGetWidth(webViewScrollViewProxy.frame)) { |
3724 // The renderer incorrectly resized the content area. Resetting the scroll | 3696 // The renderer incorrectly resized the content area. Resetting the scroll |
3725 // view's zoom scale will force a re-rendering. rdar://23963992 | 3697 // view's zoom scale will force a re-rendering. rdar://23963992 |
3726 _applyingPageState = YES; | 3698 _applyingPageState = YES; |
3727 web::PageZoomState zoomState = | 3699 web::PageZoomState zoomState = |
3728 currentItem->GetPageDisplayState().zoom_state(); | 3700 currentItem->GetPageDisplayState().zoom_state(); |
3729 if (!zoomState.IsValid()) | 3701 if (!zoomState.IsValid()) |
(...skipping 24 matching lines...) Expand all Loading... | |
3754 completionHandler:nil]; | 3726 completionHandler:nil]; |
3755 } | 3727 } |
3756 | 3728 |
3757 #pragma mark - | 3729 #pragma mark - |
3758 #pragma mark Page State | 3730 #pragma mark Page State |
3759 | 3731 |
3760 - (void)recordStateInHistory { | 3732 - (void)recordStateInHistory { |
3761 // Only record the state if: | 3733 // Only record the state if: |
3762 // - the current NavigationItem's URL matches the current URL, and | 3734 // - the current NavigationItem's URL matches the current URL, and |
3763 // - the user has interacted with the page. | 3735 // - the user has interacted with the page. |
3764 CRWSessionEntry* current = [self currentSessionEntry]; | 3736 web::NavigationItem* item = self.currentNavItem; |
3765 if (current && [current navigationItem]->GetURL() == [self currentURL] && | 3737 if (item && item->GetURL() == [self currentURL] && |
3766 self.userInteractionRegistered) { | 3738 self.userInteractionRegistered) { |
3767 [current navigationItem]->SetPageDisplayState(self.pageDisplayState); | 3739 item->SetPageDisplayState(self.pageDisplayState); |
3768 } | 3740 } |
3769 } | 3741 } |
3770 | 3742 |
3771 - (void)restoreStateFromHistory { | 3743 - (void)restoreStateFromHistory { |
3772 CRWSessionEntry* current = [self currentSessionEntry]; | 3744 web::NavigationItem* item = self.currentNavItem; |
3773 if ([current navigationItem]) | 3745 if (item) |
3774 self.pageDisplayState = [current navigationItem]->GetPageDisplayState(); | 3746 self.pageDisplayState = item->GetPageDisplayState(); |
3775 } | 3747 } |
3776 | 3748 |
3777 - (web::PageDisplayState)pageDisplayState { | 3749 - (web::PageDisplayState)pageDisplayState { |
3778 web::PageDisplayState displayState; | 3750 web::PageDisplayState displayState; |
3779 if (_webView) { | 3751 if (_webView) { |
3780 CGPoint scrollOffset = [self scrollPosition]; | 3752 CGPoint scrollOffset = [self scrollPosition]; |
3781 displayState.scroll_state().set_offset_x(std::floor(scrollOffset.x)); | 3753 displayState.scroll_state().set_offset_x(std::floor(scrollOffset.x)); |
3782 displayState.scroll_state().set_offset_y(std::floor(scrollOffset.y)); | 3754 displayState.scroll_state().set_offset_y(std::floor(scrollOffset.y)); |
3783 UIScrollView* scrollView = self.webScrollView; | 3755 UIScrollView* scrollView = self.webScrollView; |
3784 displayState.zoom_state().set_minimum_zoom_scale( | 3756 displayState.zoom_state().set_minimum_zoom_scale( |
(...skipping 20 matching lines...) Expand all Loading... | |
3805 currentPageDisplayState.scroll_state().offset_y() == | 3777 currentPageDisplayState.scroll_state().offset_y() == |
3806 _displayStateOnStartLoading.scroll_state().offset_y() && | 3778 _displayStateOnStartLoading.scroll_state().offset_y() && |
3807 !_pageHasZoomed) { | 3779 !_pageHasZoomed) { |
3808 [self applyPageDisplayState:displayState]; | 3780 [self applyPageDisplayState:displayState]; |
3809 } | 3781 } |
3810 } | 3782 } |
3811 } | 3783 } |
3812 | 3784 |
3813 - (void)extractViewportTagWithCompletion:(ViewportStateCompletion)completion { | 3785 - (void)extractViewportTagWithCompletion:(ViewportStateCompletion)completion { |
3814 DCHECK(completion); | 3786 DCHECK(completion); |
3815 web::NavigationItem* currentItem = [self currentNavItem]; | 3787 web::NavigationItem* currentItem = self.currentNavItem; |
3816 if (!currentItem) { | 3788 if (!currentItem) { |
3817 completion(nullptr); | 3789 completion(nullptr); |
3818 return; | 3790 return; |
3819 } | 3791 } |
3820 NSString* const kViewportContentQuery = | 3792 NSString* const kViewportContentQuery = |
3821 @"var viewport = document.querySelector('meta[name=\"viewport\"]');" | 3793 @"var viewport = document.querySelector('meta[name=\"viewport\"]');" |
3822 "viewport ? viewport.content : '';"; | 3794 "viewport ? viewport.content : '';"; |
3823 base::WeakNSObject<CRWWebController> weakSelf(self); | 3795 base::WeakNSObject<CRWWebController> weakSelf(self); |
3824 int itemID = currentItem->GetUniqueID(); | 3796 int itemID = currentItem->GetUniqueID(); |
3825 [self executeJavaScript:kViewportContentQuery | 3797 [self executeJavaScript:kViewportContentQuery |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3878 userScalable:viewportState->user_scalable()]; | 3850 userScalable:viewportState->user_scalable()]; |
3879 } | 3851 } |
3880 }]; | 3852 }]; |
3881 } | 3853 } |
3882 | 3854 |
3883 - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState | 3855 - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState |
3884 userScalable:(BOOL)isUserScalable { | 3856 userScalable:(BOOL)isUserScalable { |
3885 // Early return if |scrollState| doesn't match the current NavigationItem. | 3857 // Early return if |scrollState| doesn't match the current NavigationItem. |
3886 // This can sometimes occur in tests, as navigation occurs programmatically | 3858 // This can sometimes occur in tests, as navigation occurs programmatically |
3887 // and |-applyPageScrollState:| is asynchronous. | 3859 // and |-applyPageScrollState:| is asynchronous. |
3888 web::NavigationItem* currentItem = [self currentSessionEntry].navigationItem; | 3860 web::NavigationItem* currentItem = self.currentNavItem; |
3889 if (currentItem && currentItem->GetPageDisplayState() != displayState) | 3861 if (currentItem && currentItem->GetPageDisplayState() != displayState) |
3890 return; | 3862 return; |
3891 DCHECK(displayState.IsValid()); | 3863 DCHECK(displayState.IsValid()); |
3892 _applyingPageState = YES; | 3864 _applyingPageState = YES; |
3893 if (isUserScalable) { | 3865 if (isUserScalable) { |
3894 [self prepareToApplyWebViewScrollZoomScale]; | 3866 [self prepareToApplyWebViewScrollZoomScale]; |
3895 [self applyWebViewScrollZoomScaleFromZoomState:displayState.zoom_state()]; | 3867 [self applyWebViewScrollZoomScaleFromZoomState:displayState.zoom_state()]; |
3896 [self finishApplyingWebViewScrollZoomScale]; | 3868 [self finishApplyingWebViewScrollZoomScale]; |
3897 } | 3869 } |
3898 [self applyWebViewScrollOffsetFromScrollState:displayState.scroll_state()]; | 3870 [self applyWebViewScrollOffsetFromScrollState:displayState.scroll_state()]; |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4331 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); | 4303 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); |
4332 [self setDocumentURL:_defaultURL]; | 4304 [self setDocumentURL:_defaultURL]; |
4333 } | 4305 } |
4334 | 4306 |
4335 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache { | 4307 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache { |
4336 if (!_webView) | 4308 if (!_webView) |
4337 return; | 4309 return; |
4338 | 4310 |
4339 _webStateImpl->CancelDialogs(); | 4311 _webStateImpl->CancelDialogs(); |
4340 | 4312 |
4341 web::NavigationItem* item = [self currentNavItem]; | 4313 web::NavigationItem* item = self.currentNavItem; |
4342 if (allowCache && item) { | 4314 if (allowCache && item) { |
4343 _expectedReconstructionURL = item->GetVirtualURL(); | 4315 _expectedReconstructionURL = item->GetVirtualURL(); |
4344 } else { | 4316 } else { |
4345 _expectedReconstructionURL = GURL::EmptyGURL(); | 4317 _expectedReconstructionURL = GURL::EmptyGURL(); |
4346 } | 4318 } |
4347 | 4319 |
4348 [self abortLoad]; | 4320 [self abortLoad]; |
4349 [_webView removeFromSuperview]; | 4321 [_webView removeFromSuperview]; |
4350 [_containerView resetContent]; | 4322 [_containerView resetContent]; |
4351 [self setWebView:nil]; | 4323 [self setWebView:nil]; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4413 } | 4385 } |
4414 | 4386 |
4415 - (void)stopLoading { | 4387 - (void)stopLoading { |
4416 _stoppedWKNavigation.reset([_navigationStates lastAddedNavigation]); | 4388 _stoppedWKNavigation.reset([_navigationStates lastAddedNavigation]); |
4417 | 4389 |
4418 base::RecordAction(UserMetricsAction("Stop")); | 4390 base::RecordAction(UserMetricsAction("Stop")); |
4419 // Discard the pending and transient entried before notifying the tab model | 4391 // Discard the pending and transient entried before notifying the tab model |
4420 // observers of the change via |-abortLoad|. | 4392 // observers of the change via |-abortLoad|. |
4421 [[self sessionController] discardNonCommittedItems]; | 4393 [[self sessionController] discardNonCommittedItems]; |
4422 [self abortLoad]; | 4394 [self abortLoad]; |
4423 web::NavigationItem* item = [self currentNavItem]; | 4395 web::NavigationItem* item = self.currentNavItem; |
4424 GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 4396 GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
4425 // If discarding the non-committed entries results in an app-specific URL, | 4397 // If discarding the non-committed entries results in an app-specific URL, |
4426 // reload it in its native view. | 4398 // reload it in its native view. |
4427 if (!self.nativeController && | 4399 if (!self.nativeController && |
4428 [self shouldLoadURLInNativeView:navigationURL]) { | 4400 [self shouldLoadURLInNativeView:navigationURL]) { |
4429 [self loadCurrentURLInNativeView]; | 4401 [self loadCurrentURLInNativeView]; |
4430 } | 4402 } |
4431 } | 4403 } |
4432 | 4404 |
4433 #pragma mark - | 4405 #pragma mark - |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4666 [self abortLoad]; | 4638 [self abortLoad]; |
4667 NavigationManager::WebLoadParams params(webViewURL); | 4639 NavigationManager::WebLoadParams params(webViewURL); |
4668 [self loadWithParams:params]; | 4640 [self loadWithParams:params]; |
4669 } | 4641 } |
4670 return; | 4642 return; |
4671 } else { | 4643 } else { |
4672 [self registerLoadRequest:webViewURL]; | 4644 [self registerLoadRequest:webViewURL]; |
4673 } | 4645 } |
4674 } | 4646 } |
4675 | 4647 |
4676 if (![self currentSessionEntry]) { | 4648 if (!self.currentNavItem) { |
4677 // In this state CRWWebController will crash in |didCommitNavigation:| | 4649 // In this state CRWWebController will crash in |didCommitNavigation:| |
4678 // (crbug.com/676458). It's unclear if web controller could get into this | 4650 // (crbug.com/676458). It's unclear if web controller could get into this |
4679 // state but it's one of the guesses for crbug.com/676458 root cause. Report | 4651 // state but it's one of the guesses for crbug.com/676458 root cause. Report |
4680 // UMA historgam if that happens. | 4652 // UMA historgam if that happens. |
4681 // TODO(crbug.com/677552): Remove this historgam. | 4653 // TODO(crbug.com/677552): Remove this historgam. |
4682 UMA_HISTOGRAM_BOOLEAN( | 4654 UMA_HISTOGRAM_BOOLEAN( |
4683 "WebController." | 4655 "WebController." |
4684 "StartProvisionalNavigationExitedWithEmptyNavigationManager", | 4656 "StartProvisionalNavigationExitedWithEmptyNavigationManager", |
4685 true); | 4657 true); |
4686 } | 4658 } |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5144 if (self.loadPhase != web::LOAD_REQUESTED) | 5116 if (self.loadPhase != web::LOAD_REQUESTED) |
5145 return NO; | 5117 return NO; |
5146 | 5118 |
5147 web::NavigationItem* pendingItem = | 5119 web::NavigationItem* pendingItem = |
5148 self.webState->GetNavigationManager()->GetPendingItem(); | 5120 self.webState->GetNavigationManager()->GetPendingItem(); |
5149 return pendingItem && pendingItem->GetURL() == targetURL; | 5121 return pendingItem && pendingItem->GetURL() == targetURL; |
5150 } | 5122 } |
5151 | 5123 |
5152 - (void)loadRequestForCurrentNavigationItem { | 5124 - (void)loadRequestForCurrentNavigationItem { |
5153 DCHECK(_webView && !self.nativeController); | 5125 DCHECK(_webView && !self.nativeController); |
5154 DCHECK([self currentSessionEntry]); | 5126 DCHECK(self.currentNavItem); |
5155 // If a load is kicked off on a WKWebView with a frame whose size is {0, 0} or | 5127 // If a load is kicked off on a WKWebView with a frame whose size is {0, 0} or |
5156 // that has a negative dimension for a size, rendering issues occur that | 5128 // that has a negative dimension for a size, rendering issues occur that |
5157 // manifest in erroneous scrolling and tap handling (crbug.com/574996, | 5129 // manifest in erroneous scrolling and tap handling (crbug.com/574996, |
5158 // crbug.com/577793). | 5130 // crbug.com/577793). |
5159 DCHECK_GT(CGRectGetWidth([_webView frame]), 0.0); | 5131 DCHECK_GT(CGRectGetWidth([_webView frame]), 0.0); |
5160 DCHECK_GT(CGRectGetHeight([_webView frame]), 0.0); | 5132 DCHECK_GT(CGRectGetHeight([_webView frame]), 0.0); |
5161 | 5133 |
5162 web::WKBackForwardListItemHolder* holder = | 5134 web::WKBackForwardListItemHolder* holder = |
5163 [self currentBackForwardListItemHolder]; | 5135 [self currentBackForwardListItemHolder]; |
5164 BOOL repostedForm = | 5136 BOOL repostedForm = |
5165 [holder->http_method() isEqual:@"POST"] && | 5137 [holder->http_method() isEqual:@"POST"] && |
5166 (holder->navigation_type() == WKNavigationTypeFormResubmitted || | 5138 (holder->navigation_type() == WKNavigationTypeFormResubmitted || |
5167 holder->navigation_type() == WKNavigationTypeFormSubmitted); | 5139 holder->navigation_type() == WKNavigationTypeFormSubmitted); |
5168 web::NavigationItemImpl* currentItem = | 5140 web::NavigationItemImpl* currentItem = self.currentNavItem; |
5169 [self currentSessionEntry].navigationItemImpl; | |
5170 NSData* POSTData = currentItem->GetPostData(); | 5141 NSData* POSTData = currentItem->GetPostData(); |
5171 NSMutableURLRequest* request = [self requestForCurrentNavigationItem]; | 5142 NSMutableURLRequest* request = [self requestForCurrentNavigationItem]; |
5172 | 5143 |
5173 // If the request has POST data and is not a repost form, configure and | 5144 // If the request has POST data and is not a repost form, configure and |
5174 // run the POST request. | 5145 // run the POST request. |
5175 if (POSTData.length && !repostedForm) { | 5146 if (POSTData.length && !repostedForm) { |
5176 [request setHTTPMethod:@"POST"]; | 5147 [request setHTTPMethod:@"POST"]; |
5177 [request setHTTPBody:POSTData]; | 5148 [request setHTTPBody:POSTData]; |
5178 [request setAllHTTPHeaderFields:[self currentHTTPHeaders]]; | 5149 [request setAllHTTPHeaderFields:self.currentHTTPHeaders]; |
5179 GURL navigationURL = | 5150 GURL navigationURL = |
5180 currentItem ? currentItem->GetURL() : GURL::EmptyGURL(); | 5151 currentItem ? currentItem->GetURL() : GURL::EmptyGURL(); |
5181 [self registerLoadRequest:navigationURL | 5152 [self registerLoadRequest:navigationURL |
5182 referrer:[self currentSessionEntryReferrer] | 5153 referrer:self.currentNavItemReferrer |
5183 transition:[self currentTransition]]; | 5154 transition:self.currentTransition]; |
5184 [self loadPOSTRequest:request]; | 5155 [self loadPOSTRequest:request]; |
5185 return; | 5156 return; |
5186 } | 5157 } |
5187 | 5158 |
5188 ProceduralBlock defaultNavigationBlock = ^{ | 5159 ProceduralBlock defaultNavigationBlock = ^{ |
5189 web::NavigationItem* item = [self currentNavItem]; | 5160 web::NavigationItem* item = self.currentNavItem; |
5190 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); | 5161 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); |
5191 [self registerLoadRequest:navigationURL | 5162 [self registerLoadRequest:navigationURL |
5192 referrer:[self currentSessionEntryReferrer] | 5163 referrer:self.currentNavItemReferrer |
5193 transition:[self currentTransition]]; | 5164 transition:self.currentTransition]; |
5194 [self loadRequest:request]; | 5165 [self loadRequest:request]; |
5195 }; | 5166 }; |
5196 | 5167 |
5197 // When navigating via WKBackForwardListItem to pages created or updated by | 5168 // When navigating via WKBackForwardListItem to pages created or updated by |
5198 // calls to pushState() and replaceState(), sometimes core.js is not injected | 5169 // calls to pushState() and replaceState(), sometimes core.js is not injected |
5199 // correctly. This means that calling window.history navigation functions | 5170 // correctly. This means that calling window.history navigation functions |
5200 // will invoke WKWebView's non-overridden implementations, causing a mismatch | 5171 // will invoke WKWebView's non-overridden implementations, causing a mismatch |
5201 // between the WKBackForwardList and NavigationManager. | 5172 // between the WKBackForwardList and NavigationManager. |
5202 // TODO(crbug.com/659816): Figure out how to prevent core.js injection flake. | 5173 // TODO(crbug.com/659816): Figure out how to prevent core.js injection flake. |
5203 if (currentItem->HasStateBeenReplaced() || | 5174 if (currentItem->HasStateBeenReplaced() || |
(...skipping 10 matching lines...) Expand all Loading... | |
5214 ![self isBackForwardListItemValid:holder->back_forward_list_item()]) { | 5185 ![self isBackForwardListItemValid:holder->back_forward_list_item()]) { |
5215 defaultNavigationBlock(); | 5186 defaultNavigationBlock(); |
5216 return; | 5187 return; |
5217 } | 5188 } |
5218 | 5189 |
5219 ProceduralBlock webViewNavigationBlock = ^{ | 5190 ProceduralBlock webViewNavigationBlock = ^{ |
5220 // If the current navigation URL is the same as the URL of the visible | 5191 // If the current navigation URL is the same as the URL of the visible |
5221 // page, that means the user requested a reload. |goToBackForwardListItem| | 5192 // page, that means the user requested a reload. |goToBackForwardListItem| |
5222 // will be a no-op when it is passed the current back forward list item, | 5193 // will be a no-op when it is passed the current back forward list item, |
5223 // so |reload| must be explicitly called. | 5194 // so |reload| must be explicitly called. |
5224 web::NavigationItem* item = [self currentNavItem]; | 5195 web::NavigationItem* item = self.currentNavItem; |
5225 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); | 5196 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); |
5226 [self registerLoadRequest:navigationURL | 5197 [self registerLoadRequest:navigationURL |
5227 referrer:[self currentSessionEntryReferrer] | 5198 referrer:self.currentNavItemReferrer |
5228 transition:[self currentTransition]]; | 5199 transition:self.currentTransition]; |
5229 if (navigationURL == net::GURLWithNSURL([_webView URL])) { | 5200 if (navigationURL == net::GURLWithNSURL([_webView URL])) { |
5230 [_navigationStates setState:web::WKNavigationState::REQUESTED | 5201 [_navigationStates setState:web::WKNavigationState::REQUESTED |
5231 forNavigation:[_webView reload]]; | 5202 forNavigation:[_webView reload]]; |
5232 } else { | 5203 } else { |
5233 // |didCommitNavigation:| may not be called for fast navigation, so update | 5204 // |didCommitNavigation:| may not be called for fast navigation, so update |
5234 // the navigation type now as it is already known. | 5205 // the navigation type now as it is already known. |
5235 holder->set_navigation_type(WKNavigationTypeBackForward); | 5206 holder->set_navigation_type(WKNavigationTypeBackForward); |
5236 WKNavigation* navigation = | 5207 WKNavigation* navigation = |
5237 [_webView goToBackForwardListItem:holder->back_forward_list_item()]; | 5208 [_webView goToBackForwardListItem:holder->back_forward_list_item()]; |
5238 [_navigationStates setState:web::WKNavigationState::REQUESTED | 5209 [_navigationStates setState:web::WKNavigationState::REQUESTED |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5318 - (void)simulateLoadRequestWithURL:(const GURL&)URL { | 5289 - (void)simulateLoadRequestWithURL:(const GURL&)URL { |
5319 _lastRegisteredRequestURL = URL; | 5290 _lastRegisteredRequestURL = URL; |
5320 _loadPhase = web::LOAD_REQUESTED; | 5291 _loadPhase = web::LOAD_REQUESTED; |
5321 } | 5292 } |
5322 | 5293 |
5323 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { | 5294 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { |
5324 return [action.request valueForHTTPHeaderField:@"Referer"]; | 5295 return [action.request valueForHTTPHeaderField:@"Referer"]; |
5325 } | 5296 } |
5326 | 5297 |
5327 @end | 5298 @end |
OLD | NEW |