Commit c579173c authored by Yashar Dabiran's avatar Yashar Dabiran Committed by Commit Bot

[Paint Preview] Add Startup.Android.Cold.TimeToVisibleContent metric

this new metric records the minimum recorded value of Startup.Android.Cold.TimeToFirstContentfulPaint and Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap.
It represents the time it takes for a user to see content.

Bug: 1142922
Change-Id: Ic0f6571e3699d042a1a57bfcf9f9f54cba4cdc06
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2500323Reviewed-by: default avatarMark Pearson <mpearson@chromium.org>
Reviewed-by: default avatarCalder Kitagawa <ckitagawa@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Commit-Queue: Yashar Dabiran <yashard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823285}
parent 23624bef
...@@ -1542,12 +1542,14 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent ...@@ -1542,12 +1542,14 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
mInactivityTracker = new ChromeInactivityTracker( mInactivityTracker = new ChromeInactivityTracker(
ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF); ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF);
assert getActivityTabStartupMetricsTracker() != null;
StartupPaintPreviewHelper.initialize(this, getTabModelSelector(), StartupPaintPreviewHelper.initialize(this, getTabModelSelector(),
shouldShowTabSwitcherOnStart(), shouldShowTabSwitcherOnStart(),
() ()
-> getToolbarManager() == null -> getToolbarManager() == null
? null ? null
: getToolbarManager().getProgressBarCoordinator()); : getToolbarManager().getProgressBarCoordinator(),
getActivityTabStartupMetricsTracker()::recordVisibleContent);
} }
@Override @Override
......
...@@ -20,6 +20,8 @@ import org.chromium.content_public.browser.WebContents; ...@@ -20,6 +20,8 @@ import org.chromium.content_public.browser.WebContents;
* startup. * startup.
*/ */
public class ActivityTabStartupMetricsTracker { public class ActivityTabStartupMetricsTracker {
private static final String UMA_HISTOGRAM_TABBED_SUFFIX = ".Tabbed";
private final long mActivityStartTimeMs; private final long mActivityStartTimeMs;
// Event duration recorded from the |mActivityStartTimeMs|. // Event duration recorded from the |mActivityStartTimeMs|.
...@@ -28,6 +30,7 @@ public class ActivityTabStartupMetricsTracker { ...@@ -28,6 +30,7 @@ public class ActivityTabStartupMetricsTracker {
private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
private PageLoadMetrics.Observer mPageLoadMetricsObserver; private PageLoadMetrics.Observer mPageLoadMetricsObserver;
private boolean mShouldTrackStartupMetrics; private boolean mShouldTrackStartupMetrics;
private boolean mVisibleContentRecorded;
public ActivityTabStartupMetricsTracker( public ActivityTabStartupMetricsTracker(
ObservableSupplier<TabModelSelector> tabModelSelectorSupplier) { ObservableSupplier<TabModelSelector> tabModelSelectorSupplier) {
...@@ -151,11 +154,31 @@ public class ActivityTabStartupMetricsTracker { ...@@ -151,11 +154,31 @@ public class ActivityTabStartupMetricsTracker {
if (mFirstCommitTimeMs == 0) return; if (mFirstCommitTimeMs == 0) return;
if (UmaUtils.hasComeToForeground() && !UmaUtils.hasComeToBackground()) { if (UmaUtils.hasComeToForeground() && !UmaUtils.hasComeToBackground()) {
long durationMs = firstContentfulPaintMs - mActivityStartTimeMs;
RecordHistogram.recordMediumTimesHistogram( RecordHistogram.recordMediumTimesHistogram(
"Startup.Android.Cold.TimeToFirstContentfulPaint" + mHistogramSuffix, "Startup.Android.Cold.TimeToFirstContentfulPaint" + mHistogramSuffix,
firstContentfulPaintMs - mActivityStartTimeMs); durationMs);
if (mHistogramSuffix.equals(UMA_HISTOGRAM_TABBED_SUFFIX)) {
recordVisibleContent(durationMs);
}
} }
// This is the last event we track, so destroy this tracker and remove observers. // This is the last event we track, so destroy this tracker and remove observers.
destroy(); destroy();
} }
/**
* Record the first Visible Content time.
* This metric reports the minimum value of
* Startup.Android.Cold.TimeToFirstContentfulPaint.Tabbed and
* Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap.
*
* @param durationMs duration in millis.
*/
public void recordVisibleContent(long durationMs) {
if (mVisibleContentRecorded) return;
mVisibleContentRecorded = true;
RecordHistogram.recordMediumTimesHistogram(
"Startup.Android.Cold.TimeToVisibleContent", durationMs);
}
} }
...@@ -69,7 +69,8 @@ public class StartupPaintPreviewHelper { ...@@ -69,7 +69,8 @@ public class StartupPaintPreviewHelper {
*/ */
public static void initialize(ChromeActivity<?> activity, TabModelSelector tabModelSelector, public static void initialize(ChromeActivity<?> activity, TabModelSelector tabModelSelector,
boolean willShowStartSurface, boolean willShowStartSurface,
Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier) { Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier,
Callback<Long> visibleContentCallback) {
if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)) return; if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)) return;
if (MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(activity) if (MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(activity)
...@@ -77,7 +78,8 @@ public class StartupPaintPreviewHelper { ...@@ -77,7 +78,8 @@ public class StartupPaintPreviewHelper {
sShouldShowOnRestore = false; sShouldShowOnRestore = false;
} }
sWindowAndroidHelperMap.put(activity.getWindowAndroid(), sWindowAndroidHelperMap.put(activity.getWindowAndroid(),
new PaintPreviewWindowAndroidHelper(activity, progressBarCoordinatorSupplier)); new PaintPreviewWindowAndroidHelper(
activity, progressBarCoordinatorSupplier, visibleContentCallback));
// TODO(crbug/1074428): verify this doesn't cause a memory leak if the user exits Chrome // TODO(crbug/1074428): verify this doesn't cause a memory leak if the user exits Chrome
// prior to onTabStateInitialized being called. // prior to onTabStateInitialized being called.
...@@ -137,7 +139,8 @@ public class StartupPaintPreviewHelper { ...@@ -137,7 +139,8 @@ public class StartupPaintPreviewHelper {
StartupPaintPreview startupPaintPreview = new StartupPaintPreview(tab, StartupPaintPreview startupPaintPreview = new StartupPaintPreview(tab,
windowAndroidHelper.getBrowserControlsManager().getBrowserVisibilityDelegate(), windowAndroidHelper.getBrowserControlsManager().getBrowserVisibilityDelegate(),
progressSimulatorCallback, progressPreventionCallback); progressSimulatorCallback, progressPreventionCallback,
windowAndroidHelper.getVisibleContentCallback());
startupPaintPreview.setActivityCreationTimestampMs( startupPaintPreview.setActivityCreationTimestampMs(
windowAndroidHelper.getActivityCreationTime()); windowAndroidHelper.getActivityCreationTime());
startupPaintPreview.setShouldRecordFirstPaint( startupPaintPreview.setShouldRecordFirstPaint(
...@@ -166,13 +169,16 @@ public class StartupPaintPreviewHelper { ...@@ -166,13 +169,16 @@ public class StartupPaintPreviewHelper {
private final WindowAndroid mWindowAndroid; private final WindowAndroid mWindowAndroid;
private final BrowserControlsManager mBrowserControlsManager; private final BrowserControlsManager mBrowserControlsManager;
private final Supplier<LoadProgressCoordinator> mProgressBarCoordinatorSupplier; private final Supplier<LoadProgressCoordinator> mProgressBarCoordinatorSupplier;
private final Callback<Long> mVisibleContentCallback;
PaintPreviewWindowAndroidHelper(ChromeActivity<?> chromeActivity, PaintPreviewWindowAndroidHelper(ChromeActivity<?> chromeActivity,
Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier) { Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier,
Callback<Long> visibleContentCallback) {
mWindowAndroid = chromeActivity.getWindowAndroid(); mWindowAndroid = chromeActivity.getWindowAndroid();
mActivityCreationTime = chromeActivity.getOnCreateTimestampMs(); mActivityCreationTime = chromeActivity.getOnCreateTimestampMs();
mBrowserControlsManager = chromeActivity.getBrowserControlsManager(); mBrowserControlsManager = chromeActivity.getBrowserControlsManager();
mProgressBarCoordinatorSupplier = progressBarCoordinatorSupplier; mProgressBarCoordinatorSupplier = progressBarCoordinatorSupplier;
mVisibleContentCallback = visibleContentCallback;
ApplicationStatus.registerStateListenerForActivity(this, chromeActivity); ApplicationStatus.registerStateListenerForActivity(this, chromeActivity);
} }
...@@ -188,6 +194,10 @@ public class StartupPaintPreviewHelper { ...@@ -188,6 +194,10 @@ public class StartupPaintPreviewHelper {
return mBrowserControlsManager; return mBrowserControlsManager;
} }
Callback<Long> getVisibleContentCallback() {
return mVisibleContentCallback;
}
@Override @Override
public void onActivityStateChange(Activity activity, @ActivityState int newState) { public void onActivityStateChange(Activity activity, @ActivityState int newState) {
if (newState == ActivityState.DESTROYED) { if (newState == ActivityState.DESTROYED) {
......
...@@ -50,6 +50,8 @@ public class StartupLoadingMetricsTest { ...@@ -50,6 +50,8 @@ public class StartupLoadingMetricsTest {
"Startup.Android.Cold.TimeToFirstNavigationCommit"; "Startup.Android.Cold.TimeToFirstNavigationCommit";
private static final String FIRST_CONTENTFUL_PAINT_HISTOGRAM = private static final String FIRST_CONTENTFUL_PAINT_HISTOGRAM =
"Startup.Android.Cold.TimeToFirstContentfulPaint"; "Startup.Android.Cold.TimeToFirstContentfulPaint";
private static final String VISIBLE_CONTENT_HISTOGRAM =
"Startup.Android.Cold.TimeToVisibleContent";
private static final String TABBED_SUFFIX = ChromeTabbedActivity.STARTUP_UMA_HISTOGRAM_SUFFIX; private static final String TABBED_SUFFIX = ChromeTabbedActivity.STARTUP_UMA_HISTOGRAM_SUFFIX;
private static final String WEBAPK_SUFFIX = private static final String WEBAPK_SUFFIX =
...@@ -111,6 +113,10 @@ public class StartupLoadingMetricsTest { ...@@ -111,6 +113,10 @@ public class StartupLoadingMetricsTest {
Assert.assertEquals(expectedCount, Assert.assertEquals(expectedCount,
RecordHistogram.getHistogramTotalCountForTesting( RecordHistogram.getHistogramTotalCountForTesting(
FIRST_CONTENTFUL_PAINT_HISTOGRAM + histogramSuffix)); FIRST_CONTENTFUL_PAINT_HISTOGRAM + histogramSuffix));
if (histogramSuffix.equals(TABBED_SUFFIX)) {
Assert.assertEquals(expectedCount,
RecordHistogram.getHistogramTotalCountForTesting(VISIBLE_CONTENT_HISTOGRAM));
}
} }
/** /**
......
...@@ -39,6 +39,7 @@ public class StartupPaintPreview implements PlayerManager.Listener { ...@@ -39,6 +39,7 @@ public class StartupPaintPreview implements PlayerManager.Listener {
private Runnable mOnDismissed; private Runnable mOnDismissed;
private SnackbarManager.SnackbarController mSnackbarController; private SnackbarManager.SnackbarController mSnackbarController;
private TabObserver mStartupTabObserver; private TabObserver mStartupTabObserver;
private Callback<Long> mVisibleContentCallback;
private boolean mFirstMeaningfulPaintHappened; private boolean mFirstMeaningfulPaintHappened;
private boolean mDidStartRestore; private boolean mDidStartRestore;
...@@ -54,7 +55,8 @@ public class StartupPaintPreview implements PlayerManager.Listener { ...@@ -54,7 +55,8 @@ public class StartupPaintPreview implements PlayerManager.Listener {
public StartupPaintPreview(Tab tab, public StartupPaintPreview(Tab tab,
BrowserStateBrowserControlsVisibilityDelegate visibilityDelegate, BrowserStateBrowserControlsVisibilityDelegate visibilityDelegate,
Runnable progressSimulatorCallback, Callback<Boolean> progressPreventionCallback) { Runnable progressSimulatorCallback, Callback<Boolean> progressPreventionCallback,
Callback<Long> visibleContentCallback) {
mTab = tab; mTab = tab;
mMetricsHelper = new StartupPaintPreviewMetrics(); mMetricsHelper = new StartupPaintPreviewMetrics();
mTabbedPaintPreview = TabbedPaintPreview.get(mTab); mTabbedPaintPreview = TabbedPaintPreview.get(mTab);
...@@ -63,6 +65,7 @@ public class StartupPaintPreview implements PlayerManager.Listener { ...@@ -63,6 +65,7 @@ public class StartupPaintPreview implements PlayerManager.Listener {
mTabbedPaintPreview.setProgressSimulatorNeededCallback(progressSimulatorCallback); mTabbedPaintPreview.setProgressSimulatorNeededCallback(progressSimulatorCallback);
mStartupTabObserver = new StartupPaintPreviewTabObserver(); mStartupTabObserver = new StartupPaintPreviewTabObserver();
mTab.addObserver(mStartupTabObserver); mTab.addObserver(mStartupTabObserver);
mVisibleContentCallback = visibleContentCallback;
} }
/** /**
...@@ -203,7 +206,8 @@ public class StartupPaintPreview implements PlayerManager.Listener { ...@@ -203,7 +206,8 @@ public class StartupPaintPreview implements PlayerManager.Listener {
public void onFirstPaint() { public void onFirstPaint() {
if (!mTabbedPaintPreview.isAttached()) return; if (!mTabbedPaintPreview.isAttached()) return;
mMetricsHelper.onFirstPaint(mActivityCreationTimestampMs, mShouldRecordFirstPaint); mMetricsHelper.onFirstPaint(
mActivityCreationTimestampMs, mShouldRecordFirstPaint, mVisibleContentCallback);
} }
@Override @Override
......
...@@ -8,6 +8,7 @@ import android.os.SystemClock; ...@@ -8,6 +8,7 @@ import android.os.SystemClock;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import org.chromium.base.Callback;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
...@@ -64,12 +65,16 @@ public class StartupPaintPreviewMetrics { ...@@ -64,12 +65,16 @@ public class StartupPaintPreviewMetrics {
mShownTime = System.currentTimeMillis(); mShownTime = System.currentTimeMillis();
} }
void onFirstPaint(long activityOnCreateTimestamp, Supplier<Boolean> shouldRecordFirstPaint) { void onFirstPaint(long activityOnCreateTimestamp, Supplier<Boolean> shouldRecordFirstPaint,
Callback<Long> visibleContentCallback) {
mFirstPaintHappened = true; mFirstPaintHappened = true;
if (shouldRecordFirstPaint != null && shouldRecordFirstPaint.get()) { if (shouldRecordFirstPaint != null && shouldRecordFirstPaint.get()) {
long durationMs = SystemClock.elapsedRealtime() - activityOnCreateTimestamp;
RecordHistogram.recordLongTimesHistogram( RecordHistogram.recordLongTimesHistogram(
"Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap", "Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap", durationMs);
SystemClock.elapsedRealtime() - activityOnCreateTimestamp); if (visibleContentCallback != null) {
visibleContentCallback.onResult(durationMs);
}
} }
} }
......
...@@ -83,7 +83,7 @@ public class StartupPaintPreviewTest { ...@@ -83,7 +83,7 @@ public class StartupPaintPreviewTest {
public void testDisplayedCorrectly() throws ExecutionException { public void testDisplayedCorrectly() throws ExecutionException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TestThreadUtils.runOnUiThreadBlocking(() -> startupPaintPreview.show(null)); TestThreadUtils.runOnUiThreadBlocking(() -> startupPaintPreview.show(null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
...@@ -95,7 +95,7 @@ public class StartupPaintPreviewTest { ...@@ -95,7 +95,7 @@ public class StartupPaintPreviewTest {
public void testSnackbarShow() throws ExecutionException { public void testSnackbarShow() throws ExecutionException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
showAndWaitForInflation(startupPaintPreview, tabbedPaintPreview, null); showAndWaitForInflation(startupPaintPreview, tabbedPaintPreview, null);
...@@ -133,7 +133,7 @@ public class StartupPaintPreviewTest { ...@@ -133,7 +133,7 @@ public class StartupPaintPreviewTest {
public void testRemoveOnFirstMeaningfulPaint() throws ExecutionException { public void testRemoveOnFirstMeaningfulPaint() throws ExecutionException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
CallbackHelper dismissCallback = new CallbackHelper(); CallbackHelper dismissCallback = new CallbackHelper();
...@@ -155,7 +155,7 @@ public class StartupPaintPreviewTest { ...@@ -155,7 +155,7 @@ public class StartupPaintPreviewTest {
public void testRemoveOnOfflinePage() throws ExecutionException { public void testRemoveOnOfflinePage() throws ExecutionException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
// Offline page callback always returns true. // Offline page callback always returns true.
...@@ -179,7 +179,7 @@ public class StartupPaintPreviewTest { ...@@ -179,7 +179,7 @@ public class StartupPaintPreviewTest {
public void testRemoveOnActionbarClick() throws ExecutionException, UiObjectNotFoundException { public void testRemoveOnActionbarClick() throws ExecutionException, UiObjectNotFoundException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
CallbackHelper dismissCallback = new CallbackHelper(); CallbackHelper dismissCallback = new CallbackHelper();
...@@ -207,7 +207,7 @@ public class StartupPaintPreviewTest { ...@@ -207,7 +207,7 @@ public class StartupPaintPreviewTest {
public void testRemoveOnNavigation() throws ExecutionException, UiObjectNotFoundException { public void testRemoveOnNavigation() throws ExecutionException, UiObjectNotFoundException {
Tab tab = sActivityTestRule.getActivity().getActivityTab(); Tab tab = sActivityTestRule.getActivity().getActivityTab();
StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking( StartupPaintPreview startupPaintPreview = TestThreadUtils.runOnUiThreadBlocking(
() -> new StartupPaintPreview(tab, null, null, null)); () -> new StartupPaintPreview(tab, null, null, null, null));
TabbedPaintPreview tabbedPaintPreview = TabbedPaintPreview tabbedPaintPreview =
TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab)); TestThreadUtils.runOnUiThreadBlocking(() -> TabbedPaintPreview.get(tab));
CallbackHelper dismissCallback = new CallbackHelper(); CallbackHelper dismissCallback = new CallbackHelper();
......
...@@ -82,6 +82,20 @@ reviews. Googlers can read more about this at go/gwsq-gerrit. ...@@ -82,6 +82,20 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</summary> </summary>
</histogram> </histogram>
<histogram name="Startup.Android.Cold.TimeToVisibleContent" units="ms"
expires_after="2021-04-26">
<owner>yashard@chromium.org</owner>
<owner>ckitagawa@chromium.org</owner>
<summary>
Android: The time from the activity creation point to the moment the content
may first appear ready to a user. The intent is to capture readiness of
Chrome regardless of whether Chrome is launched into native UI or a web
page. The recorded value is the minimum of
'Startup.Android.Cold.TimeToFirstContentfulPaint.Tabbed' and
'Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap' metric values.
</summary>
</histogram>
<histogram base="true" name="Startup.Android.FeedContentFirstLoadedTime" <histogram base="true" name="Startup.Android.FeedContentFirstLoadedTime"
units="ms" expires_after="2021-06-10"> units="ms" expires_after="2021-06-10">
<!-- Name completed by histogram_suffixes name="JavaStartMode" --> <!-- Name completed by histogram_suffixes name="JavaStartMode" -->
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment