lodewallet-xcode/static/js/02m00yk5jgcp2qkmim0yh7gz0g9zzfari38wyqv0fp2hl5zbvk6h-content.js

90 lines
3.6 KiB
JavaScript
Raw Normal View History

2023-01-19 19:08:25 +00:00
// This content script acts as a relay to send messages to and from the
// background script. Webpage scripts can call `window.postMessage` to send a
// message to the content script which will be caught by this handler, which
// will then forward that message to the background script using inter-script
// message passing.
//
// When the content script receives a response from the background script, it
// will use the same `window.postMessage` api to send that message back to the
// client page (which should also have a message event listener that filters
// for events with the property `event.data.responseFromExtension == true`).
//
// To ensure that the content script doesn't send its own message (intended for
// the webpage script) to the background script, it creates an envelope with
// two fields: `responseFromExtension` and `response`. `responseFromExtension`
// will be set to true, indicating that this shouldn't be forwarded to the
// background script. The `response` field will contain whatever data the
// background script sent in response to the initial message.
window.addEventListener("message", async function(event) {
log("CONTENT MSG EVENT")
log(event.data)
var d = event.data;
if (event.source == window && d) { // Ignore events with no data field and coming from other sources
if (d._sourceIsExtension) { // If the message we just received came from the extension, don't relay
} else { // If the message didn't come from the extension, relay it to the background script
if (d.target == "lode") { // MESSAGE SEND BY DAPP
log("CONTENT SEND MSG")
if (!checkIsPublic(d.data)) {
const isEnabled = await (
new Promise((res) => {
chrome.runtime.sendMessage(["LodePublic_IsEnabled", "stub"], (response) => res(response.response))
})
);
if (!isEnabled) {
const error = { code: -3, info: "Site not enabled." };
window.postMessage({_sourceIsExtension: true, id: d.id, response: undefined, error: error }, "*");
return;
}
}
chrome.runtime.sendMessage(d.data, function(response) {
log("CONTENT RESPONSE")
log(response)
window.postMessage({_sourceIsExtension: true, id: d.id, response: response ? response.response : undefined, error: response ? (response.error ? response.error.external : undefined) : undefined }, "*");
});
}
}
}
})
const PUBLIC_API = new Set(["LodePublic_Enable", "LodePublic_IsEnabled", "LodePublic_GetWalletIdentity"])
const checkIsPublic = (request) => {
if (Array.isArray(request) && request.length == 2) {
return PUBLIC_API.has(request[0]);
}
return false;
};
const VERBOSE = false;
const log = (msg) => VERBOSE && console.log(msg);
const injectScript = () => {
const script = document.createElement('script');
script.async = false;
script.src = chrome.runtime.getURL('injected.js');
script.onload = function () {
this.remove();
};
(document.head || document.documentElement).appendChild(script);
};
function shouldInject() {
const documentElement = document.documentElement.nodeName;
const docElemCheck = documentElement
? documentElement.toLowerCase() === 'html'
: true;
const { docType } = window.document;
const docTypeCheck = docType ? docType.name === 'html' : true;
return docElemCheck && docTypeCheck;
}
if (shouldInject()) {
injectScript();
}
// TODO clean-up this mess ; quick means to tell the tab to reset its wallet endpoint
chrome.runtime.onMessage.addListener(request => {
window.postMessage({_sourceIsExtension: true, id: null, prompt: "LodePrompt_CheckWalletIdentity"}, "*");
return;
});