/** * Hachette handling of page actions in content scripts * * Copyright (C) 2021 Wojtek Kosior * Redistribution terms are gathered in the `copyright' file. */ /* * IMPORTS_START * IMPORT CONNECTION_TYPE * IMPORT browser * IMPORT report_script * IMPORT report_settings * IMPORT report_document_type * IMPORTS_END */ let policy_received_callback; /* Snapshot url and content type early; these can be changed by other code. */ let url; let is_html; let port; let loaded = false; let scripts_awaiting = []; let nonce; function handle_message(message) { const [action, data] = message; if (action === "inject") { for (let script_text of data) { if (loaded) add_script(script_text); else scripts_awaiting.push(script_text); } } if (action === "settings") { report_settings(data); policy_received_callback({url, allow: data[1].allow}); } } function document_ready(event) { loaded = true; for (let script_text of scripts_awaiting) add_script(script_text); scripts_awaiting = undefined; } function add_script(script_text) { if (!is_html) return; let script = document.createElement("script"); script.textContent = script_text; script.setAttribute("nonce", nonce); script._hachette_payload = true; document.body.appendChild(script); report_script(script_text); } function handle_page_actions(script_nonce, policy_received_cb, doc_ready_promise) { policy_received_callback = policy_received_cb; url = document.URL; is_html = document instanceof HTMLDocument; report_document_type(is_html); doc_ready_promise.then(document_ready); port = browser.runtime.connect({name : CONNECTION_TYPE.PAGE_ACTIONS}); port.onMessage.addListener(handle_message); port.postMessage({url}); nonce = script_nonce; } /* * EXPORTS_START * EXPORT handle_page_actions * EXPORTS_END */