tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>