| Index: ios/web/web_state/ui/crw_web_controller.mm
|
| diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
|
| index e162b1a18f0827149c95b2c8217c80a24fbd7e26..3d319f5bc4882725b0a452982c16b489ded571f6 100644
|
| --- a/ios/web/web_state/ui/crw_web_controller.mm
|
| +++ b/ios/web/web_state/ui/crw_web_controller.mm
|
| @@ -465,14 +465,16 @@ @interface CRWWebController ()<CRWContextMenuDelegate,
|
| // Facade for Mojo API.
|
| @property(nonatomic, readonly) web::MojoFacade* mojoFacade;
|
|
|
| -// Updates Desktop User Agent and calls webWillFinishHistoryNavigationFromEntry:
|
| -// on CRWWebDelegate. TODO(crbug.com/684098): Remove this method and inline its
|
| -// content.
|
| -- (void)webWillFinishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry;
|
| -// Recreates web view if |entry| and |fromEntry| have different value for
|
| -// IsOverridingUserAgent() flag.
|
| -- (void)updateDesktopUserAgentForEntry:(CRWSessionEntry*)entry
|
| - fromEntry:(CRWSessionEntry*)fromEntry;
|
| +// TODO(crbug.com/684098): Remove these methods and inline their content.
|
| +// Called before finishing a history navigation from a page with the given
|
| +// UserAgentType.
|
| +- (void)webWillFinishHistoryNavigationWithPreviousUserAgentType:
|
| + (web::UserAgentType)userAgentType;
|
| +// Requires page reconstruction if |item| has a non-NONE UserAgentType and it
|
| +// differs from that of |fromItem|.
|
| +- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item
|
| + previousUserAgentType:(web::UserAgentType)userAgentType;
|
| +
|
| // Removes the container view from the hierarchy and resets the ivar.
|
| - (void)resetContainerView;
|
| // Called when the web page has changed document and/or URL, and so the page
|
| @@ -608,9 +610,12 @@ - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess;
|
| // TODO(crbug.com/661316): Move this method to NavigationManager.
|
| - (void)goDelta:(int)delta;
|
| // Loads a new URL if the current entry is not from a pushState() navigation.
|
| -// |fromEntry| is the CRWSessionEntry that was the current entry prior to the
|
| -// navigation.
|
| -- (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry;
|
| +// |fromURL| is the URL of the previous NavigationItem, |fromUserAgentType| is
|
| +// that item's UserAgentType, and |sameDocument| is YES if the navigation is
|
| +// between two pages with the same document.
|
| +- (void)finishHistoryNavigationFromURL:(const GURL&)fromURL
|
| + userAgentType:(web::UserAgentType)fromUserAgentType
|
| + sameDocument:(BOOL)sameDocument;
|
| // Informs the native controller if web usage is allowed or not.
|
| - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled;
|
| // Called when web controller receives a new message from the web page.
|
| @@ -722,9 +727,8 @@ - (BOOL)isBackForwardListItemValid:(WKBackForwardListItem*)item;
|
| // Compares the two URLs being navigated between during a history navigation to
|
| // determine if a # needs to be appended to the URL of |toItem| to trigger a
|
| // hashchange event. If so, also saves the modified URL into |toItem|.
|
| -- (GURL)URLForHistoryNavigationFromItem:(web::NavigationItem*)fromItem
|
| - toItem:(web::NavigationItem*)toItem;
|
| -
|
| +- (GURL)URLForHistoryNavigationToItem:(web::NavigationItem*)toItem
|
| + previousURL:(const GURL&)previousURL;
|
| // Finds all the scrollviews in the view hierarchy and makes sure they do not
|
| // interfere with scroll to top when tapping the statusbar.
|
| - (void)optOutScrollsToTopForSubviews;
|
| @@ -1411,8 +1415,8 @@ - (BOOL)isBackForwardListItemValid:(WKBackForwardListItem*)item {
|
| [list.backList indexOfObject:item] != NSNotFound;
|
| }
|
|
|
| -- (GURL)URLForHistoryNavigationFromItem:(web::NavigationItem*)fromItem
|
| - toItem:(web::NavigationItem*)toItem {
|
| +- (GURL)URLForHistoryNavigationToItem:(web::NavigationItem*)toItem
|
| + previousURL:(const GURL&)previousURL {
|
| // If navigating with native API, i.e. using a back forward list item,
|
| // hashchange events will be triggered automatically, so no URL tampering is
|
| // required.
|
| @@ -1422,26 +1426,25 @@ - (GURL)URLForHistoryNavigationFromItem:(web::NavigationItem*)fromItem
|
| return toItem->GetURL();
|
| }
|
|
|
| - const GURL& startURL = fromItem->GetURL();
|
| - const GURL& endURL = toItem->GetURL();
|
| + const GURL& URL = toItem->GetURL();
|
|
|
| // Check the state of the fragments on both URLs (aka, is there a '#' in the
|
| // url or not).
|
| - if (!startURL.has_ref() || endURL.has_ref()) {
|
| - return endURL;
|
| + if (!previousURL.has_ref() || URL.has_ref()) {
|
| + return URL;
|
| }
|
|
|
| // startURL contains a fragment and endURL doesn't. Remove the fragment from
|
| // startURL and compare the resulting string to endURL. If they are equal, add
|
| // # to endURL to cause a hashchange event.
|
| - GURL hashless = web::GURLByRemovingRefFromGURL(startURL);
|
| + GURL hashless = web::GURLByRemovingRefFromGURL(previousURL);
|
|
|
| - if (hashless != endURL)
|
| - return endURL;
|
| + if (hashless != URL)
|
| + return URL;
|
|
|
| url::StringPieceReplacements<std::string> emptyRef;
|
| emptyRef.SetRefStr("");
|
| - GURL newEndURL = endURL.ReplaceComponents(emptyRef);
|
| + GURL newEndURL = URL.ReplaceComponents(emptyRef);
|
| toItem->SetURL(newEndURL);
|
| return newEndURL;
|
| }
|
| @@ -2127,17 +2130,26 @@ - (void)goToItemAtIndex:(int)index {
|
|
|
| if (!_webStateImpl->IsShowingWebInterstitial())
|
| [self recordStateInHistory];
|
| - CRWSessionEntry* fromEntry = sessionController.currentEntry;
|
| - CRWSessionEntry* toEntry = entries[index];
|
| +
|
| + web::NavigationItem* previousItem = sessionController.currentItem;
|
| + GURL previousURL = previousItem ? previousItem->GetURL() : GURL::EmptyGURL();
|
| + web::UserAgentType previousUserAgentType =
|
| + previousItem ? previousItem->GetUserAgentType()
|
| + : web::UserAgentType::NONE;
|
| + web::NavigationItem* toItem = items[index].get();
|
| + BOOL sameDocumentNavigation =
|
| + [sessionController isSameDocumentNavigationBetweenItem:previousItem
|
| + andItem:toItem];
|
|
|
| NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
|
| if (![userDefaults boolForKey:@"PendingIndexNavigationDisabled"]) {
|
| [self clearTransientContentView];
|
| [self updateDesktopUserAgentForEntry:toEntry fromEntry:fromEntry];
|
|
|
| - BOOL sameDocumentNavigation = [sessionController
|
| - isSameDocumentNavigationBetweenItem:fromEntry.navigationItem
|
| - andItem:toEntry.navigationItem];
|
| + // Update the user agent before attempting the navigation.
|
| + [self updateDesktopUserAgentForItem:toItem
|
| + previousUserAgentType:previousUserAgentType];
|
| +
|
| if (sameDocumentNavigation) {
|
| [sessionController goToItemAtIndex:index];
|
| [self updateHTML5HistoryState];
|
| @@ -2154,8 +2166,11 @@ - (void)goToItemAtIndex:(int)index {
|
| }
|
| } else {
|
| [sessionController goToItemAtIndex:index];
|
| - if (fromEntry)
|
| - [self finishHistoryNavigationFromEntry:fromEntry];
|
| + if (previousURL.is_valid()) {
|
| + [self finishHistoryNavigationFromURL:previousURL
|
| + userAgentType:previousUserAgentType
|
| + sameDocument:sameDocumentNavigation];
|
| + }
|
| }
|
| }
|
|
|
| @@ -2249,20 +2264,19 @@ - (void)goDelta:(int)delta {
|
| }
|
| }
|
|
|
| -- (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry {
|
| - [self webWillFinishHistoryNavigationFromEntry:fromEntry];
|
| +- (void)finishHistoryNavigationFromURL:(const GURL&)fromURL
|
| + userAgentType:(web::UserAgentType)fromUserAgentType
|
| + sameDocument:(BOOL)sameDocument {
|
| + [self webWillFinishHistoryNavigationWithPreviousUserAgentType:
|
| + fromUserAgentType];
|
|
|
| // Only load the new URL if it has a different document than |fromEntry| to
|
| // prevent extra page loads from NavigationItems created by hash changes or
|
| // calls to window.history.pushState().
|
| - BOOL shouldLoadURL = ![self.sessionController
|
| - isSameDocumentNavigationBetweenItem:fromEntry.navigationItem
|
| - andItem:self.currentNavItem];
|
| - web::NavigationItemImpl* currentItem =
|
| - self.currentSessionEntry.navigationItemImpl;
|
| - GURL endURL = [self URLForHistoryNavigationFromItem:fromEntry.navigationItem
|
| - toItem:currentItem];
|
| - if (shouldLoadURL) {
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| + GURL endURL =
|
| + [self URLForHistoryNavigationToItem:currentItem previousURL:fromURL];
|
| + if (!sameDocument) {
|
| ui::PageTransition transition = ui::PageTransitionFromInt(
|
| ui::PAGE_TRANSITION_RELOAD | ui::PAGE_TRANSITION_FORWARD_BACK);
|
|
|
| @@ -2278,7 +2292,7 @@ - (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry {
|
| // updated after the navigation is committed, as attempting to replace the URL
|
| // here will result in a JavaScript SecurityError due to the URLs having
|
| // different origins.
|
| - if (!shouldLoadURL)
|
| + if (sameDocument)
|
| [self updateHTML5HistoryState];
|
| }
|
|
|
| @@ -2371,21 +2385,21 @@ - (CRWPassKitDownloader*)passKitDownloader {
|
| return _passKitDownloader.get();
|
| }
|
|
|
| -- (void)webWillFinishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry {
|
| - DCHECK(fromEntry);
|
| - [self updateDesktopUserAgentForEntry:self.currentSessionEntry
|
| - fromEntry:fromEntry];
|
| - [_delegate webWillFinishHistoryNavigationFromEntry:fromEntry];
|
| +- (void)webWillFinishHistoryNavigationWithPreviousUserAgentType:
|
| + (web::UserAgentType)userAgentType {
|
| + [self updateDesktopUserAgentForItem:self.currentNavItem
|
| + previousUserAgentType:userAgentType];
|
| + [_delegate webWillFinishHistoryNavigation];
|
| }
|
|
|
| -- (void)updateDesktopUserAgentForEntry:(CRWSessionEntry*)entry
|
| - fromEntry:(CRWSessionEntry*)fromEntry {
|
| - web::NavigationItemImpl* item = entry.navigationItemImpl;
|
| - web::NavigationItemImpl* fromItem = fromEntry.navigationItemImpl;
|
| +- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item
|
| + previousUserAgentType:(web::UserAgentType)userAgentType {
|
| + if (!item)
|
| + return;
|
| web::UserAgentType itemUserAgentType = item->GetUserAgentType();
|
| if (!item || !fromItem || itemUserAgentType == web::UserAgentType::NONE)
|
| return;
|
| - if (itemUserAgentType != fromItem->GetUserAgentType())
|
| + if (itemUserAgentType != userAgentType)
|
| [self requirePageReconstruction];
|
| }
|
|
|
|
|