// 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. #include "chrome/browser/usb/usb_tab_helper.h" #include #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" using content::RenderFrameHost; using content::WebContents; DEFINE_WEB_CONTENTS_USER_DATA_KEY(UsbTabHelper); struct FrameUsbServices { scoped_ptr permission_provider; scoped_ptr chooser_service; }; // static UsbTabHelper* UsbTabHelper::GetOrCreateForWebContents( WebContents* web_contents) { UsbTabHelper* tab_helper = FromWebContents(web_contents); if (!tab_helper) { CreateForWebContents(web_contents); tab_helper = FromWebContents(web_contents); } return tab_helper; } UsbTabHelper::~UsbTabHelper() {} void UsbTabHelper::CreateDeviceManager( RenderFrameHost* render_frame_host, mojo::InterfaceRequest request) { DCHECK(WebContents::FromRenderFrameHost(render_frame_host) == web_contents()); device::usb::DeviceManagerImpl::Create( GetPermissionProvider(render_frame_host), std::move(request)); } #if !defined(OS_ANDROID) void UsbTabHelper::CreateChooserService( content::RenderFrameHost* render_frame_host, mojo::InterfaceRequest request) { GetChooserService(render_frame_host, std::move(request)); } #endif // !defined(OS_ANDROID) UsbTabHelper::UsbTabHelper(WebContents* web_contents) : content::WebContentsObserver(web_contents) {} void UsbTabHelper::RenderFrameDeleted(RenderFrameHost* render_frame_host) { frame_usb_services_.erase(render_frame_host); } FrameUsbServices* UsbTabHelper::GetFrameUsbService( content::RenderFrameHost* render_frame_host) { FrameUsbServicesMap::const_iterator it = frame_usb_services_.find(render_frame_host); if (it == frame_usb_services_.end()) { scoped_ptr frame_usb_services(new FrameUsbServices()); it = (frame_usb_services_.insert( std::make_pair(render_frame_host, std::move(frame_usb_services)))) .first; } return it->second.get(); } base::WeakPtr UsbTabHelper::GetPermissionProvider(RenderFrameHost* render_frame_host) { FrameUsbServices* frame_usb_services = GetFrameUsbService(render_frame_host); if (!frame_usb_services->permission_provider) { frame_usb_services->permission_provider.reset( new WebUSBPermissionProvider(render_frame_host)); } return frame_usb_services->permission_provider->GetWeakPtr(); } #if !defined(OS_ANDROID) void UsbTabHelper::GetChooserService( content::RenderFrameHost* render_frame_host, mojo::InterfaceRequest request) { FrameUsbServices* frame_usb_services = GetFrameUsbService(render_frame_host); if (!frame_usb_services->chooser_service) { frame_usb_services->chooser_service.reset( new WebUsbChooserService(render_frame_host)); } frame_usb_services->chooser_service->Bind(std::move(request)); } #endif // !defined(OS_ANDROID)