Source code

Revision control

Copy as Markdown

Other Tools

'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.
try {
await navigator.usb.getDevices();
} catch (e) {
// This can happen in case of, for example, testing usb disallowed
// iframe.
console.error(`getDevices() throws error: ${e.name}: ${e.message}`);
}
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]);
}
}
})();