Commit 2ebd9254 authored by Sebastien Marchand's avatar Sebastien Marchand Committed by Commit Bot

Reland "RC: Encapsulate most of the singletons into ResourceCoordinatorParts"

This is a reland of 14754da5 with some
fixes (see the ps #1..#2 diff).

The problem in the previous CL was that the LocalDB WCObserver was
sometime created despite not having a PageSignalReceiver, this caused
some access violation because this WCO relies on some signal sent by the
PSR. I've added a check to prevent creating this WCO when the PSR isn't
available (and fixed some tests to make them create one).

// Confirmed with sky@ that he's ok with me relanding this without his
// +1 as none of the files he owns have changed.
TBR=sky@chromium.org

Original change's description:
> RC: Encapsulate most of the singletons into ResourceCoordinatorParts
>
> There's several singletons / global instances in c/b/rc that are leaked
> at shutdown, this is causing some issues in runs of unit_tests because
> we end up re-using them between different test runs that should be
> independent. This is currently preventing some feature to be enabled.
>
> This CL add a new ResourceCoordinatorParts class that encapsulate all
> these objects that should be created only once, an instance of this
> class is owned by the browser process.
>
> Change-Id: Ia64618b6f47052815d861ff6820d994f8a65cc64
> Reviewed-on: https://chromium-review.googlesource.com/c/1290775
> Reviewed-by: Scott Violet <sky@chromium.org>
> Reviewed-by: Chris Hamilton <chrisha@chromium.org>
> Reviewed-by: François Doray <fdoray@chromium.org>
> Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#606061}

Change-Id: I71feb4ea233d02cb5cc001c12e3cdd7f6ddd795b
Reviewed-on: https://chromium-review.googlesource.com/c/1324134
Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org>
Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606548}
parent 5025d593
......@@ -1339,6 +1339,8 @@ jumbo_split_static_library("browser") {
"resource_coordinator/performance_measurement_manager.h",
"resource_coordinator/render_process_probe.cc",
"resource_coordinator/render_process_probe.h",
"resource_coordinator/resource_coordinator_parts.cc",
"resource_coordinator/resource_coordinator_parts.h",
"resource_coordinator/session_restore_policy.cc",
"resource_coordinator/session_restore_policy.h",
"resource_coordinator/tab_helper.cc",
......@@ -1351,6 +1353,8 @@ jumbo_split_static_library("browser") {
"resource_coordinator/tab_memory_metrics_reporter.h",
"resource_coordinator/time.cc",
"resource_coordinator/time.h",
"resource_coordinator/utils.cc",
"resource_coordinator/utils.h",
"resources_util.cc",
"resources_util.h",
"search/instant_io_context.cc",
......@@ -2903,8 +2907,6 @@ jumbo_split_static_library("browser") {
"resource_coordinator/tab_metrics_logger.h",
"resource_coordinator/usage_clock.cc",
"resource_coordinator/usage_clock.h",
"resource_coordinator/utils.cc",
"resource_coordinator/utils.h",
"search/background/ntp_background_data.cc",
"search/background/ntp_background_data.h",
"search/background/ntp_background_service.cc",
......
......@@ -113,6 +113,7 @@ class RapporServiceImpl;
}
namespace resource_coordinator {
class ResourceCoordinatorParts;
class TabManager;
}
......@@ -279,8 +280,13 @@ class BrowserProcess {
virtual gcm::GCMDriver* gcm_driver() = 0;
// Returns the tab manager. On non-supported platforms, this returns null.
// TODO(sebmarchand): Update callers to
// resource_coordinator_parts()->tab_manager() and remove this.
virtual resource_coordinator::TabManager* GetTabManager() = 0;
virtual resource_coordinator::ResourceCoordinatorParts*
resource_coordinator_parts() = 0;
// Returns the default web client state of Chrome (i.e., was it the user's
// default browser) at the time a previous check was made sometime between
// process startup and now.
......
......@@ -71,7 +71,7 @@
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/print_preview_dialog_controller.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/status_icons/status_tray.h"
......@@ -345,11 +345,6 @@ BrowserProcessImpl::~BrowserProcessImpl() {
#if !defined(OS_ANDROID)
KeepAliveRegistry::GetInstance()->RemoveObserver(this);
// TabLifecycleUnitSource must be deleted before TabManager because it has a
// raw pointer to a UsageClock owned by TabManager.
tab_lifecycle_unit_source_.reset();
tab_manager_.reset();
#endif
g_browser_process = NULL;
......@@ -897,19 +892,17 @@ gcm::GCMDriver* BrowserProcessImpl::gcm_driver() {
resource_coordinator::TabManager* BrowserProcessImpl::GetTabManager() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if defined(OS_ANDROID)
return nullptr;
#else
if (!tab_manager_) {
tab_manager_ = std::make_unique<resource_coordinator::TabManager>();
tab_lifecycle_unit_source_ =
std::make_unique<resource_coordinator::TabLifecycleUnitSource>(
tab_manager_->intervention_policy_database(),
tab_manager_->usage_clock());
tab_lifecycle_unit_source_->AddObserver(tab_manager_.get());
return resource_coordinator_parts()->tab_manager();
}
resource_coordinator::ResourceCoordinatorParts*
BrowserProcessImpl::resource_coordinator_parts() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!resource_coordinator_parts_) {
resource_coordinator_parts_ =
std::make_unique<resource_coordinator::ResourceCoordinatorParts>();
}
return tab_manager_.get();
#endif // defined(OS_ANDROID)
return resource_coordinator_parts_.get();
}
shell_integration::DefaultWebClientState
......
......@@ -69,10 +69,6 @@ class ChromeBrowserPolicyConnector;
class PolicyService;
} // namespace policy
namespace resource_coordinator {
class TabLifecycleUnitSource;
}
namespace webrtc_event_logging {
class WebRtcEventLogManager;
} // namespace webrtc_event_logging
......@@ -196,6 +192,8 @@ class BrowserProcessImpl : public BrowserProcess,
network_time::NetworkTimeTracker* network_time_tracker() override;
gcm::GCMDriver* gcm_driver() override;
resource_coordinator::TabManager* GetTabManager() override;
resource_coordinator::ResourceCoordinatorParts* resource_coordinator_parts()
override;
shell_integration::DefaultWebClientState CachedDefaultWebClientState()
override;
prefs::InProcessPrefServiceFactory* pref_service_factory() const override;
......@@ -411,17 +409,11 @@ class BrowserProcessImpl : public BrowserProcess,
std::unique_ptr<ChromeDeviceClient> device_client_;
#if !defined(OS_ANDROID)
// Any change to this #ifdef must be reflected as well in
// chrome/browser/resource_coordinator/tab_manager_browsertest.cc
std::unique_ptr<resource_coordinator::TabManager> tab_manager_;
std::unique_ptr<resource_coordinator::TabLifecycleUnitSource>
tab_lifecycle_unit_source_;
#endif
shell_integration::DefaultWebClientState cached_default_web_client_state_ =
shell_integration::UNKNOWN_DEFAULT;
std::unique_ptr<resource_coordinator::ResourceCoordinatorParts>
resource_coordinator_parts_;
std::unique_ptr<prefs::InProcessPrefServiceFactory> pref_service_factory_;
#if !defined(OS_ANDROID)
......
......@@ -283,6 +283,9 @@ void ExtensionServiceTestBase::ValidateStringPref(
void ExtensionServiceTestBase::SetUp() {
LoadErrorReporter::GetInstance()->ClearErrors();
// Force TabManager/TabLifecycleUnitSource creation.
g_browser_process->resource_coordinator_parts();
}
void ExtensionServiceTestBase::TearDown() {
......
......@@ -8,6 +8,7 @@
#include "chrome/browser/resource_coordinator/browser_child_process_watcher.h"
#include "chrome/browser/resource_coordinator/page_signal_receiver.h"
#include "chrome/browser/resource_coordinator/render_process_probe.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "content/public/common/service_manager_connection.h"
#include "services/resource_coordinator/public/cpp/process_resource_coordinator.h"
#include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
......@@ -34,7 +35,7 @@ void ChromeBrowserMainExtraPartsResourceCoordinator::PreBrowserStart() {
if (base::FeatureList::IsEnabled(features::kPerformanceMeasurement)) {
DCHECK(resource_coordinator::RenderProcessProbe::IsEnabled());
resource_coordinator::PageSignalReceiver* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance();
resource_coordinator::GetPageSignalReceiver();
DCHECK(resource_coordinator::PageSignalReceiver::IsEnabled());
resource_coordinator::RenderProcessProbe* render_process_probe =
......
......@@ -4,11 +4,15 @@
#include "chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.h"
#include "base/task/post_task.h"
#include "chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.h"
#include "chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h"
#include "chrome/browser/resource_coordinator/tab_helper.h"
#include "chrome/browser/resource_coordinator/tab_manager_features.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/service_manager_connection.h"
#include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
namespace resource_coordinator {
......@@ -103,9 +107,19 @@ void ChromeTestHarnessWithLocalDB::SetUp() {
// of a non-mock version of a data store when browser_context() gets
// initialized.
LocalSiteCharacteristicsDataStoreFactory::EnableForTesting();
content::ServiceManagerConnection::SetForProcess(
content::ServiceManagerConnection::Create(
mojo::MakeRequest(&service_),
base::CreateSingleThreadTaskRunnerWithTraits(
{content::BrowserThread::IO})));
ChromeRenderViewHostTestHarness::SetUp();
}
void ChromeTestHarnessWithLocalDB::TearDown() {
content::ServiceManagerConnection::DestroyForProcess();
ChromeRenderViewHostTestHarness::TearDown();
}
} // namespace testing
} // namespace resource_coordinator
......@@ -12,6 +12,7 @@
#include "chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.h"
#include "chrome/browser/resource_coordinator/local_site_characteristics_database.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "content/public/common/service_manager_connection.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace content {
......@@ -85,10 +86,13 @@ class ChromeTestHarnessWithLocalDB : public ChromeRenderViewHostTestHarness {
ChromeTestHarnessWithLocalDB();
~ChromeTestHarnessWithLocalDB() override;
protected:
void SetUp() override;
void TearDown() override;
private:
base::test::ScopedFeatureList scoped_feature_list_;
service_manager::mojom::ServicePtr service_;
};
} // namespace testing
......
......@@ -44,7 +44,7 @@ LocalSiteCharacteristicsWebContentsObserver::
DCHECK(PageSignalReceiver::IsEnabled());
TabLoadTracker::Get()->AddObserver(this);
page_signal_receiver_ = PageSignalReceiver::GetInstance();
page_signal_receiver_ = GetPageSignalReceiver();
DCHECK(page_signal_receiver_);
page_signal_receiver_->AddObserver(this);
}
......@@ -111,11 +111,14 @@ void LocalSiteCharacteristicsWebContentsObserver::DidFinishNavigation(
DCHECK(profile);
SiteCharacteristicsDataStore* data_store =
LocalSiteCharacteristicsDataStoreFactory::GetForProfile(profile);
DCHECK(data_store);
auto rc_visibility =
ContentVisibilityToRCVisibility(web_contents()->GetVisibility());
writer_ = data_store->GetWriterForOrigin(new_origin, rc_visibility);
UpdateBackgroundedTime(rc_visibility);
// A data store might not be available in some unit tests.
if (data_store) {
auto rc_visibility =
ContentVisibilityToRCVisibility(web_contents()->GetVisibility());
writer_ = data_store->GetWriterForOrigin(new_origin, rc_visibility);
UpdateBackgroundedTime(rc_visibility);
}
// The writer is initially in an unloaded state, load it if necessary.
if (TabLoadTracker::Get()->GetLoadingState(web_contents()) ==
......
......@@ -20,16 +20,6 @@ bool PageSignalReceiver::IsEnabled() {
return content::ServiceManagerConnection::GetForProcess() != nullptr;
}
// static
PageSignalReceiver* PageSignalReceiver::GetInstance() {
if (!IsEnabled())
return nullptr;
static base::NoDestructor<PageSignalReceiver> page_signal_receiver;
return page_signal_receiver.get();
}
PageSignalReceiver::PageSignalReceiver() : binding_(this) {}
PageSignalReceiver::~PageSignalReceiver() = default;
......
......@@ -70,8 +70,6 @@ class PageSignalReceiver : public mojom::PageSignalReceiver {
~PageSignalReceiver() override;
static bool IsEnabled();
// Callers do not take ownership.
static PageSignalReceiver* GetInstance();
// mojom::PageSignalReceiver implementation.
void NotifyPageAlmostIdle(
......
// 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.
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/resource_coordinator/page_signal_receiver.h"
#include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
namespace resource_coordinator {
ResourceCoordinatorParts::ResourceCoordinatorParts()
: page_signal_receiver_(
resource_coordinator::PageSignalReceiver::IsEnabled()
? std::make_unique<resource_coordinator::PageSignalReceiver>()
: nullptr)
#if !defined(OS_ANDROID)
,
tab_manager_(page_signal_receiver_.get(), &tab_load_tracker_),
tab_lifecycle_unit_source_(tab_manager_.intervention_policy_database(),
tab_manager_.usage_clock(),
page_signal_receiver_.get())
#endif
{
#if !defined(OS_ANDROID)
tab_lifecycle_unit_source_.AddObserver(&tab_manager_);
#endif
}
ResourceCoordinatorParts::~ResourceCoordinatorParts() = default;
} // namespace resource_coordinator
// 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_RESOURCE_COORDINATOR_PARTS_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_RESOURCE_COORDINATOR_PARTS_H_
#include "base/macros.h"
#include "build/build_config.h"
#include "chrome/browser/resource_coordinator/performance_measurement_manager.h"
#include "chrome/browser/resource_coordinator/tab_load_tracker.h"
#include "chrome/browser/resource_coordinator/tab_memory_metrics_reporter.h"
#if !defined(OS_ANDROID)
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#endif
namespace resource_coordinator {
class PageSignalReceiver;
#if defined(OS_ANDROID)
class TabManager;
class TabLifecycleUnitSource;
#endif
// Contains the various parts of the resource coordinator. There should be only
// one instance of this class created early during the initialization of the
// browser process.
class ResourceCoordinatorParts {
public:
ResourceCoordinatorParts();
~ResourceCoordinatorParts();
PageSignalReceiver* page_signal_receiver() const {
return page_signal_receiver_.get();
}
TabMemoryMetricsReporter* tab_memory_metrics_reporter() {
if (!tab_memory_metrics_reporter_.get())
tab_memory_metrics_reporter_.reset(new TabMemoryMetricsReporter());
return tab_memory_metrics_reporter_.get();
}
TabLoadTracker* tab_load_tracker() { return &tab_load_tracker_; }
TabManager* tab_manager() {
#if defined(OS_ANDROID)
return nullptr;
#else
return &tab_manager_;
#endif // defined(OS_ANDROID)
}
TabLifecycleUnitSource* tab_lifecycle_unit_source() {
#if defined(OS_ANDROID)
return nullptr;
#else
return &tab_lifecycle_unit_source_;
#endif // defined(OS_ANDROID)
}
private:
const std::unique_ptr<PageSignalReceiver> page_signal_receiver_;
// This should be declared before |tab_memory_metrics_reporter_| and
// |tab_manager_| as they both depend on this at shutdown.
TabLoadTracker tab_load_tracker_;
// Created on demand the first time it's being accessed.
std::unique_ptr<TabMemoryMetricsReporter> tab_memory_metrics_reporter_;
#if !defined(OS_ANDROID)
// Any change to this #ifdef must be reflected as well in
// chrome/browser/resource_coordinator/tab_manager_browsertest.cc
//
// The order of these 2 members matters, TabLifecycleUnitSource must be
// deleted before TabManager because it has a raw pointer to a UsageClock
// owned by TabManager.
TabManager tab_manager_;
TabLifecycleUnitSource tab_lifecycle_unit_source_;
#endif
DISALLOW_COPY_AND_ASSIGN(ResourceCoordinatorParts);
};
} // namespace resource_coordinator
#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_RESOURCE_COORDINATOR_PARTS_H__
......@@ -13,6 +13,7 @@
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#include "chrome/browser/resource_coordinator/tab_manager_features.h"
#include "chrome/browser/resource_coordinator/time.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
......@@ -425,7 +426,7 @@ IN_PROC_BROWSER_TEST_F(TabActivityWatcherUkmTest,
// Discard the first tab.
content::WebContents* first_contents =
browser()->tab_strip_model()->GetWebContentsAt(0);
resource_coordinator::TabLifecycleUnitSource::GetInstance()
resource_coordinator::GetTabLifecycleUnitSource()
->GetTabLifecycleUnitExternal(first_contents)
->DiscardTab();
......@@ -450,7 +451,7 @@ IN_PROC_BROWSER_TEST_F(TabActivityWatcherUkmTest,
// Discard the second tab.
content::WebContents* second_content =
browser()->tab_strip_model()->GetWebContentsAt(1);
resource_coordinator::TabLifecycleUnitSource::GetInstance()
resource_coordinator::GetTabLifecycleUnitSource()
->GetTabLifecycleUnitExternal(second_content)
->DiscardTab();
......
......@@ -12,13 +12,16 @@
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/resource_coordinator/page_signal_receiver.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_memory_metrics_reporter.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/service_manager_connection.h"
#include "content/public/common/service_names.mojom.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
#include "services/resource_coordinator/public/cpp/page_resource_coordinator.h"
#include "services/resource_coordinator/public/cpp/process_resource_coordinator.h"
#include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
......@@ -51,19 +54,27 @@ ResourceCoordinatorTabHelper::ResourceCoordinatorTabHelper(
web_contents->GetVisibility() != content::Visibility::HIDDEN;
page_resource_coordinator_->SetVisibility(is_visible);
if (auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance()) {
if (auto* page_signal_receiver = GetPageSignalReceiver()) {
// Gets CoordinationUnitID for this WebContents and adds it to
// PageSignalReceiver.
page_signal_receiver->AssociateCoordinationUnitIDWithWebContents(
page_resource_coordinator_->id(), web_contents);
}
TabMemoryMetricsReporter::Get()->StartReporting(TabLoadTracker::Get());
if (memory_instrumentation::MemoryInstrumentation::GetInstance()) {
auto* rc_parts = g_browser_process->resource_coordinator_parts();
DCHECK(rc_parts);
rc_parts->tab_memory_metrics_reporter()->StartReporting(
TabLoadTracker::Get());
}
}
#if !defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(features::kSiteCharacteristicsDatabase)) {
// Don't create the LocalSiteCharacteristicsWebContentsObserver for this tab
// we don't have a page signal receiver as the data that this observer
// records depend on it.
if (base::FeatureList::IsEnabled(features::kSiteCharacteristicsDatabase) &&
GetPageSignalReceiver()) {
local_site_characteristics_wc_observer_ =
std::make_unique<LocalSiteCharacteristicsWebContentsObserver>(
web_contents);
......@@ -113,8 +124,7 @@ void ResourceCoordinatorTabHelper::OnVisibilityChanged(
void ResourceCoordinatorTabHelper::WebContentsDestroyed() {
if (page_resource_coordinator_) {
if (auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance()) {
if (auto* page_signal_receiver = GetPageSignalReceiver()) {
// Gets CoordinationUnitID for this WebContents and removes it from
// PageSignalReceiver.
page_signal_receiver->RemoveCoordinationUnitID(
......@@ -149,8 +159,7 @@ void ResourceCoordinatorTabHelper::DidFinishNavigation(
process_resource_coordinator->AddFrame(*frame_resource_coordinator);
if (navigation_handle->IsInMainFrame()) {
if (auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance()) {
if (auto* page_signal_receiver = GetPageSignalReceiver()) {
// Update the last observed navigation ID for this WebContents.
page_signal_receiver->SetNavigationID(
web_contents(), navigation_handle->GetNavigationId());
......
......@@ -6,31 +6,26 @@
#include "base/logging.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#include "chrome/browser/resource_coordinator/utils.h"
namespace resource_coordinator {
// static
TabLifecycleUnitExternal* TabLifecycleUnitExternal::FromWebContents(
content::WebContents* web_contents) {
TabLifecycleUnitSource* source = TabLifecycleUnitSource::GetInstance();
DCHECK(source);
return source->GetTabLifecycleUnitExternal(web_contents);
return GetTabLifecycleUnitSource()->GetTabLifecycleUnitExternal(web_contents);
}
// static
void TabLifecycleUnitExternal::AddTabLifecycleObserver(
TabLifecycleObserver* observer) {
TabLifecycleUnitSource* source = TabLifecycleUnitSource::GetInstance();
DCHECK(source);
source->AddTabLifecycleObserver(observer);
GetTabLifecycleUnitSource()->AddTabLifecycleObserver(observer);
}
// static
void TabLifecycleUnitExternal::RemoveTabLifecycleObserver(
TabLifecycleObserver* observer) {
TabLifecycleUnitSource* source = TabLifecycleUnitSource::GetInstance();
DCHECK(source);
source->RemoveTabLifecycleObserver(observer);
GetTabLifecycleUnitSource()->RemoveTabLifecycleObserver(observer);
}
} // namespace resource_coordinator
......@@ -10,7 +10,9 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h"
#include "chrome/browser/resource_coordinator/lifecycle_unit_source_observer.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
......@@ -23,10 +25,6 @@
namespace resource_coordinator {
namespace {
TabLifecycleUnitSource* instance_ = nullptr;
} // namespace
// Allows storage of a TabLifecycleUnit on a WebContents.
class TabLifecycleUnitSource::TabLifecycleUnitHolder
: public content::WebContentsUserData<
......@@ -54,32 +52,22 @@ class TabLifecycleUnitSource::TabLifecycleUnitHolder
TabLifecycleUnitSource::TabLifecycleUnitSource(
InterventionPolicyDatabase* intervention_policy_database,
UsageClock* usage_clock)
UsageClock* usage_clock,
PageSignalReceiver* page_signal_receiver)
: browser_tab_strip_tracker_(this, nullptr, this),
page_signal_receiver_observer_(this),
intervention_policy_database_(intervention_policy_database),
usage_clock_(usage_clock) {
DCHECK(!instance_);
// In unit tests, tabs might already exist when TabLifecycleUnitSource is
// instantiated. No TabLifecycleUnit is created for these tabs.
DCHECK(intervention_policy_database_);
browser_tab_strip_tracker_.Init();
instance_ = this;
if (auto* page_signal_receiver = PageSignalReceiver::GetInstance())
if (page_signal_receiver)
page_signal_receiver_observer_.Add(page_signal_receiver);
}
TabLifecycleUnitSource::~TabLifecycleUnitSource() {
DCHECK_EQ(instance_, this);
instance_ = nullptr;
}
// static
TabLifecycleUnitSource* TabLifecycleUnitSource::GetInstance() {
return instance_;
}
TabLifecycleUnitSource::~TabLifecycleUnitSource() = default;
TabLifecycleUnitExternal* TabLifecycleUnitSource::GetTabLifecycleUnitExternal(
content::WebContents* web_contents) const {
......
......@@ -40,13 +40,13 @@ class TabLifecycleUnitSource : public BrowserListObserver,
public:
class TabLifecycleUnit;
explicit TabLifecycleUnitSource(
// |page_signal_receiver| might be null.
TabLifecycleUnitSource(
InterventionPolicyDatabase* intervention_policy_database,
UsageClock* usage_clock);
UsageClock* usage_clock,
PageSignalReceiver* page_signal_receiver);
~TabLifecycleUnitSource() override;
static TabLifecycleUnitSource* GetInstance();
// Returns the TabLifecycleUnitExternal instance associated with
// |web_contents|, or nullptr if |web_contents| isn't a tab.
TabLifecycleUnitExternal* GetTabLifecycleUnitExternal(
......
......@@ -20,6 +20,7 @@
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit.h"
#include "chrome/browser/resource_coordinator/test_lifecycle_unit.h"
#include "chrome/browser/resource_coordinator/time.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h"
#include "chrome/common/pref_names.h"
......@@ -111,7 +112,7 @@ class TabLifecycleUnitSourceTest
// Force TabManager/TabLifecycleUnitSource creation.
g_browser_process->GetTabManager();
source_ = TabLifecycleUnitSource::GetInstance();
source_ = GetTabLifecycleUnitSource();
source_->AddObserver(&source_observer_);
source_->AddTabLifecycleObserver(&tab_observer_);
......
......@@ -8,7 +8,9 @@
#include "base/logging.h"
#include "base/stl_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
......@@ -32,8 +34,8 @@ TabLoadTracker::~TabLoadTracker() = default;
// static
TabLoadTracker* TabLoadTracker::Get() {
static base::NoDestructor<TabLoadTracker> tab_load_tracker;
return tab_load_tracker.get();
DCHECK(g_browser_process);
return g_browser_process->resource_coordinator_parts()->tab_load_tracker();
}
TabLoadTracker::LoadingState TabLoadTracker::GetLoadingState(
......
......@@ -9,7 +9,6 @@
#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/process/kill.h"
#include "base/sequence_checker.h"
......@@ -22,6 +21,7 @@ class WebContents;
namespace resource_coordinator {
class ResourceCoordinatorParts;
class ResourceCoordinatorTabHelper;
class TabManagerResourceCoordinatorSignalObserverHelper;
......@@ -117,8 +117,7 @@ class TabLoadTracker {
content::WebContents* new_contents);
protected:
// This allows the singleton constructor access to the protected constructor.
friend class base::NoDestructor<TabLoadTracker>;
friend class ResourceCoordinatorParts;
// For unittesting.
friend class LocalSiteCharacteristicsWebContentsObserverTest;
......
......@@ -166,7 +166,8 @@ class TabManager::TabManagerSessionRestoreObserver final
constexpr base::TimeDelta TabManager::kDefaultMinTimeToPurge;
TabManager::TabManager()
TabManager::TabManager(PageSignalReceiver* page_signal_receiver,
TabLoadTracker* tab_load_tracker)
: state_transitions_callback_(
base::BindRepeating(&TabManager::PerformStateTransitions,
base::Unretained(this))),
......@@ -175,6 +176,7 @@ TabManager::TabManager()
restored_tab_count_(0u),
background_tab_loading_mode_(BackgroundTabLoadingMode::kStaggered),
loading_slots_(kNumOfLoadingSlots),
tab_load_tracker_(tab_load_tracker),
weak_ptr_factory_(this) {
#if defined(OS_CHROMEOS)
delegate_.reset(new TabManagerDelegate(weak_ptr_factory_.GetWeakPtr()));
......@@ -183,12 +185,12 @@ TabManager::TabManager()
session_restore_observer_.reset(new TabManagerSessionRestoreObserver(this));
if (PageSignalReceiver::IsEnabled()) {
resource_coordinator_signal_observer_.reset(
new ResourceCoordinatorSignalObserver());
new ResourceCoordinatorSignalObserver(page_signal_receiver));
}
stats_collector_.reset(new TabManagerStatsCollector());
proactive_freeze_discard_params_ =
GetStaticProactiveTabFreezeAndDiscardParams();
TabLoadTracker::Get()->AddObserver(this);
tab_load_tracker_->AddObserver(this);
intervention_policy_database_.reset(new InterventionPolicyDatabase());
// TabManager works in the absence of DesktopSessionDurationTracker for tests.
......@@ -197,7 +199,7 @@ TabManager::TabManager()
}
TabManager::~TabManager() {
TabLoadTracker::Get()->RemoveObserver(this);
tab_load_tracker_->RemoveObserver(this);
resource_coordinator_signal_observer_.reset();
Stop();
......
......@@ -46,6 +46,7 @@ class WebContents;
namespace resource_coordinator {
class BackgroundTabNavigationThrottle;
class PageSignalReceiver;
#if defined(OS_CHROMEOS)
class TabManagerDelegate;
......@@ -90,7 +91,9 @@ class TabManager : public LifecycleUnitObserver,
class WebContentsData;
TabManager();
// |page_signal_receiver| might be null.
TabManager(PageSignalReceiver* page_signal_receiver,
TabLoadTracker* tab_load_tracker);
~TabManager() override;
// Start/Stop the Tab Manager.
......@@ -548,6 +551,9 @@ class TabManager : public LifecycleUnitObserver,
// A clock that advances when Chrome is in use.
UsageClock usage_clock_;
// The tab load tracker observed by this instance.
TabLoadTracker* const tab_load_tracker_;
// Weak pointer factory used for posting delayed tasks.
base::WeakPtrFactory<TabManager> weak_ptr_factory_;
......
......@@ -276,7 +276,7 @@ class TabManagerTest : public InProcessBrowserTest {
// indicates that the page is frozen. In production, this is sent by the
// renderer process. This is done to finish a proactive tab discard.
void SimulateFreezeSignal(content::WebContents* contents) {
TabLifecycleUnitSource::GetInstance()
GetTabLifecycleUnitSource()
->GetTabLifecycleUnit(contents)
->UpdateLifecycleState(mojom::LifecycleState::kFrozen);
}
......@@ -289,7 +289,7 @@ class TabManagerTest : public InProcessBrowserTest {
}
LifecycleUnit* GetLifecycleUnitAt(int index) {
return TabLifecycleUnitSource::GetInstance()->GetTabLifecycleUnit(
return GetTabLifecycleUnitSource()->GetTabLifecycleUnit(
GetWebContentsAt(index));
}
......@@ -307,8 +307,7 @@ class TabManagerTestWithTwoTabs : public TabManagerTest {
TabManagerTest::SetUpOnMainThread();
// Open 2 tabs with default URLs in a focused tab strip.
TabLifecycleUnitSource::GetInstance()->SetFocusedTabStripModelForTesting(
tsm());
GetTabLifecycleUnitSource()->SetFocusedTabStripModelForTesting(tsm());
OpenTwoTabs(GURL(chrome::kChromeUIAboutURL),
GURL(chrome::kChromeUICreditsURL));
}
......
......@@ -6,9 +6,11 @@
#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 {
......@@ -23,25 +25,25 @@ class TabManagerResourceCoordinatorSignalObserverHelper {
};
TabManager::ResourceCoordinatorSignalObserver::
ResourceCoordinatorSignalObserver() {
if (auto* page_signal_receiver = PageSignalReceiver::GetInstance())
page_signal_receiver->AddObserver(this);
ResourceCoordinatorSignalObserver(PageSignalReceiver* page_signal_receiver)
: page_signal_receiver_(page_signal_receiver) {
if (page_signal_receiver_)
page_signal_receiver_->AddObserver(this);
}
TabManager::ResourceCoordinatorSignalObserver::
~ResourceCoordinatorSignalObserver() {
if (auto* page_signal_receiver = PageSignalReceiver::GetInstance())
page_signal_receiver->RemoveObserver(this);
if (page_signal_receiver_)
page_signal_receiver_->RemoveObserver(this);
}
void TabManager::ResourceCoordinatorSignalObserver::OnPageAlmostIdle(
content::WebContents* web_contents,
const PageNavigationIdentity& page_navigation_id) {
auto* page_signal_receiver = PageSignalReceiver::GetInstance();
DCHECK_NE(nullptr, page_signal_receiver);
DCHECK_NE(nullptr, page_signal_receiver_);
// Only dispatch the event if it pertains to the current navigation.
if (page_signal_receiver->GetNavigationIDForWebContents(web_contents) ==
if (page_signal_receiver_->GetNavigationIDForWebContents(web_contents) ==
page_navigation_id.navigation_id) {
TabManagerResourceCoordinatorSignalObserverHelper::OnPageAlmostIdle(
web_contents);
......@@ -53,10 +55,9 @@ void TabManager::ResourceCoordinatorSignalObserver::
content::WebContents* web_contents,
const PageNavigationIdentity& page_navigation_id,
base::TimeDelta duration) {
auto* page_signal_receiver = PageSignalReceiver::GetInstance();
DCHECK_NE(nullptr, page_signal_receiver);
DCHECK_NE(nullptr, page_signal_receiver_);
if (page_signal_receiver->GetNavigationIDForWebContents(web_contents) !=
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.
......
......@@ -18,7 +18,8 @@ namespace resource_coordinator {
class TabManager::ResourceCoordinatorSignalObserver
: public PageSignalObserver {
public:
ResourceCoordinatorSignalObserver();
explicit ResourceCoordinatorSignalObserver(
PageSignalReceiver* page_signal_receiver);
~ResourceCoordinatorSignalObserver() override;
// PageSignalObserver implementation.
......@@ -31,6 +32,8 @@ class TabManager::ResourceCoordinatorSignalObserver
base::TimeDelta duration) override;
private:
PageSignalReceiver* const page_signal_receiver_;
DISALLOW_COPY_AND_ASSIGN(ResourceCoordinatorSignalObserver);
};
......
......@@ -36,6 +36,7 @@
#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/time.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/browser/sessions/tab_loader.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tab_ui_helper.h"
......@@ -237,7 +238,7 @@ class TabManagerTest : public testing::ChromeTestHarnessWithLocalDB {
TabLifecycleUnitSource::TabLifecycleUnit* GetTabLifecycleUnit(
content::WebContents* content) {
return TabLifecycleUnitSource::GetInstance()->GetTabLifecycleUnit(content);
return GetTabLifecycleUnitSource()->GetTabLifecycleUnit(content);
}
bool IsTabFrozen(content::WebContents* content) {
......@@ -756,14 +757,14 @@ TEST_F(TabManagerTest, BackgroundTabLoadingMode) {
}
TEST_F(TabManagerTest, BackgroundTabLoadingSlots) {
TabManager tab_manager1;
TabManager tab_manager1(GetPageSignalReceiver(), TabLoadTracker::Get());
MaybeThrottleNavigations(&tab_manager1, 1);
EXPECT_FALSE(tab_manager1.IsNavigationDelayedForTest(nav_handle1_.get()));
EXPECT_TRUE(tab_manager1.IsNavigationDelayedForTest(nav_handle2_.get()));
EXPECT_TRUE(tab_manager1.IsNavigationDelayedForTest(nav_handle3_.get()));
ResetState();
TabManager tab_manager2;
TabManager tab_manager2(GetPageSignalReceiver(), TabLoadTracker::Get());
tab_manager2.SetLoadingSlotsForTest(2);
MaybeThrottleNavigations(&tab_manager2, 2);
EXPECT_FALSE(tab_manager2.IsNavigationDelayedForTest(nav_handle1_.get()));
......@@ -771,7 +772,7 @@ TEST_F(TabManagerTest, BackgroundTabLoadingSlots) {
EXPECT_TRUE(tab_manager2.IsNavigationDelayedForTest(nav_handle3_.get()));
ResetState();
TabManager tab_manager3;
TabManager tab_manager3(GetPageSignalReceiver(), TabLoadTracker::Get());
tab_manager3.SetLoadingSlotsForTest(3);
MaybeThrottleNavigations(&tab_manager3, 3);
EXPECT_FALSE(tab_manager3.IsNavigationDelayedForTest(nav_handle1_.get()));
......
......@@ -18,13 +18,6 @@
namespace resource_coordinator {
// static
TabMemoryMetricsReporter* TabMemoryMetricsReporter::Get() {
static base::NoDestructor<TabMemoryMetricsReporter>
tab_memory_metrics_reporter;
return tab_memory_metrics_reporter.get();
}
TabMemoryMetricsReporter::TabMemoryMetricsReporter() = default;
TabMemoryMetricsReporter::~TabMemoryMetricsReporter() = default;
......
......@@ -24,9 +24,6 @@ class TabMemoryMetricsReporter : public TabLoadTracker::Observer {
TabMemoryMetricsReporter();
~TabMemoryMetricsReporter() override;
// Returns the singleton TabMemoryMetricsReporter instance.
static TabMemoryMetricsReporter* Get();
void StartReporting(TabLoadTracker* tracker);
void OnStartTracking(content::WebContents* web_contents,
......
......@@ -6,6 +6,8 @@
#include "base/md5.h"
#include "base/numerics/safe_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h"
namespace resource_coordinator {
......@@ -41,4 +43,22 @@ int GetPrivateMemoryKB(base::ProcessHandle handle) {
return base::saturated_cast<int>(total_freed_bytes / 1024);
}
TabLifecycleUnitSource* GetTabLifecycleUnitSource() {
DCHECK(g_browser_process);
auto* source = g_browser_process->resource_coordinator_parts()
->tab_lifecycle_unit_source();
DCHECK(source);
return source;
}
PageSignalReceiver* GetPageSignalReceiver() {
// This might get called during the destruction of the browser process, at
// which point there's no PageSignalReceiver anymore.
if (!g_browser_process)
return nullptr;
auto* page_signal_receiver =
g_browser_process->resource_coordinator_parts()->page_signal_receiver();
return page_signal_receiver;
}
} // namespace resource_coordinator
......@@ -13,6 +13,9 @@
namespace resource_coordinator {
class PageSignalReceiver;
class TabLifecycleUnitSource;
// Serialize an Origin into the representation used by the different databases
// that need it.
std::string SerializeOriginIntoDatabaseKey(const url::Origin& origin);
......@@ -24,6 +27,13 @@ bool URLShouldBeStoredInLocalDatabase(const GURL& url);
// Get the private memory footprint (in KB) for the process.
int GetPrivateMemoryKB(base::ProcessHandle handle);
// Returns the TabLifecycleUnitSource indirectly owned by g_browser_process.
TabLifecycleUnitSource* GetTabLifecycleUnitSource();
// Returns the PageSignalReceiver indirectly owned by g_browser_process. This
// can be null if the service isn't enabled.
PageSignalReceiver* GetPageSignalReceiver();
} // namespace resource_coordinator
#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_UTILS_H_
......@@ -6,6 +6,7 @@
#include "base/metrics/histogram_macros.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/grit/generated_resources.h"
#include "components/infobars/core/simple_alert_infobar_delegate.h"
#include "content/public/browser/navigation_entry.h"
......@@ -15,6 +16,7 @@
#include "ui/base/l10n/l10n_util.h"
namespace {
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class BloatedRendererHandlingInBrowser {
......@@ -27,18 +29,15 @@ enum class BloatedRendererHandlingInBrowser {
void RecordBloatedRendererHandling(BloatedRendererHandlingInBrowser handling) {
UMA_HISTOGRAM_ENUMERATION("BloatedRenderer.HandlingInBrowser", handling);
}
} // anonymous namespace
BloatedRendererTabHelper::BloatedRendererTabHelper(
content::WebContents* contents)
: content::WebContentsObserver(contents) {
auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance();
if (page_signal_receiver) {
// PageSignalReceiver is not available if the resource coordinator is not
// enabled.
if (auto* page_signal_receiver =
resource_coordinator::GetPageSignalReceiver())
page_signal_receiver->AddObserver(this);
}
}
void BloatedRendererTabHelper::DidStartNavigation(
......@@ -60,13 +59,9 @@ void BloatedRendererTabHelper::DidFinishNavigation(
}
void BloatedRendererTabHelper::WebContentsDestroyed() {
auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance();
if (page_signal_receiver) {
// PageSignalReceiver is not available if the resource coordinator is not
// enabled.
if (auto* page_signal_receiver =
resource_coordinator::GetPageSignalReceiver())
page_signal_receiver->RemoveObserver(this);
}
}
void BloatedRendererTabHelper::ShowInfoBar(InfoBarService* infobar_service) {
......@@ -124,8 +119,7 @@ void BloatedRendererTabHelper::OnRendererIsBloated(
// Ignore if the notification is about a different tab.
return;
}
auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance();
auto* page_signal_receiver = resource_coordinator::GetPageSignalReceiver();
DCHECK_NE(nullptr, page_signal_receiver);
if (page_navigation_id.navigation_id !=
page_signal_receiver->GetNavigationIDForWebContents(web_contents())) {
......
......@@ -6,6 +6,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/url_constants.h"
......@@ -36,8 +37,7 @@ IN_PROC_BROWSER_TEST_F(BloatedRendererTabHelperBrowserTest, ReloadBloatedTab) {
InfoBarService::FromWebContents(web_contents);
EXPECT_EQ(0u, infobar_service->infobar_count());
auto* page_signal_receiver =
resource_coordinator::PageSignalReceiver::GetInstance();
auto* page_signal_receiver = resource_coordinator::GetPageSignalReceiver();
resource_coordinator::PageNavigationIdentity page_id;
page_id.navigation_id =
page_signal_receiver->GetNavigationIDForWebContents(web_contents);
......
......@@ -19,6 +19,7 @@
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/chrome_paths.h"
......@@ -57,8 +58,6 @@
#endif
#if !defined(OS_ANDROID)
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "components/keep_alive_registry/keep_alive_registry.h"
#endif
......@@ -117,13 +116,6 @@ TestingBrowserProcess::~TestingBrowserProcess() {
extensions::AppWindowClient::Set(nullptr);
#endif
#if !defined(OS_ANDROID)
// TabLifecycleUnitSource must be deleted before TabManager because it has a
// raw pointer to a UsageClock owned by TabManager.
tab_lifecycle_unit_source_.reset();
tab_manager_.reset();
#endif
content::SetNetworkConnectionTrackerForTesting(nullptr);
// Destructors for some objects owned by TestingBrowserProcess will use
......@@ -426,20 +418,17 @@ gcm::GCMDriver* TestingBrowserProcess::gcm_driver() {
return nullptr;
}
resource_coordinator::TabManager* TestingBrowserProcess::GetTabManager() {
#if defined(OS_ANDROID)
return nullptr;
#else
if (!tab_manager_) {
tab_manager_ = std::make_unique<resource_coordinator::TabManager>();
tab_lifecycle_unit_source_ =
std::make_unique<resource_coordinator::TabLifecycleUnitSource>(
tab_manager_->intervention_policy_database(),
tab_manager_->usage_clock());
tab_lifecycle_unit_source_->AddObserver(tab_manager_.get());
resource_coordinator::ResourceCoordinatorParts*
TestingBrowserProcess::resource_coordinator_parts() {
if (!resource_coordinator_parts_) {
resource_coordinator_parts_ =
std::make_unique<resource_coordinator::ResourceCoordinatorParts>();
}
return tab_manager_.get();
#endif
return resource_coordinator_parts_.get();
}
resource_coordinator::TabManager* TestingBrowserProcess::GetTabManager() {
return resource_coordinator_parts()->tab_manager();
}
shell_integration::DefaultWebClientState
......
......@@ -53,7 +53,7 @@ class PolicyService;
}
namespace resource_coordinator {
class TabLifecycleUnitSource;
class ResourceCoordinatorParts;
}
class TestingBrowserProcess : public BrowserProcess {
......@@ -134,6 +134,8 @@ class TestingBrowserProcess : public BrowserProcess {
gcm::GCMDriver* gcm_driver() override;
resource_coordinator::TabManager* GetTabManager() override;
resource_coordinator::ResourceCoordinatorParts* resource_coordinator_parts()
override;
shell_integration::DefaultWebClientState CachedDefaultWebClientState()
override;
prefs::InProcessPrefServiceFactory* pref_service_factory() const override;
......@@ -197,14 +199,6 @@ class TestingBrowserProcess : public BrowserProcess {
std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
// |tab_manager_| is null by default and will be created when
// GetTabManager() is invoked on supported platforms.
#if !defined(OS_ANDROID)
std::unique_ptr<resource_coordinator::TabManager> tab_manager_;
std::unique_ptr<resource_coordinator::TabLifecycleUnitSource>
tab_lifecycle_unit_source_;
#endif
// The following objects are not owned by TestingBrowserProcess:
PrefService* local_state_;
IOThread* io_thread_;
......@@ -223,6 +217,9 @@ class TestingBrowserProcess : public BrowserProcess {
extensions_browser_client_;
#endif
std::unique_ptr<resource_coordinator::ResourceCoordinatorParts>
resource_coordinator_parts_;
DISALLOW_COPY_AND_ASSIGN(TestingBrowserProcess);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment