Commit c11274ed authored by Rohit Agarwal's avatar Rohit Agarwal Committed by Commit Bot

Refactor TabModelImpl to take profile instead of boolean for incognito.

This CL refactors the TabModel related code and tests to support
passing profiles instead of boolean for incognito.

Bug: 1099642
Change-Id: I05eb4b036a32ed39b518c8034590e52a64cb6197
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2320276Reviewed-by: default avatarRohit Agarwal <roagarwal@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Commit-Queue: Rohit Agarwal <roagarwal@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807877}
parent add84afc
......@@ -78,8 +78,8 @@ public class CustomTabActivityTabFactory {
/** Creates a {@link TabModelSelector} for the custom tab. */
public TabModelSelectorImpl createTabModelSelector() {
mTabModelSelector = new TabModelSelectorImpl(mActivity, mActivity, mPersistencePolicy,
mTabModelFilterFactory,
mTabModelSelector = new TabModelSelectorImpl(mActivity, mActivityWindowAndroid::get,
mActivity, mPersistencePolicy, mTabModelFilterFactory,
() -> NextTabPolicy.LOCATIONAL, mAsyncTabParamsManager.get(), false, false, false);
return mTabModelSelector;
}
......
......@@ -4,9 +4,17 @@
package org.chromium.chrome.browser.tabmodel;
import static org.chromium.chrome.browser.incognito.IncognitoUtils.getNonPrimaryOTRProfileFromWindowAndroid;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tabmodel.IncognitoTabModelImpl.IncognitoTabModelDelegate;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.ui.base.WindowAndroid;
/**
* Stores all the variables needed to create an Incognito TabModelImpl when it is needed.
......@@ -22,12 +30,19 @@ class IncognitoTabModelImplCreator implements IncognitoTabModelDelegate {
private final AsyncTabParamsManager mAsyncTabParamsManager;
private final TabModelDelegate mModelDelegate;
// This is passed in as null if the {@link WindowAndroid} instance doesn't belong to an
// incognito CustomTabActivity.
@Nullable
private final Supplier<WindowAndroid> mWindowAndroidSupplier;
/**
* Constructor for an IncognitoTabModelImplCreator, used by {@link IncognitoTabModelImpl}.
*
* Creating an instance of this class does not create the Incognito TabModelImpl immediately.
* The {@link IncognitoTabModelImpl} will use this class to create the real TabModelImpl when it
* will actually be used.
*
* @param windowAndroidSupplier The supplier to the {@link WindowAndroid} instance.
* @param regularTabCreator Creates regular tabs.
* @param incognitoTabCreator Creates incognito tabs.
* @param uma Handles UMA tracking for the model.
......@@ -38,11 +53,12 @@ class IncognitoTabModelImplCreator implements IncognitoTabModelDelegate {
* @param asyncTabParamsManager An {@link AsyncTabParamsManager} instance.
* @param modelDelegate Delegate to handle external dependencies and interactions.
*/
public IncognitoTabModelImplCreator(TabCreator regularTabCreator,
TabCreator incognitoTabCreator, TabModelSelectorUma uma,
public IncognitoTabModelImplCreator(@Nullable Supplier<WindowAndroid> windowAndroidSupplier,
TabCreator regularTabCreator, TabCreator incognitoTabCreator, TabModelSelectorUma uma,
TabModelOrderController orderController, TabContentManager tabContentManager,
TabPersistentStore tabSaver, NextTabPolicySupplier nextTabPolicySupplier,
AsyncTabParamsManager asyncTabParamsManager, TabModelDelegate modelDelegate) {
mWindowAndroidSupplier = windowAndroidSupplier;
mRegularTabCreator = regularTabCreator;
mIncognitoTabCreator = incognitoTabCreator;
mUma = uma;
......@@ -54,9 +70,26 @@ class IncognitoTabModelImplCreator implements IncognitoTabModelDelegate {
mModelDelegate = modelDelegate;
}
private @NonNull Profile getOTRProfile() {
if (mWindowAndroidSupplier != null) {
Profile otrProfile =
getNonPrimaryOTRProfileFromWindowAndroid(mWindowAndroidSupplier.get());
// TODO(crbug.com/1023759): PaymentHandlerActivity is an exceptional case that uses the
// primary OTR profile. PaymentHandlerActivity would use incognito CCT when the
// Incognito CCT flag is enabled by default in which case we would return the non
// primary OTR profile.
if (otrProfile == null) {
return Profile.getLastUsedRegularProfile().getPrimaryOTRProfile();
}
}
return Profile.getLastUsedRegularProfile().getPrimaryOTRProfile();
}
@Override
public TabModel createTabModel() {
return new TabModelImpl(true, false, mRegularTabCreator, mIncognitoTabCreator, mUma,
Profile otrProfile = getOTRProfile();
return new TabModelImpl(otrProfile, false, mRegularTabCreator, mIncognitoTabCreator, mUma,
mOrderController, mTabContentManager, mTabSaver, mNextTabPolicySupplier,
mAsyncTabParamsManager, mModelDelegate, false);
}
......
......@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.tabmodel;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.MathUtils;
......@@ -84,13 +85,13 @@ public class TabModelImpl extends TabModelJniBridge {
*/
private boolean mIsUndoSupported = true;
public TabModelImpl(boolean incognito, boolean isTabbedActivity, TabCreator regularTabCreator,
TabCreator incognitoTabCreator, TabModelSelectorUma uma,
public TabModelImpl(@NonNull Profile profile, boolean isTabbedActivity,
TabCreator regularTabCreator, TabCreator incognitoTabCreator, TabModelSelectorUma uma,
TabModelOrderController orderController, TabContentManager tabContentManager,
TabPersistentStore tabSaver, NextTabPolicySupplier nextTabPolicySupplier,
AsyncTabParamsManager asyncTabParamsManager, TabModelDelegate modelDelegate,
boolean supportUndo) {
super(incognito, isTabbedActivity);
super(profile, isTabbedActivity);
mRegularTabCreator = regularTabCreator;
mIncognitoTabCreator = incognitoTabCreator;
mUma = uma;
......@@ -103,10 +104,9 @@ public class TabModelImpl extends TabModelJniBridge {
mIsUndoSupported = supportUndo;
mObservers = new ObserverList<TabModelObserver>();
// The call to initializeNative() should be as late as possible, as it results in calling
// observers on the native side, which may in turn call |addObserver()| on this object. This
// needs to be before the call to getProfile() to ensure native is running.
initializeNative();
mRecentlyClosedBridge = new RecentlyClosedBridge(getProfile());
// observers on the native side, which may in turn call |addObserver()| on this object.
initializeNative(profile);
mRecentlyClosedBridge = new RecentlyClosedBridge(profile);
}
@Override
......
......@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.tabmodel;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.annotations.CalledByNative;
......@@ -41,17 +42,14 @@ public abstract class TabModelJniBridge implements TabModel {
*/
private boolean mIsTabbedActivityForSync;
public TabModelJniBridge(boolean isIncognito, boolean isTabbedActivity) {
mIsIncognito = isIncognito;
public TabModelJniBridge(@NonNull Profile profile, boolean isTabbedActivity) {
mIsIncognito = profile.isOffTheRecord();
mIsTabbedActivityForSync = isTabbedActivity;
}
/** Initializes the native-side counterpart to this class. */
protected void initializeNative() {
protected void initializeNative(Profile profile) {
assert mNativeTabModelJniBridge == 0;
// TODO(https://crbug.com/1099642): Pass the correct OTR profile.
Profile profile = Profile.getLastUsedRegularProfile();
if (mIsIncognito) profile = profile.getPrimaryOTRProfile();
mNativeTabModelJniBridge = TabModelJniBridgeJni.get().init(
TabModelJniBridge.this, profile, mIsTabbedActivityForSync);
}
......
......@@ -10,7 +10,9 @@ import android.os.Handler;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.SadTab;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
......@@ -56,9 +58,13 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
private CloseAllTabsDelegate mCloseAllTabsDelegate;
private final Supplier<WindowAndroid> mWindowAndroidSupplier;
/**
* Builds a {@link TabModelSelectorImpl} instance.
* @param activity An {@link Activity} instance.
* @param windowAndroidSupplier A supplier of {@link WindowAndroid} instance which is passed
* down to {@link IncognitoTabModelImplCreator} for creating {@link IncognitoTabModel}.
* @param tabCreatorManager A {@link TabCreatorManager} instance.
* @param persistencePolicy A {@link TabPersistencePolicy} instance.
* @param tabModelFilterFactory
......@@ -66,12 +72,15 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
* @param asyncTabParamsManager
* @param supportUndo Whether a tab closure can be undone.
*/
public TabModelSelectorImpl(Activity activity, TabCreatorManager tabCreatorManager,
TabPersistencePolicy persistencePolicy, TabModelFilterFactory tabModelFilterFactory,
public TabModelSelectorImpl(Activity activity,
@Nullable Supplier<WindowAndroid> windowAndroidSupplier,
TabCreatorManager tabCreatorManager, TabPersistencePolicy persistencePolicy,
TabModelFilterFactory tabModelFilterFactory,
NextTabPolicySupplier nextTabPolicySupplier,
AsyncTabParamsManager asyncTabParamsManager, boolean supportUndo,
boolean isTabbedActivity, boolean startIncognito) {
super(tabCreatorManager, tabModelFilterFactory, startIncognito);
mWindowAndroidSupplier = windowAndroidSupplier;
mUma = new TabModelSelectorUma(activity);
final TabPersistentStoreObserver persistentStoreObserver =
new TabPersistentStoreObserver() {
......@@ -128,14 +137,16 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
(ChromeTabCreator) getTabCreatorManager().getTabCreator(false);
ChromeTabCreator incognitoTabCreator =
(ChromeTabCreator) getTabCreatorManager().getTabCreator(true);
TabModel normalModel = new TabModelImpl(false, mIsTabbedActivityForSync, regularTabCreator,
incognitoTabCreator, mUma, mOrderController, mTabContentManager, mTabSaver,
mNextTabPolicySupplier, mAsyncTabParamsManager, this, mIsUndoSupported);
IncognitoTabModel incognitoModel =
new IncognitoTabModelImpl(new IncognitoTabModelImplCreator(regularTabCreator,
TabModelImpl normalModel = new TabModelImpl(Profile.getLastUsedRegularProfile(),
mIsTabbedActivityForSync, regularTabCreator, incognitoTabCreator, mUma,
mOrderController, mTabContentManager, mTabSaver, mNextTabPolicySupplier,
mAsyncTabParamsManager, this, mIsUndoSupported);
regularTabCreator.setTabModel(normalModel, mOrderController);
IncognitoTabModel incognitoModel = new IncognitoTabModelImpl(
new IncognitoTabModelImplCreator(mWindowAndroidSupplier, regularTabCreator,
incognitoTabCreator, mUma, mOrderController, mTabContentManager, mTabSaver,
mNextTabPolicySupplier, mAsyncTabParamsManager, this));
regularTabCreator.setTabModel(normalModel, mOrderController);
incognitoTabCreator.setTabModel(incognitoModel, mOrderController);
onNativeLibraryReadyInternal(tabContentProvider, normalModel, incognitoModel);
}
......
......@@ -261,9 +261,9 @@ public class TabWindowManager implements ActivityStateListener {
TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePolicy(
selectorIndex, mergeTabs);
TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory();
return new TabModelSelectorImpl(activity, tabCreatorManager, persistencePolicy,
tabModelFilterFactory, nextTabPolicySupplier,
AsyncTabParamsManager.getInstance(), true, true, false);
return new TabModelSelectorImpl(activity, /*windowAndroidSupplier=*/null,
tabCreatorManager, persistencePolicy, tabModelFilterFactory,
nextTabPolicySupplier, AsyncTabParamsManager.getInstance(), true, true, false);
}
}
}
......@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabStateFileManager;
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.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
......@@ -454,10 +455,12 @@ public class CustomTabTabPersistencePolicyTest {
CustomTabActivity activity = new CustomTabActivity();
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
TabModelSelectorImpl selector = new TabModelSelectorImpl(activity, activity,
buildTestPersistencePolicy(), new ChromeTabModelFilterFactory(),
()
-> NextTabPolicy.LOCATIONAL,
NextTabPolicySupplier nextTabPolicySupplier = () -> NextTabPolicy.LOCATIONAL;
TabModelSelectorImpl selector = new TabModelSelectorImpl(activity,
activity::getWindowAndroid, activity, buildTestPersistencePolicy(),
new ChromeTabModelFilterFactory(), nextTabPolicySupplier,
AsyncTabParamsManager.getInstance(), false, false, false);
selector.initializeForTesting(normalTabModel, incognitoTabModel);
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
......
......@@ -66,7 +66,7 @@ public class ContextMenuLoadUrlParamsTest {
public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabModelFilterFactory tabModelFilterFactory, int selectorIndex) {
super(activity, tabCreatorManager,
super(activity, null, tabCreatorManager,
new TabbedModeTabPersistencePolicy(selectorIndex, false), tabModelFilterFactory,
()
-> NextTabPolicy.HIERARCHICAL,
......
......@@ -11,6 +11,7 @@ import org.junit.runners.model.Statement;
import org.chromium.base.CommandLine;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
......@@ -116,13 +117,15 @@ public class TabModelSelectorObserverTestRule extends ChromeBrowserTestRule {
return false;
}
};
mNormalTabModel =
new TabModelSelectorTestTabModel(false, orderController, tabContentManager,
tabPersistentStore, nextTabPolicySupplier, asyncTabParamsManager, delegate);
mIncognitoTabModel =
new TabModelSelectorTestIncognitoTabModel(orderController, tabContentManager,
tabPersistentStore, nextTabPolicySupplier, asyncTabParamsManager, delegate);
mNormalTabModel = new TabModelSelectorTestTabModel(Profile.getLastUsedRegularProfile(),
orderController, tabContentManager, tabPersistentStore, nextTabPolicySupplier,
asyncTabParamsManager, delegate);
mIncognitoTabModel = new TabModelSelectorTestIncognitoTabModel(
Profile.getLastUsedRegularProfile().getPrimaryOTRProfile(), orderController,
tabContentManager, tabPersistentStore, nextTabPolicySupplier, asyncTabParamsManager,
delegate);
mSelector.initialize(mNormalTabModel, mIncognitoTabModel);
}
......@@ -133,11 +136,11 @@ public class TabModelSelectorObserverTestRule extends ChromeBrowserTestRule {
public static class TabModelSelectorTestTabModel extends TabModelImpl {
private Set<TabModelObserver> mObserverSet = new HashSet<>();
public TabModelSelectorTestTabModel(boolean incognito,
public TabModelSelectorTestTabModel(Profile profile,
TabModelOrderController orderController, TabContentManager tabContentManager,
TabPersistentStore tabPersistentStore, NextTabPolicySupplier nextTabPolicySupplier,
AsyncTabParamsManager asyncTabParamsManager, TabModelDelegate modelDelegate) {
super(incognito, false, null, null, null, orderController, tabContentManager,
super(profile, false, null, null, null, orderController, tabContentManager,
tabPersistentStore, nextTabPolicySupplier, asyncTabParamsManager, modelDelegate,
false);
}
......@@ -164,12 +167,13 @@ public class TabModelSelectorObserverTestRule extends ChromeBrowserTestRule {
*/
public static class TabModelSelectorTestIncognitoTabModel
extends TabModelSelectorTestTabModel implements IncognitoTabModel {
public TabModelSelectorTestIncognitoTabModel(TabModelOrderController orderController,
TabContentManager tabContentManager, TabPersistentStore tabPersistentStore,
NextTabPolicySupplier nextTabPolicySupplier,
public TabModelSelectorTestIncognitoTabModel(Profile profile,
TabModelOrderController orderController, TabContentManager tabContentManager,
TabPersistentStore tabPersistentStore, NextTabPolicySupplier nextTabPolicySupplier,
AsyncTabParamsManager asyncTabParamsManager, TabModelDelegate modelDelegate) {
super(true, orderController, tabContentManager, tabPersistentStore,
nextTabPolicySupplier, asyncTabParamsManager, modelDelegate);
super(Profile.getLastUsedRegularProfile().getPrimaryOTRProfile(), orderController,
tabContentManager, tabPersistentStore, nextTabPolicySupplier,
asyncTabParamsManager, modelDelegate);
}
@Override
......
......@@ -34,6 +34,7 @@ import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tab.TabState;
......@@ -110,27 +111,26 @@ public class TabPersistentStoreTest {
}
});
mTabModelOrderController = new TabModelOrderControllerImpl(this);
NextTabPolicySupplier nextTabPolicySupplier = () -> NextTabPolicy.HIERARCHICAL;
Callable<TabModelImpl> callable = new Callable<TabModelImpl>() {
@Override
public TabModelImpl call() {
return new TabModelImpl(false, false,
return new TabModelImpl(Profile.getLastUsedRegularProfile(), false,
getTabCreatorManager().getTabCreator(false),
getTabCreatorManager().getTabCreator(true), null,
mTabModelOrderController, null, mTabPersistentStore,
()
-> NextTabPolicy.HIERARCHICAL,
AsyncTabParamsManager.getInstance(), TestTabModelSelector.this, true);
nextTabPolicySupplier, AsyncTabParamsManager.getInstance(),
TestTabModelSelector.this, true);
}
};
TabModel regularTabModel = TestThreadUtils.runOnUiThreadBlocking(callable);
IncognitoTabModel incognitoTabModel = new IncognitoTabModelImpl(
new IncognitoTabModelImplCreator(getTabCreatorManager().getTabCreator(false),
TabModelImpl regularTabModel = TestThreadUtils.runOnUiThreadBlocking(callable);
IncognitoTabModel incognitoTabModel =
new IncognitoTabModelImpl(new IncognitoTabModelImplCreator(null,
getTabCreatorManager().getTabCreator(false),
getTabCreatorManager().getTabCreator(true), null,
mTabModelOrderController, null, mTabPersistentStore,
()
-> NextTabPolicy.HIERARCHICAL,
AsyncTabParamsManager.getInstance(), this));
nextTabPolicySupplier, AsyncTabParamsManager.getInstance(), this));
initialize(regularTabModel, incognitoTabModel);
}
......
......@@ -65,11 +65,10 @@ public class TabModelSelectorImplTest {
.when(mMockTabModelFilterFactory)
.createTabModelFilter(any());
mTabCreatorManager = new MockTabCreatorManager();
mTabModelSelector = new TabModelSelectorImpl(mActivity, mTabCreatorManager,
mTabModelSelector = new TabModelSelectorImpl(mActivity, null, mTabCreatorManager,
mMockTabPersistencePolicy, mMockTabModelFilterFactory, mNextTabPolicySupplier,
AsyncTabParamsManager.getInstance(), /*supportUndo=*/false,
/*isTabbedActivity=*/false,
/*startIncognito=*/false);
/*isTabbedActivity=*/false, /*startIncognito=*/false);
mTabCreatorManager.initialize(mTabModelSelector);
mTabModelSelector.onNativeLibraryReadyInternal(mMockTabContentManager,
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