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 f3a6d0af9083a8d470f35df3a05ca4fedf19d128..c25117dd114115a97aa802e1eabeffe5e33c086e 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 |
@@ -27,6 +27,7 @@ import android.support.customtabs.ICustomTabsCallback; |
import android.support.customtabs.ICustomTabsService; |
import android.text.TextUtils; |
import android.util.SparseArray; |
+import android.util.SparseBooleanArray; |
import android.view.WindowManager; |
import org.chromium.base.FieldTrialList; |
@@ -79,6 +80,13 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
private static final int GOOD_PREDICTION = 1; |
private static final int BAD_PREDICTION = 2; |
private static final int PREDICTION_STATUS_COUNT = 3; |
+ // Values for the "CustomTabs.CalledWarmup" UMA histogram. Append-only. |
pasko
2015/09/03 18:02:19
nittynit: empty line above would look nicer
Benoit L
2015/09/29 09:04:23
Ack.
|
+ private static final int NO_SESSION_NO_WARMUP = 0; |
+ private static final int NO_SESSION_WARMUP = 1; |
+ private static final int SESSION_NO_WARMUP_ALREADY_CALLED = 2; |
+ private static final int SESSION_NO_WARMUP_NOT_CALLED = 3; |
+ private static final int SESSION_WARMUP = 4; |
+ private static final int SESSION_WARMUP_COUNT = 5; |
private static AtomicReference<CustomTabsConnection> sInstance = |
new AtomicReference<CustomTabsConnection>(); |
@@ -196,6 +204,8 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
// Prediction tracking is done by UID and not by session, since a |
// mis-behaving application can create a large number of sessions. |
private SparseArray<PredictionStats> mUidToPredictionsStats = new SparseArray<>(); |
+ // Whether a client application has called warmup() in this instance lifetime. |
+ private SparseBooleanArray mUidHasCalledWarmup = new SparseBooleanArray(); |
/** |
* <strong>DO NOT CALL</strong> |
@@ -261,6 +271,11 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
public boolean warmup(long flags) { |
// Here and in mayLaunchUrl(), don't do expensive work for background applications. |
if (!isCallerForegroundOrSelf()) return false; |
+ |
+ synchronized (mLock) { |
+ mUidHasCalledWarmup.put(Binder.getCallingUid(), true); |
+ } |
+ |
if (!mWarmupHasBeenCalled.compareAndSet(false, true)) return true; |
// The call is non-blocking and this must execute on the UI thread, post a task. |
ThreadUtils.postOnUiThread(new Runnable() { |
@@ -384,11 +399,16 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
void registerLaunch(IBinder session, String url) { |
int outcome; |
long elapsedTimeMs = -1; |
+ boolean hasValidSession = false; |
+ boolean hasUidCalledWarmup = false; |
synchronized (mLock) { |
SessionParams sessionParams = mSessionParams.get(session); |
if (sessionParams == null) { |
outcome = NO_PREDICTION; |
} else { |
+ hasValidSession = true; |
+ hasUidCalledWarmup = mUidHasCalledWarmup.get(sessionParams.mUid); |
+ |
String predictedUrl = sessionParams.getPredictedUrl(); |
outcome = predictedUrl == null ? NO_PREDICTION |
: predictedUrl.equals(url) ? GOOD_PREDICTION : BAD_PREDICTION; |
@@ -408,6 +428,19 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
RecordHistogram.recordCustomTimesHistogram("CustomTabs.PredictionToLaunch", |
elapsedTimeMs, 1, TimeUnit.MINUTES.toMillis(3), TimeUnit.MILLISECONDS, 100); |
} |
+ // CustomTabs.CalledWarmup histogram. |
+ boolean warmupCalled = mWarmupHasBeenCalled.get(); |
+ int warmupKind = warmupCalled ? NO_SESSION_WARMUP : NO_SESSION_NO_WARMUP; |
+ if (hasValidSession) { |
+ if (hasUidCalledWarmup) { |
+ warmupKind = SESSION_WARMUP; |
+ } else { |
+ warmupKind = warmupCalled ? SESSION_NO_WARMUP_ALREADY_CALLED |
+ : SESSION_NO_WARMUP_NOT_CALLED; |
+ } |
+ } |
+ RecordHistogram.recordEnumeratedHistogram( |
+ "CustomTabs.CalledWarmup", warmupKind, SESSION_WARMUP_COUNT); |
} |
/** |
@@ -637,6 +670,7 @@ public class CustomTabsConnection extends ICustomTabsService.Stub { |
SessionParams params = mSessionParams.get(session); |
if (params == null) return; |
mSessionParams.remove(session); |
+ mUidHasCalledWarmup.delete(params.mUid); |
IBinder binder = params.mCallback.asBinder(); |
binder.unlinkToDeath(params.mDeathRecipient, 0); |
if (mPrerender != null && session.equals(mPrerender.mSession)) { |