 Chromium Code Reviews
 Chromium Code Reviews Issue 2748013004:
  CustomTabs: Base version for prerender switch  (Closed)
    
  
    Issue 2748013004:
  CustomTabs: Base version for prerender switch  (Closed) 
  | 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..bd38e643e0fb5b0e0befffae414d74d3d0469bd7 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 | 
| @@ -83,7 +83,8 @@ public class CustomTabsConnection { | 
| @VisibleForTesting | 
| static final String DEBUG_OVERRIDE_KEY = | 
| "android.support.customtabs.maylaunchurl.DEBUG_OVERRIDE"; | 
| - private static final int NO_OVERRIDE = 0; | 
| + @VisibleForTesting | 
| + static final int NO_OVERRIDE = 0; | 
| @VisibleForTesting | 
| static final int NO_PRERENDERING = 1; | 
| @VisibleForTesting | 
| @@ -96,31 +97,30 @@ public class CustomTabsConnection { | 
| static final class SpeculationParams { | 
| public final CustomTabsSessionToken session; | 
| public final String url; | 
| + public final int debugOverrideValue; | 
| 
ahemery1
2017/03/21 15:15:57
Replaces prefetchOnly to have a record of what the
 
Benoit L
2017/03/21 15:56:41
I would prefer a name like "mode", or something al
 | 
| // Only for prerender. | 
| public final WebContents webContents; | 
| public final String referrer; | 
| public final Bundle extras; | 
| - public final boolean prefetchOnly; | 
| + static SpeculationParams forPrefetch(CustomTabsSessionToken session, String url) { | 
| 
ahemery1
2017/03/21 15:15:58
Just reordered.
 
Benoit L
2017/03/21 15:56:41
why?
Not an issue, but why reordering code?
 | 
| + return new SpeculationParams(session, url, PREFETCH_ONLY, null, null, null); | 
| + } | 
| static SpeculationParams forPrerender(CustomTabsSessionToken session, String url, | 
| WebContents webcontents, String referrer, Bundle extras) { | 
| - return new SpeculationParams(session, url, webcontents, referrer, extras, false); | 
| - } | 
| - | 
| - static SpeculationParams forPrefetch(CustomTabsSessionToken session, String url) { | 
| - return new SpeculationParams(session, url, null, null, null, true); | 
| + return new SpeculationParams(session, url, NO_OVERRIDE, webcontents, referrer, extras); | 
| } | 
| private SpeculationParams(CustomTabsSessionToken session, String url, | 
| - WebContents webContents, String referrer, Bundle extras, boolean prefetchOnly) { | 
| + int debugOverrideValue, WebContents webContents, String referrer, Bundle extras) { | 
| this.session = session; | 
| this.url = url; | 
| + this.debugOverrideValue = debugOverrideValue; | 
| this.webContents = webContents; | 
| this.referrer = referrer; | 
| this.extras = extras; | 
| - this.prefetchOnly = prefetchOnly; | 
| } | 
| } | 
| @@ -333,6 +333,8 @@ public class CustomTabsConnection { | 
| didStartPrefetch = new ResourcePrefetchPredictor(profile).startPrefetching(url); | 
| if (didStartPrefetch) mSpeculation = SpeculationParams.forPrefetch(session, url); | 
| } else if (debugOverrideValue != NO_PRERENDERING) { | 
| + // Last one wins and cancels the previous prerender. | 
| 
ahemery1
2017/03/21 15:15:57
This was moved from inside the prerenderUrl() func
 
Benoit L
2017/03/21 15:56:41
nit: Is it possible to isolate the changes between
 | 
| + cancelPrerender(null); | 
| didStartPrerender = prerenderUrl(session, url, extras, uid); | 
| } | 
| } | 
| @@ -587,7 +589,7 @@ public class CustomTabsConnection { | 
| return null; | 
| } | 
| - if (mSpeculation.prefetchOnly) { | 
| + if (mSpeculation.debugOverrideValue == PREFETCH_ONLY) { | 
| Profile profile = Profile.getLastUsedProfile(); | 
| new ResourcePrefetchPredictor(profile).stopPrefetching(mSpeculation.url); | 
| mSpeculation = null; | 
| @@ -901,16 +903,27 @@ public class CustomTabsConnection { | 
| } | 
| /** Cancels a prerender for a given session, or any session if null. */ | 
| + @VisibleForTesting | 
| void cancelPrerender(CustomTabsSessionToken session) { | 
| - ThreadUtils.assertOnUiThread(); | 
| - if (mSpeculation != null && (session == null || session.equals(mSpeculation.session)) | 
| - && mSpeculation.webContents != null) { | 
| - mExternalPrerenderHandler.cancelCurrentPrerender(); | 
| - mSpeculation.webContents.destroy(); | 
| - mSpeculation = null; | 
| + if (mSpeculation == null) return; | 
| + if (session != null && !session.equals(mSpeculation.session)) return; | 
| + switch (mSpeculation.debugOverrideValue) { | 
| + case NO_OVERRIDE: | 
| + cancelNoOverridePrerender(session); | 
| + break; | 
| + default: | 
| + return; | 
| } | 
| } | 
| + private void cancelNoOverridePrerender(CustomTabsSessionToken session) { | 
| + ThreadUtils.assertOnUiThread(); | 
| + if (mSpeculation.webContents == null) return; | 
| + mExternalPrerenderHandler.cancelCurrentPrerender(); | 
| + mSpeculation.webContents.destroy(); | 
| + mSpeculation = null; | 
| + } | 
| + | 
| /** | 
| * Tries to request a prerender for a given URL. | 
| * | 
| @@ -923,12 +936,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. | 
| - if (!mayPrerender(session) && !TextUtils.isEmpty(url)) return false; | 
| 
ahemery1
2017/03/21 15:15:57
Unnecessary duplicate.
 | 
| if (!mWarmupHasBeenCalled.get()) return false; | 
| - // Last one wins and cancels the previous prerender. | 
| - cancelPrerender(null); | 
| - if (TextUtils.isEmpty(url)) return false; | 
| 
ahemery1
2017/03/21 15:15:57
Extracted because behavior is more general than ju
 | 
| + | 
| boolean throttle = !shouldPrerenderOnCellularForSession(session); | 
| if (throttle && !mClientManager.isPrerenderingAllowed(uid)) return false; | 
| @@ -947,18 +956,17 @@ public class CustomTabsConnection { | 
| referrer = getReferrerForSession(session).getUrl(); | 
| } | 
| if (referrer == null) referrer = ""; | 
| - Pair<WebContents, WebContents> webContentsPair = mExternalPrerenderHandler.addPrerender( | 
| - 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( | 
| - session, url, dummyWebContents, referrer, extras); | 
| + mSpeculation = | 
| + SpeculationParams.forPrerender(session, url, dummyWebContents, referrer, extras); | 
| RecordHistogram.recordBooleanHistogram("CustomTabs.PrerenderSessionUsesDefaultParameters", | 
| mClientManager.usesDefaultSessionParameters(session)); |