| <!DOCTYPE html> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="resources/fake-devices.js"></script> |
| <script src="resources/usb-helpers.js"></script> |
| <script src="resources/webusb-test.js"></script> |
| <script> |
| 'use strict'; |
| |
| function runIframeDisconnectTest(onDeviceConnected) { |
| return navigator.usb.test.initialize().then(() => { |
| return new Promise((resolve, reject) => { |
| let opened = false; |
| let fakeDeviceGuid = null; |
| |
| let iframe = document.createElement('iframe'); |
| iframe.src = 'resources/open-in-iframe.html'; |
| iframe.onload = () => { |
| navigator.usb.test.attachToWindow(iframe.contentWindow).then(() => { |
| iframe.contentWindow.postMessage('Ready', '*'); |
| }); |
| }; |
| |
| window.onmessage = messageEvent => { |
| if (messageEvent.data == 'Ready') { |
| fakeDeviceGuid = navigator.usb.test.addFakeDevice(fakeDeviceInit); |
| } else if (messageEvent.data == 'Success') { |
| opened = true; |
| onDeviceConnected(iframe); |
| } else { |
| reject(messageEvent.data); |
| } |
| }; |
| |
| navigator.usb.test.ondeviceclose = guid => { |
| assert_equals(guid, fakeDeviceGuid); |
| assert_true(opened); |
| resolve(); |
| }; |
| |
| document.body.appendChild(iframe); |
| }); |
| }); |
| } |
| |
| promise_test(() => { |
| return runIframeDisconnectTest(iframe => { |
| document.body.removeChild(iframe); |
| }); |
| }, 'detaching iframe disconnects device.'); |
| |
| promise_test(() => { |
| return runIframeDisconnectTest(iframe => { |
| iframe.src = 'about:blank'; |
| }); |
| }, 'navigating iframe disconnects device.'); |
| |
| promise_test(() => { |
| return navigator.usb.test.initialize().then(() => { |
| return new Promise((resolve, reject) => { |
| let opened = false; |
| let fakeDeviceGuid = null; |
| |
| let iframe = document.createElement('iframe'); |
| iframe.src = 'resources/open-in-iframe.html'; |
| iframe.onload = () => { |
| navigator.usb.test.attachToWindow(iframe.contentWindow).then(() => { |
| iframe.contentWindow.postMessage('Ready', '*'); |
| }); |
| }; |
| |
| window.onmessage = messageEvent => { |
| if (messageEvent.data == 'Ready') { |
| document.body.removeChild(iframe); |
| runGarbageCollection().then(() => { |
| navigator.usb.test.addFakeDevice(fakeDeviceInit); |
| resolve(); |
| }); |
| } else { |
| reject(messageEvent.data); |
| } |
| }; |
| |
| document.body.appendChild(iframe); |
| }); |
| }); |
| }, 'events are not delivered to detached frames'); |
| </script> |