Commit 06558be1 authored by Hidehiko Abe's avatar Hidehiko Abe Committed by Commit Bot

Migrate ArcService to BrowserContextKeyedService part 21.

This CL migrates ArcTracingBridge.

BUG=672829
TEST=Ran try.

Change-Id: Ibc52186e24f7e042dfc86541cecf7fc18d2dea50
Reviewed-on: https://chromium-review.googlesource.com/572887Reviewed-by: default avatarYusuke Sato (in China Mon-Thurs, may be offline) <yusukes@chromium.org>
Commit-Queue: Hidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487043}
parent 353577cd
......@@ -110,8 +110,6 @@ void ArcServiceLauncher::Initialize() {
base::MakeUnique<ArcSettingsService>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcStorageManager>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcTracingBridge>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcTtsService>(arc_bridge_service));
arc_service_manager_->AddService(
......@@ -190,6 +188,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
ArcPowerBridge::GetForBrowserContext(profile);
ArcPrintService::GetForBrowserContext(profile);
ArcProvisionNotificationService::GetForBrowserContext(profile);
ArcTracingBridge::GetForBrowserContext(profile);
arc_service_manager_->AddService(base::MakeUnique<ArcBootPhaseMonitorBridge>(
arc_service_manager_->arc_bridge_service(),
......
......@@ -6,8 +6,10 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "components/arc/arc_service_manager.h"
#include "content/public/browser/browser_thread.h"
#include "mojo/public/cpp/system/platform_handle.h"
......@@ -21,6 +23,25 @@ namespace {
// the prefix and the real categories.
constexpr char kCategoryPrefix[] = TRACE_DISABLED_BY_DEFAULT("android ");
// Singleton factory for ArcTracingBridge.
class ArcTracingBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcTracingBridge,
ArcTracingBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcTracingBridgeFactory";
static ArcTracingBridgeFactory* GetInstance() {
return base::Singleton<ArcTracingBridgeFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcTracingBridgeFactory>;
ArcTracingBridgeFactory() = default;
~ArcTracingBridgeFactory() override = default;
};
} // namespace
struct ArcTracingBridge::Category {
......@@ -30,21 +51,34 @@ struct ArcTracingBridge::Category {
std::string full_name;
};
ArcTracingBridge::ArcTracingBridge(ArcBridgeService* bridge_service)
: ArcService(bridge_service), weak_ptr_factory_(this) {
arc_bridge_service()->tracing()->AddObserver(this);
// static
ArcTracingBridge* ArcTracingBridge::GetForBrowserContext(
content::BrowserContext* context) {
return ArcTracingBridgeFactory::GetForBrowserContext(context);
}
ArcTracingBridge::ArcTracingBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: arc_bridge_service_(bridge_service), weak_ptr_factory_(this) {
arc_bridge_service_->tracing()->AddObserver(this);
content::ArcTracingAgent::GetInstance()->SetDelegate(this);
}
ArcTracingBridge::~ArcTracingBridge() {
content::ArcTracingAgent::GetInstance()->SetDelegate(nullptr);
arc_bridge_service()->tracing()->RemoveObserver(this);
// TODO(hidehiko): Currently, the lifetime of ArcBridgeService and
// BrowserContextKeyedService is not nested.
// If ArcServiceManager::Get() returns nullptr, it is already destructed,
// so do not touch it.
if (ArcServiceManager::Get())
arc_bridge_service_->tracing()->RemoveObserver(this);
}
void ArcTracingBridge::OnInstanceReady() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
mojom::TracingInstance* tracing_instance = ARC_GET_INSTANCE_FOR_METHOD(
arc_bridge_service()->tracing(), QueryAvailableCategories);
arc_bridge_service_->tracing(), QueryAvailableCategories);
if (!tracing_instance)
return;
tracing_instance->QueryAvailableCategories(base::Bind(
......@@ -73,8 +107,8 @@ void ArcTracingBridge::StartTracing(
const StartTracingCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
mojom::TracingInstance* tracing_instance = ARC_GET_INSTANCE_FOR_METHOD(
arc_bridge_service()->tracing(), StartTracing);
mojom::TracingInstance* tracing_instance =
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->tracing(), StartTracing);
if (!tracing_instance) {
// Use PostTask as the convention of TracingAgent. The caller expects
// callback to be called after this function returns.
......@@ -98,7 +132,7 @@ void ArcTracingBridge::StopTracing(const StopTracingCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
mojom::TracingInstance* tracing_instance =
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->tracing(), StopTracing);
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->tracing(), StopTracing);
if (!tracing_instance) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(callback, false));
......
......@@ -12,22 +12,32 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/trace_event/trace_event.h"
#include "components/arc/arc_service.h"
#include "components/arc/common/tracing.mojom.h"
#include "components/arc/instance_holder.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/arc_tracing_agent.h"
namespace content {
class BrowserContext;
} // namespace content
namespace arc {
class ArcBridgeService;
// This class provides the interface to trigger tracing in the container.
class ArcTracingBridge
: public ArcService,
: public KeyedService,
public content::ArcTracingAgent::Delegate,
public InstanceHolder<mojom::TracingInstance>::Observer {
public:
explicit ArcTracingBridge(ArcBridgeService* bridge_service);
// Returns singleton instance for the given BrowserContext,
// or nullptr if the browser |context| is not allowed to use ARC.
static ArcTracingBridge* GetForBrowserContext(
content::BrowserContext* context);
ArcTracingBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service);
~ArcTracingBridge() override;
// InstanceHolder<mojom::TracingInstance>::Observer overrides:
......@@ -45,6 +55,8 @@ class ArcTracingBridge
// Callback for QueryAvailableCategories.
void OnCategoriesReady(const std::vector<std::string>& categories);
ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager.
// List of available categories.
std::vector<Category> categories_;
......
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