Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| index 4c3eee8e7a1e3ffcf42febc2b7ac428fd24caedf..da7d69700fa42a9cf0f4bee91abd9f3b1815d6b4 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java |
| @@ -89,6 +89,11 @@ public class CustomTabsConnection { |
| @VisibleForTesting |
| static final int PREFETCH_ONLY = 2; |
| + @VisibleForTesting |
| + static final String PRERENDER_MODE_KEY = "android.support.customtabs.PRERENDER_MODE"; |
| + @VisibleForTesting |
| + static final int DEFAULT_PRERENDER = 0; |
|
ahemery
2017/03/16 17:28:35
Not sure of the name
|
| + |
| private static AtomicReference<CustomTabsConnection> sInstance = new AtomicReference<>(); |
| /** Holds the parameters for the current speculation. */ |
| @@ -126,6 +131,8 @@ public class CustomTabsConnection { |
| @VisibleForTesting |
| SpeculationParams mSpeculation; |
| + @VisibleForTesting |
| + int mPrerenderMode; |
| protected final Application mApplication; |
| protected final ClientManager mClientManager; |
| private final boolean mLogRequests; |
| @@ -333,7 +340,7 @@ public class CustomTabsConnection { |
| didStartPrefetch = new ResourcePrefetchPredictor(profile).startPrefetching(url); |
| if (didStartPrefetch) mSpeculation = SpeculationParams.forPrefetch(session, url); |
| } else if (debugOverrideValue != NO_PRERENDERING) { |
| - didStartPrerender = prerenderUrl(session, url, extras, uid); |
| + didStartPrerender = startPrerender(session, url, extras, uid); |
| } |
| } |
| preconnectUrls(otherLikelyBundles); |
| @@ -900,8 +907,19 @@ public class CustomTabsConnection { |
| return !cm.isActiveNetworkMetered() || shouldPrerenderOnCellularForSession(session); |
| } |
| - /** Cancels a prerender for a given session, or any session if null. */ |
| + @VisibleForTesting |
| void cancelPrerender(CustomTabsSessionToken session) { |
|
ahemery
2017/03/16 17:28:35
Generic function to cancel the prerendering of a U
|
| + switch (mPrerenderMode) { |
| + case DEFAULT_PRERENDER: |
| + cancelWebContentsPrerender(session); |
| + break; |
| + default: |
| + return; |
| + } |
| + } |
| + |
| + /** Cancels a prerender for a given session, or any session if null. */ |
| + private void cancelWebContentsPrerender(CustomTabsSessionToken session) { |
|
ahemery
2017/03/16 17:28:35
Version targeting what we know typically as "prere
|
| ThreadUtils.assertOnUiThread(); |
| if (mSpeculation != null && (session == null || session.equals(mSpeculation.session)) |
| && mSpeculation.webContents != null) { |
| @@ -911,6 +929,18 @@ public class CustomTabsConnection { |
| } |
| } |
| + private boolean startPrerender( |
|
ahemery
2017/03/16 17:28:35
Generic function to start prerendering a URL
|
| + CustomTabsSessionToken session, String url, Bundle extras, int uid) { |
| + // Last one wins and cancels the previous prerender. |
| + cancelPrerender(null); |
| + switch (mPrerenderMode) { |
| + case DEFAULT_PRERENDER: |
| + return prerenderUrl(session, url, extras, uid); |
| + default: |
| + return false; |
| + } |
| + } |
| + |
| /** |
| * Tries to request a prerender for a given URL. |
| * |
| @@ -923,12 +953,8 @@ public class CustomTabsConnection { |
| private boolean prerenderUrl( |
| CustomTabsSessionToken session, String url, Bundle extras, int uid) { |
| ThreadUtils.assertOnUiThread(); |
| - // Ignores mayPrerender() for an empty URL, since it cancels an existing prerender. |
|
ahemery
2017/03/16 17:28:35
This is already done in maylaunchUrl and it makes
|
| - if (!mayPrerender(session) && !TextUtils.isEmpty(url)) return false; |
| if (!mWarmupHasBeenCalled.get()) return false; |
| - // Last one wins and cancels the previous prerender. |
| - cancelPrerender(null); |
| - if (TextUtils.isEmpty(url)) return false; |
| + |
| boolean throttle = !shouldPrerenderOnCellularForSession(session); |
| if (throttle && !mClientManager.isPrerenderingAllowed(uid)) return false; |
| @@ -947,18 +973,17 @@ public class CustomTabsConnection { |
| referrer = getReferrerForSession(session).getUrl(); |
| } |
| if (referrer == null) referrer = ""; |
| - Pair<WebContents, WebContents> webContentsPair = mExternalPrerenderHandler.addPrerender( |
|
ahemery
2017/03/16 17:28:35
Auto formatting
|
| - Profile.getLastUsedProfile(), url, referrer, |
| - contentBounds, |
| - shouldPrerenderOnCellularForSession(session)); |
| + Pair<WebContents, WebContents> webContentsPair = |
| + mExternalPrerenderHandler.addPrerender(Profile.getLastUsedProfile(), url, referrer, |
| + contentBounds, shouldPrerenderOnCellularForSession(session)); |
| if (webContentsPair == null) return false; |
| WebContents dummyWebContents = webContentsPair.first; |
| if (webContentsPair.second != null) { |
| mClientManager.resetPostMessageHandlerForSession(session, webContentsPair.second); |
| } |
| if (throttle) mClientManager.registerPrerenderRequest(uid, url); |
| - mSpeculation = SpeculationParams.forPrerender( |
|
ahemery
2017/03/16 17:28:35
Auto formatting
|
| - session, url, dummyWebContents, referrer, extras); |
| + mSpeculation = |
| + SpeculationParams.forPrerender(session, url, dummyWebContents, referrer, extras); |
| RecordHistogram.recordBooleanHistogram("CustomTabs.PrerenderSessionUsesDefaultParameters", |
| mClientManager.usesDefaultSessionParameters(session)); |
| @@ -980,4 +1005,13 @@ public class CustomTabsConnection { |
| void setForcePrerender(boolean force) { |
| mForcePrerenderForTesting = force; |
| } |
| + |
| + @VisibleForTesting |
| + void setPrerenderMode(int mode) { |
|
ahemery
2017/03/16 17:28:35
The new switch that enables toggling between usual
|
| + if (mPrerenderMode != mode) { |
| + // Remove all existing speculations when switching mode |
| + cancelPrerender(null); |
| + mPrerenderMode = mode; |
| + } |
| + } |
| } |