Commit db5e34d7 authored by Hidehiko Abe's avatar Hidehiko Abe Committed by Commit Bot

Migrate ArcService to BrowserContextKeyedService part 16.

This CL migrates ArcPrintService.

BUG=672829
TEST=Ran try.

Change-Id: Ia223ec8dc9d05d044ddb66812cd322d705cb1d39
Reviewed-on: https://chromium-review.googlesource.com/572882
Commit-Queue: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: default avatarYusuke Sato (in China Mon-Thurs, may be offline) <yusukes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487017}
parent 447a7199
......@@ -104,8 +104,6 @@ void ArcServiceLauncher::Initialize() {
base::MakeUnique<ArcNetHostImpl>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcPolicyBridge>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcPrintService>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcProcessService>(arc_bridge_service));
arc_service_manager_->AddService(
......@@ -192,6 +190,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
ArcMetricsService::GetForBrowserContext(profile);
ArcObbMounterBridge::GetForBrowserContext(profile);
ArcPowerBridge::GetForBrowserContext(profile);
ArcPrintService::GetForBrowserContext(profile);
arc_service_manager_->AddService(base::MakeUnique<ArcBootPhaseMonitorBridge>(
arc_service_manager_->arc_bridge_service(),
......
......@@ -11,10 +11,12 @@
#include "base/bind.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/task_scheduler/post_task.h"
#include "base/task_scheduler/task_traits.h"
#include "base/threading/thread_restrictions.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "mojo/edk/embedder/embedder.h"
#include "net/base/filename_util.h"
#include "url/gurl.h"
......@@ -45,19 +47,55 @@ base::Optional<base::FilePath> SavePdf(base::File file) {
} // namespace
namespace arc {
namespace {
// Singleton factory for ArcPrintService.
class ArcPrintServiceFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcPrintService,
ArcPrintServiceFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcPrintServiceFactory";
static ArcPrintServiceFactory* GetInstance() {
return base::Singleton<ArcPrintServiceFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcPrintServiceFactory>;
ArcPrintServiceFactory() = default;
~ArcPrintServiceFactory() override = default;
};
} // namespace
// static
ArcPrintService* ArcPrintService::GetForBrowserContext(
content::BrowserContext* context) {
return ArcPrintServiceFactory::GetForBrowserContext(context);
}
ArcPrintService::ArcPrintService(ArcBridgeService* bridge_service)
: ArcService(bridge_service), binding_(this), weak_ptr_factory_(this) {
arc_bridge_service()->print()->AddObserver(this);
ArcPrintService::ArcPrintService(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: arc_bridge_service_(bridge_service),
binding_(this),
weak_ptr_factory_(this) {
arc_bridge_service_->print()->AddObserver(this);
}
ArcPrintService::~ArcPrintService() {
arc_bridge_service()->print()->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_->print()->RemoveObserver(this);
}
void ArcPrintService::OnInstanceReady() {
mojom::PrintInstance* print_instance =
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->print(), Init);
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->print(), Init);
DCHECK(print_instance);
mojom::PrintHostPtr host_proxy;
binding_.Bind(mojo::MakeRequest(&host_proxy));
......
......@@ -10,20 +10,30 @@
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/threading/thread_checker.h"
#include "components/arc/arc_service.h"
#include "components/arc/common/print.mojom.h"
#include "components/arc/instance_holder.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/binding.h"
namespace content {
class BrowserContext;
} // namespace content
namespace arc {
class ArcBridgeService;
class ArcPrintService : public ArcService,
class ArcPrintService : public KeyedService,
public InstanceHolder<mojom::PrintInstance>::Observer,
public mojom::PrintHost {
public:
explicit ArcPrintService(ArcBridgeService* bridge_service);
// Returns singleton instance for the given BrowserContext,
// or nullptr if the browser |context| is not allowed to use ARC.
static ArcPrintService* GetForBrowserContext(
content::BrowserContext* context);
ArcPrintService(content::BrowserContext* context,
ArcBridgeService* bridge_service);
~ArcPrintService() override;
// InstanceHolder<mojom::PrintInstance>::Observer override:
......@@ -38,6 +48,8 @@ class ArcPrintService : public ArcService,
void OpenPdf(base::Optional<base::FilePath> file_path) const;
THREAD_CHECKER(thread_checker_);
ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager.
mojo::Binding<mojom::PrintHost> binding_;
base::WeakPtrFactory<ArcPrintService> weak_ptr_factory_;
......
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