Source code
Revision control
Copy as Markdown
Other Tools
<!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>