Index: ios/web/navigation/crw_session_controller.mm |
diff --git a/ios/web/navigation/crw_session_controller.mm b/ios/web/navigation/crw_session_controller.mm |
index f21c51eadcc1bb446cc32c9bce583d9b4e934231..0b02fd4511c02d5fd1b4e44a1b8c234d716f99b8 100644 |
--- a/ios/web/navigation/crw_session_controller.mm |
+++ b/ios/web/navigation/crw_session_controller.mm |
@@ -77,7 +77,7 @@ @interface CRWSessionController () { |
// If |YES|, override |currentEntry.useDesktopUserAgent| and create the |
// pending entry using the desktop user agent. |
- BOOL _useDesktopUserAgentForNextPendingEntry; |
+ BOOL _useDesktopUserAgentForNextPendingItem; |
// The browser state associated with this CRWSessionController; |
web::BrowserState* _browserState; // weak |
@@ -107,9 +107,9 @@ @interface CRWSessionController () { |
- (NSString*)uniqueID; |
// Removes all entries after currentNavigationIndex_. |
-- (void)clearForwardEntries; |
+- (void)clearForwardItems; |
// Discards the transient entry, if any. |
-- (void)discardTransientEntry; |
+- (void)discardTransientItem; |
// Create a new autoreleased session entry. |
- (CRWSessionEntry*)sessionEntryWithURL:(const GURL&)url |
referrer:(const web::Referrer&)referrer |
@@ -118,7 +118,9 @@ - (CRWSessionEntry*)sessionEntryWithURL:(const GURL&)url |
rendererInitiated:(BOOL)rendererInitiated; |
// Returns YES if the PageTransition for the underlying navigationItem at |
// |index| in |entries_| has ui::PAGE_TRANSITION_IS_REDIRECT_MASK. |
-- (BOOL)isRedirectTransitionForEntryAtIndex:(NSInteger)index; |
+- (BOOL)isRedirectTransitionForItemAtIndex:(NSInteger)index; |
+// Returns a NavigationItemList containing the NavigationItems from |entries|. |
+- (web::NavigationItemList)itemListForEntryList:(NSArray*)entries; |
@end |
@implementation CRWSessionController |
@@ -126,7 +128,7 @@ @implementation CRWSessionController |
@synthesize tabId = _tabId; |
@synthesize currentNavigationIndex = _currentNavigationIndex; |
@synthesize previousNavigationIndex = _previousNavigationIndex; |
-@synthesize pendingEntryIndex = _pendingEntryIndex; |
+@synthesize pendingItemIndex = _pendingItemIndex; |
@synthesize entries = _entries; |
@synthesize windowName = _windowName; |
@synthesize lastVisitedTimestamp = _lastVisitedTimestamp; |
@@ -152,7 +154,7 @@ - (id)initWithWindowName:(NSString*)windowName |
_lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; |
_currentNavigationIndex = -1; |
_previousNavigationIndex = -1; |
- _pendingEntryIndex = -1; |
+ _pendingItemIndex = -1; |
_sessionCertificatePolicyManager = |
[[CRWSessionCertificatePolicyManager alloc] init]; |
} |
@@ -185,7 +187,7 @@ - (id)initWithNavigationItems: |
self.currentNavigationIndex = static_cast<NSInteger>(items.size()) - 1; |
} |
_previousNavigationIndex = -1; |
- _pendingEntryIndex = -1; |
+ _pendingItemIndex = -1; |
_lastVisitedTimestamp = [[NSDate date] timeIntervalSince1970]; |
_sessionCertificatePolicyManager = |
[[CRWSessionCertificatePolicyManager alloc] init]; |
@@ -202,7 +204,7 @@ - (id)copyWithZone:(NSZone*)zone { |
copy.windowName = self.windowName; |
copy->_currentNavigationIndex = _currentNavigationIndex; |
copy->_previousNavigationIndex = _previousNavigationIndex; |
- copy->_pendingEntryIndex = _pendingEntryIndex; |
+ copy->_pendingItemIndex = _pendingItemIndex; |
copy->_lastVisitedTimestamp = _lastVisitedTimestamp; |
copy->_entries = |
[[NSMutableArray alloc] initWithArray:_entries copyItems:YES]; |
@@ -219,13 +221,13 @@ - (void)setCurrentNavigationIndex:(NSInteger)currentNavigationIndex { |
} |
} |
-- (void)setPendingEntryIndex:(NSInteger)index { |
+- (void)setPendingItemIndex:(NSInteger)index { |
DCHECK_GE(index, -1); |
DCHECK_LT(index, static_cast<NSInteger>(_entries.count)); |
- _pendingEntryIndex = index; |
+ _pendingItemIndex = index; |
CRWSessionEntry* entry = index != -1 ? _entries[index] : nil; |
_pendingEntry.reset(entry); |
- DCHECK(_pendingEntryIndex == -1 || _pendingEntry); |
+ DCHECK(_pendingItemIndex == -1 || _pendingEntry); |
} |
- (void)setNavigationManager:(web::NavigationManagerImpl*)navigationManager { |
@@ -254,10 +256,50 @@ - (NSString*)description { |
@"\nprevious index: %" PRIdNS @"\npending index: %" PRIdNS |
@"\n%@\npending: %@\ntransient: %@\n", |
_tabId, self.windowName, _lastVisitedTimestamp, |
- _currentNavigationIndex, _previousNavigationIndex, _pendingEntryIndex, |
+ _currentNavigationIndex, _previousNavigationIndex, _pendingItemIndex, |
_entries, _pendingEntry.get(), _transientEntry.get()]; |
} |
+- (web::NavigationItemList)items { |
+ return [self itemListForEntryList:self.entries]; |
+} |
+ |
+- (web::NavigationItemImpl*)currentItem { |
+ return self.currentEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)visibleItem { |
+ return self.visibleEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)pendingItem { |
+ return self.pendingEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)transientItem { |
+ return self.transientEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)lastCommittedItem { |
+ return self.lastCommittedEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)previousItem { |
+ return self.previousEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemImpl*)lastUserItem { |
+ return self.lastUserEntry.navigationItemImpl; |
+} |
+ |
+- (web::NavigationItemList)backwardItems { |
+ return [self itemListForEntryList:self.backwardEntries]; |
+} |
+ |
+- (web::NavigationItemList)forwardItems { |
+ return [self itemListForEntryList:self.forwardEntries]; |
+} |
+ |
// Returns the current entry in the session list, or the pending entry if there |
// is a navigation in progress. |
- (CRWSessionEntry*)currentEntry { |
@@ -278,7 +320,7 @@ - (CRWSessionEntry*)visibleEntry { |
web::NavigationItemImpl* pendingItem = [_pendingEntry navigationItemImpl]; |
bool safeToShowPending = pendingItem && |
!pendingItem->is_renderer_initiated() && |
- _pendingEntryIndex == -1; |
+ _pendingItemIndex == -1; |
if (safeToShowPending) { |
return _pendingEntry.get(); |
} |
@@ -306,12 +348,12 @@ - (CRWSessionEntry*)previousEntry { |
return [_entries objectAtIndex:_previousNavigationIndex]; |
} |
-- (void)addPendingEntry:(const GURL&)url |
- referrer:(const web::Referrer&)ref |
- transition:(ui::PageTransition)trans |
- rendererInitiated:(BOOL)rendererInitiated { |
- [self discardTransientEntry]; |
- _pendingEntryIndex = -1; |
+- (void)addPendingItem:(const GURL&)url |
+ referrer:(const web::Referrer&)ref |
+ transition:(ui::PageTransition)trans |
+ rendererInitiated:(BOOL)rendererInitiated { |
+ [self discardTransientItem]; |
+ _pendingItemIndex = -1; |
// Don't create a new entry if it's already the same as the current entry, |
// allowing this routine to be called multiple times in a row without issue. |
@@ -341,10 +383,10 @@ - (void)addPendingEntry:(const GURL&)url |
} |
BOOL useDesktopUserAgent = |
- _useDesktopUserAgentForNextPendingEntry || |
+ _useDesktopUserAgentForNextPendingItem || |
(self.currentEntry.navigationItem && |
self.currentEntry.navigationItem->IsOverridingUserAgent()); |
- _useDesktopUserAgentForNextPendingEntry = NO; |
+ _useDesktopUserAgentForNextPendingItem = NO; |
_pendingEntry.reset([self sessionEntryWithURL:url |
referrer:ref |
transition:trans |
@@ -356,7 +398,7 @@ - (void)addPendingEntry:(const GURL&)url |
} |
} |
-- (void)updatePendingEntry:(const GURL&)url { |
+- (void)updatePendingItem:(const GURL&)url { |
// If there is no pending entry, navigation is probably happening within the |
// session history. Don't modify the entry list. |
if (!_pendingEntry) |
@@ -367,7 +409,7 @@ - (void)updatePendingEntry:(const GURL&)url { |
// Assume a redirection, and discard any transient entry. |
// TODO(stuartmorgan): Once the current safe browsing code is gone, |
// consider making this a DCHECK that there's no transient entry. |
- [self discardTransientEntry]; |
+ [self discardTransientItem]; |
item->SetURL(url); |
item->SetVirtualURL(url); |
@@ -384,35 +426,35 @@ - (void)updatePendingEntry:(const GURL&)url { |
} |
} |
-- (void)clearForwardEntries { |
- DCHECK_EQ(_pendingEntryIndex, -1); |
- [self discardTransientEntry]; |
+- (void)clearForwardItems { |
+ DCHECK_EQ(_pendingItemIndex, -1); |
+ [self discardTransientItem]; |
- NSInteger forwardEntryStartIndex = _currentNavigationIndex + 1; |
- DCHECK(forwardEntryStartIndex >= 0); |
+ NSInteger forwardItemStartIndex = _currentNavigationIndex + 1; |
+ DCHECK(forwardItemStartIndex >= 0); |
- if (forwardEntryStartIndex >= static_cast<NSInteger>([_entries count])) |
+ if (forwardItemStartIndex >= static_cast<NSInteger>([_entries count])) |
return; |
- NSRange remove = NSMakeRange(forwardEntryStartIndex, |
- [_entries count] - forwardEntryStartIndex); |
+ NSRange remove = NSMakeRange(forwardItemStartIndex, |
+ [_entries count] - forwardItemStartIndex); |
// Store removed items in temporary NSArray so they can be deallocated after |
// their facades. |
base::scoped_nsobject<NSArray> removedItems( |
[_entries subarrayWithRange:remove]); |
[_entries removeObjectsInRange:remove]; |
- if (_previousNavigationIndex >= forwardEntryStartIndex) |
+ if (_previousNavigationIndex >= forwardItemStartIndex) |
_previousNavigationIndex = -1; |
if (_navigationManager) { |
_navigationManager->OnNavigationItemsPruned(remove.length); |
} |
} |
-- (void)commitPendingEntry { |
+- (void)commitPendingItem { |
if (_pendingEntry) { |
- NSInteger newNavigationIndex = _pendingEntryIndex; |
- if (_pendingEntryIndex == -1) { |
- [self clearForwardEntries]; |
+ NSInteger newNavigationIndex = _pendingItemIndex; |
+ if (_pendingItemIndex == -1) { |
+ [self clearForwardItems]; |
// Add the new entry at the end. |
[_entries addObject:_pendingEntry]; |
newNavigationIndex = [_entries count] - 1; |
@@ -423,7 +465,7 @@ - (void)commitPendingEntry { |
// the implementation in NavigationController.) |
[_pendingEntry navigationItemImpl]->ResetForCommit(); |
_pendingEntry.reset(); |
- _pendingEntryIndex = -1; |
+ _pendingItemIndex = -1; |
} |
CRWSessionEntry* currentEntry = self.currentEntry; |
@@ -434,10 +476,10 @@ - (void)commitPendingEntry { |
if (_navigationManager && item) |
_navigationManager->OnNavigationItemCommitted(); |
- DCHECK_EQ(_pendingEntryIndex, -1); |
+ DCHECK_EQ(_pendingItemIndex, -1); |
} |
-- (void)addTransientEntryWithURL:(const GURL&)URL { |
+- (void)addTransientItemWithURL:(const GURL&)URL { |
_transientEntry.reset([self |
sessionEntryWithURL:URL |
referrer:web::Referrer() |
@@ -451,9 +493,9 @@ - (void)addTransientEntryWithURL:(const GURL&)URL { |
_timeSmoother.GetSmoothedTime(base::Time::Now())); |
} |
-- (void)pushNewEntryWithURL:(const GURL&)URL |
- stateObject:(NSString*)stateObject |
- transition:(ui::PageTransition)transition { |
+- (void)pushNewItemWithURL:(const GURL&)URL |
+ stateObject:(NSString*)stateObject |
+ transition:(ui::PageTransition)transition { |
DCHECK(![self pendingEntry]); |
DCHECK([self currentEntry]); |
web::NavigationItem* item = [self currentEntry].navigationItem; |
@@ -474,7 +516,7 @@ - (void)pushNewEntryWithURL:(const GURL&)URL |
web::SSLStatus& sslStatus = [self currentEntry].navigationItem->GetSSL(); |
pushedEntry.get().navigationItem->GetSSL() = sslStatus; |
- [self clearForwardEntries]; |
+ [self clearForwardItems]; |
// Add the new entry at the end. |
[_entries addObject:pushedEntry]; |
_previousNavigationIndex = _currentNavigationIndex; |
@@ -484,8 +526,8 @@ - (void)pushNewEntryWithURL:(const GURL&)URL |
_navigationManager->OnNavigationItemCommitted(); |
} |
-- (void)updateCurrentEntryWithURL:(const GURL&)url |
- stateObject:(NSString*)stateObject { |
+- (void)updateCurrentItemWithURL:(const GURL&)url |
+ stateObject:(NSString*)stateObject { |
DCHECK(!_transientEntry); |
CRWSessionEntry* currentEntry = self.currentEntry; |
web::NavigationItemImpl* currentItem = self.currentEntry.navigationItemImpl; |
@@ -499,13 +541,13 @@ - (void)updateCurrentEntryWithURL:(const GURL&)url |
_navigationManager->OnNavigationItemChanged(); |
} |
-- (void)discardNonCommittedEntries { |
- [self discardTransientEntry]; |
+- (void)discardNonCommittedItems { |
+ [self discardTransientItem]; |
_pendingEntry.reset(); |
- _pendingEntryIndex = -1; |
+ _pendingItemIndex = -1; |
} |
-- (void)discardTransientEntry { |
+- (void)discardTransientItem { |
// Keep the entry alive temporarily. There are flows that get the current |
// entry, do some navigation operation, and then try to use that old current |
// entry; since navigations clear the transient entry, these flows might |
@@ -514,10 +556,6 @@ - (void)discardTransientEntry { |
_transientEntry.reset(); |
} |
-- (BOOL)hasPendingEntry { |
- return _pendingEntry != nil; |
-} |
- |
- (void)insertStateFromSessionController:(CRWSessionController*)sourceSession { |
DCHECK(sourceSession); |
self.windowName = sourceSession.windowName; |
@@ -539,23 +577,23 @@ - (void)insertStateFromSessionController:(CRWSessionController*)sourceSession { |
_previousNavigationIndex = -1; |
_currentNavigationIndex += lastIndexToCopy + 1; |
- if (_pendingEntryIndex != -1) |
- _pendingEntryIndex += lastIndexToCopy + 1; |
+ if (_pendingItemIndex != -1) |
+ _pendingItemIndex += lastIndexToCopy + 1; |
DCHECK_LT(static_cast<NSUInteger>(_currentNavigationIndex), _entries.count); |
- DCHECK(_pendingEntryIndex == -1 || _pendingEntry); |
+ DCHECK(_pendingItemIndex == -1 || _pendingEntry); |
} |
-- (void)goToEntryAtIndex:(NSInteger)index { |
+- (void)goToItemAtIndex:(NSInteger)index { |
if (index < 0 || static_cast<NSUInteger>(index) >= _entries.count) |
return; |
if (index < _currentNavigationIndex) { |
// Going back. |
- [self discardNonCommittedEntries]; |
+ [self discardNonCommittedItems]; |
} else if (_currentNavigationIndex < index) { |
// Going forward. |
- [self discardTransientEntry]; |
+ [self discardTransientItem]; |
} else { |
// |delta| is 0, no need to change current navigation index. |
return; |
@@ -565,12 +603,12 @@ - (void)goToEntryAtIndex:(NSInteger)index { |
_currentNavigationIndex = index; |
} |
-- (void)removeEntryAtIndex:(NSInteger)index { |
+- (void)removeItemAtIndex:(NSInteger)index { |
DCHECK(index < static_cast<NSInteger>([_entries count])); |
DCHECK(index != _currentNavigationIndex); |
DCHECK(index >= 0); |
- [self discardNonCommittedEntries]; |
+ [self discardNonCommittedItems]; |
[_entries removeObjectAtIndex:index]; |
if (_currentNavigationIndex > index) |
@@ -582,7 +620,7 @@ - (void)removeEntryAtIndex:(NSInteger)index { |
- (NSArray*)backwardEntries { |
NSMutableArray* entries = [NSMutableArray array]; |
for (NSInteger index = _currentNavigationIndex; index > 0; --index) { |
- if (![self isRedirectTransitionForEntryAtIndex:index]) |
+ if (![self isRedirectTransitionForItemAtIndex:index]) |
[entries addObject:_entries[index - 1]]; |
} |
return entries; |
@@ -602,12 +640,12 @@ - (NSArray*)forwardEntries { |
return entries; |
} |
-- (BOOL)isSameDocumentNavigationBetweenEntry:(CRWSessionEntry*)firstEntry |
- andEntry:(CRWSessionEntry*)secondEntry { |
- if (!firstEntry || !secondEntry || firstEntry == secondEntry) |
+- (BOOL)isSameDocumentNavigationBetweenItem:(web::NavigationItem*)firstItem |
+ andItem:(web::NavigationItem*)secondItem { |
+ if (!firstItem || !secondItem || firstItem == secondItem) |
return NO; |
- NSUInteger firstIndex = [_entries indexOfObject:firstEntry]; |
- NSUInteger secondIndex = [_entries indexOfObject:secondEntry]; |
+ NSUInteger firstIndex = [self indexOfItem:firstItem]; |
+ NSUInteger secondIndex = [self indexOfItem:secondItem]; |
if (firstIndex == NSNotFound || secondIndex == NSNotFound) |
return NO; |
NSUInteger startIndex = firstIndex < secondIndex ? firstIndex : secondIndex; |
@@ -621,8 +659,8 @@ - (BOOL)isSameDocumentNavigationBetweenEntry:(CRWSessionEntry*)firstEntry |
return NO; |
// Every entry in the sequence has to have a URL that could have been |
// created from a pushState() call. |
- if (!web::history_state_util::IsHistoryStateChangeValid( |
- firstEntry.navigationItem->GetURL(), item->GetURL())) |
+ if (!web::history_state_util::IsHistoryStateChangeValid(firstItem->GetURL(), |
+ item->GetURL())) |
return NO; |
} |
return YES; |
@@ -635,17 +673,26 @@ - (CRWSessionEntry*)lastUserEntry { |
NSInteger index = _currentNavigationIndex; |
// This will return the first session entry if all other entries are |
// redirects, regardless of the transition state of the first entry. |
- while (index > 0 && [self isRedirectTransitionForEntryAtIndex:index]) { |
+ while (index > 0 && [self isRedirectTransitionForItemAtIndex:index]) { |
--index; |
} |
return [_entries objectAtIndex:index]; |
} |
-- (void)useDesktopUserAgentForNextPendingEntry { |
+- (void)useDesktopUserAgentForNextPendingItem { |
if (_pendingEntry) |
[_pendingEntry navigationItem]->SetIsOverridingUserAgent(true); |
else |
- _useDesktopUserAgentForNextPendingEntry = YES; |
+ _useDesktopUserAgentForNextPendingItem = YES; |
+} |
+ |
+- (NSInteger)indexOfItem:(web::NavigationItem*)item { |
+ web::NavigationItemList items = self.items; |
+ for (NSInteger i = 0; i < static_cast<NSInteger>(items.size()); ++i) { |
+ if (items[i] == item) |
+ return i; |
+ } |
+ return NSNotFound; |
} |
#pragma mark - |
@@ -691,10 +738,17 @@ - (CRWSessionEntry*)sessionEntryWithURL:(const GURL&)url |
return [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item)]; |
} |
-- (BOOL)isRedirectTransitionForEntryAtIndex:(NSInteger)index { |
+- (BOOL)isRedirectTransitionForItemAtIndex:(NSInteger)index { |
ui::PageTransition transition = |
[_entries[index] navigationItem]->GetTransitionType(); |
return (transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) ? YES : NO; |
} |
+- (web::NavigationItemList)itemListForEntryList:(NSArray*)entries { |
+ web::NavigationItemList list(entries.count); |
+ for (size_t index = 0; index < entries.count; ++index) |
+ list[index] = [entries[index] navigationItem]; |
+ return list; |
+} |
+ |
@end |