Index: chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fa92654da6e8e9d3ed72369c1123eb5e88a0cfc8 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java |
@@ -0,0 +1,170 @@ |
+// 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.browser; |
+ |
+import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE; |
+ |
+import android.test.suitebuilder.annotation.LargeTest; |
+import android.view.KeyEvent; |
+ |
+import com.google.android.apps.chrome.R; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.DisabledTest; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.base.test.util.Restriction; |
+import org.chromium.chrome.browser.omnibox.UrlBar; |
+import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
+import org.chromium.chrome.test.util.ChromeTabUtils; |
+import org.chromium.chrome.test.util.PrerenderTestHelper; |
+import org.chromium.chrome.test.util.TestHttpServerClient; |
+import org.chromium.chrome.test.util.browser.TabTitleObserver; |
+import org.chromium.content.browser.test.util.KeyUtils; |
+import org.chromium.ui.base.PageTransition; |
+ |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * Prerender tests. |
+ * |
+ * Tests are disabled on low-end devices. These only support one renderer for performance reasons. |
+ */ |
+public class PrerenderTest extends ChromeTabbedActivityTestBase { |
+ |
+ // junit.framework.Assert has |
+ // assertEquals(Object,Object) |
+ // assertEquals(String,String) and |
+ // assertNotSame(Object,Object), but no |
+ // assertNotSame(String,String). |
+ // Since String equality needs equals() and object equality uses |
+ // ==, the lack of a proper API means it's easy to use object |
+ // equality by accident since Object is a base class of String. |
+ // But that's not what you want! |
+ void assertNotEquals(String expected, String actual) { |
+ assertFalse(expected.equals(actual)); |
+ } |
+ |
+ /** |
+ * We are using Autocomplete Action Predictor to decide whether or not to prerender. |
+ /* Without any training data the default action should be no-prerender. |
+ */ |
+ @LargeTest |
+ @Restriction({RESTRICTION_TYPE_NON_LOW_END_DEVICE}) |
+ @Feature({"TabContents"}) |
+ public void testNoPrerender() throws InterruptedException { |
+ String testUrl = TestHttpServerClient.getUrl( |
+ "chrome/test/data/android/prerender/google.html"); |
+ final Tab tab = getActivity().getActivityTab(); |
+ |
+ // Mimic user behavior: touch to focus then type some URL. |
+ // Since this is a URL, it should be prerendered. |
+ // Type one character at a time to properly simulate input |
+ // to the action predictor. |
+ typeInOmnibox(testUrl, true); |
+ |
+ assertFalse("URL should not have been prerendered.", |
+ PrerenderTestHelper.waitForPrerenderUrl(tab, testUrl, true)); |
+ // Navigate should not use the prerendered version. |
+ assertEquals(TabLoadStatus.DEFAULT_PAGE_LOAD, |
+ loadUrlInTab(testUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab)); |
+ } |
+ |
+ /* |
+ @LargeTest |
+ @Restriction({RESTRICTION_TYPE_NON_LOW_END_DEVICE}) |
+ @Feature({"TabContents"}) |
+ crbug.com/339668 |
+ */ |
+ @DisabledTest |
+ public void testPrerenderNotDead() throws InterruptedException, TimeoutException { |
+ String testUrl = TestHttpServerClient.getUrl( |
+ "chrome/test/data/android/prerender/google.html"); |
+ PrerenderTestHelper.trainAutocompleteActionPredictorAndTestPrerender(testUrl, this); |
+ final Tab tab = getActivity().getActivityTab(); |
+ // Navigate should use the prerendered version. |
+ assertEquals(TabLoadStatus.FULL_PRERENDERED_PAGE_LOAD, |
+ loadUrlInTab(testUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab)); |
+ |
+ // Prerender again with new text; make sure we get something different. |
+ String newTitle = "Welcome to the YouTube"; |
+ testUrl = TestHttpServerClient.getUrl("chrome/test/data/android/prerender/youtube.html"); |
+ PrerenderTestHelper.trainAutocompleteActionPredictorAndTestPrerender(testUrl, this); |
+ |
+ // Make sure the current tab title is NOT from the prerendered page. |
+ assertNotEquals(newTitle, tab.getTitle()); |
+ |
+ TabTitleObserver observer = new TabTitleObserver(tab, newTitle); |
+ |
+ // Now commit and see the new title. |
+ final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); |
+ assertNotNull("urlBar is null", urlBar); |
+ KeyUtils.singleKeyEventView(getInstrumentation(), urlBar, KeyEvent.KEYCODE_ENTER); |
+ |
+ observer.waitForTitleUpdate(5); |
+ assertEquals(newTitle, tab.getTitle()); |
+ } |
+ |
+ /** |
+ * Tests that we do get the page load finished notification even when a page has been fully |
+ * prerendered. |
+ */ |
+ /* |
+ @LargeTest |
+ @Restriction({RESTRICTION_TYPE_NON_LOW_END_DEVICE}) |
+ @Feature({"TabContents"}) |
+ crbug.com/339668 |
+ */ |
+ @DisabledTest |
+ public void testPageLoadFinishNotification() throws InterruptedException { |
+ String url = TestHttpServerClient.getUrl("chrome/test/data/android/prerender/google.html"); |
+ PrerenderTestHelper.trainAutocompleteActionPredictorAndTestPrerender(url, this); |
+ // Now let's press enter to validate the suggestion. The prerendered page should be |
+ // committed and we should get a page load finished notification (which would trigger the |
+ // page load). |
+ ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), new Runnable() { |
+ @Override |
+ public void run() { |
+ final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); |
+ assertNotNull("urlBar is null", urlBar); |
+ KeyUtils.singleKeyEventView(getInstrumentation(), urlBar, KeyEvent.KEYCODE_ENTER); |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Tests that we don't crash when dismissing a prerendered page with infobars and unlonad |
+ * handler (See bug 5757331). |
+ * Note that this bug happened with the instant code. Now that we use Wicked Fast, we don't |
+ * deal with infobars ourselves. |
+ */ |
+ /* |
+ @LargeTest |
+ @Restriction({RESTRICTION_TYPE_NON_LOW_END_DEVICE}) |
+ @Feature({"TabContents"}) |
+ crbug.com/339668 |
+ */ |
+ @DisabledTest |
+ public void testInfoBarDismissed() throws InterruptedException { |
+ final String url = TestHttpServerClient.getUrl( |
+ "chrome/test/data/geolocation/geolocation_on_load.html"); |
+ PrerenderTestHelper.trainAutocompleteActionPredictorAndTestPrerender(url, this); |
+ // Let's clear the URL bar, this will discard the prerendered WebContents and close the |
+ // infobars. |
+ final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); |
+ assertNotNull(urlBar); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ urlBar.requestFocus(); |
+ urlBar.setText(""); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
+ public void startMainActivity() throws InterruptedException { |
+ startMainActivityOnBlankPage(); |
+ } |
+} |