|  | // Copyright 2016 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. | 
|  |  | 
|  | #include "content/browser/media/audible_metrics.h" | 
|  |  | 
|  | #include "base/metrics/histogram_macros.h" | 
|  | #include "base/metrics/user_metrics.h" | 
|  | #include "base/time/default_tick_clock.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | AudibleMetrics::AudibleMetrics() | 
|  | : max_concurrent_audible_web_contents_in_session_(0), | 
|  | clock_(new base::DefaultTickClock()) { | 
|  | } | 
|  |  | 
|  | AudibleMetrics::~AudibleMetrics() { | 
|  | } | 
|  |  | 
|  | void AudibleMetrics::UpdateAudibleWebContentsState( | 
|  | const WebContents* web_contents, bool audible) { | 
|  | bool found = | 
|  | audible_web_contents_.find(web_contents) != audible_web_contents_.end(); | 
|  | if (found == audible) | 
|  | return; | 
|  |  | 
|  | if (audible) | 
|  | AddAudibleWebContents(web_contents); | 
|  | else | 
|  | RemoveAudibleWebContents(web_contents); | 
|  | } | 
|  |  | 
|  | void AudibleMetrics::SetClockForTest( | 
|  | std::unique_ptr<base::TickClock> test_clock) { | 
|  | clock_ = std::move(test_clock); | 
|  | } | 
|  |  | 
|  | void AudibleMetrics::AddAudibleWebContents(const WebContents* web_contents) { | 
|  | base::RecordAction(base::UserMetricsAction("Media.Audible.AddTab")); | 
|  |  | 
|  | UMA_HISTOGRAM_CUSTOM_COUNTS( | 
|  | "Media.Audible.ConcurrentTabsWhenStarting", audible_web_contents_.size(), | 
|  | 1, 10, 11); | 
|  |  | 
|  | audible_web_contents_.insert(web_contents); | 
|  | if (audible_web_contents_.size() > 1 && | 
|  | concurrent_web_contents_start_time_.is_null()) { | 
|  | concurrent_web_contents_start_time_ = clock_->NowTicks(); | 
|  | } | 
|  |  | 
|  | if (audible_web_contents_.size() > | 
|  | max_concurrent_audible_web_contents_in_session_) { | 
|  | max_concurrent_audible_web_contents_in_session_ = | 
|  | audible_web_contents_.size(); | 
|  |  | 
|  | UMA_HISTOGRAM_CUSTOM_COUNTS( | 
|  | "Media.Audible.MaxConcurrentTabsInSession", | 
|  | max_concurrent_audible_web_contents_in_session_, | 
|  | 1, 10, 11); | 
|  | } | 
|  | } | 
|  |  | 
|  | void AudibleMetrics::RemoveAudibleWebContents(const WebContents* web_contents) { | 
|  | base::RecordAction(base::UserMetricsAction("Media.Audible.RemoveTab")); | 
|  |  | 
|  | audible_web_contents_.erase(web_contents); | 
|  |  | 
|  | if (audible_web_contents_.size() <= 1 && | 
|  | !concurrent_web_contents_start_time_.is_null()) { | 
|  | base::TimeDelta concurrent_total_time = | 
|  | clock_->NowTicks() - concurrent_web_contents_start_time_; | 
|  | concurrent_web_contents_start_time_ = base::TimeTicks(); | 
|  |  | 
|  | UMA_HISTOGRAM_LONG_TIMES("Media.Audible.ConcurrentTabsTime", | 
|  | concurrent_total_time); | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace content |