usbDevice-iframe.https.html (2852B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/resources/test-only-api.js"></script> 5 <script src="resources/fake-devices.js"></script> 6 <script src="resources/usb-helpers.js"></script> 7 <script> 8 'use strict'; 9 10 async function sleep(timeout) { 11 return new Promise(resolve => { 12 step_timeout(() => { 13 resolve(); 14 }, timeout); 15 }); 16 } 17 18 async function connectInIframe() { 19 let iframe = document.createElement('iframe'); 20 let opened = false; 21 22 iframe.src = 'resources/open-in-iframe.html'; 23 document.body.appendChild(iframe); 24 25 await navigator.usb.test.attachToContext(iframe); 26 function nextIFrameMessage() { 27 return new Promise(resolve => window.addEventListener( 28 'message', e => resolve(e.data))); 29 } 30 iframe.contentWindow.postMessage('ConnectEvent', '*'); 31 32 assert_equals('Ready', (await nextIFrameMessage())); 33 let fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceInit); 34 let closedPromise = new Promise(resolve => fakeDevice.onclose = resolve) 35 .then(() => assert_true(opened)); 36 37 assert_equals('Success', (await nextIFrameMessage())); 38 opened = true; 39 return { iframe, closedPromise }; 40 } 41 42 usb_test(async () => { 43 let { iframe, closedPromise } = await connectInIframe(); 44 document.body.removeChild(iframe); 45 await closedPromise; 46 }, 'detaching iframe disconnects device.'); 47 48 usb_test(async () => { 49 let { iframe, closedPromise } = await connectInIframe(); 50 iframe.src = 'about:blank'; 51 await closedPromise; 52 }, 'navigating iframe disconnects device.'); 53 54 usb_test(async (t) => { 55 let iframe = document.createElement('iframe'); 56 iframe.src = 'resources/open-in-iframe.html'; 57 iframe.allow = 'usb \'none\''; 58 59 await Promise.all([ 60 new Promise(resolve => { 61 document.body.appendChild(iframe); 62 iframe.addEventListener('load', resolve); 63 }), 64 // This will wait for ReadyForAttachment event from iframe loading. 65 navigator.usb.test.attachToContext(iframe), 66 ]); 67 68 let messageWatcher = new EventWatcher(t, window, 'message'); 69 iframe.contentWindow.postMessage('ConnectEvent', '*'); 70 let messageEvent = await messageWatcher.wait_for('message'); 71 assert_equals(messageEvent.data, 'Ready'); 72 73 // This isn't necessary as the expected scenario shouldn't send any mojo 74 // request. However, in order to capture a bug that doesn't reject adding 75 // event listener, time delay here is to allow mojo request to be intercepted 76 // after iframe adding connect event listener. 77 await sleep(100); 78 79 // If device connect event fires, EventWatcher will assert for an unexpected 80 // event. 81 navigator.usb.test.addFakeDevice(fakeDeviceInit); 82 // Time delay here is to allow event to be fired if any. 83 await sleep(100); 84 }, 'Connect event is not fired in iframe with usb disallowed.'); 85 86 </script>