Index: chrome/test/android/javatests_staging/src/org/chromium/chrome/test/ChromeTabbedActivityTestBase.java |
diff --git a/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/ChromeTabbedActivityTestBase.java b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/ChromeTabbedActivityTestBase.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3ada648808cac1dffe152e4057a8d598ebc66819 |
--- /dev/null |
+++ b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/ChromeTabbedActivityTestBase.java |
@@ -0,0 +1,137 @@ |
+// Copyright 2015 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.test; |
+ |
+import android.app.Activity; |
+import android.app.Instrumentation; |
+import android.content.Intent; |
+import android.text.TextUtils; |
+import android.util.Log; |
+import android.view.View; |
+ |
+import org.chromium.base.test.util.CommandLineFlags; |
+import org.chromium.chrome.browser.ChromeSwitches; |
+import org.chromium.chrome.browser.ChromeTabbedActivity; |
+import org.chromium.chrome.browser.EmptyTabObserver; |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.tab.ChromeTab; |
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
+import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+import org.chromium.content.browser.test.util.TestTouchUtils; |
+ |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * The base class of the ChromeTabbedActivity specific tests. It provides the common methods |
+ * to access the ChromeTabbedActivity UI. |
+ */ |
+@CommandLineFlags.Add(ChromeSwitches.DISABLE_DOCUMENT_MODE) |
+public abstract class ChromeTabbedActivityTestBase extends |
+ ChromeActivityTestCaseBase<ChromeTabbedActivity> { |
+ private static final String TAG = "ChromeTabbedActivityTestBase"; |
+ |
+ public ChromeTabbedActivityTestBase() { |
+ super(ChromeTabbedActivity.class); |
+ } |
+ |
+ /** |
+ * Load a url in multiple new tabs in parallel. Each {@link ChromeTab} will pretend to be |
+ * created from a link. |
+ * |
+ * @param url The url of the page to load. |
+ * @param numTabs The number of tabs to open. |
+ */ |
+ public void loadUrlInManyNewTabs(final String url, final int numTabs) |
+ throws InterruptedException { |
+ final CallbackHelper[] pageLoadedCallbacks = new CallbackHelper[numTabs]; |
+ final int[] tabIds = new int[numTabs]; |
+ for (int i = 0; i < numTabs; ++i) { |
+ final int index = i; |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ Tab currentTab = getActivity().getCurrentTabCreator().launchUrl( |
+ url, TabLaunchType.FROM_LINK); |
+ final CallbackHelper pageLoadCallback = new CallbackHelper(); |
+ pageLoadedCallbacks[index] = pageLoadCallback; |
+ currentTab.addObserver(new EmptyTabObserver() { |
+ @Override |
+ public void onPageLoadFinished(Tab tab) { |
+ pageLoadCallback.notifyCalled(); |
+ tab.removeObserver(this); |
+ } |
+ }); |
+ tabIds[index] = currentTab.getId(); |
+ } |
+ }); |
+ } |
+ // When opening many tabs some may be frozen due to memory pressure and won't send |
+ // PAGE_LOAD_FINISHED events. Iterate over the newly opened tabs and wait for each to load. |
+ for (int i = 0; i < numTabs; ++i) { |
+ final TabModel tabModel = getActivity().getCurrentTabModel(); |
+ final Tab tab = TabModelUtils.getTabById(tabModel, tabIds[i]); |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ TabModelUtils.setIndex(tabModel, tabModel.indexOf(tab)); |
+ } |
+ }); |
+ try { |
+ pageLoadedCallbacks[i].waitForCallback(0); |
+ } catch (TimeoutException e) { |
+ fail(String.format("PAGE_LOAD_FINISHED was not received for tabId=%d", tabIds[i])); |
+ } |
+ } |
+ } |
+ |
+ @Override |
+ protected void startActivityCompletely(Intent intent) { |
+ Instrumentation.ActivityMonitor monitor = getInstrumentation().addMonitor( |
+ ChromeTabbedActivity.class.getName(), null, false); |
+ Activity activity = getInstrumentation().startActivitySync(intent); |
+ assertNotNull("Main activity did not start", activity); |
+ ChromeTabbedActivity tabbedActivity = (ChromeTabbedActivity) |
+ monitor.waitForActivityWithTimeout(ACTIVITY_START_TIMEOUT_MS); |
+ assertNotNull("ChromeTabbedActivity did not start", tabbedActivity); |
+ setActivity(tabbedActivity); |
+ Log.d(TAG, "startActivityCompletely <<"); |
+ } |
+ |
+ /** |
+ * Long presses the view, selects an item from the context menu, and |
+ * asserts that a new tab is opened and is incognito iff expectIncognito is true. |
+ * @param view The View to long press. |
+ * @param contextMenuItemId The context menu item to select on the view. |
+ * @param expectIncognito Whether the opened tab is expected to be incognito. |
+ * @param expectedUrl The expected url for the new tab. |
+ */ |
+ protected void invokeContextMenuAndOpenInANewTab(View view, int contextMenuItemId, |
+ boolean expectIncognito, final String expectedUrl) throws InterruptedException { |
+ final CallbackHelper createdCallback = new CallbackHelper(); |
+ final TabModel tabModel = getActivity().getTabModelSelector().getModel(expectIncognito); |
+ tabModel.addObserver(new EmptyTabModelObserver() { |
+ @Override |
+ public void didAddTab(Tab tab, TabLaunchType type) { |
+ if (TextUtils.equals(expectedUrl, tab.getUrl())) { |
+ createdCallback.notifyCalled(); |
+ tabModel.removeObserver(this); |
+ } |
+ } |
+ }); |
+ |
+ TestTouchUtils.longClickView(getInstrumentation(), view); |
+ assertTrue(getInstrumentation().invokeContextMenuAction(getActivity(), |
+ contextMenuItemId, 0)); |
+ |
+ try { |
+ createdCallback.waitForCallback(0); |
+ } catch (TimeoutException e) { |
+ fail("Never received tab creation event"); |
+ } |
+ } |
+} |