summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/android/chrome_jni_registrar.cc2
-rw-r--r--chrome/browser/android/usb/web_usb_chooser_service_android.cc33
-rw-r--r--chrome/browser/android/usb/web_usb_chooser_service_android.h47
-rw-r--r--chrome/browser/chrome_content_browser_client.cc9
-rw-r--r--chrome/browser/ui/android/bluetooth_chooser_android.cc1
-rw-r--r--chrome/browser/ui/android/usb_chooser_dialog_android.cc226
-rw-r--r--chrome/browser/ui/android/usb_chooser_dialog_android.h87
-rw-r--r--chrome/browser/usb/usb_chooser_bubble_controller.cc71
-rw-r--r--chrome/browser/usb/usb_tab_helper.cc19
-rw-r--r--chrome/browser/usb/usb_tab_helper.h4
-rw-r--r--chrome/browser/usb/web_usb_histograms.cc12
-rw-r--r--chrome/browser/usb/web_usb_histograms.h29
12 files changed, 462 insertions, 78 deletions
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index 3278139..a67dd52 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -157,6 +157,7 @@
#include "chrome/browser/ui/android/tab_model/single_tab_model.h"
#include "chrome/browser/ui/android/tab_model/tab_model_jni_bridge.h"
#include "chrome/browser/ui/android/toolbar/toolbar_model_android.h"
+#include "chrome/browser/ui/android/usb_chooser_dialog_android.h"
#include "chrome/browser/ui/android/website_settings_popup_android.h"
#include "components/bookmarks/common/android/component_jni_registrar.h"
#include "components/dom_distiller/android/component_jni_registrar.h"
@@ -375,6 +376,7 @@ static base::android::RegistrationMethod kChromeRegisteredMethods[] = {
{"UmaSessionStats", RegisterUmaSessionStats},
{"UpdatePasswordInfoBar", UpdatePasswordInfoBar::Register},
{"UrlUtilities", RegisterUrlUtilities},
+ {"UsbChooserDialogAndroid", UsbChooserDialogAndroid::Register},
{"Variations", variations::android::RegisterVariations},
{"VariationsSeedBridge", variations::android::RegisterVariationsSeedBridge},
{"VariationsSession", chrome::android::RegisterVariationsSession},
diff --git a/chrome/browser/android/usb/web_usb_chooser_service_android.cc b/chrome/browser/android/usb/web_usb_chooser_service_android.cc
new file mode 100644
index 0000000..d31b7b0
--- /dev/null
+++ b/chrome/browser/android/usb/web_usb_chooser_service_android.cc
@@ -0,0 +1,33 @@
+// Copyright 2016 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/android/usb/web_usb_chooser_service_android.h"
+
+#include <utility>
+
+#include "chrome/browser/ui/android/usb_chooser_dialog_android.h"
+#include "content/public/browser/browser_thread.h"
+
+WebUsbChooserServiceAndroid::WebUsbChooserServiceAndroid(
+ content::RenderFrameHost* render_frame_host)
+ : render_frame_host_(render_frame_host) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ DCHECK(render_frame_host_);
+}
+
+WebUsbChooserServiceAndroid::~WebUsbChooserServiceAndroid() {}
+
+void WebUsbChooserServiceAndroid::GetPermission(
+ mojo::Array<device::usb::DeviceFilterPtr> device_filters,
+ const GetPermissionCallback& callback) {
+ usb_chooser_dialog_android_.push_back(
+ make_scoped_ptr(new UsbChooserDialogAndroid(
+ std::move(device_filters), render_frame_host_, callback)));
+}
+
+void WebUsbChooserServiceAndroid::Bind(
+ mojo::InterfaceRequest<device::usb::ChooserService> request) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ bindings_.AddBinding(this, std::move(request));
+}
diff --git a/chrome/browser/android/usb/web_usb_chooser_service_android.h b/chrome/browser/android/usb/web_usb_chooser_service_android.h
new file mode 100644
index 0000000..d83345a
--- /dev/null
+++ b/chrome/browser/android/usb/web_usb_chooser_service_android.h
@@ -0,0 +1,47 @@
+// Copyright 2015 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_ANDROID_USB_WEB_USB_CHOOSER_SERVICE_ANDROID_H_
+#define CHROME_BROWSER_ANDROID_USB_WEB_USB_CHOOSER_SERVICE_ANDROID_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "device/usb/public/interfaces/chooser_service.mojom.h"
+#include "mojo/public/cpp/bindings/array.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+
+class UsbChooserDialogAndroid;
+
+namespace content {
+class RenderFrameHost;
+}
+
+// Implementation of the public device::usb::ChooserService interface.
+// This interface can be used by a webpage to request permission from user
+// to access a certain device.
+class WebUsbChooserServiceAndroid : public device::usb::ChooserService {
+ public:
+ explicit WebUsbChooserServiceAndroid(
+ content::RenderFrameHost* render_frame_host);
+
+ ~WebUsbChooserServiceAndroid() override;
+
+ // device::usb::ChooserService:
+ void GetPermission(mojo::Array<device::usb::DeviceFilterPtr> device_filters,
+ const GetPermissionCallback& callback) override;
+
+ void Bind(mojo::InterfaceRequest<device::usb::ChooserService> request);
+
+ private:
+ content::RenderFrameHost* const render_frame_host_;
+ mojo::BindingSet<device::usb::ChooserService> bindings_;
+ std::vector<scoped_ptr<UsbChooserDialogAndroid>> usb_chooser_dialog_android_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebUsbChooserServiceAndroid);
+};
+
+#endif // CHROME_BROWSER_ANDROID_USB_WEB_USB_CHOOSER_SERVICE_ANDROID_H_
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index a98e46b..8fd472b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -155,6 +155,7 @@
#include "content/public/common/service_registry.h"
#include "content/public/common/url_utils.h"
#include "content/public/common/web_preferences.h"
+#include "device/usb/public/interfaces/chooser_service.mojom.h"
#include "device/usb/public/interfaces/device_manager.mojom.h"
#include "gin/v8_initializer.h"
#include "mojo/shell/public/cpp/shell_client.h"
@@ -294,10 +295,6 @@
#include "chrome/browser/media/router/presentation_service_delegate_impl.h"
#endif
-#if !defined(OS_ANDROID)
-#include "device/usb/public/interfaces/chooser_service.mojom.h"
-#endif
-
#if defined(ENABLE_WAYLAND_SERVER)
#include "chrome/browser/chrome_browser_main_extra_parts_exo.h"
#endif
@@ -694,7 +691,6 @@ void CreateUsbDeviceManager(
tab_helper->CreateDeviceManager(render_frame_host, std::move(request));
}
-#if !defined(OS_ANDROID)
void CreateWebUsbChooserService(
RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::ChooserService> request) {
@@ -709,7 +705,6 @@ void CreateWebUsbChooserService(
UsbTabHelper::GetOrCreateForWebContents(web_contents);
tab_helper->CreateChooserService(render_frame_host, std::move(request));
}
-#endif // !defined(OS_ANDROID)
bool GetDataSaverEnabledPref(const PrefService* prefs) {
// Enable data saver only when data saver pref is enabled and not part of
@@ -2808,10 +2803,8 @@ void ChromeContentBrowserClient::RegisterRenderFrameMojoServices(
base::FeatureList::IsEnabled(features::kWebUsb)) {
registry->AddService(
base::Bind(&CreateUsbDeviceManager, render_frame_host));
-#if !defined(OS_ANDROID)
registry->AddService(
base::Bind(&CreateWebUsbChooserService, render_frame_host));
-#endif // !defined(OS_ANDROID)
}
}
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.cc b/chrome/browser/ui/android/bluetooth_chooser_android.cc
index a24ef89..6f4ce8b 100644
--- a/chrome/browser/ui/android/bluetooth_chooser_android.cc
+++ b/chrome/browser/ui/android/bluetooth_chooser_android.cc
@@ -9,7 +9,6 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ssl/chrome_security_state_model_client.h"
-#include "chrome/browser/ui/android/view_android_helper.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/android/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
new file mode 100644
index 0000000..10ef6d3
--- /dev/null
+++ b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
@@ -0,0 +1,226 @@
+// Copyright 2016 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/ui/android/usb_chooser_dialog_android.h"
+
+#include <stddef.h>
+
+#include <algorithm>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ssl/chrome_security_state_model_client.h"
+#include "chrome/browser/usb/usb_chooser_context.h"
+#include "chrome/browser/usb/usb_chooser_context_factory.h"
+#include "chrome/browser/usb/web_usb_histograms.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "components/prefs/pref_service.h"
+#include "components/url_formatter/elide_url.h"
+#include "content/public/browser/android/content_view_core.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "device/core/device_client.h"
+#include "device/usb/mojo/type_converters.h"
+#include "device/usb/usb_device.h"
+#include "device/usb/usb_device_filter.h"
+#include "device/usb/webusb_descriptors.h"
+#include "jni/UsbChooserDialog_jni.h"
+#include "ui/android/window_android.h"
+#include "url/gurl.h"
+
+UsbChooserDialogAndroid::UsbChooserDialogAndroid(
+ mojo::Array<device::usb::DeviceFilterPtr> device_filters,
+ content::RenderFrameHost* render_frame_host,
+ const device::usb::ChooserService::GetPermissionCallback& callback)
+ : render_frame_host_(render_frame_host),
+ callback_(callback),
+ usb_service_observer_(this),
+ weak_factory_(this) {
+ device::UsbService* usb_service =
+ device::DeviceClient::Get()->GetUsbService();
+ if (!usb_service)
+ return;
+
+ if (!usb_service_observer_.IsObserving(usb_service))
+ usb_service_observer_.Add(usb_service);
+
+ if (!device_filters.is_null())
+ filters_ = device_filters.To<std::vector<device::UsbDeviceFilter>>();
+
+ // Create (and show) the UsbChooser dialog.
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderFrameHost(render_frame_host_);
+ base::android::ScopedJavaLocalRef<jobject> window_android =
+ content::ContentViewCore::FromWebContents(web_contents)
+ ->GetWindowAndroid()
+ ->GetJavaObject();
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents->GetBrowserContext());
+ std::string languages =
+ profile->GetPrefs()->GetString(prefs::kAcceptLanguages);
+ base::android::ScopedJavaLocalRef<jstring> origin_string =
+ base::android::ConvertUTF16ToJavaString(
+ env, url_formatter::FormatUrlForSecurityDisplay(
+ render_frame_host->GetLastCommittedURL(), languages));
+ ChromeSecurityStateModelClient* security_model_client =
+ ChromeSecurityStateModelClient::FromWebContents(web_contents);
+ DCHECK(security_model_client);
+ java_dialog_.Reset(Java_UsbChooserDialog_create(
+ env, window_android.obj(), origin_string.obj(),
+ security_model_client->GetSecurityInfo().security_level,
+ reinterpret_cast<intptr_t>(this)));
+
+ if (!java_dialog_.is_null()) {
+ usb_service->GetDevices(
+ base::Bind(&UsbChooserDialogAndroid::GotUsbDeviceList,
+ weak_factory_.GetWeakPtr()));
+ }
+}
+
+UsbChooserDialogAndroid::~UsbChooserDialogAndroid() {
+ if (!callback_.is_null())
+ callback_.Run(nullptr);
+
+ if (!java_dialog_.is_null()) {
+ Java_UsbChooserDialog_closeDialog(base::android::AttachCurrentThread(),
+ java_dialog_.obj());
+ }
+}
+
+void UsbChooserDialogAndroid::OnDeviceAdded(
+ scoped_refptr<device::UsbDevice> device) {
+ if (device::UsbDeviceFilter::MatchesAny(device, filters_) &&
+ FindInWebUsbAllowedOrigins(
+ device->webusb_allowed_origins(),
+ render_frame_host_->GetLastCommittedURL().GetOrigin())) {
+ AddDeviceToChooserDialog(device);
+ devices_.push_back(device);
+ }
+}
+
+void UsbChooserDialogAndroid::OnDeviceRemoved(
+ scoped_refptr<device::UsbDevice> device) {
+ auto it = std::find(devices_.begin(), devices_.end(), device);
+ if (it != devices_.end()) {
+ RemoveDeviceFromChooserDialog(device);
+ devices_.erase(it);
+ }
+}
+
+void UsbChooserDialogAndroid::Select(const std::string& guid) {
+ for (size_t i = 0; i < devices_.size(); ++i) {
+ if (devices_[i]->guid() == guid) {
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderFrameHost(render_frame_host_);
+ GURL embedding_origin =
+ web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin();
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents->GetBrowserContext());
+ UsbChooserContext* chooser_context =
+ UsbChooserContextFactory::GetForProfile(profile);
+ chooser_context->GrantDevicePermission(
+ render_frame_host_->GetLastCommittedURL().GetOrigin(),
+ embedding_origin, devices_[i]->guid());
+ device::usb::DeviceInfoPtr device_info_ptr =
+ device::usb::DeviceInfo::From(*devices_[i]);
+ callback_.Run(std::move(device_info_ptr));
+ callback_.reset(); // Reset |callback_| so that it is only run once.
+ Java_UsbChooserDialog_closeDialog(base::android::AttachCurrentThread(),
+ java_dialog_.obj());
+
+ RecordWebUsbChooserClosure(
+ devices_[i]->serial_number().empty()
+ ? WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED
+ : WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED);
+ }
+ }
+}
+
+void UsbChooserDialogAndroid::Cancel() {
+ callback_.Run(nullptr);
+ callback_.reset(); // Reset |callback_| so that it is only run once.
+ Java_UsbChooserDialog_closeDialog(base::android::AttachCurrentThread(),
+ java_dialog_.obj());
+
+ RecordWebUsbChooserClosure(devices_.size() == 0
+ ? WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES
+ : WEBUSB_CHOOSER_CLOSED_CANCELLED);
+}
+
+void UsbChooserDialogAndroid::OnItemSelected(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jstring>& device_id) {
+ Select(base::android::ConvertJavaStringToUTF8(env, device_id));
+}
+
+void UsbChooserDialogAndroid::OnDialogCancelled(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj) {
+ Cancel();
+}
+
+void UsbChooserDialogAndroid::LoadUsbHelpPage(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj) {
+ OpenUrl(chrome::kChooserUsbOverviewURL);
+}
+
+// Get a list of devices that can be shown in the chooser bubble UI for
+// user to grant permsssion.
+void UsbChooserDialogAndroid::GotUsbDeviceList(
+ const std::vector<scoped_refptr<device::UsbDevice>>& devices) {
+ for (const auto& device : devices) {
+ if (device::UsbDeviceFilter::MatchesAny(device, filters_) &&
+ FindInWebUsbAllowedOrigins(
+ device->webusb_allowed_origins(),
+ render_frame_host_->GetLastCommittedURL().GetOrigin())) {
+ AddDeviceToChooserDialog(device);
+ devices_.push_back(device);
+ }
+ }
+
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_UsbChooserDialog_setIdleState(env, java_dialog_.obj());
+}
+
+void UsbChooserDialogAndroid::AddDeviceToChooserDialog(
+ scoped_refptr<device::UsbDevice> device) const {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jstring> device_guid =
+ base::android::ConvertUTF8ToJavaString(env, device->guid());
+ base::android::ScopedJavaLocalRef<jstring> device_name =
+ base::android::ConvertUTF16ToJavaString(env, device->product_string());
+ Java_UsbChooserDialog_addDevice(env, java_dialog_.obj(), device_guid.obj(),
+ device_name.obj());
+}
+
+void UsbChooserDialogAndroid::RemoveDeviceFromChooserDialog(
+ scoped_refptr<device::UsbDevice> device) const {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jstring> device_guid =
+ base::android::ConvertUTF8ToJavaString(env, device->guid());
+ base::android::ScopedJavaLocalRef<jstring> device_name =
+ base::android::ConvertUTF16ToJavaString(env, device->product_string());
+ Java_UsbChooserDialog_removeDevice(env, java_dialog_.obj(), device_guid.obj(),
+ device_name.obj());
+}
+
+void UsbChooserDialogAndroid::OpenUrl(const std::string& url) {
+ content::WebContents::FromRenderFrameHost(render_frame_host_)
+ ->OpenURL(content::OpenURLParams(GURL(url), content::Referrer(),
+ NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
+ false)); // is_renderer_initiated
+}
+
+// static
+bool UsbChooserDialogAndroid::Register(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
diff --git a/chrome/browser/ui/android/usb_chooser_dialog_android.h b/chrome/browser/ui/android/usb_chooser_dialog_android.h
new file mode 100644
index 0000000..1b244df
--- /dev/null
+++ b/chrome/browser/ui/android/usb_chooser_dialog_android.h
@@ -0,0 +1,87 @@
+// Copyright 2016 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_UI_ANDROID_USB_CHOOSER_DIALOG_ANDROID_H_
+#define CHROME_BROWSER_UI_ANDROID_USB_CHOOSER_DIALOG_ANDROID_H_
+
+#include <string>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "base/strings/string16.h"
+#include "device/usb/public/interfaces/chooser_service.mojom.h"
+#include "device/usb/usb_service.h"
+#include "mojo/public/cpp/bindings/array.h"
+
+namespace content {
+class RenderFrameHost;
+class WebContents;
+}
+
+namespace device {
+class UsbDevice;
+class UsbDeviceFilter;
+}
+
+// Represents a way to ask the user to select a USB device from a list of
+// options.
+class UsbChooserDialogAndroid : public device::UsbService::Observer {
+ public:
+ UsbChooserDialogAndroid(
+ mojo::Array<device::usb::DeviceFilterPtr> device_filters,
+ content::RenderFrameHost* render_frame_host,
+ const device::usb::ChooserService::GetPermissionCallback& callback);
+ ~UsbChooserDialogAndroid() override;
+
+ // device::UsbService::Observer:
+ void OnDeviceAdded(scoped_refptr<device::UsbDevice> device) override;
+ void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override;
+
+ // Report the dialog's result.
+ void OnItemSelected(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jstring>& device_id);
+ void OnDialogCancelled(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
+ void LoadUsbHelpPage(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
+ static bool Register(JNIEnv* env);
+
+ private:
+ void GotUsbDeviceList(
+ const std::vector<scoped_refptr<device::UsbDevice>>& devices);
+
+ // Called when the user selects the USB device with |guid| from the chooser
+ // dialog.
+ void Select(const std::string& guid);
+ // Called when the chooser dialog is closed.
+ void Cancel();
+
+ void AddDeviceToChooserDialog(scoped_refptr<device::UsbDevice> device) const;
+ void RemoveDeviceFromChooserDialog(
+ scoped_refptr<device::UsbDevice> device) const;
+
+ void OpenUrl(const std::string& url);
+
+ content::RenderFrameHost* const render_frame_host_;
+ device::usb::ChooserService::GetPermissionCallback callback_;
+ ScopedObserver<device::UsbService, device::UsbService::Observer>
+ usb_service_observer_;
+ std::vector<device::UsbDeviceFilter> filters_;
+
+ std::vector<scoped_refptr<device::UsbDevice>> devices_;
+
+ base::android::ScopedJavaGlobalRef<jobject> java_dialog_;
+ base::WeakPtrFactory<UsbChooserDialogAndroid> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(UsbChooserDialogAndroid);
+};
+
+#endif // CHROME_BROWSER_UI_ANDROID_USB_CHOOSER_DIALOG_ANDROID_H_
diff --git a/chrome/browser/usb/usb_chooser_bubble_controller.cc b/chrome/browser/usb/usb_chooser_bubble_controller.cc
index 8d2b3f6..23d6f52 100644
--- a/chrome/browser/usb/usb_chooser_bubble_controller.cc
+++ b/chrome/browser/usb/usb_chooser_bubble_controller.cc
@@ -8,11 +8,10 @@
#include <utility>
#include "base/bind.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/stl_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/usb/usb_chooser_context.h"
#include "chrome/browser/usb/usb_chooser_context_factory.h"
+#include "chrome/browser/usb/web_usb_histograms.h"
#include "chrome/common/url_constants.h"
#include "components/bubble/bubble_controller.h"
#include "content/public/browser/render_frame_host.h"
@@ -21,58 +20,9 @@
#include "device/usb/mojo/type_converters.h"
#include "device/usb/usb_device.h"
#include "device/usb/usb_device_filter.h"
+#include "device/usb/webusb_descriptors.h"
#include "url/gurl.h"
-namespace {
-
-// Reasons the chooser may be closed. These are used in histograms so do not
-// remove/reorder entries. Only add at the end just before
-// WEBUSB_CHOOSER_CLOSED_MAX. Also remember to update the enum listing in
-// tools/metrics/histograms/histograms.xml.
-enum WebUsbChooserClosed {
- // The user cancelled the permission prompt without selecting a device.
- WEBUSB_CHOOSER_CLOSED_CANCELLED = 0,
- // The user probably cancelled the permission prompt without selecting a
- // device because there were no devices to select.
- WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES,
- // The user granted permission to access a device.
- WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED,
- // The user granted permission to access a device but that permission will be
- // revoked when the device is disconnected.
- WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED,
- // Maximum value for the enum.
- WEBUSB_CHOOSER_CLOSED_MAX
-};
-
-void RecordChooserClosure(WebUsbChooserClosed disposition) {
- UMA_HISTOGRAM_ENUMERATION("WebUsb.ChooserClosed", disposition,
- WEBUSB_CHOOSER_CLOSED_MAX);
-}
-
-// Check if the origin is allowed.
-bool FindInAllowedOrigins(const device::WebUsbAllowedOrigins* allowed_origins,
- const GURL& origin) {
- if (!allowed_origins)
- return false;
-
- if (ContainsValue(allowed_origins->origins, origin))
- return true;
-
- for (const auto& config : allowed_origins->configurations) {
- if (ContainsValue(config.origins, origin))
- return true;
-
- for (const auto& function : config.functions) {
- if (ContainsValue(function.origins, origin))
- return true;
- }
- }
-
- return false;
-}
-
-} // namespace
-
UsbChooserBubbleController::UsbChooserBubbleController(
content::RenderFrameHost* owner,
mojo::Array<device::usb::DeviceFilterPtr> device_filters,
@@ -133,18 +83,19 @@ void UsbChooserBubbleController::Select(size_t index) {
callback_.Run(std::move(device_info_ptr));
callback_.reset(); // Reset |callback_| so that it is only run once.
- RecordChooserClosure(devices_[index].first->serial_number().empty()
- ? WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED
- : WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED);
+ RecordWebUsbChooserClosure(
+ devices_[index].first->serial_number().empty()
+ ? WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED
+ : WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED);
if (bubble_reference_)
bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED);
}
void UsbChooserBubbleController::Cancel() {
- RecordChooserClosure(devices_.size() == 0
- ? WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES
- : WEBUSB_CHOOSER_CLOSED_CANCELLED);
+ RecordWebUsbChooserClosure(devices_.size() == 0
+ ? WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES
+ : WEBUSB_CHOOSER_CLOSED_CANCELLED);
if (bubble_reference_)
bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED);
@@ -155,7 +106,7 @@ void UsbChooserBubbleController::Close() {}
void UsbChooserBubbleController::OnDeviceAdded(
scoped_refptr<device::UsbDevice> device) {
if (device::UsbDeviceFilter::MatchesAny(device, filters_) &&
- FindInAllowedOrigins(
+ FindInWebUsbAllowedOrigins(
device->webusb_allowed_origins(),
render_frame_host_->GetLastCommittedURL().GetOrigin())) {
devices_.push_back(std::make_pair(device, device->product_string()));
@@ -187,7 +138,7 @@ void UsbChooserBubbleController::GotUsbDeviceList(
const std::vector<scoped_refptr<device::UsbDevice>>& devices) {
for (const auto& device : devices) {
if (device::UsbDeviceFilter::MatchesAny(device, filters_) &&
- FindInAllowedOrigins(
+ FindInWebUsbAllowedOrigins(
device->webusb_allowed_origins(),
render_frame_host_->GetLastCommittedURL().GetOrigin())) {
devices_.push_back(std::make_pair(device, device->product_string()));
diff --git a/chrome/browser/usb/usb_tab_helper.cc b/chrome/browser/usb/usb_tab_helper.cc
index a0f0998..0f7f989 100644
--- a/chrome/browser/usb/usb_tab_helper.cc
+++ b/chrome/browser/usb/usb_tab_helper.cc
@@ -7,10 +7,15 @@
#include <utility>
#include "base/memory/scoped_ptr.h"
-#include "chrome/browser/usb/web_usb_chooser_service.h"
#include "chrome/browser/usb/web_usb_permission_provider.h"
#include "device/usb/mojo/device_manager_impl.h"
+#if defined(OS_ANDROID)
+#include "chrome/browser/android/usb/web_usb_chooser_service_android.h"
+#else
+#include "chrome/browser/usb/web_usb_chooser_service.h"
+#endif // defined(OS_ANDROID)
+
using content::RenderFrameHost;
using content::WebContents;
@@ -18,7 +23,11 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(UsbTabHelper);
struct FrameUsbServices {
scoped_ptr<WebUSBPermissionProvider> permission_provider;
+#if defined(OS_ANDROID)
+ scoped_ptr<WebUsbChooserServiceAndroid> chooser_service;
+#else
scoped_ptr<WebUsbChooserService> chooser_service;
+#endif // defined(OS_ANDROID)
};
// static
@@ -42,13 +51,11 @@ void UsbTabHelper::CreateDeviceManager(
GetPermissionProvider(render_frame_host), std::move(request));
}
-#if !defined(OS_ANDROID)
void UsbTabHelper::CreateChooserService(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::ChooserService> request) {
GetChooserService(render_frame_host, std::move(request));
}
-#endif // !defined(OS_ANDROID)
UsbTabHelper::UsbTabHelper(WebContents* web_contents)
: content::WebContentsObserver(web_contents) {}
@@ -80,15 +87,17 @@ UsbTabHelper::GetPermissionProvider(RenderFrameHost* render_frame_host) {
return frame_usb_services->permission_provider->GetWeakPtr();
}
-#if !defined(OS_ANDROID)
void UsbTabHelper::GetChooserService(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::ChooserService> request) {
FrameUsbServices* frame_usb_services = GetFrameUsbService(render_frame_host);
if (!frame_usb_services->chooser_service) {
frame_usb_services->chooser_service.reset(
+#if defined(OS_ANDROID)
+ new WebUsbChooserServiceAndroid(render_frame_host));
+#else
new WebUsbChooserService(render_frame_host));
+#endif // defined(OS_ANDROID)
}
frame_usb_services->chooser_service->Bind(std::move(request));
}
-#endif // !defined(OS_ANDROID)
diff --git a/chrome/browser/usb/usb_tab_helper.h b/chrome/browser/usb/usb_tab_helper.h
index 1771981..71eed59 100644
--- a/chrome/browser/usb/usb_tab_helper.h
+++ b/chrome/browser/usb/usb_tab_helper.h
@@ -38,11 +38,9 @@ class UsbTabHelper : public content::WebContentsObserver,
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::DeviceManager> request);
-#if !defined(OS_ANDROID)
void CreateChooserService(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::ChooserService> request);
-#endif // !defined(OS_ANDROID)
private:
explicit UsbTabHelper(content::WebContents* web_contents);
@@ -57,11 +55,9 @@ class UsbTabHelper : public content::WebContentsObserver,
base::WeakPtr<device::usb::PermissionProvider> GetPermissionProvider(
content::RenderFrameHost* render_frame_host);
-#if !defined(OS_ANDROID)
void GetChooserService(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<device::usb::ChooserService> request);
-#endif // !defined(OS_ANDROID)
FrameUsbServicesMap frame_usb_services_;
diff --git a/chrome/browser/usb/web_usb_histograms.cc b/chrome/browser/usb/web_usb_histograms.cc
new file mode 100644
index 0000000..a330c7a
--- /dev/null
+++ b/chrome/browser/usb/web_usb_histograms.cc
@@ -0,0 +1,12 @@
+// Copyright 2016 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/usb/web_usb_histograms.h"
+
+#include "base/metrics/histogram_macros.h"
+
+void RecordWebUsbChooserClosure(WebUsbChooserClosed disposition) {
+ UMA_HISTOGRAM_ENUMERATION("WebUsb.ChooserClosed", disposition,
+ WEBUSB_CHOOSER_CLOSED_MAX);
+}
diff --git a/chrome/browser/usb/web_usb_histograms.h b/chrome/browser/usb/web_usb_histograms.h
new file mode 100644
index 0000000..84805b3
--- /dev/null
+++ b/chrome/browser/usb/web_usb_histograms.h
@@ -0,0 +1,29 @@
+// Copyright 2016 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_USB_WEB_USB_HISTOGRAMS_H_
+#define CHROME_BROWSER_USB_WEB_USB_HISTOGRAMS_H_
+
+// Reasons the chooser may be closed. These are used in histograms so do not
+// remove/reorder entries. Only add at the end just before
+// WEBUSB_CHOOSER_CLOSED_MAX. Also remember to update the enum listing in
+// tools/metrics/histograms/histograms.xml.
+enum WebUsbChooserClosed {
+ // The user cancelled the permission prompt without selecting a device.
+ WEBUSB_CHOOSER_CLOSED_CANCELLED = 0,
+ // The user probably cancelled the permission prompt without selecting a
+ // device because there were no devices to select.
+ WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES,
+ // The user granted permission to access a device.
+ WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED,
+ // The user granted permission to access a device but that permission will be
+ // revoked when the device is disconnected.
+ WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED,
+ // Maximum value for the enum.
+ WEBUSB_CHOOSER_CLOSED_MAX
+};
+
+void RecordWebUsbChooserClosure(WebUsbChooserClosed disposition);
+
+#endif // CHROME_BROWSER_USB_WEB_USB_HISTOGRAMS_H_