Commit 0c392cd8 authored by Victor-Gabriel Savu's avatar Victor-Gabriel Savu Committed by Commit Bot

Initialize WilcoDtcSupportdClient only on wilco devices

Remove WilcoDtcSupportdClient from DBusThreadManager and use a feature
check to determine if initialization is required. Moving the files is
required to be able to access ::features::kWilcoDtc.

Bug: 1014062
Test: unit_tests --gtest_filter="WilcoDtcSupport*"
Test: on device with diagnostics_dpsl_demo_vm

Change-Id: Ia83b91495cfab32a05a9642a871a4cdd8b13392e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1865156
Commit-Queue: Victor-Gabriel Savu <vsavu@google.com>
Reviewed-by: default avatarOleh Lamzin <lamzin@google.com>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Reviewed-by: default avatarPolina Bondarenko <pbond@chromium.org>
Cr-Commit-Position: refs/heads/master@{#707286}
parent e1806958
......@@ -2183,10 +2183,14 @@ source_set("chromeos") {
"usb/cros_usb_detector.h",
"virtual_machines/virtual_machines_util.cc",
"virtual_machines/virtual_machines_util.h",
"wilco_dtc_supportd/fake_wilco_dtc_supportd_client.cc",
"wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h",
"wilco_dtc_supportd/mojo_utils.cc",
"wilco_dtc_supportd/mojo_utils.h",
"wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_bridge.h",
"wilco_dtc_supportd/wilco_dtc_supportd_client.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_client.h",
"wilco_dtc_supportd/wilco_dtc_supportd_manager.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_manager.h",
"wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc",
......
......@@ -7,6 +7,7 @@
#include "base/path_service.h"
#include "base/system/sys_info.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/common/chrome_paths.h"
#include "chromeos/constants/chromeos_paths.h"
#include "chromeos/cryptohome/system_salt_getter.h"
......@@ -84,11 +85,13 @@ void InitializeDBus() {
void InitializeFeatureListDependentDBus() {
dbus::Bus* bus = DBusThreadManager::Get()->GetSystemBus();
InitializeDBusClient<bluez::BluezDBusManager>(bus);
InitializeDBusClient<WilcoDtcSupportdClient>(bus);
}
void ShutdownDBus() {
// Feature list-dependent D-Bus clients are shut down first because we try to.
// Feature list-dependent D-Bus clients are shut down first because we try to
// shut down in reverse order of initialization (in case of dependencies).
WilcoDtcSupportdClient::Shutdown();
bluez::BluezDBusManager::Shutdown();
// Other D-Bus clients are shut down, also in reverse order of initialization.
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/dbus/fake_wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include <utility>
......
......@@ -2,21 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_DBUS_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
#define CHROMEOS_DBUS_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
#ifndef CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
#define CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
#include <vector>
#include "base/component_export.h"
#include "base/macros.h"
#include "base/optional.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chromeos/dbus/dbus_method_call_status.h"
#include "chromeos/dbus/wilco_dtc_supportd_client.h"
namespace chromeos {
class COMPONENT_EXPORT(CHROMEOS_DBUS) FakeWilcoDtcSupportdClient final
: public WilcoDtcSupportdClient {
class FakeWilcoDtcSupportdClient final : public WilcoDtcSupportdClient {
public:
FakeWilcoDtcSupportdClient();
~FakeWilcoDtcSupportdClient() override;
......@@ -60,4 +59,4 @@ class COMPONENT_EXPORT(CHROMEOS_DBUS) FakeWilcoDtcSupportdClient final
} // namespace chromeos
#endif // CHROMEOS_DBUS_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
#endif // CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_FAKE_WILCO_DTC_SUPPORTD_CLIENT_H_
......@@ -15,11 +15,10 @@
#include "base/posix/eintr_wrapper.h"
#include "base/run_loop.h"
#include "base/test/bind_test_util.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_wilco_dtc_supportd_client.h"
#include "chromeos/dbus/wilco_dtc_supportd_client.h"
namespace chromeos {
......@@ -130,9 +129,8 @@ class TestingWilcoDtcSupportdBridgeWrapperDelegate final
};
FakeWilcoDtcSupportdClient* GetFakeDbusWilcoDtcSupportdClient() {
DCHECK(DBusThreadManager::Get()->IsUsingFakes());
WilcoDtcSupportdClient* const wilco_dtc_supportd_client =
DBusThreadManager::Get()->GetWilcoDtcSupportdClient();
WilcoDtcSupportdClient::Get();
DCHECK(wilco_dtc_supportd_client);
return static_cast<FakeWilcoDtcSupportdClient*>(wilco_dtc_supportd_client);
}
......
......@@ -15,11 +15,11 @@
#include "base/strings/string_piece.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/wilco_dtc_supportd_client.h"
#include "mojo/public/cpp/bindings/interface_ptr_info.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/platform/platform_channel.h"
......@@ -160,9 +160,7 @@ void WilcoDtcSupportdBridge::WaitForDBusService() {
// ScheduleWaitingForDBusService().
dbus_waiting_weak_ptr_factory_.InvalidateWeakPtrs();
DBusThreadManager::Get()
->GetWilcoDtcSupportdClient()
->WaitForServiceToBeAvailable(
chromeos::WilcoDtcSupportdClient::Get()->WaitForServiceToBeAvailable(
base::BindOnce(&WilcoDtcSupportdBridge::OnWaitedForDBusService,
dbus_waiting_weak_ptr_factory_.GetWeakPtr()));
}
......@@ -221,9 +219,7 @@ void WilcoDtcSupportdBridge::BootstrapMojoConnection() {
// Send the file descriptor with the Mojo message pipe's remote endpoint to
// the wilco_dtc_supportd daemon via the D-Bus.
DBusThreadManager::Get()
->GetWilcoDtcSupportdClient()
->BootstrapMojoConnection(
chromeos::WilcoDtcSupportdClient::Get()->BootstrapMojoConnection(
std::move(remote_endpoint_fd),
base::BindOnce(&WilcoDtcSupportdBridge::OnBootstrappedMojoConnection,
weak_ptr_factory_.GetWeakPtr()));
......
......@@ -12,12 +12,11 @@
#include "base/optional.h"
#include "base/posix/eintr_wrapper.h"
#include "base/test/task_environment.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_wilco_dtc_supportd_client.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
......@@ -173,8 +172,7 @@ class MockWilcoDtcSupportdNotificationController
class WilcoDtcSupportdBridgeTest : public testing::Test {
protected:
WilcoDtcSupportdBridgeTest() {
DBusThreadManager::Initialize();
CHECK(DBusThreadManager::Get()->IsUsingFakes());
WilcoDtcSupportdClient::InitializeFake();
auto profile_manager = std::make_unique<TestingProfileManager>(
TestingBrowserProcess::GetGlobal());
......@@ -198,7 +196,7 @@ class WilcoDtcSupportdBridgeTest : public testing::Test {
~WilcoDtcSupportdBridgeTest() override {
wilco_dtc_supportd_bridge_.reset();
DBusThreadManager::Shutdown();
WilcoDtcSupportdClient::Shutdown();
}
StrictMock<MockWilcoDtcSupportdNotificationController>*
......@@ -212,7 +210,7 @@ class WilcoDtcSupportdBridgeTest : public testing::Test {
FakeWilcoDtcSupportdClient* wilco_dtc_supportd_dbus_client() {
WilcoDtcSupportdClient* const wilco_dtc_supportd_client =
DBusThreadManager::Get()->GetWilcoDtcSupportdClient();
WilcoDtcSupportdClient::Get();
DCHECK(wilco_dtc_supportd_client);
return static_cast<FakeWilcoDtcSupportdClient*>(wilco_dtc_supportd_client);
}
......
......@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/dbus/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include <utility>
#include "base/bind.h"
#include "base/feature_list.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include "chrome/common/chrome_features.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
......@@ -16,6 +19,8 @@ namespace chromeos {
namespace {
WilcoDtcSupportdClient* g_instance = nullptr;
void OnVoidDBusMethod(VoidDBusMethodCallback callback,
dbus::Response* response) {
std::move(callback).Run(response != nullptr);
......@@ -32,9 +37,6 @@ class WilcoDtcSupportdClientImpl final : public WilcoDtcSupportdClient {
WaitForServiceToBeAvailableCallback callback) override;
void BootstrapMojoConnection(base::ScopedFD fd,
VoidDBusMethodCallback callback) override;
protected:
// WilcoDtcSupportdClient overrides:
void Init(dbus::Bus* bus) override;
private:
......@@ -75,11 +77,46 @@ void WilcoDtcSupportdClientImpl::Init(dbus::Bus* bus) {
} // namespace
WilcoDtcSupportdClient::WilcoDtcSupportdClient() {
DCHECK(!g_instance);
g_instance = this;
}
WilcoDtcSupportdClient::~WilcoDtcSupportdClient() {
DCHECK_EQ(this, g_instance);
g_instance = nullptr;
}
// static
void WilcoDtcSupportdClient::Initialize(dbus::Bus* bus) {
DCHECK(bus);
#if defined(OS_CHROMEOS)
if (base::FeatureList::IsEnabled(::features::kWilcoDtc)) {
(new WilcoDtcSupportdClientImpl())->Init(bus);
}
#endif
}
// static
std::unique_ptr<WilcoDtcSupportdClient> WilcoDtcSupportdClient::Create() {
return std::make_unique<WilcoDtcSupportdClientImpl>();
void WilcoDtcSupportdClient::InitializeFake() {
new FakeWilcoDtcSupportdClient();
}
WilcoDtcSupportdClient::WilcoDtcSupportdClient() = default;
// static
void WilcoDtcSupportdClient::Shutdown() {
if (g_instance)
delete g_instance;
}
// static
bool WilcoDtcSupportdClient::IsInitialized() {
return g_instance;
}
// static
WilcoDtcSupportdClient* WilcoDtcSupportdClient::Get() {
CHECK(IsInitialized());
return g_instance;
}
} // namespace chromeos
......@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_DBUS_WILCO_DTC_SUPPORTD_CLIENT_H_
#define CHROMEOS_DBUS_WILCO_DTC_SUPPORTD_CLIENT_H_
#ifndef CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_CLIENT_H_
#define CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_CLIENT_H_
#include <memory>
......@@ -16,11 +16,18 @@
namespace chromeos {
class COMPONENT_EXPORT(CHROMEOS_DBUS) WilcoDtcSupportdClient
: public DBusClient {
class WilcoDtcSupportdClient : public DBusClient {
public:
// Factory function.
static std::unique_ptr<WilcoDtcSupportdClient> Create();
// Creates and initializes the global instance. |bus| must not be null.
static void Initialize(dbus::Bus* bus);
// Creates and initializes a fake global instance if not already created.
static void InitializeFake();
// Destroys the global instance which must have been initialized.
static void Shutdown();
// Checks if initialization was performed
static bool IsInitialized();
// Returns the global instance if initialized.
static WilcoDtcSupportdClient* Get();
// Registers |callback| to run when the wilco_dtc_supportd service becomes
// available.
......@@ -35,6 +42,7 @@ class COMPONENT_EXPORT(CHROMEOS_DBUS) WilcoDtcSupportdClient
protected:
// Create() should be used instead.
WilcoDtcSupportdClient();
~WilcoDtcSupportdClient() override;
private:
DISALLOW_COPY_AND_ASSIGN(WilcoDtcSupportdClient);
......@@ -42,4 +50,4 @@ class COMPONENT_EXPORT(CHROMEOS_DBUS) WilcoDtcSupportdClient
} // namespace chromeos
#endif // CHROMEOS_DBUS_WILCO_DTC_SUPPORTD_CLIENT_H_
#endif // CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_CLIENT_H_
......@@ -12,8 +12,8 @@
#include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/upstart/fake_upstart_client.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/session_manager_types.h"
......@@ -96,11 +96,13 @@ class FakeWilcoDtcSupportdManagerDelegate final
class WilcoDtcSupportdManagerTest : public testing::Test {
protected:
WilcoDtcSupportdManagerTest() {
DBusThreadManager::Initialize();
WilcoDtcSupportdClient::InitializeFake();
upstart_client_ = std::make_unique<TestUpstartClient>();
}
~WilcoDtcSupportdManagerTest() override { DBusThreadManager::Shutdown(); }
~WilcoDtcSupportdManagerTest() override {
WilcoDtcSupportdClient::Shutdown();
}
std::unique_ptr<WilcoDtcSupportdManager::Delegate> CreateDelegate() {
return std::make_unique<FakeWilcoDtcSupportdManagerDelegate>(
......
......@@ -15,9 +15,9 @@
#include "base/test/task_environment.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "extensions/browser/api/messaging/native_message_host.h"
#include "mojo/public/cpp/system/handle.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
......@@ -126,7 +126,7 @@ namespace {
class WilcoDtcSupportdMessagingOpenedByExtensionTest : public testing::Test {
protected:
WilcoDtcSupportdMessagingOpenedByExtensionTest() {
DBusThreadManager::Initialize();
WilcoDtcSupportdClient::InitializeFake();
testing_wilco_dtc_supportd_bridge_wrapper_ =
TestingWilcoDtcSupportdBridgeWrapper::Create(
&mojo_wilco_dtc_supportd_service_,
......@@ -140,7 +140,7 @@ class WilcoDtcSupportdMessagingOpenedByExtensionTest : public testing::Test {
// DBusThreadManager is shut down, since the WilcoDtcSupportdBridge class
// uses the latter.
wilco_dtc_supportd_bridge_.reset();
DBusThreadManager::Shutdown();
WilcoDtcSupportdClient::Shutdown();
}
MockMojoWilcoDtcSupportdService* mojo_wilco_dtc_supportd_service() {
......
......@@ -9,6 +9,7 @@
#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/notifications/notification_display_service_tester.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/testing_browser_process.h"
......
......@@ -113,8 +113,6 @@ component("dbus") {
"fake_virtual_file_provider_client.h",
"fake_vm_plugin_dispatcher_client.cc",
"fake_vm_plugin_dispatcher_client.h",
"fake_wilco_dtc_supportd_client.cc",
"fake_wilco_dtc_supportd_client.h",
"gnubby_client.cc",
"gnubby_client.h",
"image_burner_client.cc",
......@@ -144,8 +142,6 @@ component("dbus") {
"virtual_file_provider_client.h",
"vm_plugin_dispatcher_client.cc",
"vm_plugin_dispatcher_client.h",
"wilco_dtc_supportd_client.cc",
"wilco_dtc_supportd_client.h",
]
}
......
......@@ -39,7 +39,6 @@
#include "chromeos/dbus/fake_smb_provider_client.h"
#include "chromeos/dbus/fake_virtual_file_provider_client.h"
#include "chromeos/dbus/fake_vm_plugin_dispatcher_client.h"
#include "chromeos/dbus/fake_wilco_dtc_supportd_client.h"
#include "chromeos/dbus/gnubby_client.h"
#include "chromeos/dbus/image_burner_client.h"
#include "chromeos/dbus/image_loader_client.h"
......@@ -51,7 +50,6 @@
#include "chromeos/dbus/update_engine_client.h"
#include "chromeos/dbus/virtual_file_provider_client.h"
#include "chromeos/dbus/vm_plugin_dispatcher_client.h"
#include "chromeos/dbus/wilco_dtc_supportd_client.h"
namespace chromeos {
......@@ -110,8 +108,6 @@ DBusClientsBrowser::DBusClientsBrowser(bool use_real_clients) {
CREATE_DBUS_CLIENT(VirtualFileProviderClient, use_real_clients);
vm_plugin_dispatcher_client_ =
CREATE_DBUS_CLIENT(VmPluginDispatcherClient, use_real_clients);
wilco_dtc_supportd_client_ =
CREATE_DBUS_CLIENT(WilcoDtcSupportdClient, use_real_clients);
}
DBusClientsBrowser::~DBusClientsBrowser() = default;
......@@ -141,7 +137,6 @@ void DBusClientsBrowser::Initialize(dbus::Bus* system_bus) {
update_engine_client_->Init(system_bus);
virtual_file_provider_client_->Init(system_bus);
vm_plugin_dispatcher_client_->Init(system_bus);
wilco_dtc_supportd_client_->Init(system_bus);
}
} // namespace chromeos
......@@ -38,7 +38,6 @@ class SmbProviderClient;
class UpdateEngineClient;
class VirtualFileProviderClient;
class VmPluginDispatcherClient;
class WilcoDtcSupportdClient;
// D-Bus clients used only in the browser process.
// TODO(jamescook): Move this under //chrome/browser. http://crbug.com/647367
......@@ -77,7 +76,6 @@ class COMPONENT_EXPORT(CHROMEOS_DBUS) DBusClientsBrowser {
std::unique_ptr<UpdateEngineClient> update_engine_client_;
std::unique_ptr<VirtualFileProviderClient> virtual_file_provider_client_;
std::unique_ptr<VmPluginDispatcherClient> vm_plugin_dispatcher_client_;
std::unique_ptr<WilcoDtcSupportdClient> wilco_dtc_supportd_client_;
DISALLOW_COPY_AND_ASSIGN(DBusClientsBrowser);
};
......
......@@ -240,11 +240,6 @@ VirtualFileProviderClient* DBusThreadManager::GetVirtualFileProviderClient() {
: nullptr;
}
WilcoDtcSupportdClient* DBusThreadManager::GetWilcoDtcSupportdClient() {
return clients_browser_ ? clients_browser_->wilco_dtc_supportd_client_.get()
: nullptr;
}
VmPluginDispatcherClient* DBusThreadManager::GetVmPluginDispatcherClient() {
return clients_browser_ ? clients_browser_->vm_plugin_dispatcher_client_.get()
: nullptr;
......
......@@ -56,7 +56,6 @@ class SMSClient;
class UpdateEngineClient;
class VirtualFileProviderClient;
class VmPluginDispatcherClient;
class WilcoDtcSupportdClient;
// THIS CLASS IS BEING DEPRECATED. See README.md for guidelines and
// https://crbug.com/647367 for details.
......@@ -138,7 +137,6 @@ class COMPONENT_EXPORT(CHROMEOS_DBUS) DBusThreadManager {
UpdateEngineClient* GetUpdateEngineClient();
VirtualFileProviderClient* GetVirtualFileProviderClient();
VmPluginDispatcherClient* GetVmPluginDispatcherClient();
WilcoDtcSupportdClient* GetWilcoDtcSupportdClient();
// DEPRECATED, DO NOT USE. The static getter for each of these classes should
// be used instead. TODO(stevenjb): Remove. https://crbug.com/948390.
......
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