Commit d1e8719e authored by Jesse Schettler's avatar Jesse Schettler Committed by Commit Bot

arc: Add new ArcPrintSpoolerBridge

The ArcPrintSpoolerBridge will receive print requests from Android
and handle them with Chrome print preview.

Currently, it does nothing but receive connections.

Design Doc: go/arc++-print-unification

BUG=b:131243460
TEST=Manually deploy and verify successful connection

Change-Id: Ib4886745c4da21f7c3912d469792a9b0c7a8397a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1583062
Commit-Queue: Jesse Schettler <jschettler@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarHidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#654732}
parent 61687f55
...@@ -578,6 +578,8 @@ source_set("chromeos") { ...@@ -578,6 +578,8 @@ source_set("chromeos") {
"arc/policy/arc_policy_util.h", "arc/policy/arc_policy_util.h",
"arc/print/arc_print_service.cc", "arc/print/arc_print_service.cc",
"arc/print/arc_print_service.h", "arc/print/arc_print_service.h",
"arc/print_spooler/arc_print_spooler_bridge.cc",
"arc/print_spooler/arc_print_spooler_bridge.h",
"arc/process/arc_process.cc", "arc/process/arc_process.cc",
"arc/process/arc_process.h", "arc/process/arc_process.h",
"arc/process/arc_process_service.cc", "arc/process/arc_process_service.cc",
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "chrome/browser/chromeos/arc/pip/arc_pip_bridge.h" #include "chrome/browser/chromeos/arc/pip/arc_pip_bridge.h"
#include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h" #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
#include "chrome/browser/chromeos/arc/print/arc_print_service.h" #include "chrome/browser/chromeos/arc/print/arc_print_service.h"
#include "chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_bridge.h"
#include "chrome/browser/chromeos/arc/process/arc_process_service.h" #include "chrome/browser/chromeos/arc/process/arc_process_service.h"
#include "chrome/browser/chromeos/arc/screen_capture/arc_screen_capture_bridge.h" #include "chrome/browser/chromeos/arc/screen_capture/arc_screen_capture_bridge.h"
#include "chrome/browser/chromeos/arc/tracing/arc_tracing_bridge.h" #include "chrome/browser/chromeos/arc/tracing/arc_tracing_bridge.h"
...@@ -181,6 +182,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) { ...@@ -181,6 +182,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
ArcPolicyBridge::GetForBrowserContext(profile); ArcPolicyBridge::GetForBrowserContext(profile);
ArcPowerBridge::GetForBrowserContext(profile); ArcPowerBridge::GetForBrowserContext(profile);
ArcPrintService::GetForBrowserContext(profile); ArcPrintService::GetForBrowserContext(profile);
ArcPrintSpoolerBridge::GetForBrowserContext(profile);
ArcProcessService::GetForBrowserContext(profile); ArcProcessService::GetForBrowserContext(profile);
ArcPropertyBridge::GetForBrowserContext(profile); ArcPropertyBridge::GetForBrowserContext(profile);
ArcProvisionNotificationService::GetForBrowserContext(profile); ArcProvisionNotificationService::GetForBrowserContext(profile);
......
// Copyright 2019 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/chromeos/arc/print_spooler/arc_print_spooler_bridge.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "chrome/browser/ui/browser.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "components/arc/session/arc_bridge_service.h"
#include "content/public/browser/browser_thread.h"
namespace arc {
namespace {
// Singleton factory for ArcPrintSpoolerBridge.
class ArcPrintSpoolerBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcPrintSpoolerBridge, ArcPrintSpoolerBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcPrintSpoolerBridgeFactory";
static ArcPrintSpoolerBridgeFactory* GetInstance() {
return base::Singleton<ArcPrintSpoolerBridgeFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcPrintSpoolerBridgeFactory>;
ArcPrintSpoolerBridgeFactory() = default;
~ArcPrintSpoolerBridgeFactory() override = default;
};
} // namespace
// static
ArcPrintSpoolerBridge* ArcPrintSpoolerBridge::GetForBrowserContext(
content::BrowserContext* context) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return ArcPrintSpoolerBridgeFactory::GetForBrowserContext(context);
}
ArcPrintSpoolerBridge::ArcPrintSpoolerBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: profile_(Profile::FromBrowserContext(context)),
arc_bridge_service_(bridge_service),
weak_ptr_factory_(this) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
arc_bridge_service_->print_spooler()->SetHost(this);
}
ArcPrintSpoolerBridge::~ArcPrintSpoolerBridge() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
arc_bridge_service_->print_spooler()->SetHost(nullptr);
}
} // namespace arc
// Copyright 2019 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_CHROMEOS_ARC_PRINT_SPOOLER_ARC_PRINT_SPOOLER_BRIDGE_H_
#define CHROME_BROWSER_CHROMEOS_ARC_PRINT_SPOOLER_ARC_PRINT_SPOOLER_BRIDGE_H_
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/profiles/profile.h"
#include "components/arc/common/print_spooler.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
namespace content {
class BrowserContext;
} // namespace content
namespace arc {
class ArcBridgeService;
// This class handles print related IPC from the ARC container and allows print
// jobs to be displayed and managed in Chrome print preview instead of the
// Android print UI.
class ArcPrintSpoolerBridge
: public KeyedService,
public mojom::PrintSpoolerHost {
public:
// Returns singleton instance for the given BrowserContext,
// or nullptr if the browser |context| is not allowed to use ARC.
static ArcPrintSpoolerBridge* GetForBrowserContext(
content::BrowserContext* context);
ArcPrintSpoolerBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service);
~ArcPrintSpoolerBridge() override;
// mojom::PrintSpoolerHost overrides:
// TODO(jschettler): Add overrides.
private:
Profile* const profile_;
ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager.
base::WeakPtrFactory<ArcPrintSpoolerBridge> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ArcPrintSpoolerBridge);
};
} // namespace arc
#endif // CHROME_BROWSER_CHROMEOS_ARC_PRINT_SPOOLER_ARC_PRINT_SPOOLER_BRIDGE_H_
...@@ -45,6 +45,7 @@ if (is_chromeos) { ...@@ -45,6 +45,7 @@ if (is_chromeos) {
"policy.mojom", "policy.mojom",
"power.mojom", "power.mojom",
"print.mojom", "print.mojom",
"print_spooler.mojom",
"process.mojom", "process.mojom",
"property.mojom", "property.mojom",
"rotation_lock.mojom", "rotation_lock.mojom",
......
...@@ -36,6 +36,7 @@ import "components/arc/common/pip.mojom"; ...@@ -36,6 +36,7 @@ import "components/arc/common/pip.mojom";
import "components/arc/common/policy.mojom"; import "components/arc/common/policy.mojom";
import "components/arc/common/power.mojom"; import "components/arc/common/power.mojom";
import "components/arc/common/print.mojom"; import "components/arc/common/print.mojom";
import "components/arc/common/print_spooler.mojom";
import "components/arc/common/process.mojom"; import "components/arc/common/process.mojom";
import "components/arc/common/property.mojom"; import "components/arc/common/property.mojom";
import "components/arc/common/rotation_lock.mojom"; import "components/arc/common/rotation_lock.mojom";
...@@ -52,9 +53,9 @@ import "components/arc/common/volume_mounter.mojom"; ...@@ -52,9 +53,9 @@ import "components/arc/common/volume_mounter.mojom";
import "components/arc/common/wake_lock.mojom"; import "components/arc/common/wake_lock.mojom";
import "components/arc/common/wallpaper.mojom"; import "components/arc/common/wallpaper.mojom";
// Next MinVersion: 45 // Next MinVersion: 46
// Deprecated method IDs: 101, 105 // Deprecated method IDs: 101, 105
// Next method ID: 150 // Next method ID: 151
interface ArcBridgeHost { interface ArcBridgeHost {
// Keep the entries alphabetical. In order to do so without breaking // Keep the entries alphabetical. In order to do so without breaking
// compatibility with the ARC instance, explicitly assign each interface a // compatibility with the ARC instance, explicitly assign each interface a
...@@ -165,6 +166,10 @@ interface ArcBridgeHost { ...@@ -165,6 +166,10 @@ interface ArcBridgeHost {
// Notifies Chrome that the PrintInstance interface is ready. // Notifies Chrome that the PrintInstance interface is ready.
[MinVersion=16] OnPrintInstanceReady@121(PrintInstance instance_ptr); [MinVersion=16] OnPrintInstanceReady@121(PrintInstance instance_ptr);
// Notifies Chrome that the PrintSpoolerInstance interface is ready.
[MinVersion=45] OnPrintSpoolerInstanceReady@150(
PrintSpoolerInstance instance_ptr);
// Notifies Chrome that the ProcessInstance interface is ready. // Notifies Chrome that the ProcessInstance interface is ready.
OnProcessInstanceReady@104(ProcessInstance instance_ptr); OnProcessInstanceReady@104(ProcessInstance instance_ptr);
......
// Copyright 2019 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.
//
// Next MinVersion: 1
module arc.mojom;
// Next method ID: 0
interface PrintSpoolerHost {
// TODO(jschettler): Add methods to open and close print preview
};
// Next method ID: 1
interface PrintSpoolerInstance {
// Establishes full-duplex communication with the host.
[MinVersion=0] Init@0(PrintSpoolerHost host_ptr) => ();
};
\ No newline at end of file
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "components/arc/common/policy.mojom.h" #include "components/arc/common/policy.mojom.h"
#include "components/arc/common/power.mojom.h" #include "components/arc/common/power.mojom.h"
#include "components/arc/common/print.mojom.h" #include "components/arc/common/print.mojom.h"
#include "components/arc/common/print_spooler.mojom.h"
#include "components/arc/common/process.mojom.h" #include "components/arc/common/process.mojom.h"
#include "components/arc/common/property.mojom.h" #include "components/arc/common/property.mojom.h"
#include "components/arc/common/rotation_lock.mojom.h" #include "components/arc/common/rotation_lock.mojom.h"
...@@ -256,6 +257,12 @@ void ArcBridgeHostImpl::OnPrintInstanceReady( ...@@ -256,6 +257,12 @@ void ArcBridgeHostImpl::OnPrintInstanceReady(
OnInstanceReady(arc_bridge_service_->print(), std::move(print_ptr)); OnInstanceReady(arc_bridge_service_->print(), std::move(print_ptr));
} }
void ArcBridgeHostImpl::OnPrintSpoolerInstanceReady(
mojom::PrintSpoolerInstancePtr print_spooler_ptr) {
OnInstanceReady(arc_bridge_service_->print_spooler(),
std::move(print_spooler_ptr));
}
void ArcBridgeHostImpl::OnProcessInstanceReady( void ArcBridgeHostImpl::OnProcessInstanceReady(
mojom::ProcessInstancePtr process_ptr) { mojom::ProcessInstancePtr process_ptr) {
OnInstanceReady(arc_bridge_service_->process(), std::move(process_ptr)); OnInstanceReady(arc_bridge_service_->process(), std::move(process_ptr));
......
...@@ -87,6 +87,8 @@ class ArcBridgeHostImpl : public mojom::ArcBridgeHost { ...@@ -87,6 +87,8 @@ class ArcBridgeHostImpl : public mojom::ArcBridgeHost {
void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override; void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override;
void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override; void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override;
void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override; void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override;
void OnPrintSpoolerInstanceReady(
mojom::PrintSpoolerInstancePtr print_spooler_ptr) override;
void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override; void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override;
void OnPropertyInstanceReady( void OnPropertyInstanceReady(
mojom::PropertyInstancePtr property_ptr) override; mojom::PropertyInstancePtr property_ptr) override;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "components/arc/common/policy.mojom.h" #include "components/arc/common/policy.mojom.h"
#include "components/arc/common/power.mojom.h" #include "components/arc/common/power.mojom.h"
#include "components/arc/common/print.mojom.h" #include "components/arc/common/print.mojom.h"
#include "components/arc/common/print_spooler.mojom.h"
#include "components/arc/common/process.mojom.h" #include "components/arc/common/process.mojom.h"
#include "components/arc/common/property.mojom.h" #include "components/arc/common/property.mojom.h"
#include "components/arc/common/rotation_lock.mojom.h" #include "components/arc/common/rotation_lock.mojom.h"
......
...@@ -71,6 +71,8 @@ class PowerHost; ...@@ -71,6 +71,8 @@ class PowerHost;
class PowerInstance; class PowerInstance;
class PrintHost; class PrintHost;
class PrintInstance; class PrintInstance;
class PrintSpoolerHost;
class PrintSpoolerInstance;
class ProcessInstance; class ProcessInstance;
class PropertyInstance; class PropertyInstance;
class RotationLockInstance; class RotationLockInstance;
...@@ -204,6 +206,10 @@ class ArcBridgeService { ...@@ -204,6 +206,10 @@ class ArcBridgeService {
ConnectionHolder<mojom::PrintInstance, mojom::PrintHost>* print() { ConnectionHolder<mojom::PrintInstance, mojom::PrintHost>* print() {
return &print_; return &print_;
} }
ConnectionHolder<mojom::PrintSpoolerInstance, mojom::PrintSpoolerHost>*
print_spooler() {
return &print_spooler_;
}
ConnectionHolder<mojom::ProcessInstance>* process() { return &process_; } ConnectionHolder<mojom::ProcessInstance>* process() { return &process_; }
ConnectionHolder<mojom::PropertyInstance>* property() { return &property_; } ConnectionHolder<mojom::PropertyInstance>* property() { return &property_; }
ConnectionHolder<mojom::RotationLockInstance>* rotation_lock() { ConnectionHolder<mojom::RotationLockInstance>* rotation_lock() {
...@@ -282,6 +288,8 @@ class ArcBridgeService { ...@@ -282,6 +288,8 @@ class ArcBridgeService {
ConnectionHolder<mojom::PolicyInstance, mojom::PolicyHost> policy_; ConnectionHolder<mojom::PolicyInstance, mojom::PolicyHost> policy_;
ConnectionHolder<mojom::PowerInstance, mojom::PowerHost> power_; ConnectionHolder<mojom::PowerInstance, mojom::PowerHost> power_;
ConnectionHolder<mojom::PrintInstance, mojom::PrintHost> print_; ConnectionHolder<mojom::PrintInstance, mojom::PrintHost> print_;
ConnectionHolder<mojom::PrintSpoolerInstance, mojom::PrintSpoolerHost>
print_spooler_;
ConnectionHolder<mojom::ProcessInstance> process_; ConnectionHolder<mojom::ProcessInstance> process_;
ConnectionHolder<mojom::PropertyInstance> property_; ConnectionHolder<mojom::PropertyInstance> property_;
ConnectionHolder<mojom::RotationLockInstance> rotation_lock_; ConnectionHolder<mojom::RotationLockInstance> rotation_lock_;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "components/arc/common/policy.mojom.h" #include "components/arc/common/policy.mojom.h"
#include "components/arc/common/power.mojom.h" #include "components/arc/common/power.mojom.h"
#include "components/arc/common/print.mojom.h" #include "components/arc/common/print.mojom.h"
#include "components/arc/common/print_spooler.mojom.h"
#include "components/arc/common/process.mojom.h" #include "components/arc/common/process.mojom.h"
#include "components/arc/common/property.mojom.h" #include "components/arc/common/property.mojom.h"
#include "components/arc/common/rotation_lock.mojom.h" #include "components/arc/common/rotation_lock.mojom.h"
...@@ -150,6 +151,9 @@ void FakeArcBridgeHost::OnPowerInstanceReady( ...@@ -150,6 +151,9 @@ void FakeArcBridgeHost::OnPowerInstanceReady(
void FakeArcBridgeHost::OnPrintInstanceReady( void FakeArcBridgeHost::OnPrintInstanceReady(
mojom::PrintInstancePtr print_ptr) {} mojom::PrintInstancePtr print_ptr) {}
void FakeArcBridgeHost::OnPrintSpoolerInstanceReady(
mojom::PrintSpoolerInstancePtr print_spooler_ptr) {}
void FakeArcBridgeHost::OnProcessInstanceReady( void FakeArcBridgeHost::OnProcessInstanceReady(
mojom::ProcessInstancePtr process_ptr) {} mojom::ProcessInstancePtr process_ptr) {}
......
...@@ -67,6 +67,8 @@ class FakeArcBridgeHost : public mojom::ArcBridgeHost { ...@@ -67,6 +67,8 @@ class FakeArcBridgeHost : public mojom::ArcBridgeHost {
void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override; void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override;
void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override; void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override;
void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override; void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override;
void OnPrintSpoolerInstanceReady(
mojom::PrintSpoolerInstancePtr print_spooler_ptr) override;
void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override; void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override;
void OnPropertyInstanceReady( void OnPropertyInstanceReady(
mojom::PropertyInstancePtr property_ptr) override; mojom::PropertyInstancePtr property_ptr) override;
......
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