Commit 749006de authored by Sky Malice's avatar Sky Malice Committed by Chromium LUCI CQ

Revert "Reland "Create glue-layer TabModelOrchestrators""

This reverts commit ddad167d.

Reason for revert: Failing many XR/VR tests during activity initialization. See https://ci.chromium.org/ui/p/chromium/builders/ci/Nougat%20Phone%20Tester/16101/overview

Original change's description:
> Reland "Create glue-layer TabModelOrchestrators"
>
> This is a reland of 314cbf4c
>
> Patchset 1 is the original change.
>
> The main difference is that now the TabPersistentStore is created
> with the actual index that TabWindowManagerImpl assigned to the
> TabModelSelector, rather than the index that was "requested".
>
> Other changes are to adapt tests.
>
> Original change's description:
> > Create glue-layer TabModelOrchestrators
> >
> > TabModelSelectorImpl does not create or destroy TabPersistentStore
> > anymore. Instead, TabModelOrchestrators manage the lifetime of TabModelSelectorImpl and
> > TabPersistentStore.
> >
> > Give TabModelSelectorImpl a Supplier<TabPersistentStore> instead of
> > passing TabPersistentStore directly.
> >
> > This is a step to break the two-way dependency between
> > TabModelSelectorImpl and TabPersistentStore.
> >
> > Bug: 1138561
> > Change-Id: Ie2fa4a2735e509ff816b3e2cf5f8f6fffda7999c
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2572639
> > Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
> > Reviewed-by: David Trainor <dtrainor@chromium.org>
> > Reviewed-by: Ella Ge <eirage@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#835819}
>
> Bug: 1138561,1158259
> Change-Id: Iac6eaaed149e853536813cd627d28236638657de
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2590427
> Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
> Reviewed-by: Ella Ge <eirage@chromium.org>
> Reviewed-by: David Trainor <dtrainor@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#843752}

TBR=dtrainor@chromium.org,eirage@chromium.org,hnakashima@chromium.org,chromium-scoped@luci-project-accounts.iam.gserviceaccount.com

Change-Id: Id6440841c48bffa2dc0f33b89bcddb36ea2f0c3c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 1138561
Bug: 1158259
Bug: 1167010
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2632386Reviewed-by: default avatarSky Malice <skym@chromium.org>
Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Auto-Submit: Sky Malice <skym@chromium.org>
Commit-Queue: Natalie Chouinard <chouinard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844070}
parent c7b95818
...@@ -84,11 +84,8 @@ chrome_java_sources = [ ...@@ -84,11 +84,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton.java", "java/src/org/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier.java", "java/src/org/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.java", "java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/CustomTabsTabModelOrchestrator.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory.java", "java/src/org/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java", "java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/ChromeLanguageInfoProvider.java", "java/src/org/chromium/chrome/browser/app/video_tutorials/ChromeLanguageInfoProvider.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java", "java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java", "java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java",
......
...@@ -60,9 +60,7 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout ...@@ -60,9 +60,7 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeNextTabPolicySupplier; import org.chromium.chrome.browser.app.tabmodel.ChromeNextTabPolicySupplier;
import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.TabbedModeTabModelOrchestrator;
import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
...@@ -249,7 +247,6 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -249,7 +247,6 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
private ToolbarControlContainer mControlContainer; private ToolbarControlContainer mControlContainer;
private TabbedModeTabModelOrchestrator mTabModelOrchestrator;
private TabModelSelectorImpl mTabModelSelectorImpl; private TabModelSelectorImpl mTabModelSelectorImpl;
private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
private TabModelSelectorTabModelObserver mTabModelObserver; private TabModelSelectorTabModelObserver mTabModelObserver;
...@@ -1626,13 +1623,7 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1626,13 +1623,7 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
} }
@Override @Override
protected TabModelOrchestrator createTabModelOrchestrator() { protected TabModelSelector createTabModelSelector() {
mTabModelOrchestrator = new TabbedModeTabModelOrchestrator();
return mTabModelOrchestrator;
}
@Override
protected void createTabModels() {
assert mTabModelSelectorImpl == null; assert mTabModelSelectorImpl == null;
Bundle savedInstanceState = getSavedInstanceState(); Bundle savedInstanceState = getSavedInstanceState();
...@@ -1643,15 +1634,17 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1643,15 +1634,17 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
int index = savedInstanceState != null ? savedInstanceState.getInt(WINDOW_INDEX, 0) : 0; int index = savedInstanceState != null ? savedInstanceState.getInt(WINDOW_INDEX, 0) : 0;
mNextTabPolicySupplier = new ChromeNextTabPolicySupplier(mOverviewModeBehaviorSupplier); mNextTabPolicySupplier = new ChromeNextTabPolicySupplier(mOverviewModeBehaviorSupplier);
mTabModelSelectorImpl =
boolean tabModelWasCreated = (TabModelSelectorImpl) TabWindowManagerSingleton.getInstance().requestSelector(
mTabModelOrchestrator.createTabModels(this, this, mNextTabPolicySupplier, index); this, this, mNextTabPolicySupplier, index);
if (!tabModelWasCreated) { if (mTabModelSelectorImpl == null) {
Toast.makeText(
this, getString(R.string.unsupported_number_of_windows), Toast.LENGTH_LONG)
.show();
finish(); finish();
return; return null;
} }
mTabModelSelectorImpl = mTabModelOrchestrator.getTabModelSelector();
mTabModelSelectorImpl.addObserver(new EmptyTabModelSelectorObserver() { mTabModelSelectorImpl.addObserver(new EmptyTabModelSelectorObserver() {
@Override @Override
public void onTabStateInitialized() { public void onTabStateInitialized() {
...@@ -1675,6 +1668,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1675,6 +1668,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
mAppIndexingUtil = new AppIndexingUtil(mTabModelSelectorImpl); mAppIndexingUtil = new AppIndexingUtil(mTabModelSelectorImpl);
if (startIncognito) mTabModelSelectorImpl.selectModel(true); if (startIncognito) mTabModelSelectorImpl.selectModel(true);
return mTabModelSelectorImpl;
} }
@Override @Override
...@@ -2223,13 +2218,6 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -2223,13 +2218,6 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
super.onDestroyInternal(); super.onDestroyInternal();
} }
@Override
protected void destroyTabModels() {
if (mTabModelOrchestrator != null) {
mTabModelOrchestrator.destroy();
}
}
@Override @Override
public void onTrimMemory(int level) { public void onTrimMemory(int level) {
super.onTrimMemory(level); super.onTrimMemory(level);
......
...@@ -71,7 +71,6 @@ import org.chromium.chrome.browser.app.flags.ChromeCachedFlags; ...@@ -71,7 +71,6 @@ import org.chromium.chrome.browser.app.flags.ChromeCachedFlags;
import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingDelegateFactory; import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingDelegateFactory;
import org.chromium.chrome.browser.app.tab_activity_glue.TabReparentingController; import org.chromium.chrome.browser.app.tab_activity_glue.TabReparentingController;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
import org.chromium.chrome.browser.bookmarks.BookmarkModel; import org.chromium.chrome.browser.bookmarks.BookmarkModel;
...@@ -242,7 +241,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -242,7 +241,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
new TabModelSelectorProfileSupplier(mTabModelSelectorSupplier); new TabModelSelectorProfileSupplier(mTabModelSelectorSupplier);
protected ObservableSupplierImpl<BookmarkBridge> mBookmarkBridgeSupplier = protected ObservableSupplierImpl<BookmarkBridge> mBookmarkBridgeSupplier =
new ObservableSupplierImpl<>(); new ObservableSupplierImpl<>();
private TabModelOrchestrator mTabModelOrchestrator; private TabModelSelector mTabModelSelector;
private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
private TabCreator mRegularTabCreator; private TabCreator mRegularTabCreator;
private TabCreator mIncognitoTabCreator; private TabCreator mIncognitoTabCreator;
...@@ -264,6 +263,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -264,6 +263,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
/** Whether or not {@link #postDeferredStartupIfNeeded()} has already successfully run. */ /** Whether or not {@link #postDeferredStartupIfNeeded()} has already successfully run. */
private boolean mDeferredStartupPosted; private boolean mDeferredStartupPosted;
private boolean mTabModelsInitialized;
private boolean mNativeInitialized; private boolean mNativeInitialized;
private boolean mRemoveWindowBackgroundDone; private boolean mRemoveWindowBackgroundDone;
protected AccessibilityVisibilityHandler mAccessibilityVisibilityHandler; protected AccessibilityVisibilityHandler mAccessibilityVisibilityHandler;
...@@ -358,9 +358,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -358,9 +358,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
// onPreInflationStartup event. // onPreInflationStartup event.
mComponent = createComponent(); mComponent = createComponent();
// Create the orchestrator that manages Tab models and persistence
mTabModelOrchestrator = createTabModelOrchestrator();
// There's no corresponding call to removeObserver() for this addObserver() because // There's no corresponding call to removeObserver() for this addObserver() because
// mTabModelProfileSupplier has the same lifecycle as this activity. // mTabModelProfileSupplier has the same lifecycle as this activity.
mTabModelProfileSupplier.addObserver((profile) -> { mTabModelProfileSupplier.addObserver((profile) -> {
...@@ -491,10 +488,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -491,10 +488,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mCompositorViewHolder.getCompositorView()); mCompositorViewHolder.getCompositorView());
initializeTabModels(); initializeTabModels();
TabModelSelector tabModelSelector = mTabModelOrchestrator.getTabModelSelector();
setTabContentManager(new TabContentManager(this, getContentOffsetProvider(), setTabContentManager(new TabContentManager(this, getContentOffsetProvider(),
!SysUtils.isLowEndDevice(), !SysUtils.isLowEndDevice(),
tabModelSelector != null ? tabModelSelector::getTabById : null)); mTabModelSelector != null ? mTabModelSelector::getTabById : null));
if (!isFinishing()) { if (!isFinishing()) {
getBrowserControlsManager().initialize( getBrowserControlsManager().initialize(
...@@ -656,28 +652,28 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -656,28 +652,28 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* this activity. * this activity.
*/ */
public final void initializeTabModels() { public final void initializeTabModels() {
if (mTabModelOrchestrator.areTabModelsInitialized()) return; if (mTabModelsInitialized) return;
createTabModels(); mTabModelSelector = createTabModelSelector();
TabModelSelector tabModelSelector = mTabModelOrchestrator.getTabModelSelector();
if (tabModelSelector == null) { if (mTabModelSelector == null) {
assert isFinishing(); assert isFinishing();
mTabModelsInitialized = true;
return; return;
} }
mTabModelSelectorSupplier.set(tabModelSelector); mTabModelSelectorSupplier.set(mTabModelSelector);
mActivityTabProvider.setTabModelSelector(tabModelSelector); mActivityTabProvider.setTabModelSelector(mTabModelSelector);
getStatusBarColorController().setTabModelSelector(tabModelSelector); getStatusBarColorController().setTabModelSelector(mTabModelSelector);
Pair<? extends TabCreator, ? extends TabCreator> tabCreators = createTabCreators(); Pair<? extends TabCreator, ? extends TabCreator> tabCreators = createTabCreators();
mRegularTabCreator = tabCreators.first; mRegularTabCreator = tabCreators.first;
mIncognitoTabCreator = tabCreators.second; mIncognitoTabCreator = tabCreators.second;
OfflinePageUtils.observeTabModelSelector(this, tabModelSelector); OfflinePageUtils.observeTabModelSelector(this, mTabModelSelector);
if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy(); if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy();
mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(tabModelSelector) { mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) {
@Override @Override
public void onLoadStopped(Tab tab, boolean toDifferentDocument) { public void onLoadStopped(Tab tab, boolean toDifferentDocument) {
postDeferredStartupIfNeeded(); postDeferredStartupIfNeeded();
...@@ -694,6 +690,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -694,6 +690,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
postDeferredStartupIfNeeded(); postDeferredStartupIfNeeded();
} }
}; };
mTabModelsInitialized = true;
} }
/** /**
...@@ -709,19 +707,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -709,19 +707,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
} }
/** /**
* @return The {@link TabModelOrchestrator} owned by this {@link ChromeActivity}. * @return The {@link TabModelSelector} owned by this {@link ChromeActivity}.
*/
protected abstract TabModelOrchestrator createTabModelOrchestrator();
/**
* Call the {@link TabModelOrchestrator} to initialize its members.
*/ */
protected abstract void createTabModels(); protected abstract TabModelSelector createTabModelSelector();
/**
* Call the {@link TabModelOrchestrator} to destroy its members.
*/
protected abstract void destroyTabModels();
/** /**
* @return The {@link TabCreator}s owned * @return The {@link TabCreator}s owned
...@@ -860,8 +848,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -860,8 +848,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
VrModuleProvider.getDelegate().onActivityHidden(this); VrModuleProvider.getDelegate().onActivityHidden(this);
Tab tab = getActivityTab(); Tab tab = getActivityTab();
TabModelSelector tabModelSelector = mTabModelOrchestrator.getTabModelSelector(); if (mTabModelSelector != null && !mTabModelSelector.isReparentingInProgress()
if (tabModelSelector != null && !tabModelSelector.isReparentingInProgress()
&& tab != null) { && tab != null) {
tab.hide(TabHidingType.ACTIVITY_HIDDEN); tab.hide(TabHidingType.ACTIVITY_HIDDEN);
} }
...@@ -1325,7 +1312,10 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1325,7 +1312,10 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mActivityTabStartupMetricsTracker = null; mActivityTabStartupMetricsTracker = null;
} }
destroyTabModels(); if (mTabModelsInitialized) {
TabModelSelector selector = getTabModelSelector();
if (selector != null) selector.destroy();
}
if (mBookmarkBridgeSupplier != null) { if (mBookmarkBridgeSupplier != null) {
BookmarkBridge bookmarkBridge = mBookmarkBridgeSupplier.get(); BookmarkBridge bookmarkBridge = mBookmarkBridgeSupplier.get();
...@@ -1601,7 +1591,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1601,7 +1591,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* @return Whether the tab models have been fully initialized. * @return Whether the tab models have been fully initialized.
*/ */
public boolean areTabModelsInitialized() { public boolean areTabModelsInitialized() {
return mTabModelOrchestrator.areTabModelsInitialized(); return mTabModelsInitialized;
} }
/** /**
...@@ -1610,11 +1600,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1610,11 +1600,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* @return The {@link TabModelSelector}, possibly null. * @return The {@link TabModelSelector}, possibly null.
*/ */
public TabModelSelector getTabModelSelector() { public TabModelSelector getTabModelSelector() {
if (!mTabModelOrchestrator.areTabModelsInitialized()) { if (!mTabModelsInitialized) {
throw new IllegalStateException( throw new IllegalStateException(
"Attempting to access TabModelSelector before initialization"); "Attempting to access TabModelSelector before initialization");
} }
return mTabModelOrchestrator.getTabModelSelector(); return mTabModelSelector;
} }
/** /**
...@@ -1635,7 +1625,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1635,7 +1625,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
@Override @Override
public TabCreator getTabCreator(boolean incognito) { public TabCreator getTabCreator(boolean incognito) {
if (!mTabModelOrchestrator.areTabModelsInitialized()) { if (!mTabModelsInitialized) {
throw new IllegalStateException( throw new IllegalStateException(
"Attempting to access TabCreator before initialization"); "Attempting to access TabCreator before initialization");
} }
...@@ -1702,7 +1692,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1702,7 +1692,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* null if the Tab does not exist or the system is not initialized. * null if the Tab does not exist or the system is not initialized.
*/ */
public Tab getActivityTab() { public Tab getActivityTab() {
if (!mTabModelOrchestrator.areTabModelsInitialized()) { if (!mTabModelsInitialized) {
return null; return null;
} }
return TabModelUtils.getCurrentTab(getCurrentTabModel()); return TabModelUtils.getCurrentTab(getCurrentTabModel());
...@@ -1713,7 +1703,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1713,7 +1703,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* WebContents. * WebContents.
*/ */
public WebContents getCurrentWebContents() { public WebContents getCurrentWebContents() {
if (!mTabModelOrchestrator.areTabModelsInitialized()) { if (!mTabModelsInitialized) {
return null; return null;
} }
return TabModelUtils.getCurrentWebContents(getCurrentTabModel()); return TabModelUtils.getCurrentWebContents(getCurrentTabModel());
...@@ -2037,7 +2027,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -2037,7 +2027,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
if (id == R.id.help_id) { if (id == R.id.help_id) {
String url = currentTab != null ? currentTab.getUrlString() : ""; String url = currentTab != null ? currentTab.getUrlString() : "";
Profile profile = getTabModelSelector().isIncognitoSelected() Profile profile = mTabModelSelector.isIncognitoSelected()
? Profile.getLastUsedRegularProfile().getPrimaryOTRProfile() ? Profile.getLastUsedRegularProfile().getPrimaryOTRProfile()
: Profile.getLastUsedRegularProfile(); : Profile.getLastUsedRegularProfile();
startHelpAndFeedback(url, "MobileMenuFeedback", profile); startHelpAndFeedback(url, "MobileMenuFeedback", profile);
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.app.tabmodel;
import androidx.annotation.Nullable;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
import org.chromium.ui.base.WindowAndroid;
import javax.inject.Inject;
/**
* Glue-level class that manages lifetime of root .tabmodel objects: {@link TabPersistentStore} and
* {@link TabModelSelectorImpl} for custom tabs.
*/
@ActivityScope
public class CustomTabsTabModelOrchestrator extends TabModelOrchestrator {
@Inject
public CustomTabsTabModelOrchestrator() {}
/**
* Creates the TabModelSelector and the TabPersistentStore.
*/
public void createTabModels(@Nullable Supplier<WindowAndroid> windowAndroidSupplier,
TabCreatorManager tabCreatorManager, TabModelFilterFactory tabModelFilterFactory,
TabPersistencePolicy persistencePolicy, AsyncTabParamsManager asyncTabParamsManager) {
// Instantiate TabModelSelectorImpl
NextTabPolicySupplier nextTabPolicySupplier = () -> NextTabPolicy.LOCATIONAL;
mTabModelSelector = new TabModelSelectorImpl(windowAndroidSupplier, tabCreatorManager,
tabModelFilterFactory, nextTabPolicySupplier, asyncTabParamsManager, false, false,
false);
// Instantiate TabPersistentStore
mTabPersistentStore =
new TabPersistentStore(persistencePolicy, mTabModelSelector, tabCreatorManager);
wireSelectorAndStore();
markTabModelsInitialized();
}
}
...@@ -5,15 +5,19 @@ ...@@ -5,15 +5,19 @@
package org.chromium.chrome.browser.app.tabmodel; package org.chromium.chrome.browser.app.tabmodel;
import android.app.Activity; import android.app.Activity;
import android.os.Build;
import org.chromium.base.annotations.VerifiesOnN; import org.chromium.base.annotations.VerifiesOnN;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory; import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorFactory; import org.chromium.chrome.browser.tabmodel.TabModelSelectorFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
/** /**
* Default {@link TabModelSelectorFactory} for Chrome. * Default {@link TabModelSelectorFactory} for Chrome.
...@@ -25,11 +29,32 @@ public class DefaultTabModelSelectorFactory implements TabModelSelectorFactory { ...@@ -25,11 +29,32 @@ public class DefaultTabModelSelectorFactory implements TabModelSelectorFactory {
@Override @Override
public TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager, public TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager,
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex) { NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex) {
// Merge tabs if this TabModelSelector is for a ChromeTabbedActivity created in
// fullscreen mode and there are no TabModelSelector's currently alive. This indicates
// that it is a cold start or process restart in fullscreen mode.
boolean mergeTabs = Build.VERSION.SDK_INT > Build.VERSION_CODES.M
&& MultiInstanceManager.isTabModelMergingEnabled()
&& !activity.isInMultiWindowMode();
if (MultiInstanceManager.shouldMergeOnStartup(activity)) {
mergeTabs = mergeTabs
&& (!MultiWindowUtils.getInstance().isInMultiDisplayMode(activity)
|| TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0);
} else {
mergeTabs = mergeTabs
&& TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0;
}
if (mergeTabs) {
MultiInstanceManager.mergedOnStartup();
}
TabPersistencePolicy persistencePolicy =
new TabbedModeTabPersistencePolicy(selectorIndex, mergeTabs);
TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory(); TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory();
AsyncTabParamsManager asyncTabParamsManager = AsyncTabParamsManagerSingleton.getInstance(); return new TabModelSelectorImpl(activity, /*windowAndroidSupplier=*/null, tabCreatorManager,
persistencePolicy, tabModelFilterFactory, nextTabPolicySupplier,
return new TabModelSelectorImpl(/*windowAndroidSupplier=*/null, tabCreatorManager, AsyncTabParamsManagerSingleton.getInstance(), true, true, false);
tabModelFilterFactory, nextTabPolicySupplier, asyncTabParamsManager, true, true,
false);
} }
} }
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.app.tabmodel;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver;
/**
* Implementers are glue-level objects that manage lifetime of root .tabmodel objects: {@link
* TabPersistentStore} and {@link TabModelSelectorImpl}.
*/
public abstract class TabModelOrchestrator {
protected TabPersistentStore mTabPersistentStore;
protected TabModelSelectorImpl mTabModelSelector;
private boolean mTabModelsInitialized;
/**
* @return Whether the tab models have been fully initialized.
*/
public boolean areTabModelsInitialized() {
return mTabModelsInitialized;
}
/**
* @return The {@link TabModelSelectorImpl} managed by this orchestrator.
*/
public TabModelSelectorImpl getTabModelSelector() {
return mTabModelSelector;
}
/**
* Destroy the {@link TabPersistentStore} and {@link TabModelSelectorImpl} members.
*/
public void destroy() {
if (!mTabModelsInitialized) {
return;
}
if (mTabPersistentStore != null) {
mTabPersistentStore.destroy();
mTabPersistentStore = null;
}
if (mTabModelSelector != null) {
mTabModelSelector.destroy();
mTabModelSelector = null;
}
mTabModelsInitialized = false;
}
protected void wireSelectorAndStore() {
// Supply TabModelSelectorImpl with TabPersistentStore.
//
// TODO(crbug.com/1138561): Remove this dependency by making TabModelSelectorImpl emit
// events and TabPersistentStore react to them as an observer.
ObservableSupplierImpl<TabPersistentStore> tabPersistentStoreSupplier =
new ObservableSupplierImpl<>();
tabPersistentStoreSupplier.set(mTabPersistentStore);
mTabModelSelector.setTabPersistentStoreSupplier(tabPersistentStoreSupplier);
// Notify TabModelSelectorImpl when TabPersistentStore initializes tab state
final TabPersistentStoreObserver persistentStoreObserver =
new TabPersistentStoreObserver() {
@Override
public void onStateLoaded() {
mTabModelSelector.markTabStateInitialized();
}
};
mTabPersistentStore.addObserver(persistentStoreObserver);
}
protected void markTabModelsInitialized() {
mTabModelsInitialized = true;
}
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.app.tabmodel;
import android.app.Activity;
import android.os.Build;
import android.util.Pair;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
import org.chromium.ui.widget.Toast;
/**
* Glue-level class that manages lifetime of root .tabmodel objects: {@link TabPersistentStore} and
* {@link TabModelSelectorImpl} for tabbed mode.
*/
public class TabbedModeTabModelOrchestrator extends TabModelOrchestrator {
public TabbedModeTabModelOrchestrator() {}
/**
* Creates the TabModelSelector and the TabPersistentStore.
*
* @return Whether the creation was successful. It may fail is we reached the limit of number of
* windows.
*/
public boolean createTabModels(Activity activity, TabCreatorManager tabCreatorManager,
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex) {
boolean mergeTabs = shouldMergeTabs(activity);
if (mergeTabs) {
MultiInstanceManager.mergedOnStartup();
}
// Instantiate TabModelSelectorImpl
Pair<Integer, TabModelSelector> selectorAssignment =
TabWindowManagerSingleton.getInstance().requestSelector(
activity, tabCreatorManager, nextTabPolicySupplier, selectorIndex);
int assignedIndex = selectorAssignment.first;
mTabModelSelector = (TabModelSelectorImpl) selectorAssignment.second;
if (mTabModelSelector == null) {
markTabModelsInitialized();
Toast.makeText(activity,
activity.getString(
org.chromium.chrome.R.string.unsupported_number_of_windows),
Toast.LENGTH_LONG)
.show();
return false;
}
// Instantiate TabPersistentStore
TabPersistencePolicy tabPersistencePolicy =
new TabbedModeTabPersistencePolicy(assignedIndex, mergeTabs);
mTabPersistentStore =
new TabPersistentStore(tabPersistencePolicy, mTabModelSelector, tabCreatorManager);
wireSelectorAndStore();
markTabModelsInitialized();
return true;
}
private boolean shouldMergeTabs(Activity activity) {
// Merge tabs if this TabModelSelector is for a ChromeTabbedActivity created in
// fullscreen mode and there are no TabModelSelector's currently alive. This indicates
// that it is a cold start or process restart in fullscreen mode.
boolean mergeTabs = Build.VERSION.SDK_INT > Build.VERSION_CODES.M
&& MultiInstanceManager.isTabModelMergingEnabled()
&& !activity.isInMultiWindowMode();
if (MultiInstanceManager.shouldMergeOnStartup(activity)) {
mergeTabs = mergeTabs
&& (!MultiWindowUtils.getInstance().isInMultiDisplayMode(activity)
|| TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0);
} else {
mergeTabs = mergeTabs
&& TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0;
}
return mergeTabs;
}
}
...@@ -24,7 +24,6 @@ import org.chromium.chrome.R; ...@@ -24,7 +24,6 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.KeyboardShortcuts; import org.chromium.chrome.browser.KeyboardShortcuts;
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier; import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.TrustedWebActivityCoordinator; import org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.TrustedWebActivityCoordinator;
...@@ -46,6 +45,7 @@ import org.chromium.chrome.browser.night_mode.SystemNightModeMonitor; ...@@ -46,6 +45,7 @@ import org.chromium.chrome.browser.night_mode.SystemNightModeMonitor;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.theme.TopUiThemeColorProvider; import org.chromium.chrome.browser.theme.TopUiThemeColorProvider;
import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.RootUiCoordinator;
...@@ -293,20 +293,8 @@ public abstract class BaseCustomTabActivity extends ChromeActivity<BaseCustomTab ...@@ -293,20 +293,8 @@ public abstract class BaseCustomTabActivity extends ChromeActivity<BaseCustomTab
} }
@Override @Override
protected TabModelOrchestrator createTabModelOrchestrator() { protected TabModelSelector createTabModelSelector() {
return mTabFactory.createTabModelOrchestrator(); return mTabFactory.createTabModelSelector();
}
@Override
protected void destroyTabModels() {
if (mTabFactory != null) {
mTabFactory.destroyTabModelOrchestrator();
}
}
@Override
protected void createTabModels() {
mTabFactory.createTabModels();
} }
@Override @Override
......
...@@ -15,8 +15,6 @@ import org.chromium.chrome.browser.IntentHandler; ...@@ -15,8 +15,6 @@ import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory; import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.app.tabmodel.CustomTabsTabModelOrchestrator;
import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory; import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory;
import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy; import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy;
...@@ -28,6 +26,7 @@ import org.chromium.chrome.browser.tab.TabDelegateFactory; ...@@ -28,6 +26,7 @@ import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory; import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
...@@ -57,7 +56,7 @@ public class CustomTabActivityTabFactory { ...@@ -57,7 +56,7 @@ public class CustomTabActivityTabFactory {
private final Lazy<AsyncTabParamsManager> mAsyncTabParamsManager; private final Lazy<AsyncTabParamsManager> mAsyncTabParamsManager;
@Nullable @Nullable
private CustomTabsTabModelOrchestrator mTabModelOrchestrator; private TabModelSelectorImpl mTabModelSelector;
@Inject @Inject
public CustomTabActivityTabFactory(ChromeActivity<?> activity, public CustomTabActivityTabFactory(ChromeActivity<?> activity,
...@@ -78,35 +77,21 @@ public class CustomTabActivityTabFactory { ...@@ -78,35 +77,21 @@ public class CustomTabActivityTabFactory {
mAsyncTabParamsManager = asyncTabParamsManager; mAsyncTabParamsManager = asyncTabParamsManager;
} }
/** Creates a {@link TabModelOrchestrator} for the custom tab. */ /** Creates a {@link TabModelSelector} for the custom tab. */
public TabModelOrchestrator createTabModelOrchestrator() { public TabModelSelectorImpl createTabModelSelector() {
mTabModelOrchestrator = new CustomTabsTabModelOrchestrator(); mTabModelSelector = new TabModelSelectorImpl(mActivity, mActivityWindowAndroid::get,
return mTabModelOrchestrator; mActivity, mPersistencePolicy, mTabModelFilterFactory,
} () -> NextTabPolicy.LOCATIONAL, mAsyncTabParamsManager.get(), false, false, false);
return mTabModelSelector;
public void destroyTabModelOrchestrator() {
if (mTabModelOrchestrator != null) {
mTabModelOrchestrator.destroy();
}
}
/** Calls the {@link TabModelOrchestrator} to create TabModels and TabPersistentStore. */
public void createTabModels() {
mTabModelOrchestrator.createTabModels(mActivityWindowAndroid::get, mActivity,
mTabModelFilterFactory, mPersistencePolicy, mAsyncTabParamsManager.get());
} }
/** Returns the previously created {@link TabModelSelector}. */ /** Returns the previously created {@link TabModelSelector}. */
public TabModelSelectorImpl getTabModelSelector() { public TabModelSelectorImpl getTabModelSelector() {
if (mTabModelOrchestrator == null) { if (mTabModelSelector == null) {
assert false;
createTabModelOrchestrator();
}
if (mTabModelOrchestrator.getTabModelSelector() == null) {
assert false; assert false;
createTabModels(); return createTabModelSelector();
} }
return mTabModelOrchestrator.getTabModelSelector(); return mTabModelSelector;
} }
/** Creates a {@link ChromeTabCreator}s for the custom tab. */ /** Creates a {@link ChromeTabCreator}s for the custom tab. */
......
...@@ -34,11 +34,12 @@ import org.chromium.base.test.util.Feature; ...@@ -34,11 +34,12 @@ import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory; import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.app.tabmodel.CustomTabsTabModelOrchestrator;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.MockTab; import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabStateFileManager; import org.chromium.chrome.browser.tab.TabStateFileManager;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy; import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
...@@ -455,11 +456,12 @@ public class CustomTabTabPersistencePolicyTest { ...@@ -455,11 +456,12 @@ public class CustomTabTabPersistencePolicyTest {
CustomTabActivity activity = new CustomTabActivity(); CustomTabActivity activity = new CustomTabActivity();
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
CustomTabsTabModelOrchestrator orchestrator = new CustomTabsTabModelOrchestrator(); NextTabPolicySupplier nextTabPolicySupplier = () -> NextTabPolicy.LOCATIONAL;
orchestrator.createTabModels(activity::getWindowAndroid, activity,
new ChromeTabModelFilterFactory(), buildTestPersistencePolicy(), TabModelSelectorImpl selector = new TabModelSelectorImpl(activity,
AsyncTabParamsManagerSingleton.getInstance()); activity::getWindowAndroid, activity, buildTestPersistencePolicy(),
TabModelSelectorImpl selector = orchestrator.getTabModelSelector(); new ChromeTabModelFilterFactory(), nextTabPolicySupplier,
AsyncTabParamsManagerSingleton.getInstance(), false, false, false);
selector.initializeForTesting(normalTabModel, incognitoTabModel); selector.initializeForTesting(normalTabModel, incognitoTabModel);
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED); ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
return selector; return selector;
......
...@@ -74,7 +74,8 @@ public class ContextMenuLoadUrlParamsTest { ...@@ -74,7 +74,8 @@ public class ContextMenuLoadUrlParamsTest {
public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager, public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabModelFilterFactory tabModelFilterFactory, int selectorIndex) { TabModelFilterFactory tabModelFilterFactory, int selectorIndex) {
super(null, tabCreatorManager, tabModelFilterFactory, super(activity, null, tabCreatorManager,
new TabbedModeTabPersistencePolicy(selectorIndex, false), tabModelFilterFactory,
() ()
-> NextTabPolicy.HIERARCHICAL, -> NextTabPolicy.HIERARCHICAL,
AsyncTabParamsManagerSingleton.getInstance(), false, false, false); AsyncTabParamsManagerSingleton.getInstance(), false, false, false);
......
...@@ -361,9 +361,7 @@ public class TabModelMergingTest { ...@@ -361,9 +361,7 @@ public class TabModelMergingTest {
MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStoreObserver(); MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStoreObserver();
TabModelSelectorImpl tabModelSelector = TabModelSelectorImpl tabModelSelector =
(TabModelSelectorImpl) mActivity2.getTabModelSelector(); (TabModelSelectorImpl) mActivity2.getTabModelSelector();
TestThreadUtils.runOnUiThreadBlocking(() -> { tabModelSelector.getTabPersistentStoreForTesting().addObserver(mockObserver);
tabModelSelector.getTabPersistentStoreForTesting().addObserver(mockObserver);
});
// Merge tabs into ChromeTabbedActivity2. Wait for the merge to finish, ensuring the // Merge tabs into ChromeTabbedActivity2. Wait for the merge to finish, ensuring the
// tab metadata file for ChromeTabbedActivity gets deleted before attempting to merge // tab metadata file for ChromeTabbedActivity gets deleted before attempting to merge
......
...@@ -32,7 +32,6 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout ...@@ -32,7 +32,6 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout
import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory; import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper;
import org.chromium.chrome.browser.flags.ActivityType; import org.chromium.chrome.browser.flags.ActivityType;
...@@ -247,16 +246,10 @@ public class TabPersistentStoreTest { ...@@ -247,16 +246,10 @@ public class TabPersistentStoreTest {
} }
@Override @Override
protected TabModelOrchestrator createTabModelOrchestrator() { protected TabModelSelector createTabModelSelector() {
return null; return null;
} }
@Override
protected void createTabModels() {}
@Override
protected void destroyTabModels() {}
@Override @Override
protected BrowserControlsManager createBrowserControlsManager() { protected BrowserControlsManager createBrowserControlsManager() {
return null; return null;
...@@ -728,9 +721,8 @@ public class TabPersistentStoreTest { ...@@ -728,9 +721,8 @@ public class TabPersistentStoreTest {
// createAndRestoreRealTabModelImpls is called multiple times in one test). // createAndRestoreRealTabModelImpls is called multiple times in one test).
sTabWindowManager.onActivityStateChange( sTabWindowManager.onActivityStateChange(
mChromeActivity, ActivityState.DESTROYED); mChromeActivity, ActivityState.DESTROYED);
return (TestTabModelSelector) sTabWindowManager return (TestTabModelSelector) sTabWindowManager.requestSelector(
.requestSelector(mChromeActivity, mChromeActivity, null, 0) mChromeActivity, mChromeActivity, null, 0);
.second;
} }
}); });
......
...@@ -8,6 +8,8 @@ import static org.mockito.ArgumentMatchers.any; ...@@ -8,6 +8,8 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import android.app.Activity;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
...@@ -15,6 +17,7 @@ import org.junit.runner.RunWith; ...@@ -15,6 +17,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
...@@ -34,6 +37,8 @@ import org.chromium.ui.base.WindowAndroid; ...@@ -34,6 +37,8 @@ import org.chromium.ui.base.WindowAndroid;
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
public class TabModelSelectorImplTest { public class TabModelSelectorImplTest {
@Mock
TabPersistencePolicy mMockTabPersistencePolicy;
@Mock @Mock
TabModelFilterFactory mMockTabModelFilterFactory; TabModelFilterFactory mMockTabModelFilterFactory;
@Mock @Mock
...@@ -45,22 +50,27 @@ public class TabModelSelectorImplTest { ...@@ -45,22 +50,27 @@ public class TabModelSelectorImplTest {
private TabModelSelectorImpl mTabModelSelector; private TabModelSelectorImpl mTabModelSelector;
private MockTabCreatorManager mTabCreatorManager; private MockTabCreatorManager mTabCreatorManager;
private Activity mActivity;
@Before @Before
public void setUp() { public void setUp() {
mActivity = Robolectric.buildActivity(Activity.class).setup().get();
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
doReturn(TabPersistentStore.SAVED_STATE_FILE_PREFIX)
.when(mMockTabPersistencePolicy)
.getStateFileName();
doReturn(mock(TabModelFilter.class)) doReturn(mock(TabModelFilter.class))
.when(mMockTabModelFilterFactory) .when(mMockTabModelFilterFactory)
.createTabModelFilter(any()); .createTabModelFilter(any());
mTabCreatorManager = new MockTabCreatorManager(); mTabCreatorManager = new MockTabCreatorManager();
AsyncTabParamsManager realAsyncTabParamsManager = AsyncTabParamsManager realAsyncTabParamsManager =
AsyncTabParamsManagerFactory.createAsyncTabParamsManager(); AsyncTabParamsManagerFactory.createAsyncTabParamsManager();
mTabModelSelector = new TabModelSelectorImpl(null, mTabCreatorManager, mTabModelSelector = new TabModelSelectorImpl(mActivity, null, mTabCreatorManager,
mMockTabModelFilterFactory, mNextTabPolicySupplier, realAsyncTabParamsManager, mMockTabPersistencePolicy, mMockTabModelFilterFactory, mNextTabPolicySupplier,
/*supportUndo=*/false, realAsyncTabParamsManager, /*supportUndo=*/false,
/*isTabbedActivity=*/false, /*startIncognito=*/false); /*isTabbedActivity=*/false, /*startIncognito=*/false);
mTabModelSelector.setTabPersistentStoreSupplier(() -> null);
mTabCreatorManager.initialize(mTabModelSelector); mTabCreatorManager.initialize(mTabModelSelector);
mTabModelSelector.onNativeLibraryReadyInternal(mMockTabContentManager, mTabModelSelector.onNativeLibraryReadyInternal(mMockTabContentManager,
new MockTabModel(false, null), new MockTabModel(true, null)); new MockTabModel(false, null), new MockTabModel(true, null));
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package org.chromium.chrome.browser.tabmodel; package org.chromium.chrome.browser.tabmodel;
import android.app.Activity; import android.app.Activity;
import android.util.Pair;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
...@@ -35,13 +34,11 @@ public interface TabWindowManager { ...@@ -35,13 +34,11 @@ public interface TabWindowManager {
* @param nextTabPolicySupplier An instance of {@link NextTabPolicySupplier}. * @param nextTabPolicySupplier An instance of {@link NextTabPolicySupplier}.
* @param index The index of the requested {@link TabModelSelector}. Not guaranteed to be the * @param index The index of the requested {@link TabModelSelector}. Not guaranteed to be the
* index of the {@link TabModelSelector} returned. * index of the {@link TabModelSelector} returned.
* @return {@link Pair} of the index and the {@link TabModelSelector} assigned to that index, or * @return A {@link TabModelSelector} index, or {@code null} if there are too many
* {@code null} if there are too many
* {@link TabModelSelector}s already built. * {@link TabModelSelector}s already built.
*/ */
Pair<Integer, TabModelSelector> requestSelector(Activity activity, TabModelSelector requestSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabCreatorManager tabCreatorManager, NextTabPolicySupplier nextTabPolicySupplier, NextTabPolicySupplier nextTabPolicySupplier, int index);
int index);
/** /**
* An index that represents the invalid state (i.e. when the window wasn't found in the list). * An index that represents the invalid state (i.e. when the window wasn't found in the list).
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package org.chromium.chrome.browser.tabmodel; package org.chromium.chrome.browser.tabmodel;
import android.app.Activity; import android.app.Activity;
import android.util.Pair;
import android.util.SparseArray; import android.util.SparseArray;
import org.chromium.base.ActivityState; import org.chromium.base.ActivityState;
...@@ -44,18 +43,10 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan ...@@ -44,18 +43,10 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan
} }
@Override @Override
public Pair<Integer, TabModelSelector> requestSelector(Activity activity, public TabModelSelector requestSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabCreatorManager tabCreatorManager, NextTabPolicySupplier nextTabPolicySupplier, NextTabPolicySupplier nextTabPolicySupplier, int index) {
int index) {
if (mAssignments.get(activity) != null) { if (mAssignments.get(activity) != null) {
TabModelSelector assignedSelector = mAssignments.get(activity); return mAssignments.get(activity);
for (int i = 0; i < mSelectors.size(); i++) {
if (mSelectors.get(i) == assignedSelector) {
return Pair.create(i, assignedSelector);
}
}
throw new IllegalStateException(
"TabModelSelector is assigned to an Activity but has no index.");
} }
if (index < 0 || index >= mSelectors.size()) index = 0; if (index < 0 || index >= mSelectors.size()) index = 0;
...@@ -77,7 +68,7 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan ...@@ -77,7 +68,7 @@ public class TabWindowManagerImpl implements ActivityStateListener, TabWindowMan
mSelectors.set(index, selector); mSelectors.set(index, selector);
mAssignments.put(activity, selector); mAssignments.put(activity, selector);
return Pair.create(index, selector); return selector;
} }
@Override @Override
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment