Commit ed3913b7 authored by Han Leon's avatar Han Leon Committed by Commit Bot

[DeviceService] Expose SerialDeviceEnumerator interface from Device Service

This CL is part of servicification work for //device/serial, it:
 - creates a new mojo interface SerialDeviceEnumerator and exposes it
   from Device Service, the interface implementation wraps
   a device::SerialDeviceEnumerator to do actual work.
 - lets serial extension API impls consume the above interface instead
   of directly calling functions of device::SerialDeviceEnumerator.

BUG=749514
TEST=browser_tests SerialApiTest.*

Change-Id: Ib768bb25032fcc4a0899780a2f85467f128a6800
Reviewed-on: https://chromium-review.googlesource.com/586632Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarColin Blundell <blundell@chromium.org>
Commit-Queue: Han Leon <leon.han@intel.com>
Cr-Commit-Position: refs/heads/master@{#491942}
parent a4809304
...@@ -4,10 +4,9 @@ ...@@ -4,10 +4,9 @@
var testGetDevices = function() { var testGetDevices = function() {
var onGetDevices = function(devices) { var onGetDevices = function(devices) {
// Any length is potentially valid, because we're on unknown hardware. But chrome.test.assertTrue(devices.length == 2);
// we are testing at least that the devices member was filled in, so it's chrome.test.assertEq('/dev/fakeserialmojo', devices[0].path);
// still a somewhat meaningful test. chrome.test.assertEq('\\\\COM800\\', devices[1].path);
chrome.test.assertTrue(devices.length >= 0);
chrome.test.succeed(); chrome.test.succeed();
} }
......
// Copyright (c) 2017 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.
var testGetDevices = function() {
var onGetDevices = function(devices) {
chrome.test.assertTrue(devices.length == 0);
chrome.test.succeed();
}
chrome.serial.getDevices(onGetDevices);
};
var tests = [testGetDevices];
chrome.test.runTests(tests);
{
"name": "chrome.serial.getDevices failure test",
"version": "0.1",
"description": "end-to-end test getDevices returns empty list for failure",
"app": {
"background": {
"scripts": ["background.js"]
}
},
"permissions": [
"serial"
]
}
...@@ -79,6 +79,7 @@ ...@@ -79,6 +79,7 @@
"device": [ "device": [
"device:generic_sensor", "device:generic_sensor",
"device:nfc", "device:nfc",
"device:serial",
"device:vibration", "device:vibration",
"device:wake_lock" "device:wake_lock"
], ],
......
...@@ -6,84 +6,86 @@ import("//build/config/features.gni") ...@@ -6,84 +6,86 @@ import("//build/config/features.gni")
import("//mojo/public/tools/bindings/mojom.gni") import("//mojo/public/tools/bindings/mojom.gni")
# Library works only on desktop platforms. # Library works only on desktop platforms.
assert(is_win || is_linux || is_mac) if (is_win || is_linux || is_mac) {
config("platform_support") {
config("platform_support") { visibility = [ ":serial" ]
visibility = [ ":serial" ] if (is_win) {
if (is_win) { libs = [ "setupapi.lib" ]
libs = [ "setupapi.lib" ] ldflags = [ "/DELAYLOAD:setupapi.dll" ]
ldflags = [ "/DELAYLOAD:setupapi.dll" ] }
} }
}
static_library("serial") { static_library("serial") {
output_name = "device_serial" output_name = "device_serial"
sources = [ sources = [
"buffer.cc", "buffer.cc",
"buffer.h", "buffer.h",
"serial_device_enumerator.cc", "serial_device_enumerator.cc",
"serial_device_enumerator.h", "serial_device_enumerator.h",
"serial_device_enumerator_linux.cc", "serial_device_enumerator_linux.cc",
"serial_device_enumerator_linux.h", "serial_device_enumerator_linux.h",
"serial_device_enumerator_mac.cc", "serial_device_enumerator_mac.cc",
"serial_device_enumerator_mac.h", "serial_device_enumerator_mac.h",
"serial_device_enumerator_win.cc", "serial_device_enumerator_win.cc",
"serial_device_enumerator_win.h", "serial_device_enumerator_win.h",
"serial_io_handler.cc", "serial_io_handler.cc",
"serial_io_handler.h", "serial_io_handler.h",
"serial_io_handler_posix.cc", "serial_io_handler_posix.cc",
"serial_io_handler_posix.h", "serial_io_handler_posix.h",
"serial_io_handler_win.cc", "serial_io_handler_win.cc",
"serial_io_handler_win.h", "serial_io_handler_win.h",
] ]
public_configs = [ ":platform_support" ] public_configs = [ ":platform_support" ]
public_deps = [ public_deps = [
":serial_mojo", ":serial_mojo",
"//base", "//base",
"//device/base", "//device/base",
] ]
deps = [ deps = [
"//mojo/public/cpp/system", "//mojo/public/cpp/system",
"//net", "//net",
"//third_party/re2", "//third_party/re2",
] ]
if (use_udev) { if (use_udev) {
deps += [ "//device/udev_linux" ] deps += [ "//device/udev_linux" ]
}
if (is_chromeos) {
deps += [
"//chromeos",
"//dbus",
]
}
if (is_mac) {
libs = [
"Foundation.framework",
"IOKit.framework",
]
}
} }
if (is_chromeos) {
deps += [ static_library("test_support") {
"//chromeos", sources = [
"//dbus", "test_serial_io_handler.cc",
"test_serial_io_handler.h",
] ]
}
if (is_mac) { public_deps = [
libs = [ ":serial",
"Foundation.framework",
"IOKit.framework",
] ]
} }
} }
static_library("test_support") {
sources = [
"test_serial_io_handler.cc",
"test_serial_io_handler.h",
]
public_deps = [
":serial",
]
}
mojom("serial_mojo") { mojom("serial_mojo") {
visibility = [ visibility = [
":serial", ":serial",
"//extensions:extensions_renderer_resources_grit", "//extensions:extensions_renderer_resources_grit",
"//services/device/public/interfaces",
"//services/device/public/interfaces:interfaces_blink",
] ]
sources = [ sources = [
......
...@@ -18,8 +18,12 @@ source_set("serial") { ...@@ -18,8 +18,12 @@ source_set("serial") {
] ]
deps = [ deps = [
"//content/public/common",
"//device/serial", "//device/serial",
"//extensions/common/api", "//extensions/common/api",
"//mojo/public/cpp/bindings",
"//services/device/public/interfaces",
"//services/service_manager/public/cpp",
] ]
public_deps = [ public_deps = [
......
...@@ -11,10 +11,14 @@ ...@@ -11,10 +11,14 @@
#include "base/values.h" #include "base/values.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/common/service_manager_connection.h"
#include "device/serial/serial_device_enumerator.h" #include "device/serial/serial_device_enumerator.h"
#include "extensions/browser/api/serial/serial_connection.h" #include "extensions/browser/api/serial/serial_connection.h"
#include "extensions/browser/api/serial/serial_event_dispatcher.h" #include "extensions/browser/api/serial/serial_event_dispatcher.h"
#include "extensions/common/api/serial.h" #include "extensions/common/api/serial.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "services/device/public/interfaces/constants.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
using content::BrowserThread; using content::BrowserThread;
...@@ -76,21 +80,29 @@ void SerialAsyncApiFunction::RemoveSerialConnection(int api_resource_id) { ...@@ -76,21 +80,29 @@ void SerialAsyncApiFunction::RemoveSerialConnection(int api_resource_id) {
SerialGetDevicesFunction::SerialGetDevicesFunction() {} SerialGetDevicesFunction::SerialGetDevicesFunction() {}
bool SerialGetDevicesFunction::Prepare() { SerialGetDevicesFunction::~SerialGetDevicesFunction() {}
set_work_task_runner(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskPriority::BACKGROUND})); ExtensionFunction::ResponseAction SerialGetDevicesFunction::Run() {
return true; DCHECK_CURRENTLY_ON(BrowserThread::UI);
} DCHECK(content::ServiceManagerConnection::GetForProcess());
content::ServiceManagerConnection::GetForProcess()
void SerialGetDevicesFunction::Work() { ->GetConnector()
DCHECK(work_task_runner()->RunsTasksInCurrentSequence()); ->BindInterface(device::mojom::kServiceName,
mojo::MakeRequest(&enumerator_));
std::unique_ptr<device::SerialDeviceEnumerator> enumerator = enumerator_.set_connection_error_handler(
device::SerialDeviceEnumerator::Create(); base::BindOnce(&SerialGetDevicesFunction::OnGotDevices, this,
std::vector<device::mojom::SerialDeviceInfoPtr> devices = std::vector<device::mojom::SerialDeviceInfoPtr>()));
enumerator->GetDevices(); enumerator_->GetDevices(
results_ = serial::GetDevices::Results::Create( base::BindOnce(&SerialGetDevicesFunction::OnGotDevices, this));
mojo::ConvertTo<std::vector<serial::DeviceInfo>>(devices)); return RespondLater();
}
void SerialGetDevicesFunction::OnGotDevices(
std::vector<device::mojom::SerialDeviceInfoPtr> devices) {
std::unique_ptr<base::ListValue> results =
serial::GetDevices::Results::Create(
mojo::ConvertTo<std::vector<serial::DeviceInfo>>(devices));
Respond(ArgumentList(std::move(results)));
} }
SerialConnectFunction::SerialConnectFunction() {} SerialConnectFunction::SerialConnectFunction() {}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "extensions/browser/api/api_resource_manager.h" #include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/async_api_function.h" #include "extensions/browser/api/async_api_function.h"
#include "extensions/common/api/serial.h" #include "extensions/common/api/serial.h"
#include "services/device/public/interfaces/serial.mojom.h"
namespace extensions { namespace extensions {
...@@ -37,18 +38,24 @@ class SerialAsyncApiFunction : public AsyncApiFunction { ...@@ -37,18 +38,24 @@ class SerialAsyncApiFunction : public AsyncApiFunction {
ApiResourceManager<SerialConnection>* manager_; ApiResourceManager<SerialConnection>* manager_;
}; };
class SerialGetDevicesFunction : public SerialAsyncApiFunction { class SerialGetDevicesFunction : public UIThreadExtensionFunction {
public: public:
DECLARE_EXTENSION_FUNCTION("serial.getDevices", SERIAL_GETDEVICES) DECLARE_EXTENSION_FUNCTION("serial.getDevices", SERIAL_GETDEVICES)
SerialGetDevicesFunction(); SerialGetDevicesFunction();
protected: protected:
~SerialGetDevicesFunction() override {} ~SerialGetDevicesFunction() override;
// AsyncApiFunction: // ExtensionFunction:
bool Prepare() override; ResponseAction Run() override;
void Work() override;
private:
void OnGotDevices(std::vector<device::mojom::SerialDeviceInfoPtr> devices);
device::mojom::SerialDeviceEnumeratorPtr enumerator_;
DISALLOW_COPY_AND_ASSIGN(SerialGetDevicesFunction);
}; };
class SerialConnectFunction : public SerialAsyncApiFunction { class SerialConnectFunction : public SerialAsyncApiFunction {
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_apitest.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "device/serial/serial_device_enumerator.h"
#include "device/serial/test_serial_io_handler.h" #include "device/serial/test_serial_io_handler.h"
#include "extensions/browser/api/serial/serial_api.h" #include "extensions/browser/api/serial/serial_api.h"
#include "extensions/browser/api/serial/serial_connection.h" #include "extensions/browser/api/serial/serial_connection.h"
...@@ -18,6 +17,10 @@ ...@@ -18,6 +17,10 @@
#include "extensions/common/api/serial.h" #include "extensions/common/api/serial.h"
#include "extensions/common/switches.h" #include "extensions/common/switches.h"
#include "extensions/test/result_catcher.h" #include "extensions/test/result_catcher.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/device/public/interfaces/constants.mojom.h"
#include "services/device/public/interfaces/serial.mojom.h"
#include "services/service_manager/public/cpp/service_context.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
using testing::_; using testing::_;
...@@ -26,41 +29,26 @@ using testing::Return; ...@@ -26,41 +29,26 @@ using testing::Return;
namespace extensions { namespace extensions {
namespace { namespace {
class FakeSerialGetDevicesFunction : public AsyncExtensionFunction { class FakeSerialDeviceEnumerator
: public device::mojom::SerialDeviceEnumerator {
public: public:
bool RunAsync() override { FakeSerialDeviceEnumerator() = default;
std::unique_ptr<base::ListValue> devices(new base::ListValue()); ~FakeSerialDeviceEnumerator() override = default;
std::unique_ptr<base::DictionaryValue> device0(new base::DictionaryValue());
device0->SetString("path", "/dev/fakeserial");
std::unique_ptr<base::DictionaryValue> device1(new base::DictionaryValue());
device1->SetString("path", "\\\\COM800\\");
devices->Append(std::move(device0));
devices->Append(std::move(device1));
SetResult(std::move(devices));
SendResponse(true);
return true;
}
protected:
~FakeSerialGetDevicesFunction() override {}
};
class FakeSerialDeviceEnumerator : public device::SerialDeviceEnumerator {
public:
~FakeSerialDeviceEnumerator() override {}
std::vector<device::mojom::SerialDeviceInfoPtr> GetDevices() override { private:
// device::mojom::SerialDeviceEnumerator methods:
void GetDevices(GetDevicesCallback callback) override {
std::vector<device::mojom::SerialDeviceInfoPtr> devices; std::vector<device::mojom::SerialDeviceInfoPtr> devices;
device::mojom::SerialDeviceInfoPtr device0( auto device0 = device::mojom::SerialDeviceInfo::New();
device::mojom::SerialDeviceInfo::New());
device0->path = "/dev/fakeserialmojo"; device0->path = "/dev/fakeserialmojo";
device::mojom::SerialDeviceInfoPtr device1( auto device1 = device::mojom::SerialDeviceInfo::New();
device::mojom::SerialDeviceInfo::New());
device1->path = "\\\\COM800\\"; device1->path = "\\\\COM800\\";
devices.push_back(std::move(device0)); devices.push_back(std::move(device0));
devices.push_back(std::move(device1)); devices.push_back(std::move(device1));
return devices; std::move(callback).Run(std::move(devices));
} }
DISALLOW_COPY_AND_ASSIGN(FakeSerialDeviceEnumerator);
}; };
class FakeEchoSerialIoHandler : public device::TestSerialIoHandler { class FakeEchoSerialIoHandler : public device::TestSerialIoHandler {
...@@ -104,6 +92,19 @@ class FakeSerialConnectFunction : public api::SerialConnectFunction { ...@@ -104,6 +92,19 @@ class FakeSerialConnectFunction : public api::SerialConnectFunction {
~FakeSerialConnectFunction() override {} ~FakeSerialConnectFunction() override {}
}; };
void BindSerialDeviceEnumerator(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle handle,
const service_manager::BindSourceInfo& source_info) {
mojo::MakeStrongBinding(
base::MakeUnique<FakeSerialDeviceEnumerator>(),
device::mojom::SerialDeviceEnumeratorRequest(std::move(handle)));
}
void DropBindRequest(const std::string& interface_name,
mojo::ScopedMessagePipeHandle handle,
const service_manager::BindSourceInfo& source_info) {}
class SerialApiTest : public ExtensionApiTest { class SerialApiTest : public ExtensionApiTest {
public: public:
SerialApiTest() {} SerialApiTest() {}
...@@ -112,15 +113,23 @@ class SerialApiTest : public ExtensionApiTest { ...@@ -112,15 +113,23 @@ class SerialApiTest : public ExtensionApiTest {
ExtensionApiTest::SetUpCommandLine(command_line); ExtensionApiTest::SetUpCommandLine(command_line);
} }
void SetUpOnMainThread() override {
ExtensionApiTest::SetUpOnMainThread();
// Because Device Service also runs in this process(browser process), we can
// set our binder to intercept requests for SerialDeviceEnumerator interface
// to it.
service_manager::ServiceContext::SetGlobalBinderForTesting(
device::mojom::kServiceName,
device::mojom::SerialDeviceEnumerator::Name_,
base::Bind(&BindSerialDeviceEnumerator));
}
void TearDownOnMainThread() override { void TearDownOnMainThread() override {
ExtensionApiTest::TearDownOnMainThread(); ExtensionApiTest::TearDownOnMainThread();
} }
}; };
ExtensionFunction* FakeSerialGetDevicesFunctionFactory() {
return new FakeSerialGetDevicesFunction();
}
ExtensionFunction* FakeSerialConnectFunctionFactory() { ExtensionFunction* FakeSerialConnectFunctionFactory() {
return new FakeSerialConnectFunction(); return new FakeSerialConnectFunction();
} }
...@@ -158,8 +167,6 @@ IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialFakeHardware) { ...@@ -158,8 +167,6 @@ IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialFakeHardware) {
catcher.RestrictToBrowserContext(browser()->profile()); catcher.RestrictToBrowserContext(browser()->profile());
#if SIMULATE_SERIAL_PORTS #if SIMULATE_SERIAL_PORTS
ASSERT_TRUE(OverrideFunction("serial.getDevices",
FakeSerialGetDevicesFunctionFactory));
ASSERT_TRUE( ASSERT_TRUE(
OverrideFunction("serial.connect", FakeSerialConnectFunctionFactory)); OverrideFunction("serial.connect", FakeSerialConnectFunctionFactory));
#endif #endif
...@@ -174,4 +181,17 @@ IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialRealHardware) { ...@@ -174,4 +181,17 @@ IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialRealHardware) {
ASSERT_TRUE(RunExtensionTest("serial/real_hardware")) << message_; ASSERT_TRUE(RunExtensionTest("serial/real_hardware")) << message_;
} }
IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialRealHardwareFail) {
// Intercept the request and then drop it, chrome.serial.getDevices() should
// get an empty list.
service_manager::ServiceContext::SetGlobalBinderForTesting(
device::mojom::kServiceName, device::mojom::SerialDeviceEnumerator::Name_,
base::Bind(&DropBindRequest));
ResultCatcher catcher;
catcher.RestrictToBrowserContext(browser()->profile());
ASSERT_TRUE(RunExtensionTest("serial/real_hardware_fail")) << message_;
}
} // namespace extensions } // namespace extensions
...@@ -11,6 +11,8 @@ if (is_android) { ...@@ -11,6 +11,8 @@ if (is_android) {
import("//build/config/android/rules.gni") import("//build/config/android/rules.gni")
} }
is_serial_enabled_platform = is_win || (is_linux && use_udev) || is_mac
source_set("lib") { source_set("lib") {
# This should be visible only to embedders of the Device Service, and the # This should be visible only to embedders of the Device Service, and the
# dependence should only be for the purpose of embedding the Device Service. # dependence should only be for the purpose of embedding the Device Service.
...@@ -51,6 +53,10 @@ source_set("lib") { ...@@ -51,6 +53,10 @@ source_set("lib") {
"//services/device/vibration", "//services/device/vibration",
] ]
} }
if (is_serial_enabled_platform) {
deps += [ "//services/device/serial" ]
}
} }
is_linux_without_udev = is_linux && !use_udev is_linux_without_udev = is_linux && !use_udev
...@@ -119,6 +125,11 @@ source_set("tests") { ...@@ -119,6 +125,11 @@ source_set("tests") {
] ]
} }
if (is_serial_enabled_platform) {
sources += [ "serial/serial_device_enumerator_impl_unittest.cc" ]
deps += [ "//services/device/serial" ]
}
if (is_win) { if (is_win) {
# Needed for "generic_sensor/platform_sensor_and_provider_unittest_win.cc" # Needed for "generic_sensor/platform_sensor_and_provider_unittest_win.cc"
libs = [ libs = [
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "device/sensors/device_sensor_host.h" #include "device/sensors/device_sensor_host.h"
#include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/message_pipe.h"
#include "services/device/fingerprint/fingerprint.h" #include "services/device/fingerprint/fingerprint.h"
...@@ -19,6 +20,7 @@ ...@@ -19,6 +20,7 @@
#include "services/device/power_monitor/power_monitor_message_broadcaster.h" #include "services/device/power_monitor/power_monitor_message_broadcaster.h"
#include "services/device/public/cpp/device_features.h" #include "services/device/public/cpp/device_features.h"
#include "services/device/public/interfaces/battery_monitor.mojom.h" #include "services/device/public/interfaces/battery_monitor.mojom.h"
#include "services/device/serial/serial_device_enumerator_impl.h"
#include "services/device/time_zone_monitor/time_zone_monitor.h" #include "services/device/time_zone_monitor/time_zone_monitor.h"
#include "services/device/wake_lock/wake_lock_provider.h" #include "services/device/wake_lock/wake_lock_provider.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
...@@ -109,6 +111,9 @@ void DeviceService::OnStart() { ...@@ -109,6 +111,9 @@ void DeviceService::OnStart() {
&DeviceService::BindTimeZoneMonitorRequest, base::Unretained(this))); &DeviceService::BindTimeZoneMonitorRequest, base::Unretained(this)));
registry_.AddInterface<mojom::WakeLockProvider>(base::Bind( registry_.AddInterface<mojom::WakeLockProvider>(base::Bind(
&DeviceService::BindWakeLockProviderRequest, base::Unretained(this))); &DeviceService::BindWakeLockProviderRequest, base::Unretained(this)));
registry_.AddInterface<mojom::SerialDeviceEnumerator>(
base::Bind(&DeviceService::BindSerialDeviceEnumeratorRequest,
base::Unretained(this)));
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
registry_.AddInterface(GetJavaInterfaceProvider() registry_.AddInterface(GetJavaInterfaceProvider()
...@@ -248,6 +253,14 @@ void DeviceService::BindWakeLockProviderRequest( ...@@ -248,6 +253,14 @@ void DeviceService::BindWakeLockProviderRequest(
wake_lock_context_callback_); wake_lock_context_callback_);
} }
void DeviceService::BindSerialDeviceEnumeratorRequest(
mojom::SerialDeviceEnumeratorRequest request) {
#if (defined(OS_LINUX) && defined(USE_UDEV)) || defined(OS_WIN) || \
defined(OS_MACOSX)
SerialDeviceEnumeratorImpl::Create(std::move(request));
#endif
}
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
service_manager::InterfaceProvider* DeviceService::GetJavaInterfaceProvider() { service_manager::InterfaceProvider* DeviceService::GetJavaInterfaceProvider() {
if (!java_interface_provider_initialized_) { if (!java_interface_provider_initialized_) {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "services/device/public/interfaces/nfc_provider.mojom.h" #include "services/device/public/interfaces/nfc_provider.mojom.h"
#include "services/device/public/interfaces/power_monitor.mojom.h" #include "services/device/public/interfaces/power_monitor.mojom.h"
#include "services/device/public/interfaces/sensor_provider.mojom.h" #include "services/device/public/interfaces/sensor_provider.mojom.h"
#include "services/device/public/interfaces/serial.mojom.h"
#include "services/device/public/interfaces/time_zone_monitor.mojom.h" #include "services/device/public/interfaces/time_zone_monitor.mojom.h"
#include "services/device/public/interfaces/vibration_manager.mojom.h" #include "services/device/public/interfaces/vibration_manager.mojom.h"
#include "services/device/public/interfaces/wake_lock_provider.mojom.h" #include "services/device/public/interfaces/wake_lock_provider.mojom.h"
...@@ -97,6 +98,9 @@ class DeviceService : public service_manager::Service { ...@@ -97,6 +98,9 @@ class DeviceService : public service_manager::Service {
void BindWakeLockProviderRequest(mojom::WakeLockProviderRequest request); void BindWakeLockProviderRequest(mojom::WakeLockProviderRequest request);
void BindSerialDeviceEnumeratorRequest(
mojom::SerialDeviceEnumeratorRequest request);
std::unique_ptr<PowerMonitorMessageBroadcaster> std::unique_ptr<PowerMonitorMessageBroadcaster>
power_monitor_message_broadcaster_; power_monitor_message_broadcaster_;
std::unique_ptr<TimeZoneMonitor> time_zone_monitor_; std::unique_ptr<TimeZoneMonitor> time_zone_monitor_;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
"device::mojom::OrientationAbsoluteSensor", "device::mojom::OrientationAbsoluteSensor",
"device::mojom::OrientationSensor" "device::mojom::OrientationSensor"
], ],
"device:serial": [ "device::mojom::SerialDeviceEnumerator" ],
"device:time_zone_monitor": [ "device::mojom::TimeZoneMonitor" ], "device:time_zone_monitor": [ "device::mojom::TimeZoneMonitor" ],
"device:vibration": [ "device::mojom::VibrationManager" ], "device:vibration": [ "device::mojom::VibrationManager" ],
"device:wake_lock": [ "device::mojom::WakeLockProvider" ] "device:wake_lock": [ "device::mojom::WakeLockProvider" ]
......
...@@ -12,6 +12,7 @@ mojom("interfaces") { ...@@ -12,6 +12,7 @@ mojom("interfaces") {
"nfc.mojom", "nfc.mojom",
"nfc_provider.mojom", "nfc_provider.mojom",
"power_monitor.mojom", "power_monitor.mojom",
"serial.mojom",
"time_zone_monitor.mojom", "time_zone_monitor.mojom",
"vibration_manager.mojom", "vibration_manager.mojom",
"wake_lock.mojom", "wake_lock.mojom",
...@@ -23,6 +24,10 @@ mojom("interfaces") { ...@@ -23,6 +24,10 @@ mojom("interfaces") {
":constants", ":constants",
] ]
deps = [
"//device/serial:serial_mojo",
]
# TODO(crbug.com/699569): Convert to use the new JS bindings. # TODO(crbug.com/699569): Convert to use the new JS bindings.
js_bindings_mode = "both" js_bindings_mode = "both"
} }
......
// Copyright 2017 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.
module device.mojom;
import "device/serial/serial.mojom";
// Discovers and enumerates serial devices available to the host.
interface SerialDeviceEnumerator {
GetDevices() => (array<SerialDeviceInfo> devices);
};
# Copyright 2017 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.
import("//build/config/features.gni")
if (is_win || (is_linux && use_udev) || is_mac) {
source_set("serial") {
visibility = [
"//services/device:lib",
"//services/device:tests",
]
sources = [
"serial_device_enumerator_impl.cc",
"serial_device_enumerator_impl.h",
]
public_deps = [
"//services/device/public/interfaces",
]
deps = [
"//base",
"//device/serial",
"//mojo/public/cpp/bindings",
]
}
}
include_rules = [
"+device/serial",
]
// Copyright 2017 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 "services/device/serial/serial_device_enumerator_impl.h"
#include "base/memory/ptr_util.h"
#include "base/task_scheduler/post_task.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
namespace device {
namespace {
void CreateAndBindOnBlockableRunner(
mojom::SerialDeviceEnumeratorRequest request) {
mojo::MakeStrongBinding(base::MakeUnique<SerialDeviceEnumeratorImpl>(),
std::move(request));
}
} // namespace
// static
void SerialDeviceEnumeratorImpl::Create(
mojom::SerialDeviceEnumeratorRequest request) {
// SerialDeviceEnumeratorImpl must live on a thread that is allowed to do
// blocking IO.
scoped_refptr<base::SequencedTaskRunner> blockable_sequence_runner =
base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskPriority::BACKGROUND});
blockable_sequence_runner->PostTask(
FROM_HERE,
base::BindOnce(&CreateAndBindOnBlockableRunner, std::move(request)));
}
SerialDeviceEnumeratorImpl::SerialDeviceEnumeratorImpl()
: enumerator_(device::SerialDeviceEnumerator::Create()) {}
SerialDeviceEnumeratorImpl::~SerialDeviceEnumeratorImpl() = default;
void SerialDeviceEnumeratorImpl::GetDevices(GetDevicesCallback callback) {
DCHECK(enumerator_);
std::move(callback).Run(enumerator_->GetDevices());
}
} // namespace device
// Copyright 2017 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 SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_IMPL_H_
#define SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_IMPL_H_
#include <memory>
#include "base/macros.h"
#include "device/serial/serial_device_enumerator.h"
#include "services/device/public/interfaces/serial.mojom.h"
namespace device {
// TODO(leonhsl): Merge this class with SerialDeviceEnumerator if/once
// SerialDeviceEnumerator is exposed only via the Device Service.
// crbug.com/748505
class SerialDeviceEnumeratorImpl : public mojom::SerialDeviceEnumerator {
public:
static void Create(mojom::SerialDeviceEnumeratorRequest request);
SerialDeviceEnumeratorImpl();
~SerialDeviceEnumeratorImpl() override;
private:
// mojom::SerialDeviceEnumerator methods:
void GetDevices(GetDevicesCallback callback) override;
std::unique_ptr<device::SerialDeviceEnumerator> enumerator_;
DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorImpl);
};
} // namespace device
#endif // SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_IMPL_H_
// Copyright (c) 2017 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 "services/device/serial/serial_device_enumerator_impl.h"
#include "base/macros.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "services/device/device_service_test_base.h"
#include "services/device/public/interfaces/constants.mojom.h"
#include "services/device/public/interfaces/serial.mojom.h"
namespace device {
namespace {
class SerialDeviceEnumeratorImplTest : public DeviceServiceTestBase {
public:
SerialDeviceEnumeratorImplTest() = default;
~SerialDeviceEnumeratorImplTest() override = default;
protected:
void SetUp() override {
DeviceServiceTestBase::SetUp();
connector()->BindInterface(mojom::kServiceName, &enumerator_);
}
void TearDown() override { enumerator_.reset(); }
mojom::SerialDeviceEnumeratorPtr enumerator_;
DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorImplTest);
};
// This is to simply test that on Linux/Mac/Windows a client can connect to
// Device Service and bind the serial SerialDeviceEnumerator interface
// correctly.
// TODO(leonhsl): figure out how to add more robust tests.
TEST_F(SerialDeviceEnumeratorImplTest, SimpleConnectTest) {
enumerator_.FlushForTesting();
}
} // namespace
} // namespace device
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