[go: up one dir, main page]

[Chromeshine] Stop using the page-provided canonical URL

This means we won't handle AMP pages that don't use SXG(signed exchanges).
Trusting the canonical URL blindly has potential privacy risks. Trusting only
Google-provided AMP urls is also the wrong solution; we want to rely on the
long term solution that is SXG.

(cherry picked from commit 0e604b323671c3be03fbf0836f7c26b54ca89955)

Bug: 961814
Change-Id: Ib3544e8c478a3a9089d8c7414f7ea42bb65b8794
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1659511
Reviewed-by: Sky Malice <skym@chromium.org>
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#669854}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1665651
Reviewed-by: Patrick Noland <pnoland@chromium.org>
Cr-Commit-Position: refs/branch-heads/3809@{#433}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java
index 0865c87..dd26d4a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/PageViewObserver.java
@@ -21,7 +21,6 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabSelectionType;
-import org.chromium.content_public.browser.NavigationHandle;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -58,7 +57,7 @@
             @Override
             public void onShown(Tab tab, @TabSelectionType int type) {
                 if (!tab.isLoading() && !tab.isBeingRestored()) {
-                    updateUsingCanonicalUrl(tab);
+                    updateUrl(tab.getUrl());
                 }
             }
 
@@ -82,25 +81,13 @@
             public void didFirstVisuallyNonEmptyPaint(Tab tab) {
                 assert tab == mCurrentTab;
 
-                updateUsingCanonicalUrl(tab);
+                updateUrl(tab.getUrl());
             }
 
             @Override
             public void onCrash(Tab tab) {
                 updateUrl(null);
             }
-
-            @Override
-            public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) {
-                // We only check isLikelySubframeAmpNavigation here because this is the only
-                // observer method that fires for subframe navigations. The reason we have the
-                // isLikelySubframeAmpNavigation at all is that onDidFinishNavigation triggers very
-                // often, and we only want to bother getting the canonical URL if we think there's a
-                // good chance that it will actually be present.
-                if (isLikelySubframeAmpNavigation(navigation)) {
-                    updateUsingCanonicalUrl(tab);
-                }
-            }
         };
 
         mTabModelObserver = new TabModelSelectorTabModelObserver(tabModelSelector) {
@@ -146,22 +133,6 @@
         }
     }
 
-    private void updateUsingCanonicalUrl(Tab tab) {
-        if (tab.getWebContents() == null || tab.getWebContents().getMainFrame() == null) {
-            updateUrl(tab.getUrl());
-            return;
-        }
-
-        tab.getWebContents().getMainFrame().getCanonicalUrlForSharing((canonicalUrl) -> {
-            if (tab != mCurrentTab) return;
-            String urlToUse = tab.getUrl();
-            if (canonicalUrl != null && canonicalUrl.length() > 0) {
-                urlToUse = canonicalUrl;
-            }
-            updateUrl(urlToUse);
-        });
-    }
-
     /**
      * Updates our state from the previous url to {@code newUrl}. This can result in any/all of the
      * following:
@@ -232,7 +203,7 @@
         // If the newly active tab is hidden, we don't want to check its URL yet; we'll wait until
         // the onShown event fires.
         if (mCurrentTab != null && !tab.isHidden()) {
-            updateUsingCanonicalUrl(tab);
+            updateUrl(tab.getUrl());
         }
     }
 
@@ -274,18 +245,4 @@
         String host = Uri.parse(url).getHost();
         return host == null ? "" : host;
     }
-
-    private boolean isLikelySubframeAmpNavigation(NavigationHandle navigation) {
-        if (navigation.isInMainFrame()) return false;
-        String subframeUrl = navigation.getUrl();
-        if (subframeUrl == null || subframeUrl.length() == 0) return false;
-
-        // Our heuristic for AMP pages, based on AMPPageLoadMetricsObserver, is to look for a
-        // subframe navigation that contains "amp_js_v" in the query. This might produce a false
-        // positive, but we're OK with that; we'll just call updateUrl an extra time. This is a
-        // no-op if the URL hasn't actually changed.
-        String query = Uri.parse(subframeUrl).getQuery();
-        if (query == null) return false;
-        return query.contains(AMP_QUERY_PARAM);
-    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
index a5a77c8..75229240 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
@@ -42,15 +42,12 @@
 import org.chromium.components.safe_browsing.SafeBrowsingApiBridge;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
-import org.chromium.content_public.browser.test.util.JavaScriptUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.common.ContentSwitches;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.ui.base.PageTransition;
 
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 
 /**
  * Integration tests for {@link PageViewObserver} and {@link SuspendedTab}
@@ -63,9 +60,6 @@
 public class TabSuspensionTest {
     private static final String STARTING_FQDN = "example.com";
     private static final String DIFFERENT_FQDN = "www.google.com";
-    private static final String MAINFRAME_TEST_PAGE =
-            "/chrome/test/data/android/usage_stats/amp_root.html";
-    private static final String SUBFRAME_TEST_PAGE = "/chrome/test/data/android/test.html";
 
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
@@ -75,13 +69,12 @@
     @Mock
     private UsageStatsBridge mUsageStatsBridge;
     @Mock
-    private EventTracker mEventTracker;
-    @Mock
     private SuspensionTracker mSuspensionTracker;
 
     private ChromeTabbedActivity mActivity;
     private PageViewObserver mPageViewObserver;
     private TokenTracker mTokenTracker;
+    private EventTracker mEventTracker;
     private Tab mTab;
     private EmbeddedTestServer mTestServer;
     private String mStartingUrl;
@@ -90,10 +83,12 @@
     @Before
     public void setUp() throws InterruptedException {
         MockitoAnnotations.initMocks(this);
-        // TokenTracker holds a promise, and Promises can only be used on a single thread, so we
-        // have to initialize it on the thread where it will be used.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTokenTracker = new TokenTracker(mUsageStatsBridge); });
+        // TokenTracker and EventTracker hold a promise, and Promises can only be used on a single
+        // thread, so we have to initialize them on the thread where they will be used.
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mTokenTracker = new TokenTracker(mUsageStatsBridge);
+            mEventTracker = new EventTracker(mUsageStatsBridge);
+        });
         mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
         mStartingUrl = mTestServer.getURLWithHostName(STARTING_FQDN, "/defaultresponse");
         mDifferentUrl = mTestServer.getURLWithHostName(DIFFERENT_FQDN, "/defaultresponse");
@@ -286,38 +281,6 @@
         });
     }
 
-    @Test
-    @MediumTest
-    public void testAmpPage() throws InterruptedException, TimeoutException {
-        String mainframeUrl = mTestServer.getURLWithHostName(DIFFERENT_FQDN, MAINFRAME_TEST_PAGE);
-        mActivityTestRule.loadUrl(mainframeUrl);
-        doReturn(true).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN);
-
-        String iframeSrc =
-                mTestServer.getURLWithHostName(STARTING_FQDN, SUBFRAME_TEST_PAGE + "?amp_js_v=0");
-        String code = "document.getElementById('iframe_test_id').src='" + iframeSrc + "';";
-        JavaScriptUtils.executeJavaScriptAndWaitForResult(
-                mTab.getWebContents(), code, 3, TimeUnit.SECONDS);
-        waitForSuspendedTabToShow(mTab, STARTING_FQDN);
-
-        doReturn(false).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN);
-        unsuspendDomain(STARTING_FQDN);
-        assertSuspendedTabHidden(mTab);
-
-        // Un-suspension reloads the page, so we need to wait for it to load and re-navigate the
-        // iframe back to the suspended domain.
-        ChromeTabUtils.waitForTabPageLoaded(mTab, mainframeUrl);
-        JavaScriptUtils.executeJavaScriptAndWaitForResult(
-                mTab.getWebContents(), code, 3, TimeUnit.SECONDS);
-
-        doReturn(true).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN);
-        suspendDomain(STARTING_FQDN);
-        waitForSuspendedTabToShow(mTab, STARTING_FQDN);
-
-        mActivityTestRule.loadUrl(mDifferentUrl);
-        assertSuspendedTabHidden(mTab);
-    }
-
     private void startLoadingUrl(Tab tab, String url) {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> { tab.loadUrl(new LoadUrlParams(url, PageTransition.TYPED)); });