| 'use strict'; |
| |
| // This polyfill prepares a child context to be attached to a parent context. |
| // The parent must call navigator.usb.test.attachToContext() to attach to the |
| // child context. |
| (() => { |
| if (this.constructor.name === 'DedicatedWorkerGlobalScope' || |
| this !== window.top) { |
| |
| // Run Chromium specific set up code. |
| if (typeof MojoInterfaceInterceptor !== 'undefined') { |
| let messageChannel = new MessageChannel(); |
| messageChannel.port1.onmessage = async (messageEvent) => { |
| if (messageEvent.data.type === 'Attach') { |
| messageEvent.data.interfaces.forEach(interfaceName => { |
| let interfaceInterceptor = |
| new MojoInterfaceInterceptor(interfaceName); |
| interfaceInterceptor.oninterfacerequest = |
| e => messageChannel.port1.postMessage({ |
| type: interfaceName, |
| handle: e.handle |
| }, [e.handle]); |
| interfaceInterceptor.start(); |
| }); |
| |
| // Wait for a call to GetDevices() to ensure that the interface |
| // handles are forwarded to the parent context. |
| await navigator.usb.getDevices(); |
| messageChannel.port1.postMessage({ type: 'Complete' }); |
| } |
| }; |
| |
| let message = { type: 'ReadyForAttachment', port: messageChannel.port2 }; |
| if (typeof Window !== 'undefined') |
| parent.postMessage(message, '*', [messageChannel.port2]); |
| else |
| postMessage(message, [messageChannel.port2]); |
| } |
| } |
| })(); |