/* This file is part of GNU Taler (C) 2022 Taler Systems S.A. GNU Taler is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ import { CoreApiResponse } from "@gnu-taler/taler-util"; /** * This will modify all the pages that the user load when navigating with Web Extension enabled * * Can't do useful integration since it run in ISOLATED (or equivalent) mode. * * If taler support is expected, it will inject a script which will complete the integration. */ // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities#content_script_environment // ISOLATED mode in chromium browsers // https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/core/v8/V8BindingDesign.md#world // X-Ray vision in Firefox // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts#xray_vision_in_firefox // *** IMPORTANT *** // Content script lifecycle during navigation // In Firefox: Content scripts remain injected in a web page after the user has navigated away, // however, window object properties are destroyed. // In Chrome: Content scripts are destroyed when the user navigates away from a web page. const documentDocTypeIsHTML = window.document.doctype && window.document.doctype.name === "html"; const suffixIsNotXMLorPDF = !window.location.pathname.endsWith(".xml") && !window.location.pathname.endsWith(".pdf"); const rootElementIsHTML = document.documentElement.nodeName && document.documentElement.nodeName.toLowerCase() === "html"; const pageAcceptsTalerSupport = document.head.querySelector( "meta[name=taler-support]", ); // safe check, if one of this is true then taler handler is not useful // or not expected const shouldNotInject = !documentDocTypeIsHTML || !suffixIsNotXMLorPDF || // !pageAcceptsTalerSupport || FIXME: removing this before release for testing !rootElementIsHTML; const logger = { debug: (...msg: any[]) => {}, info: (...msg: any[]) => console.log(`${new Date().toISOString()} TALER`, ...msg), error: (...msg: any[]) => console.error(`${new Date().toISOString()} TALER`, ...msg), }; async function start() { if (shouldNotInject) { return; } const debugEnabled = pageAcceptsTalerSupport?.getAttribute("debug") === "true"; if (debugEnabled) { logger.debug = logger.info; } createBridgeWithExtension(); logger.debug("bridged created"); const shouldInject = await callBackground("isInjectionEnabled", undefined); if (shouldInject) { injectTalerSupportScript(debugEnabled); logger.debug("injection completed"); } else { logger.debug("injection is not enabled"); } } /** * Create a