92 lines
3.3 KiB
HTML
92 lines
3.3 KiB
HTML
<!DOCTYPE html>
|
|
<script src="/resources/testdriver.js"></script>
|
|
<script src="/resources/testdriver-vendor.js"></script>
|
|
<body>
|
|
<button>Click me!</button>
|
|
<script>
|
|
let device, gatt;
|
|
|
|
test_driver.set_test_context(parent);
|
|
|
|
function requestDeviceWithOptionsAndConnect(options) {
|
|
return test_driver.click(document.getElementsByTagName("button")[0])
|
|
.then(() => navigator.bluetooth.requestDevice(options))
|
|
.then(device => device.gatt.connect());
|
|
}
|
|
|
|
window.addEventListener('message', (messageEvent) => {
|
|
switch (messageEvent.data.type) {
|
|
case 'GetAvailability':
|
|
navigator.bluetooth.getAvailability()
|
|
.then(availability => parent.postMessage(availability, '*'))
|
|
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
|
|
break;
|
|
case 'GetDevices':
|
|
navigator.bluetooth.getDevices()
|
|
.then(devices => parent.postMessage('Success', '*'))
|
|
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
|
|
break;
|
|
case 'RequestDevice':
|
|
test_driver.click(document.getElementsByTagName('button')[0])
|
|
.then(
|
|
() => navigator.bluetooth.requestDevice(
|
|
{filters: [{services: ['generic_access']}]}))
|
|
.then(device => {
|
|
if (device.constructor.name === 'BluetoothDevice') {
|
|
parent.postMessage('Success', '*');
|
|
} else {
|
|
parent.postMessage(
|
|
`FAIL: requestDevice in iframe returned ${device.name}`, '*');
|
|
}
|
|
})
|
|
.catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
|
|
break;
|
|
case 'RequestLEScan':
|
|
test_driver.click(document.getElementsByTagName('button')[0])
|
|
.then(
|
|
() => navigator.bluetooth.requestLEScan(
|
|
{filters: [{name: 'Health Thermometer'}]}))
|
|
.then(leScan => {
|
|
if (leScan.active) {
|
|
parent.postMessage('Success', '*');
|
|
leScan.stop();
|
|
} else {
|
|
parent.postMessage(`FAIL: the LE scan hasn't been initiated.`, '*');
|
|
}
|
|
})
|
|
.catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
|
|
break;
|
|
case 'RequestAndConnect':
|
|
requestDeviceWithOptionsAndConnect(messageEvent.data.options)
|
|
.then(_ => {
|
|
gatt = _;
|
|
device = gatt.device;
|
|
parent.postMessage('Connected', '*');
|
|
})
|
|
.catch(err => {
|
|
parent.postMessage(`FAIL: ${err}`, '*');
|
|
});
|
|
break;
|
|
case 'DiscoverServices':
|
|
requestDeviceWithOptionsAndConnect(messageEvent.data.options)
|
|
.then(gatt => gatt.getPrimaryServices())
|
|
.then(() => parent.postMessage('DiscoveryComplete', '*'))
|
|
.catch(err => {
|
|
parent.postMessage(`FAIL: ${err}`, '*');
|
|
});
|
|
break;
|
|
case 'GetService':
|
|
if (typeof gatt === 'undefined') {
|
|
parent.postMessage('FAIL: no GATT server', '*');
|
|
break;
|
|
}
|
|
gatt.getPrimaryService(messageEvent.data.options)
|
|
.then(() => parent.postMessage('ServiceReceived', '*'))
|
|
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
|
|
break;
|
|
default:
|
|
parent.postMessage(
|
|
`FAIL: Bad message type: ${messageEvent.data.type}`, '*');
|
|
}
|
|
});
|
|
</script>
|