Commit 314cbf4c authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Chromium LUCI CQ

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: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarElla Ge <eirage@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835819}
parent 9ecc67d3
...@@ -86,8 +86,11 @@ chrome_java_sources = [ ...@@ -86,8 +86,11 @@ 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",
......
...@@ -56,7 +56,9 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout ...@@ -56,7 +56,9 @@ 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;
...@@ -242,6 +244,7 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -242,6 +244,7 @@ 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;
...@@ -1601,7 +1604,13 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1601,7 +1604,13 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
} }
@Override @Override
protected TabModelSelector createTabModelSelector() { protected TabModelOrchestrator createTabModelOrchestrator() {
mTabModelOrchestrator = new TabbedModeTabModelOrchestrator();
return mTabModelOrchestrator;
}
@Override
protected void createTabModels() {
assert mTabModelSelectorImpl == null; assert mTabModelSelectorImpl == null;
Bundle savedInstanceState = getSavedInstanceState(); Bundle savedInstanceState = getSavedInstanceState();
...@@ -1612,17 +1621,15 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1612,17 +1621,15 @@ 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 =
(TabModelSelectorImpl) TabWindowManagerSingleton.getInstance().requestSelector( boolean tabModelWasCreated =
this, this, mNextTabPolicySupplier, index); mTabModelOrchestrator.createTabModels(this, this, mNextTabPolicySupplier, index);
if (mTabModelSelectorImpl == null) { if (!tabModelWasCreated) {
Toast.makeText(
this, getString(R.string.unsupported_number_of_windows), Toast.LENGTH_LONG)
.show();
finish(); finish();
return null; return;
} }
mTabModelSelectorImpl = mTabModelOrchestrator.getTabModelSelector();
mTabModelSelectorImpl.addObserver(new EmptyTabModelSelectorObserver() { mTabModelSelectorImpl.addObserver(new EmptyTabModelSelectorObserver() {
@Override @Override
public void onTabStateInitialized() { public void onTabStateInitialized() {
...@@ -1646,8 +1653,6 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1646,8 +1653,6 @@ 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
...@@ -2180,6 +2185,13 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -2180,6 +2185,13 @@ 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);
......
...@@ -69,6 +69,7 @@ import org.chromium.chrome.browser.app.flags.ChromeCachedFlags; ...@@ -69,6 +69,7 @@ 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;
...@@ -239,7 +240,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -239,7 +240,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 TabModelSelector mTabModelSelector; private TabModelOrchestrator mTabModelOrchestrator;
private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
private TabCreator mRegularTabCreator; private TabCreator mRegularTabCreator;
private TabCreator mIncognitoTabCreator; private TabCreator mIncognitoTabCreator;
...@@ -261,7 +262,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -261,7 +262,6 @@ 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;
...@@ -353,6 +353,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -353,6 +353,9 @@ 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) -> {
...@@ -478,9 +481,10 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -478,9 +481,10 @@ 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(),
mTabModelSelector != null ? mTabModelSelector::getTabById : null)); tabModelSelector != null ? tabModelSelector::getTabById : null));
if (!isFinishing()) { if (!isFinishing()) {
getBrowserControlsManager().initialize( getBrowserControlsManager().initialize(
...@@ -642,28 +646,28 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -642,28 +646,28 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* this activity. * this activity.
*/ */
public final void initializeTabModels() { public final void initializeTabModels() {
if (mTabModelsInitialized) return; if (mTabModelOrchestrator.areTabModelsInitialized()) return;
mTabModelSelector = createTabModelSelector(); createTabModels();
TabModelSelector tabModelSelector = mTabModelOrchestrator.getTabModelSelector();
if (mTabModelSelector == null) { if (tabModelSelector == null) {
assert isFinishing(); assert isFinishing();
mTabModelsInitialized = true;
return; return;
} }
mTabModelSelectorSupplier.set(mTabModelSelector); mTabModelSelectorSupplier.set(tabModelSelector);
mActivityTabProvider.setTabModelSelector(mTabModelSelector); mActivityTabProvider.setTabModelSelector(tabModelSelector);
getStatusBarColorController().setTabModelSelector(mTabModelSelector); getStatusBarColorController().setTabModelSelector(tabModelSelector);
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, mTabModelSelector); OfflinePageUtils.observeTabModelSelector(this, tabModelSelector);
if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy(); if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy();
mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) { mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(tabModelSelector) {
@Override @Override
public void onLoadStopped(Tab tab, boolean toDifferentDocument) { public void onLoadStopped(Tab tab, boolean toDifferentDocument) {
postDeferredStartupIfNeeded(); postDeferredStartupIfNeeded();
...@@ -680,8 +684,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -680,8 +684,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
postDeferredStartupIfNeeded(); postDeferredStartupIfNeeded();
} }
}; };
mTabModelsInitialized = true;
} }
/** /**
...@@ -697,9 +699,19 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -697,9 +699,19 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
} }
/** /**
* @return The {@link TabModelSelector} owned by this {@link ChromeActivity}. * @return The {@link TabModelOrchestrator} owned by this {@link ChromeActivity}.
*/
protected abstract TabModelOrchestrator createTabModelOrchestrator();
/**
* Call the {@link TabModelOrchestrator} to initialize its members.
*/ */
protected abstract TabModelSelector createTabModelSelector(); protected abstract void createTabModels();
/**
* Call the {@link TabModelOrchestrator} to destroy its members.
*/
protected abstract void destroyTabModels();
/** /**
* @return The {@link TabCreator}s owned * @return The {@link TabCreator}s owned
...@@ -826,7 +838,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -826,7 +838,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
VrModuleProvider.getDelegate().onActivityHidden(this); VrModuleProvider.getDelegate().onActivityHidden(this);
Tab tab = getActivityTab(); Tab tab = getActivityTab();
if (mTabModelSelector != null && !mTabModelSelector.isReparentingInProgress() TabModelSelector tabModelSelector = mTabModelOrchestrator.getTabModelSelector();
if (tabModelSelector != null && !tabModelSelector.isReparentingInProgress()
&& tab != null) { && tab != null) {
tab.hide(TabHidingType.ACTIVITY_HIDDEN); tab.hide(TabHidingType.ACTIVITY_HIDDEN);
} }
...@@ -1288,10 +1301,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1288,10 +1301,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mActivityTabStartupMetricsTracker = null; mActivityTabStartupMetricsTracker = null;
} }
if (mTabModelsInitialized) { destroyTabModels();
TabModelSelector selector = getTabModelSelector();
if (selector != null) selector.destroy();
}
if (mBookmarkBridgeSupplier != null) { if (mBookmarkBridgeSupplier != null) {
BookmarkBridge bookmarkBridge = mBookmarkBridgeSupplier.get(); BookmarkBridge bookmarkBridge = mBookmarkBridgeSupplier.get();
...@@ -1562,7 +1572,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1562,7 +1572,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 mTabModelsInitialized; return mTabModelOrchestrator.areTabModelsInitialized();
} }
/** /**
...@@ -1571,11 +1581,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1571,11 +1581,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 (!mTabModelsInitialized) { if (!mTabModelOrchestrator.areTabModelsInitialized()) {
throw new IllegalStateException( throw new IllegalStateException(
"Attempting to access TabModelSelector before initialization"); "Attempting to access TabModelSelector before initialization");
} }
return mTabModelSelector; return mTabModelOrchestrator.getTabModelSelector();
} }
/** /**
...@@ -1596,7 +1606,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1596,7 +1606,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
@Override @Override
public TabCreator getTabCreator(boolean incognito) { public TabCreator getTabCreator(boolean incognito) {
if (!mTabModelsInitialized) { if (!mTabModelOrchestrator.areTabModelsInitialized()) {
throw new IllegalStateException( throw new IllegalStateException(
"Attempting to access TabCreator before initialization"); "Attempting to access TabCreator before initialization");
} }
...@@ -1663,7 +1673,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1663,7 +1673,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 (!mTabModelsInitialized) { if (!mTabModelOrchestrator.areTabModelsInitialized()) {
return null; return null;
} }
return TabModelUtils.getCurrentTab(getCurrentTabModel()); return TabModelUtils.getCurrentTab(getCurrentTabModel());
...@@ -1674,7 +1684,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1674,7 +1684,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
* WebContents. * WebContents.
*/ */
public WebContents getCurrentWebContents() { public WebContents getCurrentWebContents() {
if (!mTabModelsInitialized) { if (!mTabModelOrchestrator.areTabModelsInitialized()) {
return null; return null;
} }
return TabModelUtils.getCurrentWebContents(getCurrentTabModel()); return TabModelUtils.getCurrentWebContents(getCurrentTabModel());
...@@ -1997,7 +2007,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1997,7 +2007,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 = mTabModelSelector.isIncognitoSelected() Profile profile = getTabModelSelector().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,19 +5,15 @@ ...@@ -5,19 +5,15 @@
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.multiwindow.MultiInstanceManager; import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
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.
...@@ -29,32 +25,11 @@ public class DefaultTabModelSelectorFactory implements TabModelSelectorFactory { ...@@ -29,32 +25,11 @@ 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();
return new TabModelSelectorImpl(activity, /*windowAndroidSupplier=*/null, tabCreatorManager, AsyncTabParamsManager asyncTabParamsManager = AsyncTabParamsManagerSingleton.getInstance();
persistencePolicy, tabModelFilterFactory, nextTabPolicySupplier,
AsyncTabParamsManagerSingleton.getInstance(), true, true, false); return new TabModelSelectorImpl(/*windowAndroidSupplier=*/null, tabCreatorManager,
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 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.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
mTabModelSelector =
(TabModelSelectorImpl) TabWindowManagerSingleton.getInstance().requestSelector(
activity, tabCreatorManager, nextTabPolicySupplier, selectorIndex);
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(selectorIndex, 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,6 +24,7 @@ import org.chromium.chrome.R; ...@@ -24,6 +24,7 @@ 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;
...@@ -45,7 +46,6 @@ import org.chromium.chrome.browser.night_mode.SystemNightModeMonitor; ...@@ -45,7 +46,6 @@ 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,8 +293,20 @@ public abstract class BaseCustomTabActivity extends ChromeActivity<BaseCustomTab ...@@ -293,8 +293,20 @@ public abstract class BaseCustomTabActivity extends ChromeActivity<BaseCustomTab
} }
@Override @Override
protected TabModelSelector createTabModelSelector() { protected TabModelOrchestrator createTabModelOrchestrator() {
return mTabFactory.createTabModelSelector(); return mTabFactory.createTabModelOrchestrator();
}
@Override
protected void destroyTabModels() {
if (mTabFactory != null) {
mTabFactory.destroyTabModelOrchestrator();
}
}
@Override
protected void createTabModels() {
mTabFactory.createTabModels();
} }
@Override @Override
......
...@@ -15,6 +15,8 @@ import org.chromium.chrome.browser.IntentHandler; ...@@ -15,6 +15,8 @@ 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;
...@@ -26,7 +28,6 @@ import org.chromium.chrome.browser.tab.TabDelegateFactory; ...@@ -26,7 +28,6 @@ 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;
...@@ -56,7 +57,7 @@ public class CustomTabActivityTabFactory { ...@@ -56,7 +57,7 @@ public class CustomTabActivityTabFactory {
private final Lazy<AsyncTabParamsManager> mAsyncTabParamsManager; private final Lazy<AsyncTabParamsManager> mAsyncTabParamsManager;
@Nullable @Nullable
private TabModelSelectorImpl mTabModelSelector; private CustomTabsTabModelOrchestrator mTabModelOrchestrator;
@Inject @Inject
public CustomTabActivityTabFactory(ChromeActivity<?> activity, public CustomTabActivityTabFactory(ChromeActivity<?> activity,
...@@ -77,21 +78,35 @@ public class CustomTabActivityTabFactory { ...@@ -77,21 +78,35 @@ public class CustomTabActivityTabFactory {
mAsyncTabParamsManager = asyncTabParamsManager; mAsyncTabParamsManager = asyncTabParamsManager;
} }
/** Creates a {@link TabModelSelector} for the custom tab. */ /** Creates a {@link TabModelOrchestrator} for the custom tab. */
public TabModelSelectorImpl createTabModelSelector() { public TabModelOrchestrator createTabModelOrchestrator() {
mTabModelSelector = new TabModelSelectorImpl(mActivity, mActivityWindowAndroid::get, mTabModelOrchestrator = new CustomTabsTabModelOrchestrator();
mActivity, mPersistencePolicy, mTabModelFilterFactory, return mTabModelOrchestrator;
() -> 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 (mTabModelSelector == null) { if (mTabModelOrchestrator == null) {
assert false;
createTabModelOrchestrator();
}
if (mTabModelOrchestrator.getTabModelSelector() == null) {
assert false; assert false;
return createTabModelSelector(); createTabModels();
} }
return mTabModelSelector; return mTabModelOrchestrator.getTabModelSelector();
} }
/** Creates a {@link ChromeTabCreator}s for the custom tab. */ /** Creates a {@link ChromeTabCreator}s for the custom tab. */
......
...@@ -34,12 +34,11 @@ import org.chromium.base.test.util.Feature; ...@@ -34,12 +34,11 @@ 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;
...@@ -456,12 +455,11 @@ public class CustomTabTabPersistencePolicyTest { ...@@ -456,12 +455,11 @@ public class CustomTabTabPersistencePolicyTest {
CustomTabActivity activity = new CustomTabActivity(); CustomTabActivity activity = new CustomTabActivity();
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
NextTabPolicySupplier nextTabPolicySupplier = () -> NextTabPolicy.LOCATIONAL; CustomTabsTabModelOrchestrator orchestrator = new CustomTabsTabModelOrchestrator();
orchestrator.createTabModels(activity::getWindowAndroid, activity,
TabModelSelectorImpl selector = new TabModelSelectorImpl(activity, new ChromeTabModelFilterFactory(), buildTestPersistencePolicy(),
activity::getWindowAndroid, activity, buildTestPersistencePolicy(), AsyncTabParamsManagerSingleton.getInstance());
new ChromeTabModelFilterFactory(), nextTabPolicySupplier, TabModelSelectorImpl selector = orchestrator.getTabModelSelector();
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;
......
...@@ -67,8 +67,7 @@ public class ContextMenuLoadUrlParamsTest { ...@@ -67,8 +67,7 @@ public class ContextMenuLoadUrlParamsTest {
public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager, public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabModelFilterFactory tabModelFilterFactory, int selectorIndex) { TabModelFilterFactory tabModelFilterFactory, int selectorIndex) {
super(activity, null, tabCreatorManager, super(null, tabCreatorManager, tabModelFilterFactory,
new TabbedModeTabPersistencePolicy(selectorIndex, false), tabModelFilterFactory,
() ()
-> NextTabPolicy.HIERARCHICAL, -> NextTabPolicy.HIERARCHICAL,
AsyncTabParamsManagerSingleton.getInstance(), false, false, false); AsyncTabParamsManagerSingleton.getInstance(), false, false, false);
......
...@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout ...@@ -30,6 +30,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.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;
...@@ -237,10 +238,16 @@ public class TabPersistentStoreTest { ...@@ -237,10 +238,16 @@ public class TabPersistentStoreTest {
} }
@Override @Override
protected TabModelSelector createTabModelSelector() { protected TabModelOrchestrator createTabModelOrchestrator() {
return null; return null;
} }
@Override
protected void createTabModels() {}
@Override
protected void destroyTabModels() {}
@Override @Override
protected BrowserControlsManager createBrowserControlsManager() { protected BrowserControlsManager createBrowserControlsManager() {
return null; return null;
......
...@@ -8,8 +8,6 @@ import static org.mockito.ArgumentMatchers.any; ...@@ -8,8 +8,6 @@ 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;
...@@ -17,7 +15,6 @@ import org.junit.runner.RunWith; ...@@ -17,7 +15,6 @@ 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;
...@@ -37,8 +34,6 @@ import org.chromium.ui.base.WindowAndroid; ...@@ -37,8 +34,6 @@ 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
...@@ -50,27 +45,22 @@ public class TabModelSelectorImplTest { ...@@ -50,27 +45,22 @@ 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(mActivity, null, mTabCreatorManager, mTabModelSelector = new TabModelSelectorImpl(null, mTabCreatorManager,
mMockTabPersistencePolicy, mMockTabModelFilterFactory, mNextTabPolicySupplier, mMockTabModelFilterFactory, mNextTabPolicySupplier, realAsyncTabParamsManager,
realAsyncTabParamsManager, /*supportUndo=*/false, /*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));
......
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