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 f750667939f2435cb239960a4501e9cbc6a4ab93..a1eb080f6cac845a04d210448d4c794ab5c27147 100644 |
--- a/ios/chrome/browser/tabs/tab_model.mm |
+++ b/ios/chrome/browser/tabs/tab_model.mm |
@@ -240,6 +240,15 @@ Tab* GetOpenerForTab(id<NSFastEnumeration> tabs, Tab* tab) { |
// check that. |
- (void)insertTab:(Tab*)tab atIndex:(NSUInteger)index opener:(Tab*)parentTab; |
+// Helper method to insert |tab| at the given |index| recording |parentTab| as |
+// the opener. Broadcasts the proper notifications about the change. The |
+// receiver should be set as the parentTabModel for |tab|; this method doesn't |
+// check that. |
+- (void)insertTab:(Tab*)tab |
+ atIndex:(NSUInteger)index |
+ opener:(Tab*)parentTab |
+ transition:(ui::PageTransition)transition; |
+ |
@end |
@implementation TabModel |
@@ -551,14 +560,22 @@ Tab* GetOpenerForTab(id<NSFastEnumeration> tabs, Tab* tab) { |
return tab; |
} |
-- (void)insertTab:(Tab*)tab atIndex:(NSUInteger)index opener:(Tab*)parentTab { |
+- (void)insertTab:(Tab*)tab |
+ atIndex:(NSUInteger)index |
+ opener:(Tab*)parentTab |
+ transition:(ui::PageTransition)transition { |
DCHECK(tab); |
DCHECK(![_tabRetainer containsObject:tab]); |
- DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX)); |
[_tabRetainer addObject:tab]; |
- _webStateList.InsertWebState(static_cast<int>(index), tab.webState, |
- parentTab.webState); |
+ if (index == TabModelConstants::kTabPositionAutomatically) { |
+ _webStateList.AppendWebState(transition, tab.webState, parentTab.webState); |
+ } else { |
+ DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX)); |
+ const int insertion_index = static_cast<int>(index); |
+ _webStateList.InsertWebState(insertion_index, tab.webState, |
+ parentTab.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 |
@@ -569,7 +586,22 @@ Tab* GetOpenerForTab(id<NSFastEnumeration> tabs, Tab* tab) { |
++_newTabCount; |
} |
+- (void)insertTab:(Tab*)tab atIndex:(NSUInteger)index opener:(Tab*)parentTab { |
+ DCHECK(tab); |
+ DCHECK(![_tabRetainer containsObject:tab]); |
+ DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX)); |
+ |
+ [self insertTab:tab |
+ atIndex:index |
+ opener:parentTab |
+ transition:ui::PAGE_TRANSITION_GENERATED]; |
+} |
+ |
- (void)insertTab:(Tab*)tab atIndex:(NSUInteger)index { |
+ DCHECK(tab); |
+ DCHECK(![_tabRetainer containsObject:tab]); |
+ DCHECK_LE(index, static_cast<NSUInteger>(INT_MAX)); |
+ |
[self insertTab:tab atIndex:index opener:GetOpenerForTab(self, tab)]; |
} |
@@ -861,39 +893,10 @@ Tab* GetOpenerForTab(id<NSFastEnumeration> tabs, Tab* tab) { |
browserState:_browserState]); |
[tab webController].webUsageEnabled = webUsageEnabled_; |
- if ((PageTransitionCoreTypeIs(params.transition_type, |
- ui::PAGE_TRANSITION_LINK)) && |
- (index == TabModelConstants::kTabPositionAutomatically)) { |
- DCHECK(!parentTab || [self indexOfTab:parentTab] != NSNotFound); |
- // Assume tabs opened via link clicks are part of the same "task" as their |
- // parent and are grouped together. |
- TabModelOrderConstants::InsertionAdjacency adjacency = |
- inBackground ? TabModelOrderConstants::kAdjacentAfter |
- : TabModelOrderConstants::kAdjacentBefore; |
- index = [_orderController insertionIndexForTab:tab |
- transition:params.transition_type |
- opener:parentTab |
- adjacency:adjacency]; |
- } else { |
- // For all other types, respect what was passed to us, normalizing values |
- // that are too large. |
- if (index >= self.count) |
- index = [_orderController insertionIndexForAppending]; |
- } |
- |
- if (PageTransitionCoreTypeIs(params.transition_type, |
- ui::PAGE_TRANSITION_TYPED) && |
- index == self.count) { |
- // Also, any tab opened at the end of the TabStrip with a "TYPED" |
- // transition inherit group as well. This covers the cases where the user |
- // creates a New Tab (e.g. Ctrl+T, or clicks the New Tab button), or types |
- // in the address bar and presses Alt+Enter. This allows for opening a new |
- // Tab to quickly look up something. When this Tab is closed, the old one |
- // is re-selected, not the next-adjacent. |
- // TODO(crbug.com/661988): Make this work. |
- } |
- |
- [self insertTab:tab atIndex:index opener:parentTab]; |
+ [self insertTab:tab |
+ atIndex:index |
+ opener:parentTab |
+ transition:params.transition_type]; |
if (!inBackground && _tabUsageRecorder) |
_tabUsageRecorder->TabCreatedForSelection(tab); |
@@ -1112,7 +1115,7 @@ Tab* GetOpenerForTab(id<NSFastEnumeration> tabs, Tab* tab) { |
referrer:referrer |
windowName:windowName |
opener:nil |
- atIndex:[_orderController insertionIndexForAppending]]; |
+ atIndex:self.count]; |
} |
- (Tab*)insertTabWithURL:(const GURL&)URL |