| Index: chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fe1956f25f9bc5ec836686862c8822bb544997d3
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
|
| @@ -0,0 +1,184 @@
|
| +// Copyright 2017 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 android.support.test.filters.LargeTest;
|
| +
|
| +import org.chromium.base.Callback;
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.CallbackHelper;
|
| +import org.chromium.base.test.util.CommandLineFlags;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.base.test.util.Restriction;
|
| +import org.chromium.blink.mojom.document_metadata.Entity;
|
| +import org.chromium.blink.mojom.document_metadata.Property;
|
| +import org.chromium.blink.mojom.document_metadata.Values;
|
| +import org.chromium.blink.mojom.document_metadata.WebPage;
|
| +import org.chromium.chrome.browser.firstrun.FirstRunStatus;
|
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| +import org.chromium.chrome.test.util.ChromeTabUtils;
|
| +import org.chromium.net.test.EmbeddedTestServer;
|
| +import org.chromium.url.mojom.Url;
|
| +
|
| +import java.util.concurrent.TimeoutException;
|
| +
|
| +/**
|
| + * Tests Copyless Paste AppIndexing using instrumented tests.
|
| + */
|
| +@CommandLineFlags.Add("enable-features=CopylessPaste")
|
| +@Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE)
|
| +public class CopylessPasteTest extends ChromeTabbedActivityTestBase {
|
| + // NODATA_PAGE doesn't contain desired metadata.
|
| + private static final String NODATA_PAGE = "/chrome/test/data/android/about.html";
|
| +
|
| + // DATA_PAGE contains desired metadata.
|
| + private static final String DATA_PAGE = "/chrome/test/data/android/appindexing/json-ld.html";
|
| +
|
| + private EmbeddedTestServer mTestServer;
|
| + private CopylessHelper mCallbackHelper;
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + // We have to set up the test server before starting the activity.
|
| + mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext());
|
| +
|
| + mCallbackHelper = new CopylessHelper();
|
| +
|
| + AppIndexingUtil.setCallbackForTesting(new Callback<WebPage>() {
|
| + @Override
|
| + public void onResult(WebPage webpage) {
|
| + mCallbackHelper.notifyCalled(webpage);
|
| + }
|
| + });
|
| +
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + FirstRunStatus.setFirstRunFlowComplete(true);
|
| + }
|
| + });
|
| + super.setUp();
|
| + }
|
| +
|
| + @Override
|
| + protected void tearDown() throws Exception {
|
| + mTestServer.stopAndDestroyServer();
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + FirstRunStatus.setFirstRunFlowComplete(false);
|
| + }
|
| + });
|
| + AppIndexingUtil.setCallbackForTesting(null);
|
| + super.tearDown();
|
| + }
|
| +
|
| + @Override
|
| + public void startMainActivity() throws InterruptedException {
|
| + startMainActivityOnBlankPage();
|
| + }
|
| +
|
| + private static class CopylessHelper extends CallbackHelper {
|
| + private WebPage mWebPage;
|
| +
|
| + public WebPage getWebPage() {
|
| + return mWebPage;
|
| + }
|
| +
|
| + public void notifyCalled(WebPage page) {
|
| + mWebPage = page;
|
| + notifyCalled();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Tests that CopylessPaste is disabled in Incognito tabs.
|
| + */
|
| + @LargeTest
|
| + @Feature({"CopylessPaste"})
|
| + public void testIncognito() throws InterruptedException, TimeoutException {
|
| + // Incognito tabs are ignored.
|
| + newIncognitoTabsFromMenu(1);
|
| + loadUrl(mTestServer.getURL(NODATA_PAGE));
|
| + loadUrl(mTestServer.getURL(DATA_PAGE));
|
| + ChromeTabUtils.closeCurrentTab(getInstrumentation(), getActivity());
|
| + assertEquals(0, mCallbackHelper.getCallCount());
|
| + }
|
| +
|
| + /**
|
| + * Tests that CopylessPaste skips invalid schemes.
|
| + */
|
| + @LargeTest
|
| + @Feature({"CopylessPaste"})
|
| + public void testInvalidScheme() throws InterruptedException, TimeoutException {
|
| + // CopylessPaste only parses http and https.
|
| + loadUrl("chrome://newtab");
|
| + loadUrl("chrome://about");
|
| + assertEquals(0, mCallbackHelper.getCallCount());
|
| + }
|
| +
|
| + /**
|
| + * Tests that CopylessPaste works on pages without desired metadata.
|
| + */
|
| + @LargeTest
|
| + @Feature({"CopylessPaste"})
|
| + public void testNoMeta() throws InterruptedException, TimeoutException {
|
| + loadUrl(mTestServer.getURL(NODATA_PAGE));
|
| + mCallbackHelper.waitForCallback(0);
|
| + assertNull(mCallbackHelper.getWebPage());
|
| + }
|
| +
|
| + /**
|
| + * Tests that CopylessPaste works end-to-end.
|
| + */
|
| + @LargeTest
|
| + @Feature({"CopylessPaste"})
|
| + public void testValid() throws InterruptedException, TimeoutException {
|
| + loadUrl(mTestServer.getURL(DATA_PAGE));
|
| + mCallbackHelper.waitForCallback(0);
|
| + WebPage extracted = mCallbackHelper.getWebPage();
|
| +
|
| + WebPage expected = new WebPage();
|
| + expected.url = new Url();
|
| + expected.url.url = mTestServer.getURL(DATA_PAGE);
|
| + expected.title = "JSON-LD for AppIndexing Test";
|
| + Entity e = new Entity();
|
| + e.type = "Hotel";
|
| + e.properties = new Property[2];
|
| + e.properties[0] = new Property();
|
| + e.properties[0].name = "@context";
|
| + e.properties[0].values = new Values();
|
| + e.properties[0].values.setStringValues(new String[] {"http://schema.org"});
|
| + e.properties[1] = new Property();
|
| + e.properties[1].name = "name";
|
| + e.properties[1].values = new Values();
|
| + e.properties[1].values.setStringValues(new String[] {"Hotel Name"});
|
| + expected.entities = new Entity[1];
|
| + expected.entities[0] = e;
|
| + assertEquals(expected, extracted);
|
| + }
|
| +
|
| + /**
|
| + * Tests that CopylessPaste skips parsing visited pages.
|
| + */
|
| + @LargeTest
|
| + @Feature({"CopylessPaste"})
|
| + public void testCache() throws InterruptedException, TimeoutException {
|
| + // The URLs used here should be unique in CopylessPasteTest.
|
| + String uniqueTag = "#123";
|
| + // NODATA_PAGE doesn't contain desired metadata.
|
| + loadUrl(mTestServer.getURL(NODATA_PAGE + uniqueTag));
|
| + mCallbackHelper.waitForCallback(0);
|
| + // DATA_PAGE contains desired metadata.
|
| + loadUrl(mTestServer.getURL(DATA_PAGE + uniqueTag));
|
| + mCallbackHelper.waitForCallback(1);
|
| +
|
| + // Cache hit without entities. Shouldn't parse again.
|
| + loadUrl(mTestServer.getURL(NODATA_PAGE + uniqueTag));
|
| + // Cache hit with entities. Shouldn't parse again.
|
| + loadUrl(mTestServer.getURL(DATA_PAGE + uniqueTag));
|
| + assertEquals(2, mCallbackHelper.getCallCount());
|
| + }
|
| +}
|
|
|