From c3e771274a66745f4715e3ef5160dc310c0e29b7 Mon Sep 17 00:00:00 2001 From: Zakor Gyula Date: Tue, 6 Dec 2016 12:12:01 +0100 Subject: [PATCH] Check if represented attributes are cached --- components/bluetooth/lib.rs | 38 +++++++++++++++---- .../dom/bluetoothremotegattcharacteristic.rs | 31 +++++---------- .../dom/bluetoothremotegattdescriptor.rs | 12 ++---- .../script/dom/bluetoothremotegattserver.rs | 17 +++------ .../script/dom/bluetoothremotegattservice.rs | 16 ++------ .../connect/device-goes-out-of-range.html.ini | 5 --- 6 files changed, 53 insertions(+), 66 deletions(-) delete mode 100644 tests/wpt/mozilla/meta/mozilla/bluetooth/connect/device-goes-out-of-range.html.ini diff --git a/components/bluetooth/lib.rs b/components/bluetooth/lib.rs index 0207c9e6f744..2780b1fd88b6 100644 --- a/components/bluetooth/lib.rs +++ b/components/bluetooth/lib.rs @@ -418,6 +418,10 @@ impl BluetoothManager { } } + fn device_is_cached(&self, device_id: &str) -> bool { + self.cached_devices.contains_key(device_id) && self.address_to_id.values().any(|v| v == device_id) + } + // Service fn get_and_cache_gatt_services(&mut self, @@ -460,6 +464,10 @@ impl BluetoothManager { services.into_iter().filter(|s| s.get_uuid().ok() == Some(service_uuid.to_string())).collect() } + fn service_is_cached(&self, service_id: &str) -> bool { + self.cached_services.contains_key(service_id) && self.service_to_device.contains_key(service_id) + } + // Characteristic fn get_and_cache_gatt_characteristics(&mut self, @@ -524,6 +532,11 @@ impl BluetoothManager { props } + fn characteristic_is_cached(&self, characteristic_id: &str) -> bool { + self.cached_characteristics.contains_key(characteristic_id) && + self.characteristic_to_service.contains_key(characteristic_id) + } + // Descriptor fn get_and_cache_gatt_descriptors(&mut self, @@ -627,6 +640,10 @@ impl BluetoothManager { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-connect fn gatt_server_connect(&mut self, device_id: String, sender: IpcSender) { + // Step 2. + if !self.device_is_cached(&device_id) { + return drop(sender.send(Err(BluetoothError::Network))); + } let mut adapter = get_adapter_or_return_error!(self, sender); // Step 5.1.1. @@ -685,7 +702,7 @@ impl BluetoothManager { uuid: String, sender: IpcSender) { // Step 5. - if !self.cached_devices.contains_key(&device_id) { + if !self.device_is_cached(&device_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -721,7 +738,7 @@ impl BluetoothManager { uuid: Option, sender: IpcSender) { // Step 5. - if !self.cached_devices.contains_key(&device_id) { + if !self.device_is_cached(&device_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -766,7 +783,7 @@ impl BluetoothManager { uuid: String, sender: IpcSender) { // Step 5. - if !self.cached_services.contains_key(&service_id) { + if !self.service_is_cached(&service_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -807,7 +824,7 @@ impl BluetoothManager { uuid: Option, sender: IpcSender) { // Step 5. - if !self.cached_services.contains_key(&service_id) { + if !self.service_is_cached(&service_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -854,7 +871,7 @@ impl BluetoothManager { uuid: String, sender: IpcSender) { // Step 5. - if !self.cached_services.contains_key(&service_id) { + if !self.service_is_cached(&service_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -891,7 +908,7 @@ impl BluetoothManager { uuid: Option, sender: IpcSender) { // Step 5. - if !self.cached_services.contains_key(&service_id) { + if !self.service_is_cached(&service_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -938,7 +955,7 @@ impl BluetoothManager { uuid: String, sender: IpcSender) { // Step 5. - if !self.cached_characteristics.contains_key(&characteristic_id) { + if !self.characteristic_is_cached(&characteristic_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -968,7 +985,7 @@ impl BluetoothManager { uuid: Option, sender: IpcSender) { // Step 5. - if !self.cached_characteristics.contains_key(&characteristic_id) { + if !self.characteristic_is_cached(&characteristic_id) { return drop(sender.send(Err(BluetoothError::InvalidState))); } let mut adapter = get_adapter_or_return_error!(self, sender); @@ -1069,6 +1086,11 @@ impl BluetoothManager { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-startnotifications // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-stopnotifications fn enable_notification(&mut self, id: String, enable: bool, sender: IpcSender) { + // (StartNotifications) Step 2 - 3. + // (StopNotifications) Step 1 - 2. + if !self.characteristic_is_cached(&id) { + return drop(sender.send(Err(BluetoothError::InvalidState))); + } // (StartNotification) TODO: Step 7: Missing because it is optional. let mut adapter = get_adapter_or_return_error!(self, sender); match self.get_gatt_characteristic(&mut adapter, &id) { diff --git a/components/script/dom/bluetoothremotegattcharacteristic.rs b/components/script/dom/bluetoothremotegattcharacteristic.rs index eb41e6ec1db3..34a4804bb5af 100644 --- a/components/script/dom/bluetoothremotegattcharacteristic.rs +++ b/components/script/dom/bluetoothremotegattcharacteristic.rs @@ -128,9 +128,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // TODO: Step 5: Implement representedService internal slot for BluetoothRemoteGATTService. - - // Note: Steps 6 - 7 are implemented in components/bluetooth/lib.rs in get_descriptor function + // Note: Steps 5 - 7 are implemented in components/bluetooth/lib.rs in get_descriptor function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -171,9 +169,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // TODO: Step 5: Implement representedService internal slot for BluetoothRemoteGATTService. - - // Note: Steps 6 - 7 are implemented in components/bluetooth/lib.rs in get_descriptors function + // Note: Steps 5 - 7 are implemented in components/bluetooth/lib.rs in get_descriptors function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -204,8 +200,6 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // TODO: Step 3 - 4: Implement representedCharacteristic internal slot for BluetoothRemoteGATTCharacteristic. - // TODO: Step 5: Implement the `connection-checking-wrapper` algorithm for BluetoothRemoteGATTServer. // Step 5.1. @@ -214,8 +208,8 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // Note: Remaining substeps of Step 5 are implemented in components/bluetooth/lib.rs in readValue function - // and in handle_response function. + // Note: Steps 3 - 4 and the remaining substeps of Step 5 are implemented in components/bluetooth/lib.rs + // in readValue function and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( BluetoothRequest::ReadValue(self.get_instance_id(), sender)).unwrap(); @@ -246,8 +240,6 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // TODO: Step 5 - 6: Implement representedCharacteristic internal slot for BluetoothRemoteGATTCharacteristic. - // TODO: Step 7: Implement the `connection-checking-wrapper` algorithm for BluetoothRemoteGATTServer. // Step 7.1. @@ -258,8 +250,8 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // Note: Remaining substeps of Step 7 are implemented in components/bluetooth/lib.rs in writeValue function - // and in handle_response function. + // Note: Steps 5 - 6 and the remaining substeps of Step 7 are implemented in components/bluetooth/lib.rs + // in writeValue function and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( BluetoothRequest::WriteValue(self.get_instance_id(), value, sender)).unwrap(); @@ -278,8 +270,6 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // TODO: Step 2 - 3: Implement representedCharacteristic internal slot for BluetoothRemoteGATTCharacteristic. - // Step 4. if !(self.Properties().Notify() || self.Properties().Indicate()) { @@ -295,7 +285,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris return p; } - // Note: Steps 7 - 11 are implemented in components/bluetooth/lib.rs in enable_notification function + // Note: Steps 2 - 3, 7 - 11 are implemented in components/bluetooth/lib.rs in enable_notification function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -311,11 +301,10 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris let p = Promise::new(&self.global()); let sender = response_async(&p, self); - // TODO: Step 1 - 4: Implement representedCharacteristic internal slot and - // `active notification context set` for BluetoothRemoteGATTCharacteristic, + // TODO: Step 3 - 4: Implement `active notification context set` for BluetoothRemoteGATTCharacteristic, - // Note: Part of Step 4 and Step 5 are implemented in components/bluetooth/lib.rs in enable_notification - // function and in handle_response function. + // Note: Steps 1 - 2, and part of Step 4 and Step 5 are implemented in components/bluetooth/lib.rs + // in enable_notification function and in handle_response function. self.get_bluetooth_thread().send( BluetoothRequest::EnableNotification(self.get_instance_id(), false, diff --git a/components/script/dom/bluetoothremotegattdescriptor.rs b/components/script/dom/bluetoothremotegattdescriptor.rs index c31fae99070e..404ff8c61c00 100644 --- a/components/script/dom/bluetoothremotegattdescriptor.rs +++ b/components/script/dom/bluetoothremotegattdescriptor.rs @@ -103,11 +103,9 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { return p; } - // TODO: Step 3 - 4: Implement representedDescriptor internal slot for BluetoothRemoteGATTDescriptor. - // TODO: Step 5: Implement the `connection-checking-wrapper` algorithm for BluetoothRemoteGATTServer. - // Note: Substeps of Step 5 are implemented in components/bluetooth/lib.rs in readValue function - // and in handle_response function. + // Note: Steps 3 - 4 and substeps of Step 5 are implemented in components/bluetooth/lib.rs + // in readValue function and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( BluetoothRequest::ReadValue(self.get_instance_id(), sender)).unwrap(); @@ -138,11 +136,9 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { return p; } - // TODO: Step 5 - 6: Implement representedCharacteristic internal slot for BluetoothRemoteGATTCharacteristic. - // TODO: Step 7: Implement the `connection-checking-wrapper` algorithm for BluetoothRemoteGATTServer. - // Note: Substeps of Step 7 are implemented in components/bluetooth/lib.rs in writeValue function - // and in handle_response function. + // Note: Steps 5 - 6 and substeps of Step 7 are implemented in components/bluetooth/lib.rs + // in writeValue function and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( BluetoothRequest::WriteValue(self.get_instance_id(), value, sender)).unwrap(); diff --git a/components/script/dom/bluetoothremotegattserver.rs b/components/script/dom/bluetoothremotegattserver.rs index d9d57ae51f1a..be60a8e654bd 100644 --- a/components/script/dom/bluetoothremotegattserver.rs +++ b/components/script/dom/bluetoothremotegattserver.rs @@ -67,17 +67,14 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { let p = Promise::new(&self.global()); let sender = response_async(&p, self); - // TODO: Step 2: Implement representedDevice internal slot for BluetoothDevice. - // TODO: Step 3: Check if the UA is currently using the Bluetooth system. // TODO: Step 4: Implement activeAlgorithms internal slot for BluetoothRemoteGATTServer. - // TODO: Step 5.1 - 5.2: Implement activeAlgorithms, representedDevice internal slots - // and the` garbage-collect the connection` algorithm. + // TODO: Step 5.1 - 5.2: Implement activeAlgorithms internal slot for BluetoothRemoteGATTServer. - // Note: Steps 5.1.1 and 5.1.3 are in components/bluetooth/lib.rs in the gatt_server_connect function. - // Steps 5.2.4 - 5.2.5 are in response function. + // Note: Steps 2, 5.1.1 and 5.1.3 are in components/bluetooth/lib.rs in the gatt_server_connect function. + // Steps 5.2.3 - 5.2.5 are in response function. self.get_bluetooth_thread().send( BluetoothRequest::GATTServerConnect(String::from(self.Device().Id()), sender)).unwrap(); // Step 5: return promise. @@ -142,9 +139,7 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { return p; } - // TODO: Step 5: Implement representedDevice internal slot for BluetoothDevice. - - // Note: Steps 6 - 7 are implemented in components/bluetooth/lib.rs in get_primary_service function + // Note: Steps 5 - 7 are implemented in components/bluetooth/lib.rs in get_primary_service function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -185,9 +180,7 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { return p; } - // TODO: Step 5: Implement representedDevice internal slot for BluetoothDevice. - - // Note: Steps 6 - 7 are implemented in components/bluetooth/lib.rs in get_primary_services function + // Note: Steps 5 - 7 are implemented in components/bluetooth/lib.rs in get_primary_services function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( diff --git a/components/script/dom/bluetoothremotegattservice.rs b/components/script/dom/bluetoothremotegattservice.rs index f4aed154c7c5..e9923d5d9a51 100644 --- a/components/script/dom/bluetoothremotegattservice.rs +++ b/components/script/dom/bluetoothremotegattservice.rs @@ -117,9 +117,7 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService { return p; } - // TODO: Step 5: Implement representedService internal slot for BluetootRemoteGATTService. - - // Note: Steps 6 - 7 are implemented is components/bluetooth/lib.rs in get_characteristic function + // Note: Steps 5 - 7 are implemented is components/bluetooth/lib.rs in get_characteristic function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -160,9 +158,7 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService { return p; } - // TODO: Step 5: Implement representedService internal slot for BluetootRemoteGATTService. - - // Note: Steps 6 - 7 are implemented is components/bluetooth/lib.rs in get_characteristics function + // Note: Steps 5 - 7 are implemented is components/bluetooth/lib.rs in get_characteristics function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -200,9 +196,7 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService { return p; } - // TODO: Step 5: Implement representedService internal slot for BluetootRemoteGATTService. - - // Note: Steps 6 - 7 are implemented is components/bluetooth/lib.rs in get_included_service function + // Note: Steps 5 - 7 are implemented is components/bluetooth/lib.rs in get_included_service function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( @@ -246,9 +240,7 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService { return p; } - // TODO: Step 5: Implement representedService internal slot for BluetootRemoteGATTService. - - // Note: Steps 6 - 7 are implemented is components/bluetooth/lib.rs in get_included_services function + // Note: Steps 5 - 7 are implemented is components/bluetooth/lib.rs in get_included_services function // and in handle_response function. let sender = response_async(&p, self); self.get_bluetooth_thread().send( diff --git a/tests/wpt/mozilla/meta/mozilla/bluetooth/connect/device-goes-out-of-range.html.ini b/tests/wpt/mozilla/meta/mozilla/bluetooth/connect/device-goes-out-of-range.html.ini deleted file mode 100644 index 1ac7e23518b2..000000000000 --- a/tests/wpt/mozilla/meta/mozilla/bluetooth/connect/device-goes-out-of-range.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[device-goes-out-of-range.html] - type: testharness - [Device goes out of range. Reject with NetworkError.] - expected: FAIL -