Index: gc_lang/fr/webext/content_scripts/event.js ================================================================== --- gc_lang/fr/webext/content_scripts/event.js +++ gc_lang/fr/webext/content_scripts/event.js @@ -41,11 +41,11 @@ return dataToSend.IdAction; } // ! Envoie de l'information que l'injection est bien faite ;) // (peut être lu aussi bien par la page web que le content script) -var customAPILoaded = new CustomEvent("GrammalecteIsLoaded"); +var customAPILoaded = new CustomEvent("GLInjectedScriptIsReady"); document.dispatchEvent(customAPILoaded); // Gros Hack : Auto add a button in tinymce ;) // Page to test v4 https://www.quackit.com/html/html_editors/tinymce_editor.cfm @@ -114,11 +114,11 @@ iframeElement = xEditorAdd.iframeElement.id; } else if (typeof xEditorAdd.editorId !== "undefined") { iframeElement = xEditorAdd.editorId + "_ifr"; } - sendToGrammalecte({ spellcheck: sText, iframe: iframeElement }); + sendToGrammalecte({ sTextToParse: sText, iframe: iframeElement }); } }); } function TinyInPage() { @@ -149,24 +149,26 @@ } else if (tinyMCE.majorVersion >= 3) { tinyMCE.onAddEditor.add(TinyOnEditor); } try { TinyInPage(); - } catch (error) {} + } catch (e) { + console.error(e); + } } /* // ! In the webpage script : -document.addEventListener('GrammalecteIsLoaded', function() { +document.addEventListener('GLInjectedScriptIsReady', function() { // Le gestionnaire d'évènement est prêt! // La page web peut effectuer des actions ... }); ... // Pour demander une correction sur le texte -sendToGrammalecte({"spellcheck": "salut comment ca vaa?"}); +sendToGrammalecte({"sTextToParse": "salut comment ca vaa?"}); // Pour demander une correction sur un élément html -sendToGrammalecte({"spellcheck": true, "elm": elementHTML}); +sendToGrammalecte({"sTextToParse": true, "elm": elementHTML}); // Pour avoir le lexicographe sur un texte -sendToGrammalecte({"lexique": "salut comment ca vaa?"}); +sendToGrammalecte({"sTextForLexicographer": "salut comment ca vaa?"}); // Pour avoir le lexicographe sur un élément html -sendToGrammalecte({"lexique": true, "elm": elementHTML}); +sendToGrammalecte({"sTextForLexicographer": true, "elm": elementHTML}); */ Index: gc_lang/fr/webext/content_scripts/init.js ================================================================== --- gc_lang/fr/webext/content_scripts/init.js +++ gc_lang/fr/webext/content_scripts/init.js @@ -11,11 +11,12 @@ No SharedWorker, no images allowed for now… */ "use strict"; -function showError(e) { +function showError (e) { + // because console can’t display error objects from content script console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); } // Chrome don’t follow the W3C specification: // https://browserext.github.io/browserext/ @@ -38,11 +39,11 @@ oElem.appendChild(img); }); } */ -var tinyAdd = {}; +let oTinyAdd = {}; const oGrammalecte = { nMenu: 0, lMenu: [], @@ -56,35 +57,35 @@ xObserver: null, sExtensionUrl: null, - listenRightClick: function() { + listenRightClick: function () { // Node where a right click is done // Bug report: https://bugzilla.mozilla.org/show_bug.cgi?id=1325814 document.addEventListener( "contextmenu", - function(xEvent) { + function (xEvent) { this.xRightClickedNode = xEvent.target; }.bind(this), true ); }, - clearRightClickedNode: function() { + clearRightClickedNode: function () { this.xRightClickedNode = null; }, - createMenus: function() { + createMenus: function () { if (bChrome) { browser.storage.local.get("ui_options", this._createMenus.bind(this)); return; } browser.storage.local.get("ui_options").then(this._createMenus.bind(this), showError); }, - _createMenus: function(dOptions) { + _createMenus: function (dOptions) { if (dOptions.hasOwnProperty("ui_options")) { dOptions = dOptions.ui_options; if (dOptions.textarea) { for (let xNode of document.getElementsByTagName("textarea")) { if (xNode.style.display !== "none" && xNode.style.visibility !== "hidden" && xNode.getAttribute("spellcheck") !== "false") { @@ -100,29 +101,29 @@ } } } }, - observePage: function() { + observePage: function () { /* When a textarea is added via jascript we add the menu :) */ - function NodeTinyMCE(xNode) { + function NodeTinyMCE (xNode) { let parentNode = xNode.parentNode; //mutation.target if ( typeof xNode !== "undefined" && typeof xNode.id !== "undefined" && - typeof tinyAdd[xNode.id] === "undefined" && + typeof oTinyAdd[xNode.id] === "undefined" && (parentNode.classList.contains("mce-edit-area") || parentNode.classList.contains("mceIframeContainer")) ) { - //console.log(tinyAdd, xNode, parentNode, parentNode.classList); - tinyAdd[xNode.id] = true; + //console.log(oTinyAdd, xNode, parentNode, parentNode.classList); + oTinyAdd[xNode.id] = true; sendToWebpage({ tiny: xNode.id.replace("_ifr", "") }); } } - this.xObserver = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { + this.xObserver = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { for (let i = 0; i < mutation.addedNodes.length; i++) { let MutationNode = mutation.addedNodes[i]; let tagName = MutationNode.tagName; if (tagName == "TEXTAREA") { @@ -194,32 +195,32 @@ this ); } }, - createLxgPanel: function() { + createLxgPanel: function () { if (this.oLxgPanel === null) { this.oLxgPanel = new GrammalecteLexicographer("grammalecte_lxg_panel", "Lexicographe", 500, 700); this.oLxgPanel.insertIntoPage(); } }, - createGCPanel: function() { + createGCPanel: function () { if (this.oGCPanel === null) { this.oGCPanel = new GrammalecteGrammarChecker("grammalecte_gc_panel", "Grammalecte", 500, 700); this.oGCPanel.insertIntoPage(); } }, - createMessageBox: function() { + createMessageBox: function () { if (this.oMessageBox === null) { this.oMessageBox = new GrammalecteMessageBox("grammalecte_message_box", "Grammalecte"); this.oMessageBox.insertIntoPage(); } }, - startGCPanel: function(xNode = null) { + startGCPanel: function (xNode=null) { this.createGCPanel(); this.oGCPanel.clear(); this.oGCPanel.show(); this.oGCPanel.start(xNode); this.oGCPanel.startWaitIcon(); @@ -230,32 +231,32 @@ this.oLxgPanel.clear(); this.oLxgPanel.show(); this.oLxgPanel.startWaitIcon(); }, - startFTPanel: function(xNode = null) { + startFTPanel: function (xNode = null) { this.createTFPanel(); this.oTFPanel.start(xNode); this.oTFPanel.show(); }, - showMessage: function(sMessage) { + showMessage: function (sMessage) { this.createMessageBox(); this.oMessageBox.show(); this.oMessageBox.setMessage(sMessage); }, - getPageText: function() { + getPageText: function () { let sPageText = document.body.innerText; let nPos = sPageText.indexOf("__grammalecte_panel__"); if (nPos >= 0) { sPageText = sPageText.slice(0, nPos); } return sPageText; }, - createNode: function(sType, oAttr, oDataset = null) { + createNode: function(sType, oAttr, oDataset=null) { try { let xNode = document.createElement(sType); Object.assign(xNode, oAttr); if (oDataset) { Object.assign(xNode.dataset, oDataset); @@ -264,11 +265,11 @@ } catch (e) { showError(e); } }, - createStyle: function(sLinkCss, sLinkId = null, xNodeToAppendTo = null) { + createStyle: function (sLinkCss, sLinkId=null, xNodeToAppendTo=null) { try { let xNode = document.createElement("link"); Object.assign(xNode, { rel: "stylesheet", type: "text/css", @@ -291,11 +292,11 @@ /* Connexion to the background */ let xGrammalectePort = browser.runtime.connect({ name: "content-script port" }); -xGrammalectePort.onMessage.addListener(function(oMessage) { +xGrammalectePort.onMessage.addListener(function (oMessage) { let { sActionDone, result, dInfo, bEnd, bError } = oMessage; let sText = ""; switch (sActionDone) { case "init": oGrammalecte.sExtensionUrl = oMessage.sUrl; @@ -405,98 +406,99 @@ default: console.log("[Content script] Unknown command: " + sActionDone); } }); -/* - Communicate webpage script <=> web-extension - La méthode d'injection de ce script est importante ! - - Pour que la page web puisse envoyer des infos au background - Page web => Script injecté => Content script => Background - Pour la réponse se sont les même étape en sens inverse. -*/ -var scriptEvent = document.createElement("script"); -scriptEvent.src = browser.extension.getURL("content_scripts/event.js"); -document.documentElement.appendChild(scriptEvent); - -var min = Math.ceil(0); -var max = Math.floor(9999999); -function uniqueID() { - return Date.now().toString(36) + "-" + (Math.floor(Math.random() * (max - min)) + min).toString(36); -} - -// ! Ecoute des messages venant du scipt injecté -document.addEventListener("GrammalecteEvent", function(event) { - let actionFromPage = JSON.parse(event.detail); - //console.log(event); - let sText = false; - let dInfo = {}; - let elmForGramma = null; - - if (actionFromPage.iframe) { - elmForGramma = document.getElementById(actionFromPage.iframe).contentWindow.document.body; - } - if (actionFromPage.elm) { - elmForGramma = document.getElementById(actionFromPage.elm); - sText = elmForGramma.tagName == "TEXTAREA" ? elmForGramma.value : elmForGramma.innerText; - dInfo = { sTextAreaId: elmForGramma.id }; - } - if (actionFromPage.spellcheck) { - oGrammalecte.startGCPanel(elmForGramma); - xGrammalectePort.postMessage({ - sCommand: "parseAndSpellcheck", - dParam: { sText: sText || actionFromPage.spellcheck, sCountry: "FR", bDebug: false, bContext: false }, - dInfo: dInfo - }); - } - if (actionFromPage.lexique) { - oGrammalecte.startLxgPanel(); - xGrammalectePort.postMessage({ - sCommand: "getListOfTokens", - dParam: { sText: sText || actionFromPage.lexique }, - dInfo: dInfo - }); - } -}); - -let isLoaded = false; -let bufferMsg = []; - -// ! Permet d'envoyer des messages vers le scipt injecté -// (peut aussi être lu par un script sur la page web) -function sendToWebpage(dataAction) { - let dataToSend = dataAction; - if (typeof dataToSend.IdAction === "undefined") { - dataToSend.IdAction = uniqueID(); - } - if (dataAction.elm) { - if (!dataAction.elm.id) { - dataAction.elm.id = uniqueID(); - } - dataToSend.elm = dataAction.elm.id; - } - - if (!isLoaded) { - bufferMsg.push(dataToSend); - } else { - //console.log('sendToWebpage', dataToSend); - var eventGrammalecte = new CustomEvent("GrammalecteToPage", { detail: JSON.stringify(dataToSend) }); - document.dispatchEvent(eventGrammalecte); - } - - return dataToSend.IdAction; -} - -// ! Les message ne peuvent être envoyer qu'après que le script est injecté -document.addEventListener("GrammalecteIsLoaded", function() { - //console.log("GrammalecteIsLoaded EXT"); - isLoaded = true; - if (bufferMsg.length > 0) { - for (const dataToSend of bufferMsg) { - var eventGrammalecte = new CustomEvent("GrammalecteToPage", { detail: JSON.stringify(dataToSend) }); + +/* + Communicate webpage script <=> WebExtension + La méthode d’injection de ce script est importante ! + + Pour que la page web puisse envoyer des infos au background + Page web => Script injecté => Content script => Background + Pour la réponse, ce sont les mêmes étapes en sens inverse. +*/ +let xScriptNode = document.createElement("script"); +xScriptNode.src = browser.extension.getURL("content_scripts/event.js"); +document.documentElement.appendChild(xScriptNode); + +let nMin = Math.ceil(0); +let nMax = Math.floor(9999999); +function uniqueID () { + return Date.now().toString(36) + "-" + (Math.floor(Math.random() * (nMax - nMin)) + nMin).toString(36); +} + +// ! Écoute des messages venant du script injecté +document.addEventListener("GrammalecteEvent", function (event) { + let oActionFromPage = JSON.parse(event.detail); + //console.log(event); + let sText = false; + let dInfo = {}; + let xNodeToParse = null; + + if (oActionFromPage.iframe) { + xNodeToParse = document.getElementById(oActionFromPage.iframe).contentWindow.document.body; + } + if (oActionFromPage.elm) { + xNodeToParse = document.getElementById(oActionFromPage.elm); + sText = xNodeToParse.tagName == "TEXTAREA" ? xNodeToParse.value : xNodeToParse.innerText; + dInfo = { sTextAreaId: xNodeToParse.id }; + } + if (oActionFromPage.sTextToParse) { + oGrammalecte.startGCPanel(xNodeToParse); + xGrammalectePort.postMessage({ + sCommand: "parseAndSpellcheck", + dParam: { sText: sText || oActionFromPage.sTextToParse, sCountry: "FR", bDebug: false, bContext: false }, + dInfo: dInfo + }); + } + if (oActionFromPage.sTextForLexicographer) { + oGrammalecte.startLxgPanel(); + xGrammalectePort.postMessage({ + sCommand: "getListOfTokens", + dParam: { sText: sText || oActionFromPage.sTextForLexicographer }, + dInfo: dInfo + }); + } +}); + +let bInjectedScriptReady = false; +let lBufferMsg = []; + +// ! Permet d’envoyer des messages vers le script injecté +// (peut aussi être lu par un script sur la page web) +function sendToWebpage (oDataAction) { + let oDataToSend = oDataAction; + if (typeof oDataToSend.IdAction === "undefined") { + oDataToSend.IdAction = uniqueID(); + } + if (oDataAction.elm) { + if (!oDataAction.elm.id) { + oDataAction.elm.id = uniqueID(); + } + oDataToSend.elm = oDataAction.elm.id; + } + + if (!bInjectedScriptReady) { + lBufferMsg.push(oDataToSend); + } else { + //console.log('sendToWebpage', oDataToSend); + let eventGrammalecte = new CustomEvent("GrammalecteToPage", { detail: JSON.stringify(oDataToSend) }); + document.dispatchEvent(eventGrammalecte); + } + + return oDataToSend.IdAction; +} + +// ! Les messages ne peuvent être envoyés qu’après l’injection du script +document.addEventListener("GLInjectedScriptIsReady", function () { + //console.log("GLInjectedScriptIsReady EXT"); + bInjectedScriptReady = true; + if (lBufferMsg.length > 0) { + for (const oDataToSend of lBufferMsg) { + let eventGrammalecte = new CustomEvent("GrammalecteToPage", { detail: JSON.stringify(oDataToSend) }); document.dispatchEvent(eventGrammalecte); } } }); sendToWebpage({ init: browser.extension.getURL("") });