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 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)) { |