Chromium Code Reviews| Index: chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java |
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java |
| index 450008e09e7430010450826c8935ed3bfbc5039d..980b9c93f6c84abc2aa16719c89000745e3efc6f 100644 |
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java |
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java |
| @@ -9,6 +9,8 @@ import android.test.suitebuilder.annotation.MediumTest; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.test.util.FlakyTest; |
| import org.chromium.base.test.util.Restriction; |
| +import org.chromium.base.test.util.UrlUtils; |
| +import org.chromium.chrome.browser.tab.EmptyTabObserver; |
| import org.chromium.chrome.browser.tab.Tab; |
| import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; |
| @@ -24,6 +26,7 @@ import java.util.concurrent.TimeoutException; |
| */ |
| public class UndoTabModelTest extends ChromeTabbedActivityTestBase { |
| private static final Tab[] EMPTY = new Tab[] { }; |
| + private static final String TEST_URL = UrlUtils.encodeHtmlDataUri("<html>poit.</html>"); |
| @Override |
| public void startMainActivity() throws InterruptedException { |
| @@ -75,6 +78,17 @@ public class UndoTabModelTest extends ChromeTabbedActivityTestBase { |
| }); |
| } |
| + private void createTabOnUiThread(final ChromeTabCreator tabCreator, final String url) { |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + tabCreator.createNewTab(new LoadUrlParams(url), |
| + TabLaunchType.FROM_CHROME_UI, null); |
| + } |
| + }); |
| + } |
| + |
| + |
| private void selectTabOnUiThread(final TabModel model, final Tab tab) { |
| ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| @Override |
| @@ -321,6 +335,15 @@ public class UndoTabModelTest extends ChromeTabbedActivityTestBase { |
| } |
| } |
| + private void openRecentClosedTabOnUiThread(final TabModelSelector selector) { |
|
Theresa
2016/06/29 23:53:29
nit: openRecentlyClosedTabOnUiThread
xingliu
2016/06/30 05:43:55
Done.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + ((TabModelSelectorImpl) selector).getCurrentModel().openRecentClosedTab(); |
| + } |
| + }); |
| + } |
| + |
| /** |
| * Test undo with a single tab with the following actions/expected states: |
| * Action Model List Close List Comprehensive List |
| @@ -1410,4 +1433,94 @@ public class UndoTabModelTest extends ChromeTabbedActivityTestBase { |
| assertTrue(tab0.isClosing()); |
| assertFalse(tab0.isInitialized()); |
| } |
| + |
| + /** |
| + * Test open recently closed tab which uses rewinding list in java. |
|
Theresa
2016/06/29 23:53:29
nit: Test opening recently closed tabs using the r
xingliu
2016/06/30 05:43:55
Done.
|
| + * Open recently closed tab first uses rewind list in java, then try to use |
| + * native tab_restore_service if nothing in rewind list. |
| + * @throws InterruptedException |
| + */ |
| + @MediumTest |
| + public void testOpenRecentClosedTab() throws InterruptedException { |
|
Theresa
2016/06/29 23:53:30
nit: testOpenRecentlyClosedTab()
xingliu
2016/06/30 05:43:56
Done.
|
| + TabModelSelector selector = getActivity().getTabModelSelector(); |
| + TabModel model = selector.getModel(false); |
| + ChromeTabCreator tabCreator = getActivity().getTabCreator(false); |
| + |
| + createTabOnUiThread(tabCreator, TEST_URL); |
|
Theresa
2016/06/29 23:53:30
This test doesn't rely on native, so I think we sh
xingliu
2016/06/30 05:43:56
Done.
|
| + |
| + Tab tab0 = model.getTabAt(0); |
| + Tab tab1 = model.getTabAt(1); |
| + Tab[] allTabs = new Tab[]{tab0, tab1}; |
| + |
| + closeTabOnUiThread(model, tab1, true); |
| + checkState(model, new Tab[]{tab0}, tab0, new Tab[]{tab1}, allTabs, tab0); |
| + |
| + // ensure tab recovery, ordering, and reuse of {@link Tab} objects in java. |
| + openRecentClosedTabOnUiThread(selector); |
| + checkState(model, allTabs, tab0, EMPTY, allTabs, tab0); |
| + } |
| + |
| + // helper class to wait for fully loaded page. |
|
Theresa
2016/06/29 23:53:30
nit: Helper class that notifies when a page load i
xingliu
2016/06/30 05:43:55
Done.
|
| + private class TestTabObserver extends EmptyTabObserver { |
|
Theresa
2016/06/29 23:53:30
Let's put this by the rest of the private methods
xingliu
2016/06/30 05:43:56
Done.
|
| + private CallbackHelper mCallbackHelper; |
| + private TabModel mModel; |
| + public TestTabObserver(CallbackHelper callbackHelper, TabModel model) { |
| + super(); |
| + mModel = model; |
| + mCallbackHelper = callbackHelper; |
| + } |
| + @Override |
| + public void onPageLoadFinished(Tab tab) { |
| + // close the page after tab is loaded, close it and commit closure. |
| + try { |
| + assertEquals(mModel.getCount(), 2); |
| + UndoTabModelTest.this.closeTabOnUiThread(mModel, tab, false); |
| + assertEquals(1, mModel.getCount()); |
| + mCallbackHelper.notifyCalled(); |
|
Theresa
2016/06/29 23:53:30
I think only the callback should be notified from
xingliu
2016/06/30 05:43:55
Done.
xingliu
2016/06/30 05:43:56
Make sense.
|
| + } catch (InterruptedException e) { |
| + // ignore interrupt. |
| + } |
| + } |
| + } |
| + |
| + /** |
| + * Test open recently closed tab which uses native code from tab restore service. |
| + * Open recently closed tab first use rewind list in java, then try to use |
| + * native tab_restore_service if nothing in rewind list. |
| + * @throws InterruptedException |
| + */ |
| + @MediumTest |
| + public void testOpenRecentClosedTabNative() throws InterruptedException { |
| + final TabModelSelector selector = getActivity().getTabModelSelector(); |
| + final TabModel model = selector.getModel(false); |
| + final ChromeTabCreator tabCreator = getActivity().getTabCreator(false); |
| + final CallbackHelper tabCallbackHelper = new CallbackHelper(); |
| + final TestTabObserver observer = new TestTabObserver(tabCallbackHelper, model); |
| + |
| + // create new tab and attach observer to listen to loaded event. |
| + // reason to do this is we need to wait the page to be fully loaded, then it has navigation |
|
Theresa
2016/06/29 23:53:30
nit: I would drop the "reason to do this is" and j
xingliu
2016/06/30 05:43:55
Done.
|
| + // history, then native code can successfully recover the page. |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + tabCreator.createNewTab(new LoadUrlParams(TEST_URL), |
| + TabLaunchType.FROM_CHROME_UI, null).addObserver(observer); |
| + } |
| + }); |
| + |
| + // wait for the page to be fully loaded. |
| + try { |
| + tabCallbackHelper.waitForCallback(0); |
| + } catch (TimeoutException e) { |
| + fail(); |
| + } |
| + |
| + // recover the page. |
| + openRecentClosedTabOnUiThread(selector); |
| + |
| + assertEquals(2, model.getCount()); |
| + Tab newTab = model.getTabAt(1); |
| + assertEquals(TEST_URL, newTab.getUrl()); |
| + assertTrue(TabModelUtils.getCurrentTab(model) == newTab); |
|
Theresa
2016/06/29 23:53:30
We should call checkState here too.
xingliu
2016/06/30 05:43:55
Done.
|
| + } |
|
Theresa
2016/06/29 23:53:30
Can we add a test that makes sure tabs are restore
xingliu
2016/06/30 05:43:55
Implemented another test case in the patch. But hi
xingliu
2016/06/30 05:43:56
Done.
|
| } |