| // Copyright 2018 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 CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MEMORY_METRICS_REPORTER_H_ |
| #define CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MEMORY_METRICS_REPORTER_H_ |
| |
| #include "base/gtest_prod_util.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| #include "chrome/browser/resource_coordinator/tab_load_tracker.h" |
| #include "chrome/browser/resource_coordinator/time.h" |
| |
| namespace content { |
| class WebContents; |
| } // namespace content |
| |
| namespace resource_coordinator { |
| |
| // The TabMemoryMetricsReporter reports each tab's Memory_Experimental UKM |
| // 1, 5, 10, 15 minutes after the tab is loaded. |
| class TabMemoryMetricsReporter : public TabLoadTracker::Observer { |
| public: |
| TabMemoryMetricsReporter(); |
| ~TabMemoryMetricsReporter() override; |
| |
| void StartReporting(TabLoadTracker* tracker); |
| |
| void OnStartTracking(content::WebContents* web_contents, |
| LoadingState loading_state) override; |
| void OnLoadingStateChange(content::WebContents* web_contents, |
| LoadingState old_loading_state, |
| LoadingState new_loading_state) override; |
| void OnStopTracking(content::WebContents* web_contents, |
| LoadingState loading_state) override; |
| |
| private: |
| // For unittesting. |
| friend class TestTabMemoryMetricsReporter; |
| |
| // Constructor for TabMemoryMetricsReporterTest. |
| explicit TabMemoryMetricsReporter(const base::TickClock* tick_clock); |
| |
| void UpdateTimerCallback(); |
| |
| enum ReportState { |
| NO_METRICS_EMITTED, |
| EMITTED_1MIN_METRIC, |
| EMITTED_5MIN_METRIC, |
| EMITTED_10MIN_METRIC, |
| EMITTED_ALL_METRICS, |
| CONTENT_GONE |
| }; |
| |
| struct WebContentsData { |
| base::TimeTicks page_loaded_time; |
| base::TimeTicks next_emit_time; |
| ReportState state; |
| content::WebContents* web_contents; |
| }; |
| |
| struct WebContentsDataComparator { |
| bool operator()(const WebContentsData& a, const WebContentsData& b) const; |
| }; |
| |
| void MonitorWebContents(content::WebContents* web_contents); |
| void RemoveWebContentsDataFromMonitoredListIfExists( |
| content::WebContents* web_contents); |
| |
| void RestartTimerIfNeeded(base::TimeTicks current_time); |
| |
| // Returns next emit time after page loaded. |
| static base::TimeDelta NextEmitTimeAfterPageLoaded(ReportState); |
| |
| // Returns next state of process memory dump after page loaded. |
| static ReportState NextStateOfEmitMemoryDumpAfterPageLoaded( |
| base::TimeDelta time_passed); |
| // Emit process memory dump of the specified process. |
| // Make this method virtual for TabMemoryMetricsReporterTest. |
| // Return true if succeeded in emitting the memory metrics. |
| // Otherwise, return false. (e.g. the renderer's pid is not valid) |
| virtual bool EmitMemoryMetricsAfterPageLoaded( |
| const WebContentsData& content_data); |
| |
| // true if this TabMemoryMetricsReporter has already invoked |
| // TabLoadTracker::AddObserver. |
| // TODO(tasak): clean up this up once there's a single cross-platform |
| // static initialization codepath in resource_coordinator. |
| bool reporting_started_ = false; |
| |
| // Timer to periodically update the stats of the renderers. |
| base::OneShotTimer update_timer_; |
| |
| // A list of web contents to be reported their memory usage, sorted by |
| // next_emit_time. |
| std::set<WebContentsData, WebContentsDataComparator> monitored_contents_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TabMemoryMetricsReporter); |
| }; |
| |
| } // namespace resource_coordinator |
| |
| #endif // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MEMORY_METRICS_REPORTER_H_ |