Index: extensions/browser/api/bluetooth/bluetooth_event_router.cc |
diff --git a/extensions/browser/api/bluetooth/bluetooth_event_router.cc b/extensions/browser/api/bluetooth/bluetooth_event_router.cc |
index 9302f7ce854fd71f0eb717fd5c39df87bf088886..09624a3d9772a53a5f2c8fabe538ec1d966b4246 100644 |
--- a/extensions/browser/api/bluetooth/bluetooth_event_router.cc |
+++ b/extensions/browser/api/bluetooth/bluetooth_event_router.cc |
@@ -37,7 +37,7 @@ namespace bt_private = api::bluetooth_private; |
BluetoothEventRouter::BluetoothEventRouter(content::BrowserContext* context) |
: browser_context_(context), |
- adapter_(NULL), |
+ adapter_(nullptr), |
num_event_listeners_(0), |
extension_registry_observer_(this), |
weak_ptr_factory_(this) { |
@@ -53,7 +53,7 @@ BluetoothEventRouter::~BluetoothEventRouter() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
if (adapter_.get()) { |
adapter_->RemoveObserver(this); |
- adapter_ = NULL; |
+ adapter_ = nullptr; |
} |
CleanUpAllExtensions(); |
} |
@@ -78,7 +78,29 @@ void BluetoothEventRouter::StartDiscoverySession( |
const std::string& extension_id, |
const base::Closure& callback, |
const base::Closure& error_callback) { |
- if (adapter != adapter_.get()) { |
armansito
2015/10/21 23:19:19
Since you removed this check, then maybe add a DHE
stevenjb
2015/10/21 23:36:40
Actually, the test is effectively moved to StartDi
|
+ if (!adapter_.get() && IsBluetoothSupported()) { |
+ GetAdapter(base::Bind( |
+ &BluetoothEventRouter::OnAdapterInitialized, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Bind(&BluetoothEventRouter::StartDiscoverySessionImpl, |
+ weak_ptr_factory_.GetWeakPtr(), make_scoped_refptr(adapter), |
+ extension_id, callback, error_callback))); |
+ return; |
+ } |
+ StartDiscoverySessionImpl(adapter, extension_id, callback, error_callback); |
+} |
+ |
+void BluetoothEventRouter::StartDiscoverySessionImpl( |
+ device::BluetoothAdapter* adapter, |
+ const std::string& extension_id, |
+ const base::Closure& callback, |
+ const base::Closure& error_callback) { |
+ if (!adapter_.get() || adapter != adapter_.get()) { |
armansito
2015/10/21 23:19:19
You removed the "adapter != adapter_.get()" above
stevenjb
2015/10/21 23:36:40
This is called only from StartDiscoverySession() (
|
+ if (adapter_.get()) { |
+ LOG(ERROR) << "Unable to get addapter"; |
armansito
2015/10/21 23:19:19
s/addapter/adapter/
stevenjb
2015/10/21 23:36:40
Done.
|
+ } else { |
+ LOG(ERROR) << "Adapter mismatch"; |
armansito
2015/10/21 23:19:19
Also this logic is extremely convoluted for a most
stevenjb
2015/10/21 23:36:40
Logging clarified.
|
+ } |
error_callback.Run(); |
return; |
} |
@@ -161,7 +183,7 @@ BluetoothApiPairingDelegate* BluetoothEventRouter::GetPairingDelegate( |
const std::string& extension_id) { |
return ContainsKey(pairing_delegate_map_, extension_id) |
? pairing_delegate_map_[extension_id] |
- : NULL; |
+ : nullptr; |
} |
void BluetoothEventRouter::OnAdapterInitialized( |
@@ -178,23 +200,30 @@ void BluetoothEventRouter::OnAdapterInitialized( |
void BluetoothEventRouter::MaybeReleaseAdapter() { |
if (adapter_.get() && num_event_listeners_ == 0 && |
pairing_delegate_map_.empty()) { |
+ VLOG(1) << "Releasing Adapter."; |
adapter_->RemoveObserver(this); |
- adapter_ = NULL; |
+ adapter_ = nullptr; |
} |
} |
void BluetoothEventRouter::AddPairingDelegate(const std::string& extension_id) { |
- if (!adapter_.get()) { |
- base::Closure self_callback = |
- base::Bind(&BluetoothEventRouter::AddPairingDelegate, |
+ if (!adapter_.get() && IsBluetoothSupported()) { |
+ GetAdapter( |
+ base::Bind(&BluetoothEventRouter::OnAdapterInitialized, |
weak_ptr_factory_.GetWeakPtr(), |
- extension_id); |
- GetAdapter(base::Bind(&BluetoothEventRouter::OnAdapterInitialized, |
- weak_ptr_factory_.GetWeakPtr(), |
- self_callback)); |
+ base::Bind(&BluetoothEventRouter::AddPairingDelegateImpl, |
+ weak_ptr_factory_.GetWeakPtr(), extension_id))); |
return; |
} |
+ AddPairingDelegateImpl(extension_id); |
+} |
+void BluetoothEventRouter::AddPairingDelegateImpl( |
+ const std::string& extension_id) { |
+ if (!adapter_.get()) { |
+ LOG(ERROR) << "Unable to get adatper."; |
+ return; |
+ } |
if (!ContainsKey(pairing_delegate_map_, extension_id)) { |
BluetoothApiPairingDelegate* delegate = |
new BluetoothApiPairingDelegate(extension_id, browser_context_); |
@@ -266,10 +295,13 @@ void BluetoothEventRouter::AdapterDiscoveringChanged( |
delete session; |
} |
discovery_session_map_.swap(active_session_map); |
- MaybeReleaseAdapter(); |
} |
DispatchAdapterStateEvent(); |
+ |
+ // Release the adapter after dispatching the event. |
+ if (!discovering) |
+ MaybeReleaseAdapter(); |
} |
void BluetoothEventRouter::DeviceAdded(device::BluetoothAdapter* adapter, |
@@ -327,6 +359,7 @@ void BluetoothEventRouter::OnListenerRemoved() { |
void BluetoothEventRouter::DispatchAdapterStateEvent() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
api::bluetooth::AdapterState state; |
+ CHECK(adapter_.get()); |
PopulateAdapterState(*adapter_.get(), &state); |
scoped_ptr<base::ListValue> args = |
@@ -342,6 +375,7 @@ void BluetoothEventRouter::DispatchDeviceEvent( |
const std::string& event_name, |
device::BluetoothDevice* device) { |
bluetooth::Device extension_device; |
+ CHECK(device); |
bluetooth::BluetoothDeviceToApiDevice(*device, &extension_device); |
scoped_ptr<base::ListValue> args = |