Commit 954c5152 authored by Hidehiko Abe's avatar Hidehiko Abe Committed by Commit Bot

Migrate ArcService to BrowserContextKeyedService part 5.

This CL migrates ArcClipboardBridge.

BUG=672829
TEST=Ran try.

Change-Id: I34642868629e673015bcf298869d1ced2d0a0ad5
Reviewed-on: https://chromium-review.googlesource.com/571528
Commit-Queue: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: default avatarLuis Hector Chavez <lhchavez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#486981}
parent e10fa04d
...@@ -94,8 +94,6 @@ void ArcServiceLauncher::Initialize() { ...@@ -94,8 +94,6 @@ void ArcServiceLauncher::Initialize() {
base::Bind(ArcSession::Create, arc_bridge_service))); base::Bind(ArcSession::Create, arc_bridge_service)));
// List in lexicographical order. // List in lexicographical order.
arc_service_manager_->AddService(
base::MakeUnique<ArcClipboardBridge>(arc_bridge_service));
arc_service_manager_->AddService( arc_service_manager_->AddService(
base::MakeUnique<ArcCrashCollectorBridge>(arc_bridge_service)); base::MakeUnique<ArcCrashCollectorBridge>(arc_bridge_service));
arc_service_manager_->AddService( arc_service_manager_->AddService(
...@@ -199,6 +197,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) { ...@@ -199,6 +197,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
ArcAuthService::GetForBrowserContext(profile); ArcAuthService::GetForBrowserContext(profile);
ArcBluetoothBridge::GetForBrowserContext(profile); ArcBluetoothBridge::GetForBrowserContext(profile);
ArcBootErrorNotification::GetForBrowserContext(profile); ArcBootErrorNotification::GetForBrowserContext(profile);
ArcClipboardBridge::GetForBrowserContext(profile);
arc_service_manager_->AddService(base::MakeUnique<ArcBootPhaseMonitorBridge>( arc_service_manager_->AddService(base::MakeUnique<ArcBootPhaseMonitorBridge>(
arc_service_manager_->arc_bridge_service(), arc_service_manager_->arc_bridge_service(),
......
...@@ -4,29 +4,68 @@ ...@@ -4,29 +4,68 @@
#include "components/arc/clipboard/arc_clipboard_bridge.h" #include "components/arc/clipboard/arc_clipboard_bridge.h"
#include <utility>
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "components/arc/arc_bridge_service.h" #include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/clipboard_types.h" #include "ui/base/clipboard/clipboard_types.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/clipboard/scoped_clipboard_writer.h"
namespace arc { namespace arc {
namespace {
// Singleton factory for ArcClipboardBridge.
class ArcClipboardBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcClipboardBridge,
ArcClipboardBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcClipboardBridgeFactory";
static ArcClipboardBridgeFactory* GetInstance() {
return base::Singleton<ArcClipboardBridgeFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcClipboardBridgeFactory>;
ArcClipboardBridgeFactory() = default;
~ArcClipboardBridgeFactory() override = default;
};
ArcClipboardBridge::ArcClipboardBridge(ArcBridgeService* bridge_service) } // namespace
: ArcService(bridge_service), binding_(this) {
arc_bridge_service()->clipboard()->AddObserver(this); // static
ArcClipboardBridge* ArcClipboardBridge::GetForBrowserContext(
content::BrowserContext* context) {
return ArcClipboardBridgeFactory::GetForBrowserContext(context);
}
ArcClipboardBridge::ArcClipboardBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: arc_bridge_service_(bridge_service), binding_(this) {
arc_bridge_service_->clipboard()->AddObserver(this);
} }
ArcClipboardBridge::~ArcClipboardBridge() { ArcClipboardBridge::~ArcClipboardBridge() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
arc_bridge_service()->clipboard()->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_->clipboard()->RemoveObserver(this);
} }
void ArcClipboardBridge::OnInstanceReady() { void ArcClipboardBridge::OnInstanceReady() {
mojom::ClipboardInstance* clipboard_instance = mojom::ClipboardInstance* clipboard_instance =
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->clipboard(), Init); ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->clipboard(), Init);
DCHECK(clipboard_instance); DCHECK(clipboard_instance);
mojom::ClipboardHostPtr host_proxy; mojom::ClipboardHostPtr host_proxy;
binding_.Bind(mojo::MakeRequest(&host_proxy)); binding_.Bind(mojo::MakeRequest(&host_proxy));
...@@ -47,7 +86,7 @@ void ArcClipboardBridge::GetTextContent() { ...@@ -47,7 +86,7 @@ void ArcClipboardBridge::GetTextContent() {
clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &text); clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &text);
mojom::ClipboardInstance* clipboard_instance = ARC_GET_INSTANCE_FOR_METHOD( mojom::ClipboardInstance* clipboard_instance = ARC_GET_INSTANCE_FOR_METHOD(
arc_bridge_service()->clipboard(), OnGetTextContent); arc_bridge_service_->clipboard(), OnGetTextContent);
if (!clipboard_instance) if (!clipboard_instance)
return; return;
clipboard_instance->OnGetTextContent(base::UTF16ToUTF8(text)); clipboard_instance->OnGetTextContent(base::UTF16ToUTF8(text));
......
...@@ -8,19 +8,31 @@ ...@@ -8,19 +8,31 @@
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
#include "components/arc/arc_service.h"
#include "components/arc/common/clipboard.mojom.h" #include "components/arc/common/clipboard.mojom.h"
#include "components/arc/instance_holder.h" #include "components/arc/instance_holder.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
namespace content {
class BrowserContext;
} // namespace content
namespace arc { namespace arc {
class ArcBridgeService;
class ArcClipboardBridge class ArcClipboardBridge
: public ArcService, : public KeyedService,
public InstanceHolder<mojom::ClipboardInstance>::Observer, public InstanceHolder<mojom::ClipboardInstance>::Observer,
public mojom::ClipboardHost { public mojom::ClipboardHost {
public: public:
explicit ArcClipboardBridge(ArcBridgeService* bridge_service); // Returns singleton instance for the given BrowserContext,
// or nullptr if the browser |context| is not allowed to use ARC.
static ArcClipboardBridge* GetForBrowserContext(
content::BrowserContext* context);
ArcClipboardBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service);
~ArcClipboardBridge() override; ~ArcClipboardBridge() override;
// InstanceHolder<mojom::ClipboardInstance>::Observer overrides. // InstanceHolder<mojom::ClipboardInstance>::Observer overrides.
...@@ -33,6 +45,7 @@ class ArcClipboardBridge ...@@ -33,6 +45,7 @@ class ArcClipboardBridge
private: private:
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager.
mojo::Binding<mojom::ClipboardHost> binding_; mojo::Binding<mojom::ClipboardHost> binding_;
DISALLOW_COPY_AND_ASSIGN(ArcClipboardBridge); DISALLOW_COPY_AND_ASSIGN(ArcClipboardBridge);
......
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