Chromium Code Reviews| Index: ios/chrome/browser/ui/tabs/tab_strip_controller.mm |
| diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm |
| index ced59b8ddf92bb3c4f5b09453dda550999c6260b..6b089685df158385eb3d71f07a8bb0516852788f 100644 |
| --- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm |
| +++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm |
| @@ -315,9 +315,11 @@ - (CGFloat)minTabWidth; |
| // Updates the content offset of the tab strip view in order to keep the |
| // selected tab view visible. |
| -// Content offset adjustement is only needed/performed in compact mode. |
| +// Content offset adjustement is only needed/performed in compact mode or |
| +// regular mode for newly opened tabs. |
| // This method must be called with a valid |tabIndex|. |
| -- (void)updateContentOffsetForTabIndex:(NSUInteger)tabIndex; |
| +- (void)updateContentOffsetForTabIndex:(NSUInteger)tabIndex |
| + isNewTab:(BOOL)isNewTab; |
| // Update the frame of the tab strip view (scrollview) frame, content inset and |
| // toggle buttons states depending on the current layout mode. |
| @@ -639,7 +641,7 @@ - (void)tabTapped:(id)sender { |
| [currentTab updateSnapshotWithOverlay:YES visibleFrameOnly:YES]; |
| } |
| [_tabModel setCurrentTab:tappedTab]; |
| - [self updateContentOffsetForTabIndex:index]; |
| + [self updateContentOffsetForTabIndex:index isNewTab:NO]; |
| } |
| - (void)closeTab:(id)sender { |
| @@ -943,7 +945,7 @@ - (void)tabModel:(TabModel*)model |
| [self updateContentSizeAndRepositionViews]; |
| [self setNeedsLayoutWithAnimation]; |
| - [self updateContentOffsetForTabIndex:modelIndex]; |
| + [self updateContentOffsetForTabIndex:modelIndex isNewTab:YES]; |
| } |
| // Observer method. |
| @@ -1250,9 +1252,39 @@ - (CGFloat)minTabWidth { |
| return IsCompactTablet() ? kMinTabWidthForCompactLayout : kMinTabWidth; |
| } |
| -- (void)updateContentOffsetForTabIndex:(NSUInteger)tabIndex { |
| +- (void)updateContentOffsetForTabIndex:(NSUInteger)tabIndex |
| + isNewTab:(BOOL)isNewTab { |
| DCHECK_NE(NSNotFound, static_cast<NSInteger>(tabIndex)); |
| + if (experimental_flags::IsTabStripAutoScrollNewTabsEnabled() && isNewTab) { |
| + // The following code calculates the amount of scroll amount needed to make |
|
rohitrao (ping after 24h)
2017/01/06 23:46:54
Typo: "amount" appears twice.
|
| + // |tabIndex| visible in the "virtual" coordinate system, where root is x=0 |
| + // and it contains all the tabs laid out as if the tabstrip was infinitely |
| + // long. The amount of scroll is calculated as a desired length that it is |
| + // just large enough to contain all the tabs to the left of |tabIndex|, with |
| + // the standard overlap. |
| + NSUInteger numNonClosingTabsToLeft = 0; |
|
rohitrao (ping after 24h)
2017/01/06 23:46:54
Much clearer, thank you.
liaoyuke
2017/01/06 23:55:01
Acknowledged.
|
| + NSUInteger i = 0; |
| + for (TabView* tab in _tabArray.get()) { |
| + if ([_closingTabs containsObject:tab]) |
| + ++i; |
| + |
| + if (i == tabIndex) |
| + break; |
| + |
| + ++numNonClosingTabsToLeft; |
| + ++i; |
| + } |
| + |
| + const CGFloat tabHeight = CGRectGetHeight([_tabStripView bounds]); |
| + CGRect scrollRect = |
| + CGRectMake(_currentTabWidth * numNonClosingTabsToLeft - |
| + ([self tabOverlap] * (numNonClosingTabsToLeft - 1)), |
| + 0, _currentTabWidth, tabHeight); |
| + [_tabStripView scrollRectToVisible:scrollRect animated:YES]; |
| + return; |
| + } |
| + |
| if (IsCompactTablet()) { |
| if (tabIndex == [_tabArray count] - 1) { |
| const CGFloat tabStripAvailableSpace = |
| @@ -1603,7 +1635,7 @@ - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
| [self updateContentSizeAndRepositionViews]; |
| NSUInteger selectedModelIndex = [_tabModel indexOfTab:[_tabModel currentTab]]; |
| if (selectedModelIndex != NSNotFound) { |
| - [self updateContentOffsetForTabIndex:selectedModelIndex]; |
| + [self updateContentOffsetForTabIndex:selectedModelIndex isNewTab:NO]; |
| } |
| } |