| Index: chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/PrerenderTestHelper.java
|
| diff --git a/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/PrerenderTestHelper.java b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/PrerenderTestHelper.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..821a9255ac68b844ebcfa4777022d87f9bf47a8d
|
| --- /dev/null
|
| +++ b/chrome/test/android/javatests_staging/src/org/chromium/chrome/test/util/PrerenderTestHelper.java
|
| @@ -0,0 +1,164 @@
|
| +// 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.util;
|
| +
|
| +import android.util.Pair;
|
| +
|
| +import com.google.android.apps.chrome.R;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.chrome.browser.Tab;
|
| +import org.chromium.chrome.browser.TabLoadStatus;
|
| +import org.chromium.chrome.browser.omnibox.LocationBarLayout;
|
| +import org.chromium.chrome.browser.omnibox.OmniboxResultsAdapter;
|
| +import org.chromium.chrome.browser.omnibox.OmniboxResultsAdapter.OmniboxResultItem;
|
| +import org.chromium.chrome.browser.omnibox.OmniboxResultsAdapter.OmniboxSuggestionDelegate;
|
| +import org.chromium.chrome.browser.omnibox.OmniboxSuggestion;
|
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| +import org.chromium.content.browser.test.util.Criteria;
|
| +import org.chromium.content.browser.test.util.CriteriaHelper;
|
| +
|
| +import java.util.concurrent.atomic.AtomicBoolean;
|
| +import java.util.concurrent.atomic.AtomicReference;
|
| +
|
| +/**
|
| + * Utility class for common methods to test prerendering.
|
| + */
|
| +public class PrerenderTestHelper {
|
| + private static final int UI_DELAY_MS = 100;
|
| + private static final int WAIT_FOR_RESPONSE_MS = 10000;
|
| + private static final int SHORT_TIMEOUT_MS = 200;
|
| + private static final int MAX_NUM_REPEATS_FOR_TRAINING = 7;
|
| +
|
| + private static boolean hasTabPrerenderedUrl(final Tab tab, final String url) {
|
| + final AtomicBoolean result = new AtomicBoolean();
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + result.set(tab.hasPrerenderedUrl(url));
|
| + }
|
| + });
|
| + return result.get();
|
| + }
|
| +
|
| + /**
|
| + * Waits for the specified URL to be prerendered.
|
| + * Returns true if it succeeded, false if it was not prerendered before the timeout.
|
| + * shortTimeout should be set to true when expecting this function to return false, as to
|
| + * make the tests run faster.
|
| + */
|
| + public static boolean waitForPrerenderUrl(final Tab tab, final String url,
|
| + boolean shortTimeout) throws InterruptedException {
|
| + CriteriaHelper.pollForCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return hasTabPrerenderedUrl(tab, url);
|
| + }
|
| + }, shortTimeout ? SHORT_TIMEOUT_MS : WAIT_FOR_RESPONSE_MS, UI_DELAY_MS);
|
| +
|
| + return hasTabPrerenderedUrl(tab, url);
|
| + }
|
| +
|
| + private static Pair<OmniboxSuggestion, Integer> waitForOmniboxSuggestion(
|
| + final LocationBarLayout locationBar, final String url) throws InterruptedException {
|
| + final AtomicReference<Pair<OmniboxSuggestion, Integer>> result =
|
| + new AtomicReference<Pair<OmniboxSuggestion, Integer>>();
|
| + CriteriaHelper.pollForCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + OmniboxResultsAdapter adapter =
|
| + (OmniboxResultsAdapter) locationBar.getSuggestionList().getAdapter();
|
| + for (int i = 0; i < adapter.getCount(); i++) {
|
| + OmniboxResultItem popupItem = (OmniboxResultItem) adapter.getItem(i);
|
| + OmniboxSuggestion matchedSuggestion = popupItem.getSuggestion();
|
| + if (matchedSuggestion.getUrl().equals(url)) {
|
| + result.set(new Pair<OmniboxSuggestion, Integer>(matchedSuggestion, i));
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| + }, SHORT_TIMEOUT_MS, UI_DELAY_MS);
|
| + return result.get();
|
| + }
|
| +
|
| + /**
|
| + * Clears the omnibox.
|
| + *
|
| + * @param testBase ChromeTabbedActivityTestBase instance.
|
| + */
|
| + public static void clearOmnibox(ChromeTabbedActivityTestBase testBase)
|
| + throws InterruptedException {
|
| + testBase.typeInOmnibox("", false);
|
| + }
|
| +
|
| + /**
|
| + * Clears the omnibox and types in the url character-by-character.
|
| + *
|
| + * @param url url to type into the omnibox.
|
| + * @param testBase ChromeTabbedActivityTestBase instance.
|
| + */
|
| + public static void clearOmniboxAndTypeUrl(String url, ChromeTabbedActivityTestBase testBase)
|
| + throws InterruptedException {
|
| + clearOmnibox(testBase);
|
| + testBase.typeInOmnibox(url, true);
|
| + }
|
| +
|
| + /**
|
| + * Trains the autocomplete action predictor to pre-render a url.
|
| + *
|
| + * @param testUrl Url to prerender
|
| + * @param testBase ChromeTabbedActivityTestBase instance.
|
| + */
|
| + public static void trainAutocompleteActionPredictorAndTestPrerender(final String testUrl,
|
| + ChromeTabbedActivityTestBase testBase)
|
| + throws InterruptedException {
|
| + // TODO(yusufo): Replace with external prerender handler instead of training.
|
| + ChromeTabUtils.newTabFromMenu(testBase.getInstrumentation(), testBase.getActivity());
|
| + for (int i = 0; i < MAX_NUM_REPEATS_FOR_TRAINING; i++) {
|
| + // Navigate to another URL otherwise pre-rendering won't happen.
|
| + // Sometimes calling clearOmnibox immediately after won't actually
|
| + // clear it. This seems to help.
|
| + clearOmnibox(testBase);
|
| + testBase.typeInOmnibox(testUrl, true);
|
| + final LocationBarLayout locationBar =
|
| + (LocationBarLayout) testBase.getActivity().findViewById(R.id.location_bar);
|
| + if (waitForPrerenderUrl(testBase.getActivity().getActivityTab(), testUrl, true)) {
|
| + break;
|
| + }
|
| +
|
| + final Pair<OmniboxSuggestion, Integer> suggestionPair =
|
| + waitForOmniboxSuggestion(locationBar, testUrl);
|
| + ThreadUtils.runOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + OmniboxResultsAdapter ora =
|
| + (OmniboxResultsAdapter) locationBar.getSuggestionList().getAdapter();
|
| + OmniboxSuggestionDelegate suggestionDelegate =
|
| + ora.getSuggestionDelegate();
|
| + suggestionDelegate.onSelection(suggestionPair.first, suggestionPair.second);
|
| + }
|
| + });
|
| + }
|
| + ChromeTabUtils.closeCurrentTab(testBase.getInstrumentation(), testBase.getActivity());
|
| + clearOmnibox(testBase);
|
| +
|
| + testBase.typeInOmnibox(testUrl, true);
|
| + final Tab tab = testBase.getActivity().getActivityTab();
|
| + ChromeTabbedActivityTestBase.assertTrue("URL was not prerendered.",
|
| + PrerenderTestHelper.waitForPrerenderUrl(tab, testUrl, false));
|
| + }
|
| +
|
| + /**
|
| + * Checks if the load url result is prerendered.
|
| + *
|
| + * @param result Result from a page load.
|
| + * @return Whether the result param indicates a prerendered url.
|
| + */
|
| + public static boolean isLoadUrlResultPrerendered(int result) {
|
| + return result == TabLoadStatus.FULL_PRERENDERED_PAGE_LOAD
|
| + || result == TabLoadStatus.PARTIAL_PRERENDERED_PAGE_LOAD;
|
| + }
|
| +}
|
|
|