diff options
Diffstat (limited to '')
-rw-r--r-- | testing/web-platform/tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.window.js | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/testing/web-platform/tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.window.js b/testing/web-platform/tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.window.js new file mode 100644 index 0000000000..b7f23a1491 --- /dev/null +++ b/testing/web-platform/tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.window.js @@ -0,0 +1,88 @@ +// 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); |