diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java index 2158a5c3440f8..48e42f4bca2ba 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingControllerTest.java @@ -1182,7 +1182,7 @@ private Tab addBrowserTab(ManualFillingMediator mediator, int id, @Nullable Tab when(mMockTabModelSelector.getCurrentTab()).thenReturn(tab); mActivityTabProvider.set(tab); mediator.getTabModelObserverForTesting().didAddTab( - tab, FROM_BROWSER_ACTIONS, TabCreationState.LIVE_IN_FOREGROUND); + tab, FROM_BROWSER_ACTIONS, TabCreationState.LIVE_IN_FOREGROUND, false); mediator.getTabObserverForTesting().onShown(tab, FROM_NEW); mediator.getTabModelObserverForTesting().didSelectTab(tab, FROM_NEW, lastId); setContentAreaDimensions(2.f, 300, 128); diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java index dcc3edfcb77f5..ebea916076ac9 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java @@ -166,8 +166,8 @@ interface AnimationSourceViewProvider { // Register for tab model. mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (!mTabModelSelector.isTabStateInitialized()) { return; } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java index 59e8c3bf6c290..d972e414bcaf0 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java @@ -165,7 +165,8 @@ public void willCloseTab(Tab tab, boolean animate, boolean didCloseAlone) { } @Override - public void didAddTab(Tab tab, int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, int type, @TabCreationState int creationState, + boolean markedForSelection) { if (type == TabLaunchType.FROM_CHROME_UI || type == TabLaunchType.FROM_RESTORE || type == TabLaunchType.FROM_STARTUP) { return; diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index a909f2493e876..5ec1a158e1915 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java @@ -113,6 +113,7 @@ class TabListMediator { // screen. private boolean mVisible; private boolean mShownIPH; + private Tab mTabToAddDelayed; /** * An interface to get the thumbnails to be shown inside the tab grid cards. @@ -581,15 +582,6 @@ public void didSelectTab(Tab tab, int type, int lastId) { if (tab.getId() == lastId) return; int oldIndex = mModel.indexFromId(lastId); - mLastSelectedTabListModelIndex = oldIndex; - if (oldIndex != TabModel.INVALID_TAB_INDEX) { - mModel.get(oldIndex).model.set(TabProperties.IS_SELECTED, false); - if (mActionsOnAllRelatedTabs && mThumbnailProvider != null && mVisible) { - mModel.get(oldIndex).model.set(TabProperties.THUMBNAIL_FETCHER, - new ThumbnailFetcher(mThumbnailProvider, lastId, true, false)); - } - } - int newIndex = mModel.indexFromId(tab.getId()); if (newIndex == TabModel.INVALID_TAB_INDEX && mActionsOnAllRelatedTabs && type == TabSelectionType.FROM_UNDO) { @@ -598,12 +590,13 @@ public void didSelectTab(Tab tab, int type, int lastId) { // the related ids are present in model. newIndex = getIndexForTabWithRelatedTabs(tab); } - if (newIndex == TabModel.INVALID_TAB_INDEX) return; - mModel.get(newIndex).model.set(TabProperties.IS_SELECTED, true); - if (mThumbnailProvider != null && mVisible) { - mModel.get(newIndex).model.set(TabProperties.THUMBNAIL_FETCHER, - new ThumbnailFetcher(mThumbnailProvider, tab.getId(), true, false)); + + mLastSelectedTabListModelIndex = oldIndex; + if (mTabToAddDelayed != null && mTabToAddDelayed == tab) { + // If tab is being added later, it will be selected later. + return; } + selectTab(oldIndex, newIndex); } @Override @@ -651,9 +644,16 @@ public void tabClosureUndone(Tab tab) { } @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (!mTabModelSelector.isTabStateInitialized()) return; + // Check if we need to delay tab addition to model. + boolean delayAdd = + (type == TabLaunchType.FROM_TAB_SWITCHER_UI) && markedForSelection; + if (delayAdd) { + mTabToAddDelayed = tab; + return; + } onTabAdded(tab, !mActionsOnAllRelatedTabs); if (type == TabLaunchType.FROM_RESTORE && mActionsOnAllRelatedTabs) { // When tab is restored after restoring stage (e.g. exiting multi-window mode, @@ -786,6 +786,26 @@ public void onItemMoved(ListObservable source, int curIndex, int newIndex) { } } + private void selectTab(int oldIndex, int newIndex) { + if (oldIndex != TabModel.INVALID_TAB_INDEX) { + int lastId = mModel.get(oldIndex).model.get(TAB_ID); + mModel.get(oldIndex).model.set(TabProperties.IS_SELECTED, false); + if (mActionsOnAllRelatedTabs && mThumbnailProvider != null && mVisible) { + mModel.get(oldIndex).model.set(TabProperties.THUMBNAIL_FETCHER, + new ThumbnailFetcher(mThumbnailProvider, lastId, true, false)); + } + } + + if (newIndex != TabModel.INVALID_TAB_INDEX) { + int newId = mModel.get(newIndex).model.get(TAB_ID); + mModel.get(newIndex).model.set(TabProperties.IS_SELECTED, true); + if (mThumbnailProvider != null && mVisible) { + mModel.get(newIndex).model.set(TabProperties.THUMBNAIL_FETCHER, + new ThumbnailFetcher(mThumbnailProvider, newId, true, false)); + } + } + } + public void initWithNative(Profile profile) { mTabListFaviconProvider.initWithNative(profile); mTabModelSelector.getTabModelFilterProvider().addTabModelFilterObserver(mTabModelObserver); @@ -1121,11 +1141,12 @@ private int getIndexOfTab(Tab tab, boolean onlyShowRelatedTabs) { return index; } - private void onTabAdded(Tab tab, boolean onlyShowRelatedTabs) { + private int onTabAdded(Tab tab, boolean onlyShowRelatedTabs) { int index = getIndexOfTab(tab, onlyShowRelatedTabs); - if (index == TabList.INVALID_TAB_INDEX) return; + if (index == TabList.INVALID_TAB_INDEX) return index; addTabInfoToModel(PseudoTab.fromTab(tab), index, mTabModelSelector.getCurrentTab() == tab); + return index; } private void onTabMoved(int newIndex, int curIndex) { @@ -1246,6 +1267,12 @@ private void addViewedTabId(int tabIndex) { void postHiding() { mVisible = false; unregisterOnScrolledListener(); + // if tab was marked for add later, add to model and mark as selected. + if (mTabToAddDelayed != null) { + int index = onTabAdded(mTabToAddDelayed, !mActionsOnAllRelatedTabs); + selectTab(mLastSelectedTabListModelIndex, index); + mTabToAddDelayed = null; + } } private boolean isSelectedTab(PseudoTab tab, int tabModelSelectedTabId) { diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java index 0e388a651026a..a9585c3c65db9 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java @@ -119,7 +119,8 @@ public void onClick(View v) { mTabModelObserver = new TabModelSelectorTabModelObserver(mTabModelSelector) { @Override - public void didAddTab(Tab tab, int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, int type, @TabCreationState int creationState, + boolean markedForSelection) { if (!mTabModelSelector.isTabStateInitialized()) return; // When tab is added due to multi-window close or moving between multiple windows, // force hiding the selection editor. diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index c307c5d84f3d4..e728f760af303 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java @@ -327,7 +327,8 @@ public void onTabModelSelected(TabModel newModel, TabModel oldModel) { mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab(Tab tab, int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, int type, @TabCreationState int creationState, + boolean markedForSelection) { // TODO(wychen): move didAddTab and didSelectTab to another observer and inject // after restoreCompleted. if (!mTabModelSelector.isTabStateInitialized()) { diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java index b291905049ec0..7d7e59012ba60 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java @@ -97,8 +97,8 @@ public void onTabModelSelected(TabModel newModel, TabModel oldModel) { mTabModelSelectorTabModelObserver = new TabModelSelectorTabModelObserver(mTabModelSelector) { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { mSnackbarManager.dismissSnackbars(UndoGroupSnackbarController.this); } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserver.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserver.java index a283f8a9e9f5a..5d422c9d963ff 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserver.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserver.java @@ -33,7 +33,8 @@ public void didFirstVisuallyNonEmptyPaint(Tab tab) { mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab(Tab tab, int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, int type, @TabCreationState int creationState, + boolean markedForSelection) { onTabContextChanged(TabContextChangeReason.TAB_ADDED); } diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java index 78ec6d6d4ea83..f0f5f21f4ff55 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java @@ -471,7 +471,7 @@ public void tabAddition() { doReturn(true).when(mTabModelSelector).isTabStateInitialized(); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.get(TabGridPanelProperties.ANIMATION_SOURCE_VIEW), equalTo(null)); verify(mDialogController).resetWithListOfTabs(null); diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java index 8a6b3d25538bc..1c4927d836873 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java @@ -533,9 +533,9 @@ public void tabAddition_SingleTab() { doReturn(tabs).when(mTabGroupModelFilter).getRelatedTabList(TAB4_ID); mTabModelObserverArgumentCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); mTabModelObserverArgumentCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE); + newTab, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE, false); // Strip should be not be reset when adding a single new tab. verifyNeverReset(); @@ -552,7 +552,8 @@ public void tabAddition_SingleTab_Refresh_WithAutoGroupCreation() { doReturn(tabs).when(mTabGroupModelFilter).getRelatedTabList(TAB4_ID); mTabModelObserverArgumentCaptor.getValue().didAddTab(newTab, - TabLaunchType.FROM_LONGPRESS_BACKGROUND, TabCreationState.LIVE_IN_FOREGROUND); + TabLaunchType.FROM_LONGPRESS_BACKGROUND, TabCreationState.LIVE_IN_FOREGROUND, + false); // Strip should be be reset when long pressing a link and add a tab into group. verifyResetStrip(true, tabs); @@ -570,7 +571,7 @@ public void tabAddition_SingleTab_Refresh_WithoutAutoGroupCreation() { mTabModelObserverArgumentCaptor.getValue().didAddTab(newTab, TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP, - TabCreationState.LIVE_IN_FOREGROUND); + TabCreationState.LIVE_IN_FOREGROUND, false); // Strip should be be reset when long pressing a link and add a tab into group. verifyResetStrip(true, tabs); @@ -589,11 +590,12 @@ public void tabAddition_TabGroup_NoRefresh() { doReturn(mTabGroup1).when(mTabGroupModelFilter).getRelatedTabList(TAB4_ID); mTabModelObserverArgumentCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); mTabModelObserverArgumentCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE); + newTab, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE, false); mTabModelObserverArgumentCaptor.getValue().didAddTab(newTab, - TabLaunchType.FROM_LONGPRESS_BACKGROUND, TabCreationState.LIVE_IN_FOREGROUND); + TabLaunchType.FROM_LONGPRESS_BACKGROUND, TabCreationState.LIVE_IN_FOREGROUND, + false); // Strip should be not be reset through these two types of launching. verifyNeverReset(); @@ -609,8 +611,8 @@ public void tabAddition_TabGroup_ScrollToTheLast() { mTabGroup2.add(newTab); doReturn(mTabGroup2).when(mTabGroupModelFilter).getRelatedTabList(TAB4_ID); - mTabModelObserverArgumentCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_TAB_GROUP_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTabModelObserverArgumentCaptor.getValue().didAddTab(newTab, + TabLaunchType.FROM_TAB_GROUP_UI, TabCreationState.LIVE_IN_FOREGROUND, false); // Strip should be not be reset through adding tab from UI. verifyNeverReset(); diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index 935be18788888..1cd5f4e3475c8 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java @@ -620,7 +620,7 @@ public void updatesFavicon_Navigation_NoOpNtpUrl() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(3)); assertThat(mModel.get(2).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID)); @@ -897,7 +897,7 @@ public void tabAddition_RestoreNotComplete() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND, false); // When tab restoring stage is not yet finished, this tab info should not be added to // property model. @@ -925,7 +925,7 @@ public void tabAddition_Restore() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND, false); TabListMediator.TabActionListener actionListenerAfterUpdate = mModel.get(1).model.get(TabProperties.TAB_SELECTED_LISTENER); @@ -952,11 +952,11 @@ public void tabAddition_Restore_SyncingTabListModelWithTabModel() { mModel.clear(); mMediatorTabModelObserver.didAddTab( - mTab2, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND); + mTab2, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(0)); mMediatorTabModelObserver.didAddTab( - mTab1, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND); + mTab1, TabLaunchType.FROM_RESTORE, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(1)); } @@ -975,7 +975,7 @@ public void tabAddition_GTS() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(3)); assertThat(mModel.get(2).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID)); @@ -997,7 +997,7 @@ public void tabAddition_GTS_Skip() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(2)); } @@ -1017,7 +1017,7 @@ public void tabAddition_GTS_Middle() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(3)); assertThat(mModel.get(1).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID)); @@ -1037,7 +1037,7 @@ public void tabAddition_Dialog_End() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(3)); assertThat(mModel.get(2).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID)); @@ -1057,7 +1057,7 @@ public void tabAddition_Dialog_Middle() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(3)); assertThat(mModel.get(1).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID)); @@ -1075,7 +1075,7 @@ public void tabAddition_Dialog_Skip() { assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( - newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + newTab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(2)); } @@ -1091,7 +1091,7 @@ public void tabAddition_Redundant() { // Try to do a redundant addition by adding the PropertyModel of an existing tab to the // TabListModel. mTabModelObserverCaptor.getValue().didAddTab( - mTab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); assertThat(mModel.size(), equalTo(2)); } diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserverTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserverTest.java index f5b033876588b..dde10427dd4a6 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserverTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserverTest.java @@ -78,7 +78,7 @@ public void testAddTab() { TabContextObserverTestHelper tabContextObserverTestHelper = new TabContextObserverTestHelper(mTabModelSelector); tabContextObserverTestHelper.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(TabContextObserver.TabContextChangeReason.TAB_ADDED, tabContextObserverTestHelper.getChangeReason()); } diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java index d31626b130867..1cea55a54dc33 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java @@ -132,7 +132,7 @@ public void onTabSuggestionInvalidated() {} }; tabSuggestionsOrchestrator.addObserver(tabSuggestionsObserver); tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(1, suggestions.size()); Assert.assertEquals(TAB_IDS.length, suggestions.get(0).getTabsInfo().size()); for (int idx = 0; idx < TAB_IDS.length; idx++) { @@ -172,7 +172,7 @@ public void onNewSuggestion(List tabSuggestions, public void onTabSuggestionInvalidated() {} }; tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(0, suggestions.size()); } @@ -200,7 +200,7 @@ public void onTabSuggestionInvalidated() {} tabSuggestionsOrchestrator.addObserver(tabSuggestionsObserver); tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertNotNull(tabSuggestionsOrchestrator.mTabSuggestionFeedback); Assert.assertEquals(tabSuggestionsOrchestrator.mTabSuggestionFeedback.tabSuggestionResponse, TabSuggestionFeedback.TabSuggestionResponse.ACCEPTED); @@ -271,11 +271,11 @@ public void onTabSuggestionInvalidated() {} tabSuggestionsOrchestrator.setFetchersForTesting(); tabSuggestionsOrchestrator.addObserver(tabSuggestionsObserver); tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(1, suggestions.size()); suggestions.clear(); tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( - null, 0, TabCreationState.LIVE_IN_FOREGROUND); + null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(expectedSuggestions, suggestions.size()); tabSuggestionsOrchestrator.restoreMinTimeBetweenPrefetchesForTesting(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 0e962e9dbbee5..be226e4932fa9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java @@ -648,8 +648,8 @@ private void closeIfNoTabsAndHomepageEnabled(boolean isPendingClosure) { } @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (type == TabLaunchType.FROM_LONGPRESS_BACKGROUND || type == TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP || type == TabLaunchType.FROM_RECENT_TABS @@ -834,7 +834,11 @@ private void initializeToolbarManager() { getTabModelSelector().getModel(false).commitAllTabClosures(); // This assumes that the keyboard can not be seen at the same time as the // newtab button on the toolbar. - getCurrentTabCreator().launchNTP(); + int tabLaunchType = + (getLayoutManager().getActiveLayoutType() == LayoutType.TAB_SWITCHER) + ? TabLaunchType.FROM_TAB_SWITCHER_UI + : TabLaunchType.FROM_CHROME_UI; + getCurrentTabCreator().launchNTP(tabLaunchType); mLocaleManager.showSearchEnginePromoIfNeeded(ChromeTabbedActivity.this, null); if (getTabModelSelector().isIncognitoSelected()) { RecordUserAction.record("MobileToolbarStackViewNewIncognitoTab"); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java index 6a036e73d9b93..214df53027c5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java @@ -120,7 +120,8 @@ public void onTabStateInitialized() { mTabModelSelectorTabModelObserver = new TabModelSelectorTabModelObserver(mModelSelector) { @Override - public void didAddTab(Tab tab, int type, int creationState) { + public void didAddTab( + Tab tab, int type, int creationState, boolean markedForSelection) { mNewlyAddedTabCount++; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 62c7663c09e1b..1d1cb3bb51a9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java @@ -207,8 +207,8 @@ public void willAddTab(Tab tab, @TabLaunchType int type) { } @Override - public void didAddTab( - Tab tab, @TabLaunchType int launchType, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int launchType, + @TabCreationState int creationState, boolean markedForSelection) { int tabId = tab.getId(); if (launchType == TabLaunchType.FROM_RESTORE) { getActiveLayout().onTabRestored(time(), tabId); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index 05ca5ac5768b9..19032ea28b1ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java @@ -566,8 +566,8 @@ public void setTabModelSelector(TabModelSelector modelSelector, mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int launchType, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int launchType, + @TabCreationState int creationState, boolean markedForSelection) { updateTitleForTab(tab); } }; @@ -664,7 +664,8 @@ public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) { } @Override - public void didAddTab(Tab tab, int type, int creationState) { + public void didAddTab( + Tab tab, int type, int creationState, boolean markedForSelection) { boolean selected = type != TabLaunchType.FROM_LONGPRESS_BACKGROUND || (mTabModelSelector.isIncognitoSelected() && tab.isIncognito()); boolean onStartup = type == TabLaunchType.FROM_RESTORE; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 73c542a4315f3..e0fde2d88380f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java @@ -605,8 +605,8 @@ public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) { } @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { // If we're in the process of promoting this tab, just return and don't mess with // this state. if (tab.getWebContents() == getSearchPanelWebContents()) return; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java index b245da68cdb01..bea2b68f2a154 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java @@ -133,7 +133,8 @@ public TabObserverRegistrar(ActivityLifecycleDispatcher lifecycleDispatcher, } @Override - public void didAddTab(Tab tab, int type, @TabCreationState int creationState) { + public void didAddTab( + Tab tab, int type, @TabCreationState int creationState, boolean markedForSelection) { addObserversForTab(tab); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java index 74dd333431ced..83aac08a86958 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java @@ -301,7 +301,8 @@ public void didSelectTab(Tab tab, int type, int lastId) { } @Override - public void didAddTab(Tab tab, int type, int creationState) { + public void didAddTab( + Tab tab, int type, int creationState, boolean markedForSelection) { writeTabCount(mInstanceId, selector); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java index d1acebe0b5a2c..2ea177b54cb28 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java @@ -806,8 +806,8 @@ public RecentTabTracker(TabModelSelector selector) { } @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, @TabCreationState int creationState, + boolean markedForSelection) { tab.addObserver(sTabRestoreTracker); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index d02a284ad7814..fcd7a43635e1c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java @@ -134,6 +134,8 @@ private static String tabLaunchTypeToHistogramKey(@TabLaunchType Integer tabLaun return "RecentTabs"; case TabLaunchType.FROM_READING_LIST: return "ReadingList"; + case TabLaunchType.FROM_TAB_SWITCHER_UI: + return "TabSwitcherUI"; default: assert false : "Unexpected serialization of tabLaunchType: " + tabLaunchType; return "TypeUnknown"; @@ -512,6 +514,7 @@ private int getTransitionType(@TabLaunchType int tabLaunchType, Intent intent, transition = PageTransition.LINK | PageTransition.FROM_API; break; case TabLaunchType.FROM_CHROME_UI: + case TabLaunchType.FROM_TAB_SWITCHER_UI: case TabLaunchType.FROM_TAB_GROUP_UI: case TabLaunchType.FROM_STARTUP: case TabLaunchType.FROM_LAUNCHER_SHORTCUT: diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index 075401fbb3074..86b2bcd19ed2f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java @@ -250,7 +250,9 @@ public void addTab( int newIndex = indexOf(tab); tabAddedToModel(tab); - for (TabModelObserver obs : mObservers) obs.didAddTab(tab, type, creationState); + for (TabModelObserver obs : mObservers) { + obs.didAddTab(tab, type, creationState, selectTab); + } // setIndex takes care of making sure the appropriate model is active. if (selectTab) setIndex(newIndex, TabSelectionType.FROM_NEW, false); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java index f8a1f90adb6aa..94da3c6e55ce5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java @@ -75,8 +75,8 @@ public final void willAddTab(Tab tab, @TabLaunchType int type) { } @Override - public final void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public final void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { assert mNativeTabModelObserverJniBridge != 0; TabModelObserverJniBridgeJni.get().didAddTab( mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab, type); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java index 6cd242050c3ad..4d48b97ead0f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java @@ -72,8 +72,8 @@ protected final void initialize(TabModel normalModel, IncognitoTabModel incognit TabModelObserver tabModelObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { notifyChanged(); notifyNewTabCreated(tab, creationState); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java index 73ea007521eef..c8b194756d5bf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java @@ -75,8 +75,8 @@ public EmptyBackgroundViewWrapper(TabModelSelector selector, TabCreator tabCreat mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { updateEmptyContainerState(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java index 2b95793c78f63..d09c69cf1152a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButtonTablet.java @@ -70,8 +70,8 @@ public void setTabModelSelector(TabModelSelector selector) { mTabModelObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { updateButtonVisibility(); } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java index 3e1cc15a4de40..3e201b6e6a998 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java @@ -801,8 +801,8 @@ public void testCreateNewTab() throws Exception { TestThreadUtils.runOnUiThreadBlocking(() -> { tabSelector.getModel(false).addObserver(new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { openTabHelper.notifyCalled(); } }); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java index 4bc7d56b65cd6..ec4ede0596917 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java @@ -163,16 +163,15 @@ public void resourceFilteredClickLearnMore_InfobarUI() throws Exception { Tab originalTab = mActivityTestRule.getActivity().getActivityTab(); CallbackHelper tabCreatedCallback = new CallbackHelper(); TabModel tabModel = mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); - TestThreadUtils.runOnUiThreadBlocking( - () -> tabModel.addObserver(new TabModelObserver() { - @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { - if (tab.getUrl().getSpec().equals(LEARN_MORE_PAGE)) { - tabCreatedCallback.notifyCalled(); - } - } - })); + TestThreadUtils.runOnUiThreadBlocking(() -> tabModel.addObserver(new TabModelObserver() { + @Override + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { + if (tab.getUrl().getSpec().equals(LEARN_MORE_PAGE)) { + tabCreatedCallback.notifyCalled(); + } + } + })); // Check that the infobar is showing. List infoBars = mActivityTestRule.getInfoBars(); @@ -279,8 +278,8 @@ private void testResourceFilteredClickLearnMore_MessagesUIFlow() TabModel tabModel = mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); TestThreadUtils.runOnUiThreadBlocking(() -> tabModel.addObserver(new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (tab.getUrl().getSpec().equals(LEARN_MORE_PAGE)) { tabCreatedCallback.notifyCalled(); } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java index e67850f21c940..f43038b5162f5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java @@ -686,10 +686,11 @@ public void testFlatBufferValuesUnchanged() { Assert.assertEquals(16, LaunchTypeAtCreation.FROM_LONGPRESS_INCOGNITO); Assert.assertEquals(17, LaunchTypeAtCreation.FROM_RECENT_TABS); Assert.assertEquals(18, LaunchTypeAtCreation.FROM_READING_LIST); + Assert.assertEquals(19, LaunchTypeAtCreation.FROM_TAB_SWITCHER_UI); Assert.assertEquals( "Need to increment 1 to expected value each time a LaunchTypeAtCreation " + "is added. Also need to add any new LaunchTypeAtCreation to this test.", - 21, LaunchTypeAtCreation.names.length); + 22, LaunchTypeAtCreation.names.length); } @SmallTest diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java index 8d9f5a259dc75..cee1466596e69 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java @@ -120,7 +120,8 @@ public void tabRemoved(Tab tab) { } @Override - public void didAddTab(Tab tab, int type, int creationState) { + public void didAddTab( + Tab tab, int type, int creationState, boolean markedForSelection) { didAddTabCallbackHelper.notifyCalled(); } }); diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabUsageTrackerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabUsageTrackerTest.java index 686a4c27be5eb..249b0b2e48b88 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabUsageTrackerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabUsageTrackerTest.java @@ -83,8 +83,10 @@ public void testOnStop_RecordsHistogram_NoInitialTabs() { // Act: Create 2 tabs, select 1 tab and call onStop. TabModelSelectorTabModelObserver observer = mTabUsageTracker.getTabModelSelectorTabModelObserverForTests(); - observer.didAddTab(tab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); - observer.didAddTab(tab2, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + observer.didAddTab( + tab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); + observer.didAddTab( + tab2, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); observer.didSelectTab(tab1, TabLaunchType.FROM_CHROME_UI, 0); mTabUsageTracker.onStopWithNative(); @@ -110,7 +112,8 @@ public void testOnStop_RecordsHistogram_HasInitialTabs() { // Act: Create 1 tab, select 1 tab and call onStop. TabModelSelectorTabModelObserver observer = mTabUsageTracker.getTabModelSelectorTabModelObserverForTests(); - observer.didAddTab(tab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + observer.didAddTab( + tab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); observer.didSelectTab(tab1, TabLaunchType.FROM_CHROME_UI, 3); mTabUsageTracker.onStopWithNative(); diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java index 8d780022fe0cb..5c85bd5de0351 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java @@ -607,7 +607,7 @@ private void triggerAddTab(TabModelObserver tabModelObserver, Tab tab) { } else { mNormalTabCount++; } - tabModelObserver.didAddTab(tab, 0, 0); + tabModelObserver.didAddTab(tab, 0, 0, false); } private void triggerOnFinishingTabClosure(TabModelObserver tabModelObserver, Tab tab) { diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index f2ae3e706efac..620e47e097ad1 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java @@ -310,6 +310,7 @@ public static boolean getFieldTrialParamByFeatureAsBoolean( public static final String FEED_LOADING_PLACEHOLDER = "FeedLoadingPlaceholder"; public static final String FEED_MULTI_COLUMN = "DiscoverFeedMultiColumn"; public static final String FEED_NO_VIEW_CACHE = "FeedNoViewCache"; + public static final String FEED_INTERACTIVE_REFRESH = "FeedInteractiveRefresh"; public static final String FEED_PERFORMANCE_STUDY = "FeedPerformanceStudy"; public static final String FEED_POSITION_ANDROID = "FeedPositionAndroid"; public static final String FEED_SHOW_SIGN_IN_COMMAND = "FeedShowSignInCommand"; diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java index 1724fb3927c04..7069a2ea9d4a2 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java @@ -346,6 +346,8 @@ public String getUmaTag() { return TabLaunchType.FROM_START_SURFACE; case LaunchTypeAtCreation.FROM_TAB_GROUP_UI: return TabLaunchType.FROM_TAB_GROUP_UI; + case LaunchTypeAtCreation.FROM_TAB_SWITCHER_UI: + return TabLaunchType.FROM_TAB_SWITCHER_UI; case LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND_IN_GROUP: return TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP; case LaunchTypeAtCreation.FROM_APP_WIDGET: @@ -402,6 +404,8 @@ static int getLaunchType(@Nullable @TabLaunchType Integer tabLaunchType) { return LaunchTypeAtCreation.FROM_START_SURFACE; case TabLaunchType.FROM_TAB_GROUP_UI: return LaunchTypeAtCreation.FROM_TAB_GROUP_UI; + case TabLaunchType.FROM_TAB_SWITCHER_UI: + return LaunchTypeAtCreation.FROM_TAB_SWITCHER_UI; case TabLaunchType.FROM_LONGPRESS_BACKGROUND_IN_GROUP: return LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND_IN_GROUP; case TabLaunchType.FROM_APP_WIDGET: diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs index 0f68c654463a0..fb23deeb30fce 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs @@ -36,6 +36,7 @@ enum LaunchTypeAtCreation:int { FROM_LONGPRESS_INCOGNITO = 16, FROM_RECENT_TABS = 17, FROM_READING_LIST = 18, + FROM_TAB_SWITCHER_UI = 19, // Add new values here and don't change existing values // as they are persisted across restarts. Changing existing // values will lead to backwards compatibility issues crbug.com/1286984. diff --git a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java index 4f37b28354a2d..d8f09087dd57f 100644 --- a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java +++ b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java @@ -199,7 +199,7 @@ private Tab addTabToTabModel(int index, @Nullable Tab tab) { mTabModel.addTab( tab, index, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - tab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + tab, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); return tab; } @@ -213,37 +213,37 @@ private void setupTabGroupModelFilter(boolean isTabRestoreCompleted, boolean isI mTabModel.addTab( mTab1, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); doReturn(isIncognito).when(mTab2).isIncognito(); mTabModel.addTab( mTab2, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab2, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab2, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); doReturn(isIncognito).when(mTab3).isIncognito(); mTabModel.addTab( mTab3, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab3, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab3, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); doReturn(isIncognito).when(mTab4).isIncognito(); mTabModel.addTab( mTab4, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab4, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab4, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); doReturn(isIncognito).when(mTab5).isIncognito(); mTabModel.addTab( mTab5, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab5, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab5, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); doReturn(isIncognito).when(mTab6).isIncognito(); mTabModel.addTab( mTab6, -1, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); mTabModelObserverCaptor.getValue().didAddTab( - mTab6, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND); + mTab6, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND, false); if (isTabRestoreCompleted) { mTabGroupModelFilter.restoreCompleted(); diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java index 71e6f2a3746c5..d66ed8aebc731 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreator.java @@ -104,9 +104,16 @@ public final boolean createTabWithWebContents( * Creates a new tab and loads the NTP. */ public final void launchNTP() { + launchNTP(TabLaunchType.FROM_CHROME_UI); + } + + /** + * Creates a new tab and loads the NTP. + */ + public final void launchNTP(@TabLaunchType int type) { try { TraceEvent.begin("TabCreator.launchNTP"); - launchUrl(UrlConstants.NTP_URL, TabLaunchType.FROM_CHROME_UI); + launchUrl(UrlConstants.NTP_URL, type); } finally { TraceEvent.end("TabCreator.launchNTP"); } diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java index 2327fa391cbb9..f748b753ae528 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java @@ -274,10 +274,11 @@ public void willAddTab(Tab tab, int type) { } @Override - public void didAddTab(Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, @TabCreationState int creationState, + boolean markedForSelection) { addTab(tab); for (TabModelObserver observer : mFilteredObservers) { - observer.didAddTab(tab, type, creationState); + observer.didAddTab(tab, type, creationState, markedForSelection); } } diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java index 06f7f203605d8..5b62f77dcd534 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java @@ -68,8 +68,10 @@ default void willAddTab(Tab tab, @TabLaunchType int type) {} * @param tab The newly added tab. * @param type The type of tab launch. * @param creationState How the tab was created. + * @param markedForSelection Indicates whether the added tab will be selected. */ - default void didAddTab(Tab tab, @TabLaunchType int type, @TabCreationState int creationState) {} + default void didAddTab(Tab tab, @TabLaunchType int type, @TabCreationState int creationState, + boolean markedForSelection) {} /** * Called after a tab has been moved from one position in the {@link TabModel} to another. diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver.java index ae1b979b02ef4..c745a63992c4d 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver.java @@ -55,8 +55,8 @@ public interface Observer { public TabModelSelectorTabRegistrationObserver(TabModelSelector selector) { mTabModelObserver = new TabModelSelectorTabModelObserver(selector) { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { // This observer is automatically removed by tab when it is destroyed. onTabRegistered(tab); } diff --git a/chrome/browser/ui/android/tab_model/tab_model.h b/chrome/browser/ui/android/tab_model/tab_model.h index 7fe0fff1d67e0..3df944f859504 100644 --- a/chrome/browser/ui/android/tab_model/tab_model.h +++ b/chrome/browser/ui/android/tab_model/tab_model.h @@ -106,6 +106,8 @@ class TabModel { // Opened from a Reading list. When going "back" on Android, the Reading // list should be reopened. FROM_READING_LIST, + // Opened from Tab Switcher UI. + FROM_TAB_SWITCHER_UI, // Must be last. SIZE }; diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java index 92b737a6e2012..64ce0b95feeed 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java @@ -101,8 +101,8 @@ public void onTabStateInitialized() { mTabModelFilterObserver = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { updateTabCount(); } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProviderUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProviderUnitTest.java index a34f3711eda6b..c346d897b11b4 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProviderUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProviderUnitTest.java @@ -104,7 +104,7 @@ public void getTabCount_updatedViaModelObserver() { int tabCount1 = 10; when(mMockTabModelFilter.getTotalTabCount()).thenReturn(tabCount1); - observer.didAddTab(null, 0, 0); + observer.didAddTab(null, 0, 0, false); assertEquals("Tab count from provider is not same as expected", tabCount1, mProvider.getTabCount()); diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java index 1166f8ecf7efc..a482d34edbc2a 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestRule.java @@ -144,8 +144,8 @@ public Tab newIncognitoTabFromMenu() { TabModel incognitoTabModel = getActivity().getTabModelSelector().getModel(true); TabModelObserver observer = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { createdCallback.notifyCalled(); } diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java index 36418cac9c087..af7a24f71ff90 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java @@ -386,8 +386,8 @@ public static void clickNewTabButton( TestThreadUtils.runOnUiThreadBlocking(() -> { normalTabModel.addObserver(new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { createdCallback.notifyCalled(); normalTabModel.removeObserver(this); } @@ -434,8 +434,8 @@ public static void newTabFromMenu(Instrumentation instrumentation, TabModel tabModel = activity.getTabModelSelector().getModel(incognito); TabModelObserver observer = new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { createdCallback.notifyCalled(); } @@ -750,8 +750,8 @@ public static void invokeContextMenuAndOpenInANewTab(ChromeTabbedActivityTestRul TestThreadUtils.runOnUiThreadBlocking(() -> { tabModel.addObserver(new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (TextUtils.equals(expectedUrl, tab.getUrl().getSpec())) { createdCallback.notifyCalled(); tabModel.removeObserver(this); @@ -802,8 +802,8 @@ public static void invokeContextMenuAndOpenInOtherWindow( TestThreadUtils.runOnUiThreadBlocking(() -> { tabModel.addObserver(new TabModelObserver() { @Override - public void didAddTab( - Tab tab, @TabLaunchType int type, @TabCreationState int creationState) { + public void didAddTab(Tab tab, @TabLaunchType int type, + @TabCreationState int creationState, boolean markedForSelection) { if (TextUtils.equals(expectedUrl, tab.getUrl().getSpec())) { createdCallback.notifyCalled(); tabModel.removeObserver(this); diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java index f94aaab1fb3f2..8d08f578829e7 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java @@ -70,7 +70,9 @@ public void addTab( } } - for (TabModelObserver observer : mObservers) observer.didAddTab(tab, type, creationState); + for (TabModelObserver observer : mObservers) { + observer.didAddTab(tab, type, creationState, false); + } } @Override diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 41c0568ef90a4..b66a6571db128 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml @@ -3521,6 +3521,7 @@ chromium-metrics-reviews@google.com. +