blob: f7eee2104be3813735e666fb2c4490f5e804beaa [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.
#include "chrome/browser/resource_coordinator/tab_manager_resource_coordinator_signal_observer.h"
#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/resource_coordinator/tab_load_tracker.h"
#include "chrome/browser/resource_coordinator/tab_manager_stats_collector.h"
#include "chrome/browser/resource_coordinator/tab_manager_web_contents_data.h"
#include "chrome/browser/resource_coordinator/utils.h"
namespace resource_coordinator {
// A helper class for accessing TabLoadTracker. TabLoadTracker can't directly
// friend TabManager::ResourceCoordinatorSignalObserver as it's a nested class
// and can't be forward declared.
class TabManagerResourceCoordinatorSignalObserverHelper {
public:
static void OnPageAlmostIdle(content::WebContents* web_contents) {
TabLoadTracker::Get()->OnPageAlmostIdle(web_contents);
}
};
TabManager::ResourceCoordinatorSignalObserver::
ResourceCoordinatorSignalObserver(PageSignalReceiver* page_signal_receiver)
: page_signal_receiver_(page_signal_receiver) {
if (page_signal_receiver_)
page_signal_receiver_->AddObserver(this);
}
TabManager::ResourceCoordinatorSignalObserver::
~ResourceCoordinatorSignalObserver() {
if (page_signal_receiver_)
page_signal_receiver_->RemoveObserver(this);
}
void TabManager::ResourceCoordinatorSignalObserver::OnPageAlmostIdle(
content::WebContents* web_contents,
const PageNavigationIdentity& page_navigation_id) {
DCHECK_NE(nullptr, page_signal_receiver_);
// Only dispatch the event if it pertains to the current navigation.
if (page_signal_receiver_->GetNavigationIDForWebContents(web_contents) ==
page_navigation_id.navigation_id) {
TabManagerResourceCoordinatorSignalObserverHelper::OnPageAlmostIdle(
web_contents);
}
}
void TabManager::ResourceCoordinatorSignalObserver::
OnExpectedTaskQueueingDurationSet(
content::WebContents* web_contents,
const PageNavigationIdentity& page_navigation_id,
base::TimeDelta duration) {
DCHECK_NE(nullptr, page_signal_receiver_);
if (page_signal_receiver_->GetNavigationIDForWebContents(web_contents) !=
page_navigation_id.navigation_id) {
// |web_contents| has been re-navigated, drop this notification rather than
// recording it against the wrong origin.
return;
}
g_browser_process->GetTabManager()
->stats_collector()
->RecordExpectedTaskQueueingDuration(web_contents, duration);
}
} // namespace resource_coordinator