Commit 4679d930 authored by Ovidio Henriquez's avatar Ovidio Henriquez Committed by Commit Bot

bluetooth: Migrate requestDevice tests

This change migrates the requestDevice tests to wpt/.

BUG=509038

Change-Id: I0e7647be7525031aaedc76d3f0396305ae4070f0
Reviewed-on: https://chromium-review.googlesource.com/837581
Commit-Queue: Ovidio Henriquez <odejesush@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarConley Owens <cco3@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532456}
parent 3816bbea
...@@ -73,7 +73,8 @@ crbug.com/585188 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitel ...@@ -73,7 +73,8 @@ crbug.com/585188 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitel
# https://crbug.com/601584 - No OOPIF support for UserGestureIndicator triggers # https://crbug.com/601584 - No OOPIF support for UserGestureIndicator triggers
# cross-origin-iframe.html layout test failure # cross-origin-iframe.html layout test failure
crbug.com/601584 http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Skip ] crbug.com/601584 external/wpt/http/tests/bluetooth/https/requestDevice/cross-origin-iframe.sub.https.html [ Skip ]
crbug.com/601584 virtual/outofblink-cors/external/wpt/http/tests/bluetooth/https/requestDevice/cross-origin-iframe.sub.https.html [ Skip ]
# https://crbug.com/606594 - UaF of delegate_ in WebFrameTestClient::willSendRequest # https://crbug.com/606594 - UaF of delegate_ in WebFrameTestClient::willSendRequest
# https://crbug.com/786510 - test tries to access cross-origin document body # https://crbug.com/786510 - test tries to access cross-origin document body
......
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return setUpPreconnectedDevice({
knownServiceUUIDs: ['human_interface_device']})
.then(() => assert_promise_rejects_with_message(
requestDeviceWithTrustedClick({
filters: [{services: ['human_interface_device']}]}),
new DOMException(
'requestDevice() called with a filter containing a blocklisted UUID. ' +
'https://goo.gl/4NeimX',
'SecurityError'),
'Requesting blocklisted service rejects.'));
}, 'Reject with SecurityError if requesting a blocklisted service.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
let expected = new DOMException('Origin is not allowed to access the ' +
'service. Tip: Add the service UUID to ' +
'\'optionalServices\' in requestDevice() ' +
'options. https://goo.gl/HxfxSQ',
'SecurityError');
return getDiscoveredHealthThermometerDevice({
filters: [{services: ['health_thermometer']}],
optionalServices: ['human_interface_device']
})
.then(({device, fake_peripheral}) => {
return fake_peripheral
.setNextGATTConnectionResponse({code: HCI_SUCCESS})
.then(() => device.gatt.connect())
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS}))
.then(() => Promise.all([
assert_promise_rejects_with_message(
device.gatt.getPrimaryService('human_interface_device'),
expected, 'Blocklisted service not accessible.'),
assert_promise_rejects_with_message(
device.gatt.getPrimaryServices('human_interface_device'),
expected, 'Blocklisted services not accessible.')]));
});
}, 'Blocklisted UUID in optionalServices is removed and access not granted.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(t => {
return navigator.bluetooth.test.setLESupported(false)
.then(() => promise_rejects(t, 'NotFoundError',
requestDeviceWithTrustedClick({acceptAllDevices: true})));
}, 'Reject with NotFoundError if bluetooth is not supported.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return setUpPreconnectedDevice({name: ''})
.then(() => requestDeviceWithTrustedClick({filters: [{name: ''}]}))
.then(device => {
assert_equals(device.name, '');
});
}, 'An empty name device can be obtained by empty name filter.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(t => {
return setUpHealthThermometerAndHeartRateDevices()
.then(() => promise_rejects(
t, 'SecurityError', navigator.bluetooth.requestDevice({
filters: [{services: ['heart_rate']}]})));
}, 'Requires a user gesture.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return navigator.bluetooth.test.simulateCentral({state: 'absent'})
.then(() => assert_promise_rejects_with_message(
requestDeviceWithTrustedClick({filters: [{services: ['generic_access']}]}),
new DOMException('Bluetooth adapter not available.', 'NotFoundError'),
'Bluetooth adapter is not present.'));
}, 'Reject with NotFoundError if there is no BT radio present.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Concurrent requestDevice calls in iframes work.';
const iframes = [];
for (let i = 0; i < 5; i++) {
iframes.push(document.createElement('iframe'));
}
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
// 1. Load the iframes.
.then(() => {
let promises = [];
for (let iframe of iframes) {
iframe.src = '../../resources/bluetooth/requestDevice-in-iframe.html';
document.body.appendChild(iframe);
promises.push(new Promise(resolve =>
iframe.addEventListener('load', resolve)));
}
return Promise.all(promises);
})
// 2. Request the device from the iframes.
.then(() => new Promise(async (resolve) => {
let numMessages = 0;
window.onmessage = messageEvent => {
assert_equals(messageEvent.data, 'Success');
if (++numMessages === iframes.length) {
resolve();
}
}
for (let iframe of iframes) {
await callWithTrustedClick(
() => iframe.contentWindow.postMessage('Go', '*'));
}
})), test_desc);
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<body>
<script>
'use strict';
const test_desc = 'Request device from a unique origin. ' +
'Should reject with SecurityError.';
let iframe = document.createElement('iframe');
bluetooth_test(() => getHealthThermometerDevice()
// 1. Load the iframe.
.then(() => new Promise(resolve => {
iframe.sandbox.add('allow-scripts');
iframe.src = '../../resources/bluetooth/requestDevice-in-iframe.html';
document.body.appendChild(iframe);
iframe.addEventListener('load', resolve);
}))
// 2. Request the device from the iframe.
.then(() => new Promise(resolve => {
callWithTrustedClick(() => {
iframe.contentWindow.postMessage('Go', '*');
});
window.onmessage = messageEvent => {
assert_equals(messageEvent.data, 'SecurityError: requestDevice() ' +
'called from cross-origin iframe.');
resolve();
}
})), test_desc);
</script>
</body>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
let devices = [];
let push = device => devices.push(device);
return setUpHealthThermometerAndHeartRateDevices()
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.alias]}]}))
.then(push)
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.name]}]}))
.then(push)
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.uuid]}]}))
.then(push)
.then(() => {
assert_equals(devices[0], devices[1]);
assert_equals(devices[1], devices[2]);
});
}, 'Returned device should always be the same.');
</script>
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return setUpHealthThermometerAndHeartRateDevices()
.then(() => requestDeviceWithTrustedClick({
filters: [{services: ['health_thermometer']}]}))
.then(device => assert_equals(device.name, 'Health Thermometer'));
}, 'Simple filter selects matching device.');
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Reject with SecurityError if requesting a blocklisted ' +
'service.';
const expected = new DOMException(
'requestDevice() called with a filter containing a blocklisted UUID. ' +
'https://goo.gl/4NeimX',
'SecurityError');
bluetooth_test(() => setUpPreconnectedDevice({
knownServiceUUIDs: ['human_interface_device']
})
.then(() => assert_promise_rejects_with_message(
requestDeviceWithTrustedClick({
filters: [{services: ['human_interface_device']}]
}),
expected, 'Requesting blocklisted service rejects.')),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Blocklisted UUID in optionalServices is removed and ' +
'access not granted.';
const expected = new DOMException('Origin is not allowed to access the ' +
'service. Tip: Add the service UUID to \'optionalServices\' in ' +
'requestDevice() options. https://goo.gl/HxfxSQ',
'SecurityError');
let device, fake_peripheral;
bluetooth_test(() => getDiscoveredHealthThermometerDevice({
filters: [{services: ['health_thermometer']}],
optionalServices: ['human_interface_device']
})
.then(_ => ({device, fake_peripheral} = _))
.then(() =>
fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
.then(() => device.gatt.connect())
.then(() =>
fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
.then(() => Promise.all([
assert_promise_rejects_with_message(
device.gatt.getPrimaryService('human_interface_device'),
expected, 'Blocklisted service not accessible.'),
assert_promise_rejects_with_message(
device.gatt.getPrimaryServices('human_interface_device'),
expected, 'Blocklisted services not accessible.')])),
test_desc);
</script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
bluetooth_test(t => { const test_desc = 'Consumes a user gesture.';
return setUpHealthThermometerAndHeartRateDevices() const expected = new DOMException(
'Must be handling a user gesture to show a permission request.',
'SecurityError');
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
.then(() => callWithTrustedClick(() => { .then(() => callWithTrustedClick(() => {
var first = navigator.bluetooth.requestDevice({ let first = navigator.bluetooth.requestDevice({
filters: [{services: ['heart_rate']}]}); filters: [{services: ['heart_rate']}]});
var second = navigator.bluetooth.requestDevice({ let second = navigator.bluetooth.requestDevice({
filters: [{services: ['heart_rate']}]}); filters: [{services: ['heart_rate']}]});
return Promise.all([ return Promise.all([
first.then(device => assert_equals( first.then(device => assert_equals(
device.constructor.name, 'BluetoothDevice')), device.constructor.name, 'BluetoothDevice')),
promise_rejects(t, 'SecurityError', second) assert_promise_rejects_with_message(second,
expected, 'A request should consume a user gesture')
]); ]);
})); })), test_desc);
}, 'Consumes a user gesture.');
</script> </script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
const test_desc = 'Discover a device using alias, name, or UUID.'; const test_desc = 'Discover a device using alias, name, or UUID.';
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../resources/bluetooth/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
const test_desc = 'Matches a filter if all present members match.'; const test_desc = 'Matches a filter if all present members match.';
...@@ -51,18 +50,18 @@ let test_specs = [{ ...@@ -51,18 +50,18 @@ let test_specs = [{
}]; }];
bluetooth_test(() => setUpHealthThermometerDevice() bluetooth_test(() => setUpHealthThermometerDevice()
.then(() => { .then(() => {
let test_promises = Promise.resolve(); let test_promises = Promise.resolve();
test_specs.forEach(args => { test_specs.forEach(args => {
test_promises = test_promises test_promises = test_promises
.then(() => requestDeviceWithTrustedClick(args)) .then(() => requestDeviceWithTrustedClick(args))
.then(device => { .then(device => {
// We always have access to the services in matching_services // We always have access to the services in matching_services
// because we include them in a filter or in optionalServices. // because we include them in a filter or in optionalServices.
assert_equals(device.name, matching_name); assert_equals(device.name, matching_name);
assert_true(device.name.startsWith(matching_namePrefix)); assert_true(device.name.startsWith(matching_namePrefix));
}); });
}); });
return test_promises; return test_promises;
}), test_desc); }), test_desc);
</script> </script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if Bluetooth is not supported.';
const expected = new DOMException('Bluetooth Low Energy not available.',
'NotFoundError');
bluetooth_test(() => navigator.bluetooth.test.setLESupported(false)
.then(() => assert_promise_rejects_with_message(
requestDeviceWithTrustedClick({acceptAllDevices: true}),
expected, 'Bluetooth Low Energy is not supported.')),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'An empty name device can be obtained by empty name filter.'
bluetooth_test(() => setUpPreconnectedDevice({name: ''})
.then(() => requestDeviceWithTrustedClick({filters: [{name: ''}]}))
.then(device => assert_equals(device.name, '')),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Requires a user gesture.';
const expected = new DOMException(
'Must be handling a user gesture to show a permission request.',
'SecurityError');
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
.then(() => assert_promise_rejects_with_message(
navigator.bluetooth.requestDevice({filters:[{services:['heart_rate']}]}),
expected, 'User gesture is required')),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if there is no BT radio present.';
const expected = new DOMException('Bluetooth adapter not available.',
'NotFoundError');
bluetooth_test(() => navigator.bluetooth.test.simulateCentral({state: 'absent'})
.then(() => assert_promise_rejects_with_message(
requestDeviceWithTrustedClick({
filters: [{services: ['generic_access']}]
}),
expected, 'Bluetooth adapter is not present.')),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Concurrent requestDevice calls in iframes work.';
const iframes = [];
for (let i = 0; i < 5; i++) {
iframes.push(document.createElement('iframe'));
}
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
// 1. Load the iframes.
.then(() => {
let promises = [];
for (let iframe of iframes) {
iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
document.body.appendChild(iframe);
promises.push(new Promise(resolve =>
iframe.addEventListener('load', resolve)));
}
return Promise.all(promises);
})
// 2. Request the device from the iframes.
.then(() => new Promise(async (resolve) => {
let numMessages = 0;
window.onmessage = messageEvent => {
assert_equals(messageEvent.data, 'Success');
if (++numMessages === iframes.length) {
resolve();
}
}
for (let iframe of iframes) {
await callWithTrustedClick(() => iframe.contentWindow.postMessage({
type: 'RequestDevice'
}, '*'));
}
})), test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<body>
<script>
'use strict';
const test_desc = 'Request device from a unique origin. ' +
'Should reject with SecurityError.';
const expected = 'SecurityError: requestDevice() called from cross-origin ' +
'iframe.';
let iframe = document.createElement('iframe');
bluetooth_test(() => getHealthThermometerDevice()
// 1. Load the iframe.
.then(() => new Promise(resolve => {
iframe.sandbox.add('allow-scripts');
iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
document.body.appendChild(iframe);
iframe.addEventListener('load', resolve);
}))
// 2. Request the device from the iframe.
.then(() => new Promise(resolve => {
callWithTrustedClick(() => {
iframe.contentWindow.postMessage({
type: 'RequestDevice'
}, '*');
});
window.onmessage = messageEvent => {
assert_equals(messageEvent.data, expected);
resolve();
}
})), test_desc);
</script>
</body>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Returned device should always be the same.';
let devices = [];
let push = device => devices.push(device);
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.alias]}]
}))
.then(push)
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.name]}]
}))
.then(push)
.then(() => requestDeviceWithTrustedClick({
filters: [{services: [heart_rate.uuid]}]
}))
.then(push)
.then(() => {
assert_equals(devices[0], devices[1]);
assert_equals(devices[1], devices[2]);
}), test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
const test_desc = 'Simple filter selects matching device.';
bluetooth_test(() => setUpHealthThermometerAndHeartRateDevices()
.then(() => requestDeviceWithTrustedClick({
filters: [{services: ['health_thermometer']}]
}))
.then(device => assert_equals(device.name, 'Health Thermometer')),
test_desc);
</script>
...@@ -9,6 +9,19 @@ function requestDeviceWithOptionsAndConnect(options) { ...@@ -9,6 +9,19 @@ function requestDeviceWithOptionsAndConnect(options) {
window.addEventListener('message', (messageEvent) => { window.addEventListener('message', (messageEvent) => {
switch (messageEvent.data.type) { switch (messageEvent.data.type) {
case 'RequestDevice':
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(`${err.name}: ${err.message}`,
'*'));
break;
case 'RequestAndConnect': case 'RequestAndConnect':
requestDeviceWithOptionsAndConnect(messageEvent.data.options) requestDeviceWithOptionsAndConnect(messageEvent.data.options)
.then(_ => { .then(_ => {
...@@ -38,7 +51,7 @@ window.addEventListener('message', (messageEvent) => { ...@@ -38,7 +51,7 @@ window.addEventListener('message', (messageEvent) => {
break; break;
default: default:
parent.postMessage(`FAIL: Bad message type: ${messageEvent.data.type}`, parent.postMessage(`FAIL: Bad message type: ${messageEvent.data.type}`,
'*'); '*');
} }
}); });
</script> </script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="/js-test-resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/js-test-resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/js-test-resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="/js-test-resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth-resources/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<body> <body>
<script> <script>
'use strict'; 'use strict';
const test_desc = 'Request device from a unique origin. ' + const test_desc = 'Request device from a unique origin. ' +
'Should reject with SecurityError.'; 'Should reject with SecurityError.';
const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
'/bluetooth/resources/health-thermometer-iframe.html'
let iframe = document.createElement('iframe'); let iframe = document.createElement('iframe');
bluetooth_test(() => setUpConnectableHealthThermometerDevice() bluetooth_test(() => setUpConnectableHealthThermometerDevice()
// 1. Load the iframe. // 1. Load the iframe.
.then(() => new Promise(resolve => { .then(() => new Promise(resolve => {
iframe.src = 'https://localhost:8443/js-test-resources/bluetooth/' + iframe.src = cross_origin_src;
'requestDevice-in-iframe.html';
document.body.appendChild(iframe); document.body.appendChild(iframe);
iframe.addEventListener('load', resolve); iframe.addEventListener('load', resolve);
})) }))
// 2. Request the device from the iframe. // 2. Request the device from the iframe.
.then(() => new Promise(resolve => { .then(() => new Promise(resolve => {
callWithTrustedClick(() => { callWithTrustedClick(() => {
iframe.contentWindow.postMessage('Go', '*'); iframe.contentWindow.postMessage({
type: 'RequestDevice'
}, '*');
}); });
window.onmessage = messageEvent => { window.onmessage = messageEvent => {
......
# TEAM: web-bluetooth@chromium.org
# COMPONENT: Blink>Bluetooth
<!DOCTYPE html>
<script>
window.onmessage = messageEvent => {
// For requestDevice to work, 'Go' should be sent while
// handling a user gesture.
if (messageEvent.data !== 'Go') {
console.error(messageEvent.data);
}
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, '*');
}
}).catch(err => {
parent.postMessage(err.name + ': ' + err.message, '*');
});
};
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment