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

Unified Diff: ios/chrome/browser/tabs/tab_model.mm

Issue 2697193004: Add opener-opened relationship between WebState in WebStateList. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/tabs/tab_model.mm
diff --git a/ios/chrome/browser/tabs/tab_model.mm b/ios/chrome/browser/tabs/tab_model.mm
index f6d21cd57f9bf2b3a05480a80a23ed05b96dfe48..0a768fe2456f01e21323d0f9070d0dc0c3ffecbd 100644
--- a/ios/chrome/browser/tabs/tab_model.mm
+++ b/ios/chrome/browser/tabs/tab_model.mm
@@ -117,6 +117,27 @@ void CleanCertificatePolicyCache(
base::Unretained(web_state_list)));
}
+// Internal helper function returning the opener for a given WebState by
+// checking the associated Tab tabId (should be removed once the opener
+// is passed to the insertTab:atIndex: and replaceTab:withTab: methods).
+web::WebState* GetOpenerForWebState(const WebStateList& web_state_list,
+ web::WebState* web_state) {
+ Tab* tab = LegacyTabHelper::GetTabForWebState(web_state);
+ NSString* opener_id =
+ [tab navigationManager]->GetSessionController().openerId;
+ if (!opener_id)
+ return nullptr;
+
+ for (int index = 0; index < web_state_list.count(); ++index) {
+ web::WebState* web_state = web_state_list.GetWebStateAt(index);
+ Tab* tab = LegacyTabHelper::GetTabForWebState(web_state);
+ if ([opener_id isEqualToString:tab.tabId])
+ return web_state;
+ }
+
+ return nullptr;
+}
+
} // anonymous namespace
@interface TabModelWebStateProxyFactory : NSObject<WebStateProxyFactory>
@@ -405,68 +426,43 @@ void CleanCertificatePolicyCache(
}
- (Tab*)nextTabWithOpener:(Tab*)tab afterTab:(Tab*)afterTab {
- NSUInteger startIndex = NSNotFound;
- // Start looking after |afterTab|. If it's not found, start looking after
- // |tab|. If it's not found either, bail.
+ int startIndex = WebStateList::kInvalidIndex;
if (afterTab)
- startIndex = [self indexOfTab:afterTab];
- if (startIndex == NSNotFound)
- startIndex = [self indexOfTab:tab];
- if (startIndex == NSNotFound)
+ startIndex = _webStateList.GetIndexOfWebState(afterTab.webState);
+
+ if (startIndex == WebStateList::kInvalidIndex)
+ startIndex = _webStateList.GetIndexOfWebState(tab.webState);
+
+ const int index = _webStateList.GetIndexOfNextWebStateOpenedBy(
+ tab.webState, startIndex, false);
+ if (index == WebStateList::kInvalidIndex)
return nil;
- NSString* parentID = tab.tabId;
- for (NSUInteger i = startIndex + 1; i < self.count; ++i) {
- Tab* current = [self tabAtIndex:i];
- DCHECK([current navigationManager]);
- CRWSessionController* sessionController =
- [current navigationManager]->GetSessionController();
- if ([sessionController.openerId isEqualToString:parentID])
- return current;
- }
- return nil;
+
+ DCHECK_GE(index, 0);
+ return [self tabAtIndex:static_cast<NSUInteger>(index)];
}
- (Tab*)lastTabWithOpener:(Tab*)tab {
- NSUInteger startIndex = [self indexOfTab:tab];
- if (startIndex == NSNotFound)
+ int startIndex = _webStateList.GetIndexOfWebState(tab.webState);
+ if (startIndex == WebStateList::kInvalidIndex)
return nil;
- // There is at least one tab in the model, because otherwise the above check
- // would have returned.
- NSString* parentID = tab.tabId;
- DCHECK([tab navigationManager]);
- NSInteger parentNavIndex = [tab navigationManager]->GetCurrentItemIndex();
-
- Tab* match = nil;
- // Find the last tab in the first matching 'group'. A 'group' is a set of
- // tabs whose opener's id and opener's navigation index match. The navigation
- // index is used in addition to the session id to detect navigations changes
- // within the same session.
- for (NSUInteger i = startIndex + 1; i < self.count; ++i) {
- Tab* tabToCheck = [self tabAtIndex:i];
- DCHECK([tabToCheck navigationManager]);
- CRWSessionController* sessionController =
- [tabToCheck navigationManager]->GetSessionController();
- if ([sessionController.openerId isEqualToString:parentID] &&
- sessionController.openerNavigationIndex == parentNavIndex) {
- match = tabToCheck;
- } else if (match) {
- break;
- }
- }
- return match;
+
+ const int index = _webStateList.GetIndexOfLastWebStateOpenedBy(
+ tab.webState, startIndex, true);
+ if (index == WebStateList::kInvalidIndex)
+ return nil;
+
+ DCHECK_GE(index, 0);
+ return [self tabAtIndex:static_cast<NSUInteger>(index)];
}
- (Tab*)openerOfTab:(Tab*)tab {
- if (![tab navigationManager])
- return nil;
- NSString* openerId = [tab navigationManager]->GetSessionController().openerId;
- if (!openerId.length) // Short-circuit if opener is empty.
+ int index = _webStateList.GetIndexOfWebState(tab.webState);
+ if (index == WebStateList::kInvalidIndex)
return nil;
- for (Tab* iteratedTab in self) {
- if ([iteratedTab.tabId isEqualToString:openerId])
- return iteratedTab;
- }
- return nil;
+
+ web::WebState* opener = _webStateList.GetOpenerOfWebStateAt(index);
+ return opener ? LegacyTabHelper::GetTabForWebState(opener) : nil;
}
- (Tab*)insertOrUpdateTabWithURL:(const GURL&)URL
@@ -559,7 +555,9 @@ void CleanCertificatePolicyCache(
DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX));
[_tabRetainer addObject:tab];
- _webStateList.InsertWebState(static_cast<int>(index), tab.webState);
+ _webStateList.InsertWebState(
+ static_cast<int>(index), tab.webState,
+ GetOpenerForWebState(_webStateList, tab.webState));
// Persist the session due to a new tab being inserted. If this is a
// background tab (will not become active), saving now will capture the
@@ -590,7 +588,9 @@ void CleanCertificatePolicyCache(
[_tabRetainer addObject:newTab];
[newTab setParentTabModel:self];
- _webStateList.ReplaceWebStateAt(index, newTab.webState);
+ _webStateList.ReplaceWebStateAt(
+ index, newTab.webState,
+ GetOpenerForWebState(_webStateList, newTab.webState));
if (self.currentTab == oldTab)
[self changeSelectedTabFrom:nil to:newTab persistState:NO];
« no previous file with comments | « no previous file | ios/shared/chrome/browser/tabs/web_state_list.h » ('j') | ios/shared/chrome/browser/tabs/web_state_list.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698