mirror of
https://github.com/servo/servo
synced 2026-05-14 19:06:31 +02:00
89 lines
3.1 KiB
JavaScript
89 lines
3.1 KiB
JavaScript
// META: script=/resources/testdriver.js
|
|
// META: script=/resources/testdriver-vendor.js
|
|
// META: script=/bluetooth/resources/bluetooth-test.js
|
|
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
|
|
'use strict';
|
|
const test_desc = 'Two iframes in the same origin should be able to access ' +
|
|
'each other\'s services';
|
|
|
|
const iframe1 = document.createElement('iframe');
|
|
const iframe2 = document.createElement('iframe');
|
|
|
|
function add_iframe(iframe) {
|
|
let promise =
|
|
new Promise(resolve => iframe.addEventListener('load', resolve));
|
|
iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
|
|
document.body.appendChild(iframe);
|
|
return promise;
|
|
}
|
|
|
|
function send_message(iframe, command, arg, assert_func) {
|
|
let promise = new Promise((resolve, reject) => {
|
|
window.addEventListener('message', (messageEvent) => {
|
|
try {
|
|
assert_func(messageEvent.data);
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
resolve();
|
|
}, {once: true});
|
|
});
|
|
if (command === 'RequestAndConnect') {
|
|
arg = {filters: [{services: [arg]}]};
|
|
}
|
|
callWithTrustedClick(
|
|
() => iframe.contentWindow.postMessage(
|
|
{
|
|
type: command,
|
|
options: arg,
|
|
},
|
|
'*'));
|
|
return promise;
|
|
}
|
|
|
|
bluetooth_test(async () => {
|
|
await getHealthThermometerDevice();
|
|
// 1. Add the first iframe.
|
|
await add_iframe(iframe1);
|
|
// 2. Connect with the first iframe, requesting the health
|
|
// thermometer service.
|
|
await send_message(
|
|
iframe1, 'RequestAndConnect', 'health_thermometer',
|
|
msg => assert_equals(msg, 'Connected'));
|
|
// 3. Access the health thermometer service with the first iframe
|
|
// (successfully).
|
|
await send_message(
|
|
iframe1, 'GetService', 'health_thermometer',
|
|
msg => assert_equals(msg, 'ServiceReceived'));
|
|
// 4. Access the generic access service with the first iframe
|
|
// (unsuccessfully).
|
|
await send_message(iframe1, 'GetService', 'generic_access', msg => {
|
|
let split_msg = msg.split(': ');
|
|
assert_equals(split_msg[0], 'FAIL');
|
|
assert_equals(split_msg[1], 'SecurityError');
|
|
});
|
|
// 5. Add the second iframe.
|
|
await add_iframe(iframe2);
|
|
// 6. Connect with the second iframe, requesting the generic
|
|
// access service.
|
|
await send_message(
|
|
iframe2, 'RequestAndConnect', 'generic_access',
|
|
msg => assert_equals(msg, 'Connected'));
|
|
// 7. Access the health thermometer service with the second iframe
|
|
// (successfully). Both iframes should have access to both
|
|
// services at this point since they have the same origin.
|
|
await send_message(
|
|
iframe2, 'GetService', 'health_thermometer',
|
|
msg => assert_equals(msg, 'ServiceReceived'));
|
|
// 8. Access the generic access service with the second iframe
|
|
// (unsuccessfully).
|
|
await send_message(
|
|
iframe2, 'GetService', 'generic_access',
|
|
msg => assert_equals(msg, 'ServiceReceived'));
|
|
// 9. Access the generic access service with the first iframe
|
|
// (successfully).
|
|
await send_message(
|
|
iframe1, 'GetService', 'generic_access',
|
|
msg => assert_equals(msg, 'ServiceReceived'));
|
|
}, test_desc);
|