Chromium Code Reviews| Index: content/browser/bluetooth/bluetooth_device_chooser_controller.h |
| diff --git a/content/browser/bluetooth/bluetooth_device_chooser_controller.h b/content/browser/bluetooth/bluetooth_device_chooser_controller.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..075b8d65b61b22afa910f59b87e9a46ef3ed405b |
| --- /dev/null |
| +++ b/content/browser/bluetooth/bluetooth_device_chooser_controller.h |
| @@ -0,0 +1,142 @@ |
| +// 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 CONTENT_BROWSER_BLUETOOTH_BLUETOOTH_DEVICE_CHOOSER_CONTROLLER_H_ |
| +#define CONTENT_BROWSER_BLUETOOTH_BLUETOOTH_DEVICE_CHOOSER_CONTROLLER_H_ |
| + |
| +#include <string> |
| + |
| +#include "base/memory/weak_ptr.h" |
| +#include "base/time/time.h" |
| +#include "base/timer/timer.h" |
| +#include "content/public/browser/bluetooth_chooser.h" |
| +#include "third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom.h" |
| + |
| +namespace device { |
| +class BluetoothAdapter; |
| +class BluetoothDevice; |
| +class BluetoothDiscoveryFilter; |
| +class BluetoothDiscoverySession; |
| +} |
| + |
| +namespace content { |
| + |
| +class RenderFrameHost; |
| +class WebContents; |
| +class WebBluetoothServiceImpl; |
| + |
| +// Class that interacts with a chooser and starts a bluetooth discovery session. |
| +// This class needs to be re-instantiated for each call to GetDevice(). Calling |
| +// GetDevice() twice for the same instance will DCHECK. |
| +class BluetoothDeviceChooserController final { |
| + public: |
| + typedef base::Callback<void(blink::mojom::WebBluetoothRequestDeviceOptionsPtr, |
| + const std::string& device_address)> |
| + SuccessCallback; |
| + typedef base::Callback<void(blink::mojom::WebBluetoothError error)> |
| + ErrorCallback; |
| + |
| + // |web_bluetooth_service_| service that owns this class. |
| + // |render_frame_host| should be the RenderFrameHost that owns the |
| + // |web_bluetooth_service_|. |
| + // |adapter| should be the adapter used to scan for Bluetooth devices. |
| + // |scan_duration| is how long will a discovery session be active. |
| + BluetoothDeviceChooserController( |
| + WebBluetoothServiceImpl* web_bluetooth_service_, |
| + RenderFrameHost* render_frame_host, |
| + device::BluetoothAdapter* adapter, |
| + base::TimeDelta scan_duration); |
| + ~BluetoothDeviceChooserController(); |
| + |
| + // This function performs the following checks before starting a discovery |
| + // session: |
| + // - Validates filters in |request_device_options|. |
| + // - Removes any blacklisted UUIDs from |
| + // |request_device_options.optinal_services|. |
| + // - Checks if the request came from a cross-origin iframe. |
| + // - Checks if the request came from a unique origin. |
| + // - Checks if the adapter is present. |
| + // - Checks if the Web Bluetooth API has been disabled. |
| + // - Checks if we are allowed to ask for scanning permission. |
| + // If any of the previous checks failed then this function runs |
| + // |error_callback| with the corresponding error. Otherwise this function |
| + // populates the embedder provided BluetoothChooser with existing devices and |
| + // starts a new discovery session. |
| + // This function should only be called once per |
| + // BluetoothDeviceChooserController instance. Calling this function more than |
| + // once will DCHECK. |
| + void GetDevice( |
| + blink::mojom::WebBluetoothRequestDeviceOptionsPtr request_device_options, |
| + const SuccessCallback& success_callback, |
| + const ErrorCallback& error_callback); |
| + |
| + // Adds a device to the chooser. Should only be called after GetDevice and |
| + // before either of the callbacks are run. |
| + void AddFilteredDevice(const device::BluetoothDevice& device); |
| + |
| + // Stops the current discovery session and notifies the chooser |
|
Jeffrey Yasskin
2016/05/13 21:36:55
Mhmm. Another way to do it would be to just make t
ortuno
2016/05/13 22:14:38
Ack.
|
| + // that the adapter changed states. |
| + void AdapterPoweredChanged(bool powered); |
| + |
| + private: |
| + // Notifies the chooser that discovery is starting and starts a discovery |
| + // session. |
| + void StartDeviceDiscovery(); |
| + |
| + // Stops the discovery session and notifies the chooser. |
| + void StopDeviceDiscovery(); |
| + |
| + // StartDiscoverySessionWithFilter callbacks: |
| + void OnStartDiscoverySessionSuccess( |
| + std::unique_ptr<device::BluetoothDiscoverySession> discovery_session); |
| + void OnStartDiscoverySessionFailed(); |
| + |
| + // BluetoothChooser::EventHandler: |
| + // Runs error_callback_ if the chooser was cancelled or if we weren't able |
| + // to show the chooser. Otherwise runs success_callback_ with |
| + // |device_address|. |
| + void OnBluetoothChooserEvent(BluetoothChooser::Event event, |
| + const std::string& device_address); |
| + |
| + // Helper function to asynchronously run success_callback_. |
| + void PostSuccessCallback(const std::string& device_address); |
| + // Helper function to asynchronously run error_callback_. |
| + void PostErrorCallback(blink::mojom::WebBluetoothError error); |
| + |
| + // The adapter used to get existing devices and start a discovery session. |
| + device::BluetoothAdapter* adapter_; |
| + // The WebBluetoothServiceImpl that owns this instance. |
| + WebBluetoothServiceImpl* web_bluetooth_service_; |
| + // The RenderFrameHost that owns web_bluetooth_service_. |
| + RenderFrameHost* render_frame_host_; |
| + // The WebContents that owns render_frame_host_. |
| + WebContents* web_contents_; |
| + |
| + // Contains the filters and optional services used when scanning. |
| + blink::mojom::WebBluetoothRequestDeviceOptionsPtr options_; |
| + |
| + // Callbacks to be called with the result of the chooser. |
| + SuccessCallback success_callback_; |
| + ErrorCallback error_callback_; |
| + |
| + // The currently opened BluetoothChooser. |
| + std::unique_ptr<BluetoothChooser> chooser_; |
| + |
| + // Automatically stops Bluetooth discovery a set amount of time after it was |
| + // started. |
| + base::Timer discovery_session_timer_; |
| + |
| + // The last discovery session to be started. |
|
Jeffrey Yasskin
2016/05/13 21:36:55
Looking at the implementation, you do actually nul
ortuno
2016/05/13 22:14:38
Done. Thanks for opening the issue!
|
| + std::unique_ptr<device::BluetoothDiscoverySession> discovery_session_; |
| + |
| + // Weak pointer factory for generating 'this' pointers that might live longer |
| + // than we do. |
| + // Note: This should remain the last member so it'll be destroyed and |
| + // invalidate its weak pointers before any other members are destroyed. |
| + base::WeakPtrFactory<BluetoothDeviceChooserController> weak_ptr_factory_; |
| +}; |
| + |
| +} // namespace content |
| + |
| +#endif // CONTENT_BROWSER_BLUETOOTH_BLUETOOTH_DEVICE_CHOOSER_CONTROLLER_H_ |