/** * Handle all necessary tasks that can be delayed until initialization completes. * * @param activityCreationTimeMs The time of creation for the activity this toolbar belongs to. * @param activityName Simple class name for the activity this toolbar belongs to. */ public void onDeferredStartup(final long activityCreationTimeMs, final String activityName) { // Record startup performance statistics long elapsedTime = SystemClock.elapsedRealtime() - activityCreationTimeMs; if (elapsedTime < RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS) { ThreadUtils.postOnUiThreadDelayed( new Runnable() { @Override public void run() { onDeferredStartup(activityCreationTimeMs, activityName); } }, RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS - elapsedTime); } RecordHistogram.recordTimesHistogram( "MobileStartup.ToolbarFirstDrawTime." + activityName, mToolbar.getFirstDrawTime() - activityCreationTimeMs, TimeUnit.MILLISECONDS); long firstFocusTime = mToolbar.getLocationBar().getFirstUrlBarFocusTime(); if (firstFocusTime != 0) { RecordHistogram.recordCustomTimesHistogram( "MobileStartup.ToolbarFirstFocusTime." + activityName, firstFocusTime - activityCreationTimeMs, MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS, MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS, TimeUnit.MILLISECONDS, 50); } }
@Override public void didCommitProvisionalLoadForFrame( long frameId, boolean isMainFrame, String url, int transitionType) { if (isMainFrame && UmaUtils.isRunningApplicationStart()) { // Currently it takes about 2000ms to commit a navigation if the measurement // begins very early in the browser start. How many buckets (b) are needed to // explore the _typical_ values with granularity 100ms and a maximum duration // of 1 minute? // s^{n+1} / s^{n} = 2100 / 2000 // s = 1.05 // s^b = 60000 // b = ln(60000) / ln(1.05) ~= 225 RecordHistogram.recordCustomTimesHistogram( "Startup.FirstCommitNavigationTime", SystemClock.uptimeMillis() - UmaUtils.getMainEntryPointTime(), 1, 60000 /* 1 minute */, TimeUnit.MILLISECONDS, 225); UmaUtils.setRunningApplicationStart(false); } if (isMainFrame) { mTab.setIsTabStateDirty(true); mTab.updateTitle(); } RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { observers .next() .onDidCommitProvisionalLoadForFrame(mTab, frameId, isMainFrame, url, transitionType); } observers.rewind(); while (observers.hasNext()) { observers.next().onUrlUpdated(mTab); } if (!isMainFrame) return; mTab.handleDidCommitProvisonalLoadForFrame(url, transitionType); }