Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Unified Diff: ios/chrome/browser/metrics/tab_usage_recorder.h

Issue 2585233003: Upstream Chrome on iOS source code [2/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/metrics/tab_usage_recorder.h
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder.h b/ios/chrome/browser/metrics/tab_usage_recorder.h
new file mode 100644
index 0000000000000000000000000000000000000000..8b99125161c1c9eb2b05b5cef16c5232b26e2d96
--- /dev/null
+++ b/ios/chrome/browser/metrics/tab_usage_recorder.h
@@ -0,0 +1,222 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_METRICS_TAB_USAGE_RECORDER_H_
+#define IOS_CHROME_BROWSER_METRICS_TAB_USAGE_RECORDER_H_
+
+#import <Foundation/Foundation.h>
+#include <deque>
+#include <map>
+
+#include "base/ios/weak_nsobject.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#import "ios/chrome/browser/metrics/tab_usage_recorder_delegate.h"
+
+@class Tab;
+
+// Histogram names (visible for testing only).
+
+// The prefix of the histogram names. Used to create a HistogramRecorder.
+extern const char kTabUsageHistogramPrefix[];
+
+// The name of the histogram that records the state of the selected tab
+// (i.e. the tab being switched to).
+extern const char kSelectedTabHistogramName[];
+
+// The name of the histogram that records the number of page loads before an
+// evicted tab is selected.
+extern const char kPageLoadsBeforeEvictedTabSelected[];
+
+// The name of the histogram tracking the reload time for a previously-evicted
+// tab.
+extern const char kEvictedTabReloadTime[];
+
+// The name of the histogram for whether or not the reload of a
+// previously-evicted tab completed successfully.
+extern const char kEvictedTabReloadSuccessRate[];
+
+// The name of the histogram for whether or not the user switched tabs before an
+// evicted tab completed reloading.
+extern const char kDidUserWaitForEvictedTabReload[];
+
+// The name of the histogram that records time intervals between restores of
+// previously-evicted tabs. The first restore seen in a session will record the
+// time since the session started.
+extern const char kTimeBetweenRestores[];
+
+// The name of the histogram that records time intervals between the last
+// restore of a previously-evicted tab and the end of the session.
+extern const char kTimeAfterLastRestore[];
+
+// Name of histogram to record whether a memory warning had been recently
+// received when a renderer termination occurred.
+extern const char kRendererTerminationSawMemoryWarning[];
+
+// Name of histogram to record the number of alive renderers when a renderer
+// termination is received.
+extern const char kRendererTerminationAliveRenderers[];
+
+// Name of histogram to record the number of renderers that were alive shortly
+// before a renderer termination. This metric is being recorded in case the OS
+// kills renderers in batches.
+extern const char kRendererTerminationRecentlyAliveRenderers[];
+
+// The recently alive renderer count metric counts all renderers that were alive
+// x seconds before a renderer termination. |kSecondsBeforeRendererTermination|
+// specifies x.
+extern const int kSecondsBeforeRendererTermination;
+
+// Reports usage about the lifecycle of a single TabModel's tabs.
+class TabUsageRecorder {
+ public:
+ enum TabStateWhenSelected {
+ IN_MEMORY = 0,
+ EVICTED,
+ EVICTED_DUE_TO_COLD_START,
+ PARTIALLY_EVICTED, // Currently, used only by Android.
+ EVICTED_DUE_TO_BACKGROUNDING, // Deprecated
+ EVICTED_DUE_TO_INCOGNITO,
+ RELOADED_DUE_TO_COLD_START_FG_TAB_ON_START, // Android.
+ RELOADED_DUE_TO_COLD_START_BG_TAB_ON_SWITCH, // Android.
+ LAZY_LOAD_FOR_OPEN_IN_NEW_TAB, // Android
+ STOPPED_DUE_TO_LOADING_WHEN_BACKGROUNDING, // Deprecated.
+ EVICTED_DUE_TO_LOADING_WHEN_BACKGROUNDING, // Deprecated.
+ EVICTED_DUE_TO_RENDERER_TERMINATION,
+ TAB_STATE_COUNT,
+ };
+
+ enum LoadDoneState {
+ LOAD_FAILURE,
+ LOAD_SUCCESS,
+ LOAD_DONE_STATE_COUNT,
+ };
+
+ enum EvictedTabUserBehavior {
+ USER_WAITED,
+ USER_DID_NOT_WAIT,
+ USER_LEFT_CHROME,
+ USER_BEHAVIOR_COUNT,
+ };
+
+ // |delegate| is the TabUsageRecorderDelegate which provides access to the
+ // Tabs which this TabUsageRecorder is monitoring. |delegate| can be nil.
+ explicit TabUsageRecorder(id<TabUsageRecorderDelegate> delegate);
+ virtual ~TabUsageRecorder();
+
+ // Called during startup when the tab model is created, or shortly after a
+ // post-crash launch if the tabs are restored. |tabs| is an array containing
+ // the tabs being restored in the current tab model. |active_tab| is the tab
+ // currently in the foreground.
+ void InitialRestoredTabs(Tab* active_tab, NSArray* tabs);
+
+ // Called when a tab is created for immediate selection.
+ void TabCreatedForSelection(Tab* tab);
+
+ // Called when a tab switch is made. Determines what value to record, and
+ // when to reset the page load counter.
+ void RecordTabSwitched(Tab* old_tab, Tab* new_tab);
+
+ // Called when the tab model which the user is primarily interacting with has
+ // changed. The |active_tab| is the current tab of the tab model. If the user
+ // began interacting with |active_tab|, |primary| should be true. If the user
+ // stopped interacting with |active_tab|, |primary| should be false.
+ void RecordPrimaryTabModelChange(BOOL primary, Tab* active_tab);
+
+ // Called when a page load begins, to keep track of how many page loads
+ // happen before an evicted tab is seen.
+ void RecordPageLoadStart(Tab* tab);
+
+ // Called when a page load finishes, to track the load time for evicted tabs.
+ void RecordPageLoadDone(Tab* tab, bool success);
+
+ // Called when there is a user-initiated reload.
+ void RecordReload(Tab* tab);
+
+ // Called when WKWebView's renderer is terminated. |tab| contains the tab
+ // whose renderer was terminated, and |visible| indicates whether or not the
+ // tab was visible when the renderer terminated.
+ void RendererTerminated(Tab* tab, bool visible);
+
+ // Called when the app has been backgrounded.
+ void AppDidEnterBackground();
+
+ // Called when the app has been foregrounded.
+ void AppWillEnterForeground();
+
+ // Resets the page load count.
+ void ResetPageLoads();
+
+ // Size of |evicted_tabs_|. Used for testing.
+ int EvictedTabsMapSize();
+
+ // Resets all tracked data. Used for testing.
+ void ResetAll();
+
+ // Sets the delegate for the TabUsageRecorder.
+ void SetDelegate(id<TabUsageRecorderDelegate> delegate);
+
+ protected:
+ // Keep track of when the most recent tab restore begins, to record the time
+ // between evicted-tab-reloads.
+ base::TimeTicks restore_start_time_;
+
+ // Keep track of the timestamps of renderer terminations in order to find the
+ // number of recently alive tabs when a renderer termination occurs.
+ std::deque<base::TimeTicks> termination_timestamps_;
+
+ private:
+ // Clear out all state regarding a current evicted tab.
+ void ResetEvictedTab();
+
+ // Whether or not a tab can be disregarded by the metrics.
+ bool ShouldIgnoreTab(Tab* tab);
+
+ // Whether or not the tab has already been evicted.
+ bool TabAlreadyEvicted(Tab* tab);
+
+ // Returns the state of the given tab. Call only once per tab, as it removes
+ // the tab from |evicted_tabs_|.
+ TabStateWhenSelected ExtractTabState(Tab* tab);
+
+ // Records various time metrics when a restore of an evicted tab begins.
+ void RecordRestoreStartTime();
+
+ // Clears deleted tabs from |evicted_tabs_|.
+ void ClearDeletedTabs();
+
+ // Number of page loads since the last evicted tab was seen.
+ unsigned int page_loads_;
+
+ // Keep track of the current tab, but only if it has been evicted.
+ // This is kept as a pointer value only - it should never be dereferenced.
+ void* evicted_tab_;
+
+ // State of |evicted_tab_| at the time it became the current tab.
+ TabStateWhenSelected evicted_tab_state_;
+
+ // Keep track of the tab last selected when this tab model was switched
+ // away from to another mode (e.g. to incognito).
+ // Kept as a pointer value only - it should never be dereferenced.
+ void* mode_switch_tab_;
+
+ // Keep track of a tab that was created to be immediately selected. It should
+ // not contribute to the "StatusWhenSwitchedBackToForeground" metric.
+ void* tab_created_selected_;
+
+ // Keep track of when the evicted tab starts to reload, so that the total
+ // time it takes to reload can be recorded.
+ base::TimeTicks evicted_tab_reload_start_time_;
+
+ // Keep track of the tabs that have a known eviction cause.
+ std::map<base::WeakNSObject<Tab>, TabStateWhenSelected> evicted_tabs_;
+
+ // Reference to TabUsageRecorderDelegate which provides access to the count of
+ // live tabs monitored by this recorder.
+ base::WeakNSProtocol<id<TabUsageRecorderDelegate>> recorder_delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(TabUsageRecorder);
+};
+
+#endif // IOS_CHROME_BROWSER_METRICS_TAB_USAGE_RECORDER_H_
« no previous file with comments | « ios/chrome/browser/metrics/size_class_recorder_unittest.mm ('k') | ios/chrome/browser/metrics/tab_usage_recorder.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698