| Index: chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
|
| index fd2d93a561410358a5caeebce1b2e7c15f0386e6..763fa09d2d997a19ee564aef49362a7a9cd4f208 100644
|
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
|
| @@ -1366,16 +1366,31 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
|
|
| private void sendPostMessageDuringPrerenderTransition(int requestTime)
|
| throws InterruptedException {
|
| + sendPostMessageDuringSpeculationTransition(
|
| + requestTime, CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void sendPostMessageDuringSpeculationTransition(int requestTime, int speculationMode)
|
| + throws InterruptedException {
|
| final CallbackHelper messageChannelHelper = new CallbackHelper();
|
| final String url =
|
| mWebServer.setResponse("/test.html", TITLE_FROM_POSTMESSAGE_TO_CHANNEL, null);
|
| - warmUpAndWait();
|
| + final CustomTabsConnection connection = warmUpAndWait();
|
| +
|
| final CustomTabsSession session = bindWithCallback(new CustomTabsCallback() {
|
| @Override
|
| public void onMessageChannelReady(Bundle extras) {
|
| messageChannelHelper.notifyCalled();
|
| }
|
| });
|
| +
|
| + Intent intent = new CustomTabsIntent.Builder(session).build().intent;
|
| + intent.setData(Uri.parse(url));
|
| + intent.setComponent(new ComponentName(
|
| + getInstrumentation().getTargetContext(), ChromeLauncherActivity.class));
|
| + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| + CustomTabsSessionToken token = CustomTabsSessionToken.getSessionTokenFromIntent(intent);
|
| +
|
| boolean channelRequested = false;
|
| String titleString = "";
|
| String currentMessage = "";
|
| @@ -1385,11 +1400,10 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| assertTrue(channelRequested);
|
| }
|
|
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| session.mayLaunchUrl(Uri.parse(url), null, null);
|
| try {
|
| - ensureCompletedPrerenderForUrl(
|
| - CustomTabsConnection.getInstance((Application)
|
| - getInstrumentation().getTargetContext().getApplicationContext()), url);
|
| + ensureCompletedSpeculationForUrl(connection, url, speculationMode);
|
| } catch (Exception e) {
|
| fail();
|
| }
|
| @@ -1412,11 +1426,6 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| titleString = currentMessage;
|
| }
|
|
|
| - Intent intent = new CustomTabsIntent.Builder(session).build().intent;
|
| - intent.setData(Uri.parse(url));
|
| - intent.setComponent(new ComponentName(
|
| - getInstrumentation().getTargetContext(), ChromeLauncherActivity.class));
|
| - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| try {
|
| startCustomTabActivityWithIntent(intent);
|
| } catch (InterruptedException e) {
|
| @@ -1484,6 +1493,7 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| CustomTabsSessionToken token = CustomTabsSessionToken.getSessionTokenFromIntent(intent);
|
| assertTrue(connection.newSession(token));
|
| Bundle extras = new Bundle();
|
| + // Forcing no prerendering implies falling back to simply creating a spare WebContents.
|
| extras.putInt(
|
| CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnection.NO_PRERENDERING);
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(mTestPage), extras, null));
|
| @@ -1502,18 +1512,18 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| assertFalse(getActivity().getActivityTab().canGoBack());
|
| }
|
|
|
| - /** Tests that calling mayLaunchUrl() without warmup() succeeds. */
|
| + /** Tests that calling warmup() is optional without prerendering. */
|
| @SmallTest
|
| @RetryOnFailure
|
| - public void testMayLaunchUrlWithoutWarmup() {
|
| - mayLaunchUrlWithoutWarmup(false);
|
| + public void testMayLaunchUrlWithoutWarmupNoSpeculation() {
|
| + mayLaunchUrlWithoutWarmup(CustomTabsConnection.SpeculationParams.NO_SPECULATION);
|
| }
|
|
|
| - /** Tests that calling warmup() is optional without prerendering. */
|
| + /** Tests that calling mayLaunchUrl() without warmup() succeeds. */
|
| @SmallTest
|
| @RetryOnFailure
|
| - public void testMayLaunchUrlWithoutWarmupNoPrerendering() {
|
| - mayLaunchUrlWithoutWarmup(true);
|
| + public void testMayLaunchUrlWithoutWarmupPrerender() {
|
| + mayLaunchUrlWithoutWarmup(CustomTabsConnection.SpeculationParams.PRERENDER);
|
| }
|
|
|
| /**
|
| @@ -1614,6 +1624,12 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| */
|
| private void prerenderAndChangeFragment(boolean ignoreFragments, boolean wait)
|
| throws Exception {
|
| + speculateAndChangeFragment(
|
| + ignoreFragments, wait, CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void speculateAndChangeFragment(
|
| + boolean ignoreFragments, boolean wait, int speculationMode) throws Exception {
|
| String testUrl = mTestServer.getURL(FRAGMENT_TEST_PAGE);
|
| String initialFragment = "#test";
|
| String initialUrl = testUrl + initialFragment;
|
| @@ -1626,9 +1642,10 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| CustomTabsSessionToken token = CustomTabsSessionToken.getSessionTokenFromIntent(intent);
|
| connection.newSession(token);
|
| connection.setIgnoreUrlFragmentsForSession(token, ignoreFragments);
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(initialUrl), null, null));
|
|
|
| - if (wait) ensureCompletedPrerenderForUrl(connection, initialUrl);
|
| + if (wait) ensureCompletedSpeculationForUrl(connection, initialUrl, speculationMode);
|
|
|
| try {
|
| startCustomTabActivityWithIntent(intent);
|
| @@ -1636,14 +1653,16 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| fail();
|
| }
|
| final Tab tab = mActivity.getActivityTab();
|
| - ElementContentCriteria initialVisibilityCriteria = new ElementContentCriteria(
|
| - tab, "visibility", ignoreFragments ? "prerender" : "visible");
|
| - ElementContentCriteria initialFragmentCriteria = new ElementContentCriteria(
|
| - tab, "initial-fragment", ignoreFragments ? initialFragment : fragment);
|
| - ElementContentCriteria fragmentCriteria = new ElementContentCriteria(
|
| - tab, "fragment", fragment);
|
|
|
| if (wait) {
|
| + ElementContentCriteria initialVisibilityCriteria = new ElementContentCriteria(tab,
|
| + "visibility",
|
| + ignoreFragments ? getExpectedVisibilityForSpeculationMode(speculationMode)
|
| + : "visible");
|
| + ElementContentCriteria initialFragmentCriteria = new ElementContentCriteria(
|
| + tab, "initial-fragment", ignoreFragments ? initialFragment : fragment);
|
| + ElementContentCriteria fragmentCriteria =
|
| + new ElementContentCriteria(tab, "fragment", fragment);
|
| // The tab hasn't been reloaded.
|
| CriteriaHelper.pollInstrumentationThread(initialVisibilityCriteria, 2000, 200);
|
| // No reload (initial fragment is correct).
|
| @@ -1668,12 +1687,17 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testPrerenderingCorrectUrl() throws Exception {
|
| + testSpeculateCorrectUrl(CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void testSpeculateCorrectUrl(int speculationMode) throws Exception {
|
| Context context = getInstrumentation().getTargetContext().getApplicationContext();
|
| final CustomTabsConnection connection = warmUpAndWait();
|
| CustomTabsSessionToken token = CustomTabsSessionToken.createDummySessionTokenForTesting();
|
| connection.newSession(token);
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(mTestPage), null, null));
|
| - ensureCompletedPrerenderForUrl(connection, mTestPage);
|
| + ensureCompletedSpeculationForUrl(connection, mTestPage, speculationMode);
|
|
|
| try {
|
| startCustomTabActivityWithIntent(CustomTabsTestUtils.createMinimalCustomTabIntent(
|
| @@ -1693,9 +1717,14 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testPrerenderingInvalidUrl() throws Exception {
|
| + testSpeculateInvalidUrl(CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void testSpeculateInvalidUrl(int speculationMode) throws Exception {
|
| final CustomTabsConnection connection = warmUpAndWait();
|
| CustomTabsSessionToken token = CustomTabsSessionToken.createDummySessionTokenForTesting();
|
| connection.newSession(token);
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| assertFalse(connection.mayLaunchUrl(token, Uri.parse("chrome://version"), null, null));
|
| }
|
|
|
| @@ -1760,10 +1789,16 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testAllocateChildConnectionWithPrerender() throws Exception {
|
| + testAllocateChildConnectionWithSpeculation(
|
| + CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void testAllocateChildConnectionWithSpeculation(int speculationMode) throws Exception {
|
| Context context = getInstrumentation().getTargetContext().getApplicationContext();
|
| final CustomTabsConnection connection = warmUpAndWait();
|
| CustomTabsSessionToken token = CustomTabsSessionToken.createDummySessionTokenForTesting();
|
| connection.newSession(token);
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(mTestPage), null, null));
|
| try {
|
| startCustomTabActivityWithIntent(
|
| @@ -1817,14 +1852,20 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testPrerenderingWithReferrer() throws Exception {
|
| + testSpeculatingWithReferrer(CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void testSpeculatingWithReferrer(int speculationMode) throws Exception {
|
| String referrer = "android-app://com.foo.me/";
|
| - maybePrerenderAndLaunchWithReferrers(
|
| - mTestServer.getURL(FRAGMENT_TEST_PAGE), true, referrer, referrer);
|
| + maybeSpeculateAndLaunchWithReferrers(
|
| + mTestServer.getURL(FRAGMENT_TEST_PAGE), speculationMode, referrer, referrer);
|
|
|
| Tab tab = mActivity.getActivityTab();
|
| // The tab hasn't been reloaded.
|
| CriteriaHelper.pollInstrumentationThread(
|
| - new ElementContentCriteria(tab, "visibility", "prerender"), 2000, 200);
|
| + new ElementContentCriteria(tab, "visibility",
|
| + getExpectedVisibilityForSpeculationMode(speculationMode)),
|
| + 2000, 200);
|
| // The Referrer is correctly set.
|
| CriteriaHelper.pollInstrumentationThread(
|
| new TabsOpenedFromExternalAppTest.ReferrerCriteria(tab, referrer), 2000, 200);
|
| @@ -1838,10 +1879,14 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testPrerenderingWithMismatchedReferrers() throws Exception {
|
| + testSpeculatingWithMismatchedReferrers(CustomTabsConnection.SpeculationParams.PRERENDER);
|
| + }
|
| +
|
| + private void testSpeculatingWithMismatchedReferrers(int speculationMode) throws Exception {
|
| String prerenderReferrer = "android-app://com.foo.me/";
|
| String launchReferrer = "android-app://com.foo.me.i.changed.my.mind/";
|
| - maybePrerenderAndLaunchWithReferrers(
|
| - mTestServer.getURL(FRAGMENT_TEST_PAGE), true, prerenderReferrer, launchReferrer);
|
| + maybeSpeculateAndLaunchWithReferrers(mTestServer.getURL(FRAGMENT_TEST_PAGE),
|
| + speculationMode, prerenderReferrer, launchReferrer);
|
|
|
| Tab tab = mActivity.getActivityTab();
|
| // Prerender has been dropped.
|
| @@ -1852,13 +1897,14 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| new TabsOpenedFromExternalAppTest.ReferrerCriteria(tab, launchReferrer), 2000, 200);
|
| }
|
|
|
| - /** Tests that a client can set a referrer, without prerendering. */
|
| + /** Tests that a client can set a referrer, without speculating. */
|
| @SmallTest
|
| @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| @RetryOnFailure
|
| public void testClientCanSetReferrer() throws Exception {
|
| String referrerUrl = "android-app://com.foo.me/";
|
| - maybePrerenderAndLaunchWithReferrers(mTestPage, false, null, referrerUrl);
|
| + maybeSpeculateAndLaunchWithReferrers(mTestPage,
|
| + CustomTabsConnection.SpeculationParams.NO_SPECULATION, null, referrerUrl);
|
|
|
| Tab tab = mActivity.getActivityTab();
|
| // The Referrer is correctly set.
|
| @@ -1961,23 +2007,24 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| }
|
|
|
| /** Maybe prerenders a URL with a referrer, then launch it with another one. */
|
| - private void maybePrerenderAndLaunchWithReferrers(String url, boolean prerender,
|
| - String prerenderReferrer, String launchReferrer) throws Exception {
|
| + private void maybeSpeculateAndLaunchWithReferrers(String url, int speculationMode,
|
| + String speculationReferrer, String launchReferrer) throws Exception {
|
| Context context = getInstrumentation().getTargetContext().getApplicationContext();
|
| CustomTabsConnection connection = null;
|
| CustomTabsSessionToken token = null;
|
| Intent intent = CustomTabsTestUtils.createMinimalCustomTabIntent(context, url);
|
| - if (prerender) {
|
| + if (speculationMode != CustomTabsConnection.SpeculationParams.NO_SPECULATION) {
|
| connection = warmUpAndWait();
|
| token = CustomTabsSessionToken.getSessionTokenFromIntent(intent);
|
| connection.newSession(token);
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| Bundle extras = null;
|
| - if (prerenderReferrer != null) {
|
| + if (speculationReferrer != null) {
|
| extras = new Bundle();
|
| - extras.putParcelable(Intent.EXTRA_REFERRER, Uri.parse(prerenderReferrer));
|
| + extras.putParcelable(Intent.EXTRA_REFERRER, Uri.parse(speculationReferrer));
|
| }
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(url), extras, null));
|
| - ensureCompletedPrerenderForUrl(connection, url);
|
| + ensureCompletedSpeculationForUrl(connection, url, speculationMode);
|
| }
|
|
|
| if (launchReferrer != null) {
|
| @@ -1990,18 +2037,19 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| }
|
| }
|
|
|
| - private void mayLaunchUrlWithoutWarmup(boolean noPrerendering) {
|
| + private void mayLaunchUrlWithoutWarmup(int speculationMode) {
|
| Context context = getInstrumentation().getTargetContext().getApplicationContext();
|
| CustomTabsConnection connection =
|
| CustomTabsTestUtils.setUpConnection((Application) context);
|
| CustomTabsSessionToken token = CustomTabsSessionToken.createDummySessionTokenForTesting();
|
| connection.newSession(token);
|
| Bundle extras = null;
|
| - if (noPrerendering) {
|
| + if (speculationMode == CustomTabsConnection.SpeculationParams.NO_SPECULATION) {
|
| extras = new Bundle();
|
| extras.putInt(
|
| CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnection.NO_PRERENDERING);
|
| }
|
| + connection.setSpeculationModeForSession(token, speculationMode);
|
| assertTrue(connection.mayLaunchUrl(token, Uri.parse(mTestPage), extras, null));
|
| try {
|
| startCustomTabActivityWithIntent(CustomTabsTestUtils.createMinimalCustomTabIntent(
|
| @@ -2111,18 +2159,20 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| getInstrumentation().getTargetContext(), mTestPage));
|
| }
|
|
|
| - private static void ensureCompletedPrerenderForUrl(
|
| - final CustomTabsConnection connection, final String url) throws Exception {
|
| - CriteriaHelper.pollUiThread(new Criteria("No Prerender") {
|
| - @Override
|
| - public boolean isSatisfied() {
|
| - return connection.mSpeculation != null
|
| - && connection.mSpeculation.webContents != null
|
| - && ExternalPrerenderHandler.hasPrerenderedAndFinishedLoadingUrl(
|
| - Profile.getLastUsedProfile(), url,
|
| - connection.mSpeculation.webContents);
|
| - }
|
| - }, LONG_TIMEOUT_MS, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
|
| + private static void ensureCompletedSpeculationForUrl(final CustomTabsConnection connection,
|
| + final String url, int speculationMode) throws Exception {
|
| + if (speculationMode == CustomTabsConnection.SpeculationParams.PRERENDER) {
|
| + CriteriaHelper.pollUiThread(new Criteria("No Prerender") {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return connection.mSpeculation != null
|
| + && connection.mSpeculation.webContents != null
|
| + && ExternalPrerenderHandler.hasPrerenderedAndFinishedLoadingUrl(
|
| + Profile.getLastUsedProfile(), url,
|
| + connection.mSpeculation.webContents);
|
| + }
|
| + }, LONG_TIMEOUT_MS, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
|
| + }
|
| }
|
|
|
| private CustomTabsSession bindWithCallback(final CustomTabsCallback callback) {
|
| @@ -2210,4 +2260,13 @@ public class CustomTabActivityTest extends CustomTabActivityTestBase {
|
| return TextUtils.equals(mExpected, value);
|
| }
|
| }
|
| +
|
| + private static String getExpectedVisibilityForSpeculationMode(int speculationMode) {
|
| + switch (speculationMode) {
|
| + case CustomTabsConnection.SpeculationParams.PRERENDER:
|
| + return "prerender";
|
| + default:
|
| + return "visible";
|
| + }
|
| + }
|
| }
|
|
|