Index: chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java |
index 887ead6f414b8ee53da888de7ac762e055a566de..a78936779d4582719fe9f988b11935cea6a9eca3 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java |
@@ -11,9 +11,11 @@ import android.util.SparseArray; |
import org.chromium.base.ThreadUtils; |
import org.chromium.chrome.browser.TabState; |
import org.chromium.chrome.browser.tab.Tab; |
+import org.chromium.chrome.browser.tab.TabIdManager; |
import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; |
import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver; |
+import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabModelMetaDataInfo; |
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; |
import org.chromium.content.browser.test.NativeLibraryTestBase; |
import org.chromium.content.browser.test.util.CallbackHelper; |
@@ -34,8 +36,8 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
public boolean isIncognitoActiveIndex; |
/** Store information about a Tab that's been restored. */ |
- TabRestoredDetails(int index, int id, String url, boolean isStandardActiveIndex, |
- boolean isIncognitoActiveIndex) { |
+ TabRestoredDetails(int index, int id, String url, |
+ boolean isStandardActiveIndex, boolean isIncognitoActiveIndex) { |
this.index = index; |
this.id = id; |
this.url = url; |
@@ -57,14 +59,14 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
@Override |
public Tab createNewTab( |
LoadUrlParams loadUrlParams, TabModel.TabLaunchType type, Tab parent) { |
+ int id = TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID); |
+ storeTabInfo(null, id); |
return null; |
} |
@Override |
public Tab createFrozenTab(TabState state, int id, int index) { |
- if (created.size() == 0) idOfFirstCreatedTab = id; |
- created.put(id, state); |
- callback.notifyCalled(); |
+ storeTabInfo(state, id); |
return null; |
} |
@@ -78,6 +80,12 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
public Tab launchUrl(String url, TabModel.TabLaunchType type) { |
return null; |
} |
+ |
+ private void storeTabInfo(TabState state, int id) { |
+ if (created.size() == 0) idOfFirstCreatedTab = id; |
+ created.put(id, state); |
+ callback.notifyCalled(); |
+ } |
} |
private static class MockTabCreatorManager implements TabCreatorManager { |
@@ -105,8 +113,8 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
} |
@Override |
- public void onDetailsRead(int index, int id, String url, boolean isStandardActiveIndex, |
- boolean isIncognitoActiveIndex) { |
+ public void onDetailsRead(int index, int id, String url, |
+ boolean isStandardActiveIndex, boolean isIncognitoActiveIndex) { |
mDetails.add(new TabRestoredDetails( |
index, id, url, isStandardActiveIndex, isIncognitoActiveIndex)); |
detailsReadCallback.notifyCalled(); |
@@ -137,10 +145,12 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
@SmallTest |
public void testBasic() throws Exception { |
+ mMockDirectory.writeTabModelFiles(TestTabModelDirectory.TAB_MODEL_METADATA_V4, true); |
+ |
// Set up the TabPersistentStore. |
Context context = getInstrumentation().getTargetContext(); |
TabPersistentStore.setBaseStateDirectory(mMockDirectory.getBaseDirectory()); |
- int numExpectedTabs = TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS.length; |
+ int numExpectedTabs = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents.length; |
MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null); |
MockTabCreatorManager mockManager = new MockTabCreatorManager(); |
@@ -159,9 +169,9 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
for (int i = 0; i < numExpectedTabs; i++) { |
TabRestoredDetails details = mockObserver.mDetails.get(i); |
assertEquals(i, details.index); |
- assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[i].tabId, details.id); |
- assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[i].url, details.url); |
- assertEquals(details.id == TestTabModelDirectory.TAB_MODEL_METADATA_V4_SELECTED_ID, |
+ assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i].tabId, details.id); |
+ assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i].url, details.url); |
+ assertEquals(details.id == TestTabModelDirectory.TAB_MODEL_METADATA_V4.selectedTabId, |
details.isStandardActiveIndex); |
assertEquals(false, details.isIncognitoActiveIndex); |
} |
@@ -169,22 +179,24 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
// Restore the TabStates. The first Tab added should be the most recently selected tab. |
store.restoreTabs(true); |
regularCreator.callback.waitForCallback(0, 1); |
- assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4_SELECTED_ID, |
+ assertEquals(TestTabModelDirectory.TAB_MODEL_METADATA_V4.selectedTabId, |
regularCreator.idOfFirstCreatedTab); |
// Confirm that all the TabStates were read from storage (i.e. non-null). |
mockObserver.stateLoadedCallback.waitForCallback(0, 1); |
- for (int i = 0; i < TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS.length; i++) { |
- int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[i].tabId; |
+ for (int i = 0; i < TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents.length; i++) { |
+ int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i].tabId; |
assertNotNull(regularCreator.created.get(tabId)); |
} |
} |
@SmallTest |
public void testInterruptedButStillRestoresAllTabs() throws Exception { |
+ mMockDirectory.writeTabModelFiles(TestTabModelDirectory.TAB_MODEL_METADATA_V4, true); |
+ |
Context context = getInstrumentation().getTargetContext(); |
TabPersistentStore.setBaseStateDirectory(mMockDirectory.getBaseDirectory()); |
- int numExpectedTabs = TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS.length; |
+ int numExpectedTabs = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents.length; |
// Load up one TabPersistentStore, but don't load up the TabState files. This prevents the |
// Tabs from being added to the TabModel. |
@@ -230,8 +242,8 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
// TODO(dfalcantara): Revisit this bit when tab ordering is correctly preserved. |
TestTabModelDirectory.TabStateInfo currentInfo = null; |
for (int j = 0; j < numExpectedTabs && currentInfo == null; j++) { |
- if (TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[j].tabId == details.id) { |
- currentInfo = TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[j]; |
+ if (TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[j].tabId == details.id) { |
+ currentInfo = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[j]; |
} |
} |
@@ -247,8 +259,91 @@ public class TabPersistentStoreTest extends NativeLibraryTestBase { |
secondStore.restoreTabs(true); |
secondObserver.stateLoadedCallback.waitForCallback(0, 1); |
for (int i = 0; i < numExpectedTabs; i++) { |
- int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4_CONTENTS[i].tabId; |
+ int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i].tabId; |
assertNotNull(secondCreator.created.get(tabId)); |
} |
} |
+ |
+ @SmallTest |
+ public void testMissingTabStateButStillRestoresTab() throws Exception { |
+ TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5; |
+ |
+ // Write out info for all but the third tab (arbitrarily chosen). |
+ mMockDirectory.writeTabModelFiles(info, false); |
+ for (int i = 0; i < info.contents.length; i++) { |
+ if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]); |
+ } |
+ |
+ // Set up the TabPersistentStore. |
+ Context context = getInstrumentation().getTargetContext(); |
+ TabPersistentStore.setBaseStateDirectory(mMockDirectory.getBaseDirectory()); |
+ int numExpectedTabs = info.contents.length; |
+ |
+ MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null); |
+ MockTabCreatorManager mockManager = new MockTabCreatorManager(); |
+ MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStoreObserver(); |
+ TabPersistentStore store = |
+ new TabPersistentStore(mockSelector, 0, context, mockManager, mockObserver); |
+ |
+ // Make sure the metadata file loads properly and in order. |
+ store.loadState(); |
+ mockObserver.initializedCallback.waitForCallback(0, 1); |
+ assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); |
+ |
+ mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); |
+ assertEquals(numExpectedTabs, mockObserver.mDetails.size()); |
+ for (int i = 0; i < numExpectedTabs; i++) { |
+ TabRestoredDetails details = mockObserver.mDetails.get(i); |
+ assertEquals(i, details.index); |
+ assertEquals(info.contents[i].tabId, details.id); |
+ assertEquals(info.contents[i].url, details.url); |
+ assertEquals(details.id == info.selectedTabId, details.isStandardActiveIndex); |
+ assertEquals(false, details.isIncognitoActiveIndex); |
+ } |
+ |
+ // Restore the TabStates, and confirm that the correct number of tabs is created even with |
+ // one missing. |
+ store.restoreTabs(true); |
+ mockObserver.stateLoadedCallback.waitForCallback(0, 1); |
+ assertEquals(info.contents.length, mockManager.regularCreator.created.size()); |
+ } |
+ |
+ @SmallTest |
+ public void testRestoresTabWithMissingTabStateWhileIgnoringIncognitoTab() throws Exception { |
+ TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_WITH_INCOGNITO; |
+ |
+ // Write out info for all but the third tab (arbitrarily chosen). |
+ mMockDirectory.writeTabModelFiles(info, false); |
+ for (int i = 0; i < info.contents.length; i++) { |
+ if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]); |
+ } |
+ |
+ // Set up the TabPersistentStore. |
+ Context context = getInstrumentation().getTargetContext(); |
+ TabPersistentStore.setBaseStateDirectory(mMockDirectory.getBaseDirectory()); |
+ int numExpectedTabs = info.contents.length; |
+ |
+ MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null); |
+ MockTabCreatorManager mockManager = new MockTabCreatorManager(); |
+ MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStoreObserver(); |
+ TabPersistentStore store = |
+ new TabPersistentStore(mockSelector, 0, context, mockManager, mockObserver); |
+ |
+ // Load the TabModel metadata. |
+ store.loadState(); |
+ mockObserver.initializedCallback.waitForCallback(0, 1); |
+ assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); |
+ mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); |
+ assertEquals(numExpectedTabs, mockObserver.mDetails.size()); |
+ |
+ // TODO(dfalcantara): Expand MockTabModel* to support frozen and Incognito Tabs, then change |
+ // the MockTabCreators so they actually create Tabs. |
+ |
+ // Restore the TabStates, and confirm that the correct number of tabs is created even with |
+ // one missing. No Incognito tabs should be created because the TabState is missing. |
+ store.restoreTabs(true); |
+ mockObserver.stateLoadedCallback.waitForCallback(0, 1); |
+ assertEquals(info.getNumRegularTabs(), mockManager.regularCreator.created.size()); |
+ assertEquals(0, mockManager.incognitoCreator.created.size()); |
+ } |
} |