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; |
+ } |
+ } |
} |