diff options
author | reillyg <reillyg@chromium.org> | 2015-09-17 19:52:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-18 02:52:47 +0000 |
commit | 98624c769a5268117f4336a46d68c1e5bd5050bd (patch) | |
tree | 23e7044ef0c1aff2a41c383d494639d86fe0551e /extensions/browser | |
parent | 717e49ce3d4eb2949bd1568011de98003667fd07 (diff) | |
download | chromium_src-98624c769a5268117f4336a46d68c1e5bd5050bd.zip chromium_src-98624c769a5268117f4336a46d68c1e5bd5050bd.tar.gz chromium_src-98624c769a5268117f4336a46d68c1e5bd5050bd.tar.bz2 |
Add chrome.usb.getConfigurations function.
Add a new extension function that returns all of the configuration
descriptors from the provided USB device. In addition to exposing this
useful information to applications (as otherwise they would need to call
chrome.usb.setConfiguration blindly to set a non-default configuration)
it is also now available without having to call chrome.usb.openDevice
first.
BUG=531586
Review URL: https://codereview.chromium.org/1357523005
Cr-Commit-Position: refs/heads/master@{#349592}
Diffstat (limited to 'extensions/browser')
-rw-r--r-- | extensions/browser/api/usb/usb_api.cc | 47 | ||||
-rw-r--r-- | extensions/browser/api/usb/usb_api.h | 15 | ||||
-rw-r--r-- | extensions/browser/api/usb/usb_apitest.cc | 13 | ||||
-rw-r--r-- | extensions/browser/extension_function_histogram_value.h | 1 |
4 files changed, 74 insertions, 2 deletions
diff --git a/extensions/browser/api/usb/usb_api.cc b/extensions/browser/api/usb/usb_api.cc index f45ef43..6979868 100644 --- a/extensions/browser/api/usb/usb_api.cc +++ b/extensions/browser/api/usb/usb_api.cc @@ -29,6 +29,7 @@ namespace ClaimInterface = usb::ClaimInterface; namespace CloseDevice = usb::CloseDevice; namespace ControlTransfer = usb::ControlTransfer; namespace FindDevices = usb::FindDevices; +namespace GetConfigurations = usb::GetConfigurations; namespace GetDevices = usb::GetDevices; namespace GetUserSelectedDevices = usb::GetUserSelectedDevices; namespace InterruptTransfer = usb::InterruptTransfer; @@ -644,6 +645,51 @@ void UsbGetUserSelectedDevicesFunction::OnDevicesChosen( Respond(OneArgument(result.Pass())); } +UsbGetConfigurationsFunction::UsbGetConfigurationsFunction() {} + +UsbGetConfigurationsFunction::~UsbGetConfigurationsFunction() {} + +ExtensionFunction::ResponseAction UsbGetConfigurationsFunction::Run() { + scoped_ptr<extensions::api::usb::GetConfigurations::Params> parameters = + GetConfigurations::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(parameters.get()); + + UsbService* service = device::DeviceClient::Get()->GetUsbService(); + if (!service) { + return RespondNow(Error(kErrorInitService)); + } + + std::string guid; + if (!UsbGuidMap::Get(browser_context()) + ->GetGuidFromId(parameters->device.device, &guid)) { + return RespondNow(Error(kErrorNoDevice)); + } + + scoped_refptr<UsbDevice> device = service->GetDevice(guid); + if (!device.get()) { + return RespondNow(Error(kErrorNoDevice)); + } + + if (!HasDevicePermission(device)) { + // This function must act as if there is no such device. Otherwise it can be + // used to fingerprint unauthorized devices. + return RespondNow(Error(kErrorNoDevice)); + } + + scoped_ptr<base::ListValue> configs(new base::ListValue()); + const UsbConfigDescriptor* active_config = device->GetActiveConfiguration(); + for (const UsbConfigDescriptor& config : device->configurations()) { + ConfigDescriptor api_config; + ConvertConfigDescriptor(config, &api_config); + if (active_config && + config.configuration_value == active_config->configuration_value) { + api_config.active = true; + } + configs->Append(api_config.ToValue()); + } + return RespondNow(OneArgument(configs.Pass())); +} + UsbRequestAccessFunction::UsbRequestAccessFunction() { } @@ -764,6 +810,7 @@ ExtensionFunction::ResponseAction UsbGetConfigurationFunction::Run() { if (config_descriptor) { ConfigDescriptor config; ConvertConfigDescriptor(*config_descriptor, &config); + config.active = true; return RespondNow(OneArgument(config.ToValue())); } else { return RespondNow(Error(kErrorNotConfigured)); diff --git a/extensions/browser/api/usb/usb_api.h b/extensions/browser/api/usb/usb_api.h index be56a51..abc5c89 100644 --- a/extensions/browser/api/usb/usb_api.h +++ b/extensions/browser/api/usb/usb_api.h @@ -126,6 +126,21 @@ class UsbGetUserSelectedDevicesFunction : public UIThreadExtensionFunction { DISALLOW_COPY_AND_ASSIGN(UsbGetUserSelectedDevicesFunction); }; +class UsbGetConfigurationsFunction : public UsbPermissionCheckingFunction { + public: + DECLARE_EXTENSION_FUNCTION("usb.getConfigurations", USB_GETCONFIGURATIONS); + + UsbGetConfigurationsFunction(); + + private: + ~UsbGetConfigurationsFunction() override; + + // ExtensionFunction: + ResponseAction Run() override; + + DISALLOW_COPY_AND_ASSIGN(UsbGetConfigurationsFunction); +}; + class UsbRequestAccessFunction : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("usb.requestAccess", USB_REQUESTACCESS) diff --git a/extensions/browser/api/usb/usb_apitest.cc b/extensions/browser/api/usb/usb_apitest.cc index debe02b..7b654c7 100644 --- a/extensions/browser/api/usb/usb_apitest.cc +++ b/extensions/browser/api/usb/usb_apitest.cc @@ -98,8 +98,15 @@ class UsbApiTest : public ShellApiTest { void SetUpOnMainThread() override { ShellApiTest::SetUpOnMainThread(); - mock_device_ = - new MockUsbDevice(0, 0, "Test Manufacturer", "Test Device", "ABC123"); + std::vector<UsbConfigDescriptor> configs; + UsbConfigDescriptor config; + config.configuration_value = 1; + configs.push_back(config); + config.configuration_value = 2; + configs.push_back(config); + + mock_device_ = new MockUsbDevice(0, 0, "Test Manufacturer", "Test Device", + "ABC123", configs); mock_device_handle_ = new MockUsbDeviceHandle(mock_device_.get()); EXPECT_CALL(*mock_device_.get(), Open(_)) .WillRepeatedly(InvokeCallback<0>(mock_device_handle_)); @@ -116,6 +123,8 @@ class UsbApiTest : public ShellApiTest { } // namespace IN_PROC_BROWSER_TEST_F(UsbApiTest, DeviceHandling) { + EXPECT_CALL(*mock_device_.get(), GetActiveConfiguration()) + .WillOnce(Return(&mock_device_->configurations()[0])); EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(2); ASSERT_TRUE(RunAppTest("api_test/usb/device_handling")); } diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index fcaba05..87b7504 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h @@ -1143,6 +1143,7 @@ enum HistogramValue { BLUETOOTHPRIVATE_PAIR, EASYUNLOCKPRIVATE_FINDSETUPCONNECTION, RESOURCESPRIVATE_GETSTRINGS, + USB_GETCONFIGURATIONS, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY |