| 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 378b5b1e60c02855dbb067663df2ee1db59e2660..a2f1da57271a871674acd36243f7da53ea3b6dd7 100644
|
| --- a/ios/web/web_state/ui/crw_web_controller.mm
|
| +++ b/ios/web/web_state/ui/crw_web_controller.mm
|
| @@ -43,7 +43,6 @@
|
| #import "ios/web/interstitials/web_interstitial_impl.h"
|
| #import "ios/web/navigation/crw_session_certificate_policy_manager.h"
|
| #import "ios/web/navigation/crw_session_controller.h"
|
| -#import "ios/web/navigation/crw_session_entry.h"
|
| #import "ios/web/navigation/navigation_item_impl.h"
|
| #import "ios/web/navigation/navigation_manager_impl.h"
|
| #include "ios/web/net/cert_host_pair.h"
|
| @@ -465,14 +464,26 @@ @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/692871): Remove these functions and replace with more
|
| +// appropriate NavigationItem getters.
|
| +// Returns the navigation item for the current page.
|
| +@property(nonatomic, readonly) web::NavigationItemImpl* currentNavItem;
|
| +// Returns the current transition type.
|
| +@property(nonatomic, readonly) ui::PageTransition currentTransition;
|
| +// Returns the referrer for current navigation item. May be empty.
|
| +@property(nonatomic, readonly) web::Referrer currentNavItemReferrer;
|
| +// The HTTP headers associated with the current navigation item. These are nil
|
| +// unless the request was a POST.
|
| +@property(nonatomic, readonly) NSDictionary* currentHTTPHeaders;
|
| +
|
| +// TODO(crbug.com/684098): Remove these methods and inline their content.
|
| +// Called before finishing a history navigation from |item|.
|
| +- (void)webWillFinishHistoryNavigationFromItem:(web::NavigationItem*)item;
|
| +// Requires page reconstruction if |item| has a non-NONE UserAgentType and it
|
| +// differs from that of |fromItem|.
|
| +- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item
|
| + fromItem:(web::NavigationItem*)fromItem;
|
| +
|
| // 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
|
| @@ -500,23 +511,6 @@ - (void)addPlaceholderOverlay;
|
| // Removes placeholder overlay.
|
| - (void)removePlaceholderOverlay;
|
|
|
| -// Returns the current entry from the underlying session controller.
|
| -// TODO(stuartmorgan): Audit all calls to these methods; these are just wrappers
|
| -// around the same logic as GetActiveEntry, so should probably not be used for
|
| -// the same reason that GetActiveEntry is deprecated. (E.g., page operations
|
| -// should generally be dealing with the last commited entry, not a pending
|
| -// entry).
|
| -- (CRWSessionEntry*)currentSessionEntry;
|
| -// Returns the navigation item for the current page.
|
| -- (web::NavigationItem*)currentNavItem;
|
| -// Returns the current transition type.
|
| -- (ui::PageTransition)currentTransition;
|
| -// Returns the referrer for current navigation item. May be empty.
|
| -- (web::Referrer)currentSessionEntryReferrer;
|
| -// The HTTP headers associated with the current navigation item. These are nil
|
| -// unless the request was a POST.
|
| -- (NSDictionary*)currentHTTPHeaders;
|
| -
|
| // Creates a web view if it's not yet created.
|
| - (void)ensureWebViewCreated;
|
| // Creates a web view with given |config|. No-op if web view is already created.
|
| @@ -608,9 +602,9 @@ - (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
|
| +// |item| is the NavigationItem that was the current entry prior to the
|
| // navigation.
|
| -- (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry;
|
| +- (void)finishHistoryNavigationFromItem:(web::NavigationItem*)item;
|
| // 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.
|
| @@ -1279,7 +1273,7 @@ - (GURL)currentURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel {
|
| return [self.nativeController url];
|
| }
|
| }
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| return item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| }
|
|
|
| @@ -1307,7 +1301,7 @@ - (GURL)currentURL {
|
| if ([referrerString length] == 0)
|
| return web::Referrer();
|
|
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| NSString* previousURLString = base::SysUTF8ToNSString(navigationURL.spec());
|
| // Check if the referrer is equal to the previous URL minus the hash symbol.
|
| @@ -1382,7 +1376,7 @@ - (BOOL)isCurrentNavigationItemPOST {
|
| }
|
|
|
| - (BOOL)isCurrentNavigationBackForward {
|
| - if (![self currentNavItem])
|
| + if (!self.currentNavItem)
|
| return NO;
|
| WKNavigationType currentNavigationType =
|
| [self currentBackForwardListItemHolder]->navigation_type();
|
| @@ -1556,8 +1550,7 @@ - (void)registerLoadRequest:(const GURL&)requestURL
|
| }
|
|
|
| - (void)updateHTML5HistoryState {
|
| - web::NavigationItemImpl* currentItem =
|
| - static_cast<web::NavigationItemImpl*>([self currentNavItem]);
|
| + web::NavigationItemImpl* currentItem = self.currentNavItem;
|
| if (!currentItem)
|
| return;
|
|
|
| @@ -1569,9 +1562,8 @@ - (void)updateHTML5HistoryState {
|
| // WKWebView doesn't send hashchange events for same-document non-BFLI
|
| // navigations, so one must be dispatched manually for hash change same-
|
| // document navigations.
|
| - web::NavigationItem* previousItem =
|
| - self.sessionController.previousEntry.navigationItem;
|
| const GURL URL = currentItem->GetURL();
|
| + web::NavigationItem* previousItem = self.sessionController.previousItem;
|
| const GURL oldURL = previousItem ? previousItem->GetURL() : GURL();
|
| BOOL shouldDispatchHashchange = sameDocumentNavigation && previousItem &&
|
| (web::GURLByRemovingRefFromGURL(URL) ==
|
| @@ -1624,8 +1616,7 @@ - (NSString*)javaScriptToDispatchHashChangeWithOldURL:(const GURL&)oldURL
|
|
|
| - (void)injectHTML5HistoryScriptWithHashChange:(BOOL)dispatchHashChange
|
| sameDocumentNavigation:(BOOL)sameDocumentNavigation {
|
| - web::NavigationItemImpl* currentItem =
|
| - static_cast<web::NavigationItemImpl*>([self currentNavItem]);
|
| + web::NavigationItemImpl* currentItem = self.currentNavItem;
|
| if (!currentItem)
|
| return;
|
|
|
| @@ -1639,8 +1630,7 @@ - (void)injectHTML5HistoryScriptWithHashChange:(BOOL)dispatchHashChange
|
| appendString:[self javaScriptToDispatchPopStateWithObject:stateObject]];
|
| }
|
| if (dispatchHashChange) {
|
| - web::NavigationItemImpl* previousItem =
|
| - self.sessionController.previousEntry.navigationItemImpl;
|
| + web::NavigationItemImpl* previousItem = self.sessionController.previousItem;
|
| const GURL oldURL = previousItem ? previousItem->GetURL() : GURL();
|
| [script appendString:[self javaScriptToDispatchHashChangeWithOldURL:oldURL
|
| newURL:URL]];
|
| @@ -1661,7 +1651,7 @@ - (void)loadCurrentURLInWebView {
|
| // Clear the set of URLs opened in external applications.
|
| _openedApplicationURL.reset([[NSMutableSet alloc] init]);
|
|
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| GURL targetURL = item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| // Load the url. The UIWebView delegate callbacks take care of updating the
|
| // session history and UI.
|
| @@ -1716,12 +1706,12 @@ - (void)commitPendingNavigationInfo {
|
| }
|
|
|
| - (NSMutableURLRequest*)requestForCurrentNavigationItem {
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL currentNavigationURL =
|
| item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| NSMutableURLRequest* request = [NSMutableURLRequest
|
| requestWithURL:net::NSURLWithGURL(currentNavigationURL)];
|
| - const web::Referrer referrer([self currentSessionEntryReferrer]);
|
| + const web::Referrer referrer(self.currentNavItemReferrer);
|
| if (referrer.url.is_valid()) {
|
| std::string referrerValue =
|
| web::ReferrerHeaderValueForNavigation(currentNavigationURL, referrer);
|
| @@ -1734,7 +1724,7 @@ - (NSMutableURLRequest*)requestForCurrentNavigationItem {
|
| // If there are headers in the current session entry add them to |request|.
|
| // Headers that would overwrite fields already present in |request| are
|
| // skipped.
|
| - NSDictionary* headers = [self currentHTTPHeaders];
|
| + NSDictionary* headers = self.currentHTTPHeaders;
|
| for (NSString* headerName in headers) {
|
| if (![request valueForHTTPHeaderField:headerName]) {
|
| [request setValue:[headers objectForKey:headerName]
|
| @@ -1746,7 +1736,7 @@ - (NSMutableURLRequest*)requestForCurrentNavigationItem {
|
| }
|
|
|
| - (web::WKBackForwardListItemHolder*)currentBackForwardListItemHolder {
|
| - web::NavigationItem* item = [self currentSessionEntry].navigationItemImpl;
|
| + web::NavigationItem* item = self.currentNavItem;
|
| DCHECK(item);
|
| web::WKBackForwardListItemHolder* holder =
|
| web::WKBackForwardListItemHolder::FromNavigationItem(item);
|
| @@ -1804,7 +1794,7 @@ - (void)loadNativeViewWithSuccess:(BOOL)loadSuccess {
|
|
|
| - (void)loadErrorInNativeView:(NSError*)error {
|
| [self removeWebViewAllowingCachedReconstruction:NO];
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
|
|
| if (web::IsWKWebViewSSLCertError(error)) {
|
| @@ -1832,7 +1822,7 @@ - (void)loadCurrentURLInNativeView {
|
| // Free the web view.
|
| [self removeWebViewAllowingCachedReconstruction:NO];
|
|
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL targetURL = item ? item->GetURL() : GURL::EmptyGURL();
|
| const web::Referrer referrer;
|
| id<CRWNativeContent> nativeContent =
|
| @@ -1846,7 +1836,7 @@ - (void)loadCurrentURLInNativeView {
|
|
|
| [self registerLoadRequest:targetURL
|
| referrer:referrer
|
| - transition:[self currentTransition]];
|
| + transition:self.currentTransition];
|
| [self loadNativeViewWithSuccess:YES];
|
| }
|
|
|
| @@ -1885,7 +1875,7 @@ - (void)loadWithParams:(const NavigationManager::WebLoadParams&)originalParams {
|
| // forward/back transitions?
|
| [self recordStateInHistory];
|
|
|
| - if (!self.currentSessionEntry)
|
| + if (!self.currentNavItem)
|
| initialNavigation = YES;
|
|
|
| web::NavigationInitiationType navigationInitiationType =
|
| @@ -1895,8 +1885,7 @@ - (void)loadWithParams:(const NavigationManager::WebLoadParams&)originalParams {
|
| self.navigationManagerImpl->AddPendingItem(
|
| navUrl, params.referrer, transition, navigationInitiationType);
|
|
|
| - web::NavigationItemImpl* addedItem =
|
| - [self currentSessionEntry].navigationItemImpl;
|
| + web::NavigationItemImpl* addedItem = self.currentNavItem;
|
| DCHECK(addedItem);
|
| if (params.extra_headers)
|
| addedItem->AddHttpRequestHeaders(params.extra_headers);
|
| @@ -1932,7 +1921,7 @@ - (void)loadCurrentURL {
|
| // Remove the transient content view.
|
| [self clearTransientContentView];
|
|
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL currentURL = item ? item->GetURL() : GURL::EmptyGURL();
|
| // If it's a chrome URL, but not a native one, create the WebUI instance.
|
| if (web::GetWebClient()->IsAppSpecificURL(currentURL) &&
|
| @@ -2005,7 +1994,7 @@ - (void)triggerPendingLoad {
|
|
|
| [_containerView addGestureRecognizer:[self touchTrackingRecognizer]];
|
| // Is |currentUrl| a web scheme or native chrome scheme.
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL currentNavigationURL =
|
| item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| BOOL isChromeScheme =
|
| @@ -2119,25 +2108,27 @@ - (void)loadCancelled {
|
|
|
| - (void)goToItemAtIndex:(int)index {
|
| CRWSessionController* sessionController = self.sessionController;
|
| - NSArray* entries = sessionController.entries;
|
| - if (index < 0 || index >= static_cast<int>(entries.count)) {
|
| + web::NavigationItemList items = sessionController.items;
|
| + if (index < 0 || index >= static_cast<int>(items.size())) {
|
| NOTREACHED();
|
| return;
|
| }
|
|
|
| if (!_webStateImpl->IsShowingWebInterstitial())
|
| [self recordStateInHistory];
|
| - CRWSessionEntry* fromEntry = sessionController.currentEntry;
|
| - CRWSessionEntry* toEntry = entries[index];
|
| + web::NavigationItem* fromItem = sessionController.currentItem;
|
| + web::NavigationItem* toItem = items[index];
|
|
|
| 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 fromItem:fromItem];
|
| +
|
| + BOOL sameDocumentNavigation =
|
| + [sessionController isSameDocumentNavigationBetweenItem:fromItem
|
| + andItem:toItem];
|
| if (sameDocumentNavigation) {
|
| [sessionController goToItemAtIndex:index];
|
| [self updateHTML5HistoryState];
|
| @@ -2145,8 +2136,7 @@ - (void)goToItemAtIndex:(int)index {
|
| [sessionController discardNonCommittedItems];
|
| [sessionController setPendingItemIndex:index];
|
|
|
| - web::NavigationItemImpl* pendingItem =
|
| - sessionController.pendingEntry.navigationItemImpl;
|
| + web::NavigationItemImpl* pendingItem = sessionController.pendingItem;
|
| pendingItem->SetTransitionType(ui::PageTransitionFromInt(
|
| pendingItem->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK));
|
|
|
| @@ -2154,8 +2144,8 @@ - (void)goToItemAtIndex:(int)index {
|
| }
|
| } else {
|
| [sessionController goToItemAtIndex:index];
|
| - if (fromEntry)
|
| - [self finishHistoryNavigationFromEntry:fromEntry];
|
| + if (fromItem)
|
| + [self finishHistoryNavigationFromItem:fromItem];
|
| }
|
| }
|
|
|
| @@ -2219,7 +2209,7 @@ - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess {
|
| // NSURLRequest.
|
| if (_webUIManager) {
|
| web::NavigationItem* lastNavigationItem =
|
| - self.sessionController.previousEntry.navigationItem;
|
| + self.sessionController.previousItem;
|
| if (lastNavigationItem) {
|
| web::WKBackForwardListItemHolder* holder =
|
| web::WKBackForwardListItemHolder::FromNavigationItem(
|
| @@ -2249,19 +2239,17 @@ - (void)goDelta:(int)delta {
|
| }
|
| }
|
|
|
| -- (void)finishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry {
|
| - [self webWillFinishHistoryNavigationFromEntry:fromEntry];
|
| +- (void)finishHistoryNavigationFromItem:(web::NavigationItem*)item {
|
| + [self webWillFinishHistoryNavigationFromItem:item];
|
|
|
| // 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
|
| + isSameDocumentNavigationBetweenItem:item
|
| andItem:self.currentNavItem];
|
| - web::NavigationItemImpl* currentItem =
|
| - self.currentSessionEntry.navigationItemImpl;
|
| - GURL endURL = [self URLForHistoryNavigationFromItem:fromEntry.navigationItem
|
| - toItem:currentItem];
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| + GURL endURL = [self URLForHistoryNavigationFromItem:item toItem:currentItem];
|
| if (shouldLoadURL) {
|
| ui::PageTransition transition = ui::PageTransitionFromInt(
|
| ui::PAGE_TRANSITION_RELOAD | ui::PAGE_TRANSITION_FORWARD_BACK);
|
| @@ -2331,7 +2319,7 @@ - (BOOL)shouldClosePageOnNativeApplicationLoad {
|
| }
|
|
|
| - (BOOL)usesDesktopUserAgent {
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| return item && item->GetUserAgentType() == web::UserAgentType::DESKTOP;
|
| }
|
|
|
| @@ -2371,19 +2359,18 @@ - (CRWPassKitDownloader*)passKitDownloader {
|
| return _passKitDownloader.get();
|
| }
|
|
|
| -- (void)webWillFinishHistoryNavigationFromEntry:(CRWSessionEntry*)fromEntry {
|
| - DCHECK(fromEntry);
|
| - [self updateDesktopUserAgentForEntry:self.currentSessionEntry
|
| - fromEntry:fromEntry];
|
| - [_delegate webWillFinishHistoryNavigationFromEntry:fromEntry];
|
| +- (void)webWillFinishHistoryNavigationFromItem:(web::NavigationItem*)item {
|
| + DCHECK(item);
|
| + [self updateDesktopUserAgentForItem:self.currentNavItem fromItem:item];
|
| + [_delegate webWillFinishHistoryNavigation];
|
| }
|
|
|
| -- (void)updateDesktopUserAgentForEntry:(CRWSessionEntry*)entry
|
| - fromEntry:(CRWSessionEntry*)fromEntry {
|
| - web::NavigationItemImpl* item = entry.navigationItemImpl;
|
| - web::NavigationItemImpl* fromItem = fromEntry.navigationItemImpl;
|
| +- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item
|
| + fromItem:(web::NavigationItem*)fromItem {
|
| + if (!item || !fromItem)
|
| + return;
|
| web::UserAgentType itemUserAgentType = item->GetUserAgentType();
|
| - if (!item || !fromItem || itemUserAgentType == web::UserAgentType::NONE)
|
| + if (itemUserAgentType == web::UserAgentType::NONE)
|
| return;
|
| if (itemUserAgentType != fromItem->GetUserAgentType())
|
| [self requirePageReconstruction];
|
| @@ -2836,8 +2823,7 @@ - (BOOL)handleWindowHashChangeMessage:(base::DictionaryValue*)message
|
| if (_dispatchingSameDocumentHashChangeEvent) {
|
| _dispatchingSameDocumentHashChangeEvent = NO;
|
| } else {
|
| - web::NavigationItemImpl* item =
|
| - static_cast<web::NavigationItemImpl*>([self currentNavItem]);
|
| + web::NavigationItemImpl* item = self.currentNavItem;
|
| DCHECK(item);
|
| item->SetIsCreatedFromHashChange(true);
|
| }
|
| @@ -2883,7 +2869,7 @@ - (BOOL)handleWindowHistoryDidPushStateMessage:(base::DictionaryValue*)message
|
| // previous page, ignore it and allow the previously registered navigation to
|
| // continue. This can ocur if a pushState is issued from an anchor tag
|
| // onClick event, as the click would have already been registered.
|
| - if ([self sessionController].pendingEntry)
|
| + if ([self sessionController].pendingItem)
|
| return NO;
|
|
|
| std::string pageURL;
|
| @@ -2900,13 +2886,13 @@ - (BOOL)handleWindowHistoryDidPushStateMessage:(base::DictionaryValue*)message
|
| pushURL = URLEscapedForHistory(pushURL);
|
| if (!pushURL.is_valid())
|
| return YES;
|
| - web::NavigationItem* navItem = [self currentNavItem];
|
| + web::NavigationItem* navItem = self.currentNavItem;
|
| // PushState happened before first navigation entry or called when the
|
| // navigation entry does not contain a valid URL.
|
| if (!navItem || !navItem->GetURL().is_valid())
|
| return YES;
|
| if (!web::history_state_util::IsHistoryStateChangeValid(
|
| - [self currentNavItem]->GetURL(), pushURL)) {
|
| + self.currentNavItem->GetURL(), pushURL)) {
|
| // If the current session entry URL origin still doesn't match pushURL's
|
| // origin, ignore the pushState. This can happen if a new URL is loaded
|
| // just before the pushState.
|
| @@ -2966,14 +2952,14 @@ - (BOOL)handleWindowHistoryDidReplaceStateMessage:
|
| if (!replaceURL.is_valid())
|
| return YES;
|
|
|
| - web::NavigationItem* navItem = [self currentNavItem];
|
| + web::NavigationItem* navItem = self.currentNavItem;
|
| // ReplaceState happened before first navigation entry or called right
|
| // after window.open when the url is empty/not valid.
|
| if (!navItem || (self.navigationManagerImpl->GetItemCount() <= 1 &&
|
| navItem->GetURL().is_empty()))
|
| return YES;
|
| if (!web::history_state_util::IsHistoryStateChangeValid(
|
| - [self currentNavItem]->GetURL(), replaceURL)) {
|
| + self.currentNavItem->GetURL(), replaceURL)) {
|
| // If the current session entry URL origin still doesn't match
|
| // replaceURL's origin, ignore the replaceState. This can happen if a
|
| // new URL is loaded just before the replaceState.
|
| @@ -3029,7 +3015,7 @@ - (void)webPageChanged {
|
| // If no referrer was known in advance, record it now. (If there was one,
|
| // keep it since it will have a more accurate URL and policy than what can
|
| // be extracted from the landing page.)
|
| - web::NavigationItem* currentItem = [self currentNavItem];
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| if (!currentItem->GetReferrer().url.is_valid()) {
|
| currentItem->SetReferrer(referrer);
|
| }
|
| @@ -3088,18 +3074,17 @@ - (BOOL)userInteractionRegistered {
|
| }
|
|
|
| - (void)cachePOSTDataForRequest:(NSURLRequest*)request
|
| - inSessionEntry:(CRWSessionEntry*)currentSessionEntry {
|
| + inNavigationItem:(web::NavigationItemImpl*)item {
|
| NSUInteger maxPOSTDataSizeInBytes = 4096;
|
| NSString* cookieHeaderName = @"cookie";
|
|
|
| - web::NavigationItemImpl* currentItem = currentSessionEntry.navigationItemImpl;
|
| - DCHECK(currentItem);
|
| + DCHECK(item);
|
| const bool shouldUpdateEntry =
|
| - ui::PageTransitionCoreTypeIs(currentItem->GetTransitionType(),
|
| + ui::PageTransitionCoreTypeIs(item->GetTransitionType(),
|
| ui::PAGE_TRANSITION_FORM_SUBMIT) &&
|
| ![request HTTPBodyStream] && // Don't cache streams.
|
| - !currentItem->HasPostData() &&
|
| - currentItem->GetURL() == net::GURLWithNSURL([request URL]);
|
| + !item->HasPostData() &&
|
| + item->GetURL() == net::GURLWithNSURL([request URL]);
|
| const bool belowSizeCap =
|
| [[request HTTPBody] length] < maxPOSTDataSizeInBytes;
|
| DLOG_IF(WARNING, shouldUpdateEntry && !belowSizeCap)
|
| @@ -3107,15 +3092,15 @@ - (void)cachePOSTDataForRequest:(NSURLRequest*)request
|
| << " bytes), and will not be cached.";
|
|
|
| if (shouldUpdateEntry && belowSizeCap) {
|
| - currentItem->SetPostData([request HTTPBody]);
|
| - currentItem->ResetHttpRequestHeaders();
|
| - currentItem->AddHttpRequestHeaders([request allHTTPHeaderFields]);
|
| + item->SetPostData([request HTTPBody]);
|
| + item->ResetHttpRequestHeaders();
|
| + item->AddHttpRequestHeaders([request allHTTPHeaderFields]);
|
| // Don't cache the "Cookie" header.
|
| // According to NSURLRequest documentation, |-valueForHTTPHeaderField:| is
|
| // case insensitive, so it's enough to test the lower case only.
|
| if ([request valueForHTTPHeaderField:cookieHeaderName]) {
|
| // Case insensitive search in |headers|.
|
| - NSSet* cookieKeys = [currentItem->GetHttpRequestHeaders()
|
| + NSSet* cookieKeys = [item->GetHttpRequestHeaders()
|
| keysOfEntriesPassingTest:^(id key, id obj, BOOL* stop) {
|
| NSString* header = (NSString*)key;
|
| const BOOL found =
|
| @@ -3125,7 +3110,7 @@ - (void)cachePOSTDataForRequest:(NSURLRequest*)request
|
| return found;
|
| }];
|
| DCHECK_EQ(1u, [cookieKeys count]);
|
| - currentItem->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]);
|
| + item->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]);
|
| }
|
| }
|
| }
|
| @@ -3148,9 +3133,9 @@ - (BOOL)shouldAllowLoadWithNavigationAction:(WKNavigationAction*)action {
|
| BOOL isOpenInNewTabNavigation = !(self.navigationManagerImpl->GetItemCount());
|
| BOOL isPossibleLinkClick = [self isLinkNavigation:action.navigationType];
|
| if (isPossibleLinkClick || isOpenInNewTabNavigation ||
|
| - PageTransitionCoreTypeIs([self currentTransition],
|
| + PageTransitionCoreTypeIs(self.currentTransition,
|
| ui::PAGE_TRANSITION_AUTO_BOOKMARK)) {
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| const GURL currentNavigationURL =
|
| item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| // Check If the URL is handled by a native app.
|
| @@ -3218,11 +3203,11 @@ - (BOOL)shouldAllowLoadWithNavigationAction:(WKNavigationAction*)action {
|
| }
|
|
|
| if ([[request HTTPMethod] isEqualToString:@"POST"]) {
|
| - CRWSessionEntry* currentEntry = [self currentSessionEntry];
|
| + web::NavigationItemImpl* item = self.currentNavItem;
|
| // TODO(crbug.com/570699): Remove this check once it's no longer possible to
|
| // have no current entries.
|
| - if (currentEntry)
|
| - [self cachePOSTDataForRequest:request inSessionEntry:currentEntry];
|
| + if (item)
|
| + [self cachePOSTDataForRequest:request inNavigationItem:item];
|
| }
|
|
|
| return YES;
|
| @@ -3609,35 +3594,31 @@ - (NavigationManagerImpl*)navigationManagerImpl {
|
| return _webStateImpl ? &(_webStateImpl->GetNavigationManagerImpl()) : nil;
|
| }
|
|
|
| -- (CRWSessionEntry*)currentSessionEntry {
|
| - return [[self sessionController] currentEntry];
|
| -}
|
| -
|
| -- (web::NavigationItem*)currentNavItem {
|
| +- (web::NavigationItemImpl*)currentNavItem {
|
| // This goes through the legacy Session* interface rather than Navigation*
|
| // because it is itself a legacy method that should not exist, and this
|
| // avoids needing to add a GetActiveItem to NavigationManager. If/when this
|
| // method chain becomes a blocker to eliminating SessionController, the logic
|
| // can be moved here, using public NavigationManager getters. That's not
|
| // done now in order to avoid code duplication.
|
| - return [[self currentSessionEntry] navigationItem];
|
| + return [[self sessionController] currentItem];
|
| }
|
|
|
| - (ui::PageTransition)currentTransition {
|
| - if ([self currentNavItem])
|
| - return [self currentNavItem]->GetTransitionType();
|
| + if (self.currentNavItem)
|
| + return self.currentNavItem->GetTransitionType();
|
| else
|
| return ui::PageTransitionFromInt(0);
|
| }
|
|
|
| -- (web::Referrer)currentSessionEntryReferrer {
|
| - web::NavigationItem* currentItem = [self currentNavItem];
|
| +- (web::Referrer)currentNavItemReferrer {
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| return currentItem ? currentItem->GetReferrer() : web::Referrer();
|
| }
|
|
|
| - (NSDictionary*)currentHTTPHeaders {
|
| - DCHECK([self currentSessionEntry]);
|
| - return [self currentSessionEntry].navigationItem->GetHttpRequestHeaders();
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| + return currentItem ? currentItem->GetHttpRequestHeaders() : nil;
|
| }
|
|
|
| #pragma mark -
|
| @@ -3663,7 +3644,7 @@ - (void)webViewScrollViewDidZoom:
|
|
|
| - (void)webViewScrollViewDidResetContentSize:
|
| (CRWWebViewScrollViewProxy*)webViewScrollViewProxy {
|
| - web::NavigationItem* currentItem = [self currentNavItem];
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| if (webViewScrollViewProxy.isZooming || _applyingPageState || !currentItem)
|
| return;
|
| CGSize contentSize = webViewScrollViewProxy.contentSize;
|
| @@ -3708,17 +3689,17 @@ - (void)recordStateInHistory {
|
| // Only record the state if:
|
| // - the current NavigationItem's URL matches the current URL, and
|
| // - the user has interacted with the page.
|
| - CRWSessionEntry* current = [self currentSessionEntry];
|
| - if (current && [current navigationItem]->GetURL() == [self currentURL] &&
|
| + web::NavigationItem* item = self.currentNavItem;
|
| + if (item && item->GetURL() == [self currentURL] &&
|
| self.userInteractionRegistered) {
|
| - [current navigationItem]->SetPageDisplayState(self.pageDisplayState);
|
| + item->SetPageDisplayState(self.pageDisplayState);
|
| }
|
| }
|
|
|
| - (void)restoreStateFromHistory {
|
| - CRWSessionEntry* current = [self currentSessionEntry];
|
| - if ([current navigationItem])
|
| - self.pageDisplayState = [current navigationItem]->GetPageDisplayState();
|
| + web::NavigationItem* item = self.currentNavItem;
|
| + if (item)
|
| + self.pageDisplayState = item->GetPageDisplayState();
|
| }
|
|
|
| - (web::PageDisplayState)pageDisplayState {
|
| @@ -3759,7 +3740,7 @@ - (void)setPageDisplayState:(web::PageDisplayState)displayState {
|
|
|
| - (void)extractViewportTagWithCompletion:(ViewportStateCompletion)completion {
|
| DCHECK(completion);
|
| - web::NavigationItem* currentItem = [self currentNavItem];
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| if (!currentItem) {
|
| completion(nullptr);
|
| return;
|
| @@ -3832,7 +3813,7 @@ - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState
|
| // Early return if |scrollState| doesn't match the current NavigationItem.
|
| // This can sometimes occur in tests, as navigation occurs programmatically
|
| // and |-applyPageScrollState:| is asynchronous.
|
| - web::NavigationItem* currentItem = [self currentSessionEntry].navigationItem;
|
| + web::NavigationItem* currentItem = self.currentNavItem;
|
| if (currentItem && currentItem->GetPageDisplayState() != displayState)
|
| return;
|
| DCHECK(displayState.IsValid());
|
| @@ -4245,7 +4226,7 @@ - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache {
|
|
|
| _webStateImpl->CancelDialogs();
|
|
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| if (allowCache && item) {
|
| _expectedReconstructionURL = item->GetVirtualURL();
|
| } else {
|
| @@ -4327,7 +4308,7 @@ - (void)stopLoading {
|
| // observers of the change via |-abortLoad|.
|
| [[self sessionController] discardNonCommittedItems];
|
| [self abortLoad];
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| GURL navigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL();
|
| // If discarding the non-committed entries results in an app-specific URL,
|
| // reload it in its native view.
|
| @@ -5052,7 +5033,7 @@ - (BOOL)isLoadRequestPendingForURL:(const GURL&)targetURL {
|
|
|
| - (void)loadRequestForCurrentNavigationItem {
|
| DCHECK(_webView && !self.nativeController);
|
| - DCHECK([self currentSessionEntry]);
|
| + DCHECK(self.currentNavItem);
|
| // If a load is kicked off on a WKWebView with a frame whose size is {0, 0} or
|
| // that has a negative dimension for a size, rendering issues occur that
|
| // manifest in erroneous scrolling and tap handling (crbug.com/574996,
|
| @@ -5066,8 +5047,7 @@ - (void)loadRequestForCurrentNavigationItem {
|
| [holder->http_method() isEqual:@"POST"] &&
|
| (holder->navigation_type() == WKNavigationTypeFormResubmitted ||
|
| holder->navigation_type() == WKNavigationTypeFormSubmitted);
|
| - web::NavigationItemImpl* currentItem =
|
| - [self currentSessionEntry].navigationItemImpl;
|
| + web::NavigationItemImpl* currentItem = self.currentNavItem;
|
| NSData* POSTData = currentItem->GetPostData();
|
| NSMutableURLRequest* request = [self requestForCurrentNavigationItem];
|
|
|
| @@ -5076,22 +5056,22 @@ - (void)loadRequestForCurrentNavigationItem {
|
| if (POSTData.length && !repostedForm) {
|
| [request setHTTPMethod:@"POST"];
|
| [request setHTTPBody:POSTData];
|
| - [request setAllHTTPHeaderFields:[self currentHTTPHeaders]];
|
| + [request setAllHTTPHeaderFields:self.currentHTTPHeaders];
|
| GURL navigationURL =
|
| currentItem ? currentItem->GetURL() : GURL::EmptyGURL();
|
| [self registerLoadRequest:navigationURL
|
| - referrer:[self currentSessionEntryReferrer]
|
| - transition:[self currentTransition]];
|
| + referrer:self.currentNavItemReferrer
|
| + transition:self.currentTransition];
|
| [self loadPOSTRequest:request];
|
| return;
|
| }
|
|
|
| ProceduralBlock defaultNavigationBlock = ^{
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL();
|
| [self registerLoadRequest:navigationURL
|
| - referrer:[self currentSessionEntryReferrer]
|
| - transition:[self currentTransition]];
|
| + referrer:self.currentNavItemReferrer
|
| + transition:self.currentTransition];
|
| [self loadRequest:request];
|
| };
|
|
|
| @@ -5122,11 +5102,11 @@ - (void)loadRequestForCurrentNavigationItem {
|
| // page, that means the user requested a reload. |goToBackForwardListItem|
|
| // will be a no-op when it is passed the current back forward list item,
|
| // so |reload| must be explicitly called.
|
| - web::NavigationItem* item = [self currentNavItem];
|
| + web::NavigationItem* item = self.currentNavItem;
|
| GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL();
|
| [self registerLoadRequest:navigationURL
|
| - referrer:[self currentSessionEntryReferrer]
|
| - transition:[self currentTransition]];
|
| + referrer:self.currentNavItemReferrer
|
| + transition:self.currentTransition];
|
| if (navigationURL == net::GURLWithNSURL([_webView URL])) {
|
| [_navigationStates setState:web::WKNavigationState::REQUESTED
|
| forNavigation:[_webView reload]];
|
|
|