diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/android/chrome_jni_registrar.cc | 2 | ||||
-rw-r--r-- | chrome/browser/android/usb/web_usb_chooser_service_android.cc | 33 | ||||
-rw-r--r-- | chrome/browser/android/usb/web_usb_chooser_service_android.h | 47 | ||||
-rw-r--r-- | chrome/browser/chrome_content_browser_client.cc | 9 | ||||
-rw-r--r-- | chrome/browser/ui/android/bluetooth_chooser_android.cc | 1 | ||||
-rw-r--r-- | chrome/browser/ui/android/usb_chooser_dialog_android.cc | 226 | ||||
-rw-r--r-- | chrome/browser/ui/android/usb_chooser_dialog_android.h | 87 | ||||
-rw-r--r-- | chrome/browser/usb/usb_chooser_bubble_controller.cc | 71 | ||||
-rw-r--r-- | chrome/browser/usb/usb_tab_helper.cc | 19 | ||||
-rw-r--r-- | chrome/browser/usb/usb_tab_helper.h | 4 | ||||
-rw-r--r-- | chrome/browser/usb/web_usb_histograms.cc | 12 | ||||
-rw-r--r-- | chrome/browser/usb/web_usb_histograms.h | 29 |
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_ |