| Index: content/browser/bluetooth/bluetooth_dispatcher_host.cc
|
| diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.cc b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
|
| index decbede43c15dfcb8ab6af0e74e5d6360fa158d9..7335a7bc3d930780eb598e663a90bda5bfefb499 100644
|
| --- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc
|
| +++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
|
| @@ -171,6 +171,11 @@ BluetoothDispatcherHost::BluetoothDispatcherHost(int render_process_id)
|
| /*is_repeating=*/false),
|
| weak_ptr_factory_(this) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| +
|
| + // Bind all future weak pointers to the UI thread.
|
| + weak_ptr_on_ui_thread_ = weak_ptr_factory_.GetWeakPtr();
|
| + weak_ptr_on_ui_thread_.get(); // Associates with UI thread.
|
| +
|
| if (BluetoothAdapterFactory::IsBluetoothAdapterAvailable())
|
| BluetoothAdapterFactory::GetAdapter(
|
| base::Bind(&BluetoothDispatcherHost::set_adapter,
|
| @@ -278,6 +283,7 @@ void BluetoothDispatcherHost::set_adapter(
|
| void BluetoothDispatcherHost::StartDeviceDiscovery(
|
| RequestDeviceSession* session,
|
| int chooser_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| if (session->discovery_session) {
|
| // Already running; just increase the timeout.
|
| discovery_session_timer_.Reset();
|
| @@ -287,13 +293,14 @@ void BluetoothDispatcherHost::StartDeviceDiscovery(
|
| adapter_->StartDiscoverySessionWithFilter(
|
| session->ComputeScanFilter(),
|
| base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted,
|
| - weak_ptr_factory_.GetWeakPtr(), chooser_id),
|
| + weak_ptr_on_ui_thread_, chooser_id),
|
| base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError,
|
| - weak_ptr_factory_.GetWeakPtr(), chooser_id));
|
| + weak_ptr_on_ui_thread_, chooser_id));
|
| }
|
| }
|
|
|
| void BluetoothDispatcherHost::StopDeviceDiscovery() {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter(
|
| &request_device_sessions_);
|
| !iter.IsAtEnd(); iter.Advance()) {
|
| @@ -311,6 +318,7 @@ void BluetoothDispatcherHost::StopDeviceDiscovery() {
|
| void BluetoothDispatcherHost::AdapterPoweredChanged(
|
| device::BluetoothAdapter* adapter,
|
| bool powered) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| const BluetoothChooser::AdapterPresence presence =
|
| powered ? BluetoothChooser::AdapterPresence::POWERED_ON
|
| : BluetoothChooser::AdapterPresence::POWERED_OFF;
|
| @@ -325,6 +333,7 @@ void BluetoothDispatcherHost::AdapterPoweredChanged(
|
|
|
| void BluetoothDispatcherHost::DeviceAdded(device::BluetoothAdapter* adapter,
|
| device::BluetoothDevice* device) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| VLOG(1) << "Adding device to all choosers: " << device->GetAddress();
|
| for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter(
|
| &request_device_sessions_);
|
| @@ -336,6 +345,7 @@ void BluetoothDispatcherHost::DeviceAdded(device::BluetoothAdapter* adapter,
|
|
|
| void BluetoothDispatcherHost::DeviceRemoved(device::BluetoothAdapter* adapter,
|
| device::BluetoothDevice* device) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| VLOG(1) << "Marking device removed on all choosers: " << device->GetAddress();
|
| for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter(
|
| &request_device_sessions_);
|
| @@ -407,7 +417,7 @@ void BluetoothDispatcherHost::OnRequestDevice(
|
|
|
| BluetoothChooser::EventHandler chooser_event_handler =
|
| base::Bind(&BluetoothDispatcherHost::OnBluetoothChooserEvent,
|
| - weak_ptr_factory_.GetWeakPtr(), chooser_id);
|
| + weak_ptr_on_ui_thread_, chooser_id);
|
| if (WebContents* web_contents =
|
| WebContents::FromRenderFrameHost(render_frame_host)) {
|
| if (WebContentsDelegate* delegate = web_contents->GetDelegate()) {
|
| @@ -466,10 +476,10 @@ void BluetoothDispatcherHost::OnConnectGATT(
|
| }
|
| device->CreateGattConnection(
|
| base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id,
|
| + weak_ptr_on_ui_thread_, thread_id, request_id,
|
| device_instance_id, start_time),
|
| base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id,
|
| + weak_ptr_on_ui_thread_, thread_id, request_id,
|
| device_instance_id, start_time));
|
| }
|
|
|
| @@ -491,7 +501,7 @@ void BluetoothDispatcherHost::OnGetPrimaryService(
|
| BrowserThread::PostDelayedTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&BluetoothDispatcherHost::OnServicesDiscovered,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id,
|
| + weak_ptr_on_ui_thread_, thread_id, request_id,
|
| device_instance_id, service_uuid),
|
| base::TimeDelta::FromSeconds(current_delay_time_));
|
| }
|
| @@ -619,9 +629,9 @@ void BluetoothDispatcherHost::OnReadValue(
|
|
|
| characteristic->ReadRemoteCharacteristic(
|
| base::Bind(&BluetoothDispatcherHost::OnCharacteristicValueRead,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id),
|
| + weak_ptr_on_ui_thread_, thread_id, request_id),
|
| base::Bind(&BluetoothDispatcherHost::OnCharacteristicReadValueError,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id));
|
| + weak_ptr_on_ui_thread_, thread_id, request_id));
|
| }
|
|
|
| void BluetoothDispatcherHost::OnWriteValue(
|
| @@ -689,9 +699,9 @@ void BluetoothDispatcherHost::OnWriteValue(
|
| }
|
| characteristic->WriteRemoteCharacteristic(
|
| value, base::Bind(&BluetoothDispatcherHost::OnWriteValueSuccess,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id),
|
| + weak_ptr_on_ui_thread_, thread_id, request_id),
|
| base::Bind(&BluetoothDispatcherHost::OnWriteValueFailed,
|
| - weak_ptr_factory_.GetWeakPtr(), thread_id, request_id));
|
| + weak_ptr_on_ui_thread_, thread_id, request_id));
|
| }
|
|
|
| void BluetoothDispatcherHost::OnDiscoverySessionStarted(
|
| @@ -730,6 +740,7 @@ void BluetoothDispatcherHost::OnBluetoothChooserEvent(
|
| int chooser_id,
|
| BluetoothChooser::Event event,
|
| const std::string& device_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id);
|
| DCHECK(session) << "Shouldn't receive an event (" << static_cast<int>(event)
|
| << ") from a closed chooser.";
|
| @@ -751,7 +762,7 @@ void BluetoothDispatcherHost::OnBluetoothChooserEvent(
|
| if (!base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&BluetoothDispatcherHost::FinishClosingChooser,
|
| - weak_ptr_factory_.GetWeakPtr(), chooser_id, event,
|
| + weak_ptr_on_ui_thread_, chooser_id, event,
|
| device_id))) {
|
| LOG(WARNING) << "No TaskRunner; not closing requestDevice dialog.";
|
| }
|
| @@ -773,6 +784,7 @@ void BluetoothDispatcherHost::FinishClosingChooser(
|
| int chooser_id,
|
| BluetoothChooser::Event event,
|
| const std::string& device_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id);
|
| DCHECK(session) << "Session removed unexpectedly.";
|
|
|
| @@ -828,6 +840,7 @@ void BluetoothDispatcherHost::OnGATTConnectionCreated(
|
| const std::string& device_instance_id,
|
| base::TimeTicks start_time,
|
| scoped_ptr<device::BluetoothGattConnection> connection) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect
|
| // from it.
|
| RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time);
|
| @@ -842,6 +855,7 @@ void BluetoothDispatcherHost::OnCreateGATTConnectionError(
|
| const std::string& device_instance_id,
|
| base::TimeTicks start_time,
|
| device::BluetoothDevice::ConnectErrorCode error_code) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // There was an error creating the ATT Bearer so we reject with
|
| // NetworkError.
|
| // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-connectgatt
|
| @@ -897,6 +911,7 @@ void BluetoothDispatcherHost::OnCharacteristicValueRead(
|
| int thread_id,
|
| int request_id,
|
| const std::vector<uint8>& value) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS);
|
| Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id,
|
| value));
|
| @@ -906,6 +921,7 @@ void BluetoothDispatcherHost::OnCharacteristicReadValueError(
|
| int thread_id,
|
| int request_id,
|
| device::BluetoothGattService::GattErrorCode error_code) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // TranslateGATTError calls RecordGATTOperationOutcome.
|
| Send(new BluetoothMsg_ReadCharacteristicValueError(
|
| thread_id, request_id,
|
| @@ -914,6 +930,7 @@ void BluetoothDispatcherHost::OnCharacteristicReadValueError(
|
|
|
| void BluetoothDispatcherHost::OnWriteValueSuccess(int thread_id,
|
| int request_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome::SUCCESS);
|
| Send(new BluetoothMsg_WriteCharacteristicValueSuccess(thread_id, request_id));
|
| }
|
| @@ -922,6 +939,7 @@ void BluetoothDispatcherHost::OnWriteValueFailed(
|
| int thread_id,
|
| int request_id,
|
| device::BluetoothGattService::GattErrorCode error_code) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // TranslateGATTError calls RecordGATTOperationOutcome.
|
| Send(new BluetoothMsg_WriteCharacteristicValueError(
|
| thread_id, request_id,
|
| @@ -929,14 +947,17 @@ void BluetoothDispatcherHost::OnWriteValueFailed(
|
| }
|
|
|
| void BluetoothDispatcherHost::ShowBluetoothOverviewLink() {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| void BluetoothDispatcherHost::ShowBluetoothPairingLink() {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| NOTIMPLEMENTED();
|
| }
|
|
|
|
|