Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// 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);