зеркало из https://github.com/mozilla/gecko-dev.git
66 строки
1.6 KiB
JavaScript
66 строки
1.6 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
/* globals browser */
|
|
|
|
if (!window.Shims) {
|
|
window.Shims = new Map();
|
|
}
|
|
|
|
if (!window.ShimsHelperReady) {
|
|
window.ShimsHelperReady = true;
|
|
|
|
browser.runtime.onMessage.addListener(details => {
|
|
const { shimId, warning } = details;
|
|
if (!shimId) {
|
|
return;
|
|
}
|
|
window.Shims.set(shimId, details);
|
|
if (warning) {
|
|
console.warn(warning);
|
|
}
|
|
});
|
|
|
|
async function handleMessage(port, shimId, messageId, message) {
|
|
let response;
|
|
const shim = window.Shims.get(shimId);
|
|
if (shim) {
|
|
const { needsShimHelpers, origin } = shim;
|
|
if (origin === location.origin) {
|
|
if (needsShimHelpers?.includes(message)) {
|
|
const msg = { shimId, message };
|
|
try {
|
|
response = await browser.runtime.sendMessage(msg);
|
|
} catch (_) {}
|
|
}
|
|
}
|
|
}
|
|
port.postMessage({ messageId, response });
|
|
}
|
|
|
|
window.addEventListener(
|
|
"ShimConnects",
|
|
e => {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
const { port, pendingMessages, shimId } = e.detail;
|
|
const shim = window.Shims.get(shimId);
|
|
if (!shim) {
|
|
return;
|
|
}
|
|
port.onmessage = ({ data }) => {
|
|
handleMessage(port, shimId, data.messageId, data.message);
|
|
};
|
|
for (const [messageId, message] of pendingMessages) {
|
|
handleMessage(port, shimId, messageId, message);
|
|
}
|
|
},
|
|
true
|
|
);
|
|
|
|
window.dispatchEvent(new CustomEvent("ShimHelperReady"));
|
|
}
|