blob: 144f0f99d9b727a4f632c0706d8b5db86d91ec17 [file] [log] [blame]
// Copyright 2017 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_ACTIVITY_WATCHER_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_ACTIVITY_WATCHER_H_
#include <memory>
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/optional.h"
#include "chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/browser_tab_strip_tracker.h"
#include "chrome/browser/ui/browser_tab_strip_tracker_delegate.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
class TabMetricsLogger;
namespace resource_coordinator {
// Observes background tab activity in order to log UKMs for tabs and score tabs
// using the Tab Ranker. Metrics will be compared against tab reactivation/close
// events to determine the end state of each background tab.
class TabActivityWatcher : public BrowserListObserver,
public TabStripModelObserver,
public BrowserTabStripTrackerDelegate {
public:
TabActivityWatcher();
~TabActivityWatcher() override;
// Uses the Tab Ranker model to predict a score for the tab, where a higher
// value indicates a higher likelihood of being reactivated.
// Returns the score if the tab could be scored.
base::Optional<float> CalculateReactivationScore(
content::WebContents* web_contents);
// Returns the single instance, creating it if necessary.
static TabActivityWatcher* GetInstance();
private:
friend class TabActivityWatcherTest;
// Helper class to observe WebContents.
// TODO(michaelpg): Merge this into TabLifecycleUnit.
class WebContentsData;
// Called When A Tab is closed, log necessary metrics and erase the
// |web_contents_data| pointer in |all_closing_tabs_|.
void OnTabClosed(WebContentsData* web_contents_data);
// BrowserListObserver:
void OnBrowserSetLastActive(Browser* browser) override;
// TabStripModelObserver:
void OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) override;
void TabPinnedStateChanged(TabStripModel* tab_strip_model,
content::WebContents* contents,
int index) override;
void WillCloseAllTabs(TabStripModel* tab_strip_model) override;
void CloseAllTabsStopped(TabStripModel* tab_strip_model,
CloseAllStoppedReason reason) override;
// BrowserTabStripTrackerDelegate:
bool ShouldTrackBrowser(Browser* browser) override;
// Resets internal state.
void ResetForTesting();
std::unique_ptr<TabMetricsLogger> tab_metrics_logger_;
// Manages registration of this class as an observer of all TabStripModels as
// browsers are created and destroyed.
BrowserTabStripTracker browser_tab_strip_tracker_;
// Loads the Tab Ranker model on first use and calculates tab scores.
tab_ranker::TabScorePredictor predictor_;
// All WebContentsData of the browser that is currently in closing_all mode.
base::flat_set<WebContentsData*> all_closing_tabs_;
DISALLOW_COPY_AND_ASSIGN(TabActivityWatcher);
};
} // namespace resource_coordinator
#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_ACTIVITY_WATCHER_H_