| Index: chrome/browser/ui/tabs/tab_strip_model_stats_recorder.cc
|
| diff --git a/chrome/browser/ui/tabs/tab_strip_model_stats_recorder.cc b/chrome/browser/ui/tabs/tab_strip_model_stats_recorder.cc
|
| index e61fc3dd31518c1d04064a864579264b8af04a4f..9b1d577c4fcdb3322efe1f3272186539c8458e57 100644
|
| --- a/chrome/browser/ui/tabs/tab_strip_model_stats_recorder.cc
|
| +++ b/chrome/browser/ui/tabs/tab_strip_model_stats_recorder.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/supports_user_data.h"
|
| +#include "base/time/time.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_iterator.h"
|
| #include "chrome/browser/ui/browser_list.h"
|
| @@ -42,9 +43,12 @@ class TabStripModelStatsRecorder::TabInfo
|
| return info;
|
| }
|
|
|
| + base::TimeTicks CreationTime() const { return creation_time_; }
|
| +
|
| private:
|
| TabState current_state_ = TabState::INITIAL;
|
| base::TimeTicks last_state_modified_;
|
| + base::TimeTicks creation_time_ = base::TimeTicks::Now();
|
|
|
| static const char kKey[];
|
| };
|
| @@ -102,6 +106,12 @@ void TabStripModelStatsRecorder::TabInfo::UpdateState(TabState new_state) {
|
| NOTREACHED();
|
| break;
|
| }
|
| +
|
| + if (new_state == TabState::CLOSED) {
|
| + UMA_HISTOGRAM_FINE_TIMES_100("Tabs.FineTiming.TabLifetime",
|
| + now - creation_time_);
|
| + }
|
| +
|
| last_state_modified_ = now;
|
| current_state_ = new_state;
|
| }
|
| @@ -110,6 +120,7 @@ void TabStripModelStatsRecorder::TabClosingAt(TabStripModel*,
|
| content::WebContents* contents,
|
| int index) {
|
| TabInfo::Get(contents)->UpdateState(TabState::CLOSED);
|
| + last_close_time_ = base::TimeTicks::Now();
|
|
|
| // Avoid having stale pointer in active_tab_history_
|
| std::replace(active_tab_history_.begin(), active_tab_history_.end(), contents,
|
| @@ -132,6 +143,23 @@ void TabStripModelStatsRecorder::ActiveTabChanged(
|
| DCHECK(new_contents);
|
| TabInfo* tab_info = TabInfo::Get(new_contents);
|
|
|
| + if (tab_info->state() == TabState::INITIAL) {
|
| + // A new tab has been created: log the time since the last one was created.
|
| + if (!last_creation_time_.is_null()) {
|
| + UMA_HISTOGRAM_FINE_TIMES_100("Tabs.FineTiming.TimeSinceLastTabCreated",
|
| + tab_info->CreationTime() - last_creation_time_);
|
| + }
|
| + last_creation_time_ = tab_info->CreationTime();
|
| +
|
| + // Also log the time since a tab was closed, but only if this is the first
|
| + // tab that was opened since the closing.
|
| + if (!last_close_time_.is_null()) {
|
| + UMA_HISTOGRAM_FINE_TIMES_100("Tabs.FineTiming.TimeSinceLastTabClosed",
|
| + tab_info->CreationTime() - last_close_time_);
|
| + last_close_time_ = base::TimeTicks();
|
| + }
|
| + }
|
| +
|
| bool was_inactive = tab_info->state() == TabState::INACTIVE;
|
| tab_info->UpdateState(TabState::ACTIVE);
|
|
|
|
|