summaryrefslogtreecommitdiffstats
path: root/extensions/browser
diff options
context:
space:
mode:
authorreillyg <reillyg@chromium.org>2015-09-17 19:52:02 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-18 02:52:47 +0000
commit98624c769a5268117f4336a46d68c1e5bd5050bd (patch)
tree23e7044ef0c1aff2a41c383d494639d86fe0551e /extensions/browser
parent717e49ce3d4eb2949bd1568011de98003667fd07 (diff)
downloadchromium_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.cc47
-rw-r--r--extensions/browser/api/usb/usb_api.h15
-rw-r--r--extensions/browser/api/usb/usb_apitest.cc13
-rw-r--r--extensions/browser/extension_function_histogram_value.h1
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