Skip to content

Commit 4bea594

Browse files
odejesushchromium-wpt-export-bot
authored andcommitted
bluetooth: Implement getAvailability()
This change implements the getAvailability() method for navigator.bluetooth as defined in the specification. Bug: 707640 Change-Id: I9e9b3e7f8ea7f259e975f71cb6d9570e5f04b479 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1651516 Reviewed-by: Chris Harrelson <[email protected]> Reviewed-by: Giovanni Ortuño Urquidi <[email protected]> Reviewed-by: Kinuko Yasuda <[email protected]> Commit-Queue: Ovidio de Jesús Ruiz-Henríquez <[email protected]> Auto-Submit: Ovidio de Jesús Ruiz-Henríquez <[email protected]> Cr-Commit-Position: refs/heads/master@{#688987}
1 parent c73e28f commit 4bea594

9 files changed

+189
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with false if the system does ' +
8+
'not have an adapter.';
9+
10+
bluetooth_test(async () => {
11+
await navigator.bluetooth.test.simulateCentral({state: 'absent'});
12+
let availability = await navigator.bluetooth.getAvailability();
13+
assert_false(
14+
availability,
15+
'getAvailability() resolves promise with false when adapter is absent.');
16+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with true after adapter is ' +
8+
'inserted into a system with a platform that supports Bluetooth LE.';
9+
10+
bluetooth_test(async () => {
11+
const fake_central =
12+
await navigator.bluetooth.test.simulateCentral({state: 'absent'});
13+
let availability = await navigator.bluetooth.getAvailability();
14+
assert_false(
15+
availability,
16+
'getAvailability() resolves promise with false when adapter is absent.');
17+
18+
await fake_central.setState('powered-on');
19+
availability = await navigator.bluetooth.getAvailability();
20+
assert_true(
21+
availability,
22+
'getAvailability() resolves promise with true after Bluetooth LE ' +
23+
'capable adapter has been has been added.');
24+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
8+
'radio is powered off, but the platform that supports Bluetooth LE.';
9+
10+
bluetooth_test(async () => {
11+
await navigator.bluetooth.test.simulateCentral({state: 'powered-off'});
12+
let availability = await navigator.bluetooth.getAvailability();
13+
assert_true(
14+
availability,
15+
'getAvailability() resolves promise with true when adapter is powered ' +
16+
'off.');
17+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
8+
'radio is powered on and the platform supports Bluetooth LE.';
9+
10+
bluetooth_test(async () => {
11+
await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
12+
let availability = await navigator.bluetooth.getAvailability();
13+
assert_true(
14+
availability,
15+
'getAvailability() resolves promise with true when adapter is powered ' +
16+
'on and it supports Bluetooth Low-Energy.');
17+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() is not affected by the powered state of ' +
8+
'the adapter.';
9+
10+
bluetooth_test(async () => {
11+
const fake_central =
12+
await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
13+
{
14+
const availability = await navigator.bluetooth.getAvailability();
15+
assert_true(
16+
availability,
17+
'getAvailability() resolves promise with true when adapter is ' +
18+
'powered on and it supports Bluetooth Low-Energy.');
19+
}
20+
21+
{
22+
await fake_central.setState('powered-off');
23+
const availability = await navigator.bluetooth.getAvailability();
24+
assert_true(
25+
availability,
26+
'getAvailability() resolves promise with true after adapter powered ' +
27+
'off.');
28+
}
29+
30+
{
31+
await fake_central.setState('powered-on');
32+
const availability = await navigator.bluetooth.getAvailability();
33+
assert_true(
34+
availability,
35+
'getAvailability() resolves promise with true when adapter is ' +
36+
'powered back on.');
37+
}
38+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with false after the powered ' +
8+
'on adapter is removed.';
9+
10+
bluetooth_test(async () => {
11+
const fake_central =
12+
await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
13+
let availability = await navigator.bluetooth.getAvailability();
14+
assert_true(
15+
availability,
16+
'getAvailability() resolves promise with true when adapter is powered ' +
17+
'on and it supports Bluetooth Low-Energy.');
18+
19+
await fake_central.setState('absent');
20+
availability = await navigator.bluetooth.getAvailability();
21+
assert_false(
22+
availability,
23+
'getAvailability() resolves promise with false after adapter has been ' +
24+
'has been removed.');
25+
}, test_desc);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// META: script=/resources/testharness.js
2+
// META: script=/resources/testharnessreport.js
3+
// META: script=/resources/testdriver.js
4+
// META: script=/resources/testdriver-vendor.js
5+
// META: script=/bluetooth/resources/bluetooth-helpers.js
6+
'use strict';
7+
const test_desc = 'getAvailability() resolves with false if called from a ' +
8+
'unique origin';
9+
const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
10+
'/bluetooth/resources/health-thermometer-iframe.html'
11+
let iframe = document.createElement('iframe');
12+
13+
bluetooth_test(async () => {
14+
await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
15+
await new Promise(resolve => {
16+
iframe.src = cross_origin_src;
17+
document.body.appendChild(iframe);
18+
iframe.addEventListener('load', resolve);
19+
});
20+
await new Promise(resolve => {
21+
callWithTrustedClick(
22+
() => iframe.contentWindow.postMessage({type: 'GetAvailability'}, '*'));
23+
24+
window.onmessage = messageEvent => {
25+
assert_equals(
26+
messageEvent.data, false,
27+
'getAvailability resolves to false when called from a unique ' +
28+
'origin.');
29+
resolve();
30+
};
31+
});
32+
}, test_desc);

bluetooth/resources/health-thermometer-iframe.html

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99

1010
window.addEventListener('message', (messageEvent) => {
1111
switch (messageEvent.data.type) {
12+
case 'GetAvailability':
13+
navigator.bluetooth.getAvailability().then(
14+
availability => parent.postMessage(availability, '*'));
15+
break;
1216
case 'RequestDevice':
1317
navigator.bluetooth
1418
.requestDevice({filters: [{services: ['generic_access']}]})

resources/chromium/web-bluetooth-test.js

+16-1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class FakeBluetooth {
8282
this.fake_bluetooth_ptr_ = new bluetooth.mojom.FakeBluetoothPtr();
8383
Mojo.bindInterface(bluetooth.mojom.FakeBluetooth.name,
8484
mojo.makeRequest(this.fake_bluetooth_ptr_).handle, 'process');
85+
this.fake_central_ = null;
8586
}
8687

8788
// Set it to indicate whether the platform supports BLE. For example,
@@ -105,12 +106,16 @@ class FakeBluetooth {
105106
// See Bluetooth 4.2 Vol 3 Part C 2.2.2 "Roles when Operating over an
106107
// LE Physical Transport".
107108
async simulateCentral({state}) {
109+
if (this.fake_central_)
110+
throw 'simulateCentral() should only be called once';
111+
108112
await this.setLESupported(true);
109113

110114
let {fakeCentral: fake_central_ptr} =
111115
await this.fake_bluetooth_ptr_.simulateCentral(
112116
toMojoCentralState(state));
113-
return new FakeCentral(fake_central_ptr);
117+
this.fake_central_ = new FakeCentral(fake_central_ptr);
118+
return this.fake_central_;
114119
}
115120

116121
// Returns true if there are no pending responses.
@@ -202,6 +207,16 @@ class FakeCentral {
202207
return this.fetchOrCreatePeripheral_(scanResult.deviceAddress);
203208
}
204209

210+
// Simulates a change in the central device described by |state|. For example,
211+
// setState('powered-off') can be used to simulate the central device powering
212+
// off.
213+
//
214+
// This method should be used for any central state changes after
215+
// simulateCentral() has been called to create a FakeCentral object.
216+
async setState(state) {
217+
await this.fake_central_ptr_.setState(toMojoCentralState(state));
218+
}
219+
205220
// Create a fake_peripheral object from the given address.
206221
fetchOrCreatePeripheral_(address) {
207222
let peripheral = this.peripherals_.get(address);

0 commit comments

Comments
 (0)