Index: gc_lang/fr/webext/background.js ================================================================== --- gc_lang/fr/webext/background.js +++ gc_lang/fr/webext/background.js @@ -19,16 +19,27 @@ case "init": console.log("INIT DONE"); break; case "parse": console.log("GRAMMAR ERRORS"); - console.log(result); + if (typeof(dInfo.iReturnPort) === "number") { + let xPort = aConnx[dInfo.iReturnPort]; + xPort.postMessage(e.data); + } else { + console.log("[background] don’t know where to send results"); + console.log(e.data); + } break; case "parseAndSpellcheck": console.log("SPELLING AND GRAMMAR ERRORS"); - console.log(result.aSpellErr); - console.log(result.aGrammErr); + if (typeof(dInfo.iReturnPort) === "number") { + let xPort = aConnx[dInfo.iReturnPort]; + xPort.postMessage(e.data); + } else { + console.log("[background] don’t know where to send results"); + console.log(e.data); + } break; case "textToTest": console.log("TEXT TO TEXT RESULTS"); browser.runtime.sendMessage({sCommand: "text_to_test_result", sResult: result}); break; @@ -63,38 +74,72 @@ }; xGCEWorker.postMessage({sCommand: "init", dParam: {sExtensionPath: browser.extension.getURL("."), sOptions: "", sContext: "Firefox"}, dInfo: {}}); + +/* + Ports from content-scripts +*/ + +let aConnx = []; + /* Messages from the extension (not the Worker) */ function handleMessage (oRequest, xSender, sendResponse) { //console.log(xSender); - switch(oRequest.sCommand) { + console.log("[background] received:"); + console.log(oRequest); + switch (oRequest.sCommand) { case "parse": - xGCEWorker.postMessage({sCommand: "parse", dParam: {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {}}); - break; - case "parse_and_spellcheck": - xGCEWorker.postMessage({sCommand: "parseAndSpellcheck", dParam: {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {}}); - break; - case "get_list_of_tokens": - xGCEWorker.postMessage({sCommand: "getListOfTokens", dParam: {sText: oRequest.sText}, dInfo: {}}); - break; - case "text_to_test": - xGCEWorker.postMessage({sCommand: "textToTest", dParam: {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {}}); - break; - case "fulltests": - xGCEWorker.postMessage({sCommand: "fullTests", dParam: {}, dInfo: {}}); + case "parseAndSpellcheck": + case "getListOfTokens": + case "textToTest": + case "getOptions": + case "getDefaultOptions": + case "setOptions": + case "setOption": + case "fullTests": + xGCEWorker.postMessage(oRequest); break; } //sendResponse({response: "response from background script"}); } browser.runtime.onMessage.addListener(handleMessage); + +function handleConnexion (p) { + var xPort = p; + let iPortId = aConnx.length; // identifier for the port: each port can be found at aConnx[iPortId] + aConnx.push(xPort); + console.log("Port: " + p.name + ", id: " + iPortId); + xPort.onMessage.addListener(function (oRequest) { + console.log("[background] message via connexion:"); + console.log(oRequest); + switch (oRequest.sCommand) { + case "getCurrentTabId": + xPort.postMessage({sActionDone: "getCurrentTabId", result: "getCurrentTabId()", dInfo: null, bError: false}); + break; + case "parse": + case "parseAndSpellcheck": + case "getListOfTokens": + oRequest.dInfo.iReturnPort = iPortId; // we pass the id of the return port to received answer + console.log(oRequest); + xGCEWorker.postMessage(oRequest); + break; + default: + console.log("[background] Unknown command: " + oRequest.sCommand); + } + }); + xPort.postMessage({sActionDone: "newId", result: iPortId}); +} + +browser.runtime.onConnect.addListener(handleConnexion); + /* Context Menu */ browser.contextMenus.create({ @@ -165,10 +210,18 @@ break; } }); +async function getCurrentTabId () { + let xTab = await browser.tabs.getCurrent(); + return xTab.id; +} + +/* + TESTS ONLY +*/ async function newwin () { // test for popup window-like, which doesn’t close when losing the focus console.log("Async on"); const getActive = browser.tabs.query({ currentWindow: true, active: true, }); const xWindowInfo = await browser.windows.getLastFocused(); Index: gc_lang/fr/webext/content_scripts/modify_page.js ================================================================== --- gc_lang/fr/webext/content_scripts/modify_page.js +++ gc_lang/fr/webext/content_scripts/modify_page.js @@ -7,13 +7,14 @@ No SharedWorker, no images allowed for now… */ "use strict"; -console.log("Content script [start]"); +console.log("[Content script] Start"); +let nTadId = null; let nWrapper = 0; let xConjPanel = null; let xTFPanel = null; let xLxgPanel = null; @@ -40,16 +41,16 @@ nWrapper += 1; xParentElement.insertBefore(xWrapper, xTextArea); xWrapper.appendChild(xTextArea); // move textarea in wrapper let xToolbar = createWrapperToolbar(xTextArea); xWrapper.appendChild(xToolbar); + loadImage("GrammalecteTitle", "img/logo-16.png"); } catch (e) { showError(e); } } - let sButtonStyle = "display: inline-block; padding: 0 5px; margin-left: 5px; background-color: hsl(210, 50%, 60%); border-radius: 2px; cursor: pointer;"; function createWrapperToolbar (xTextArea) { try { @@ -56,10 +57,15 @@ let xToolbar = document.createElement("div"); xToolbar.style = "display: flex; justify-content: flex-end; margin-top: 5px; padding: 5px 10px;"; /*let xLogo = document.createElement("img"); xLogo.src = browser.extension.getURL("img/logo-16.png"); xTitle.appendChild(xLogo);*/ + + let xImagePlace = document.createElement("span"); + xImagePlace.className = "GrammalecteTitle"; + xToolbar.appendChild(xImagePlace); + xToolbar.appendChild(document.createTextNode("Grammalecte")); let xConjButton = document.createElement("div"); xConjButton.textContent = "Conjuguer"; xConjButton.style = sButtonStyle; xConjButton.onclick = function() { @@ -68,34 +74,33 @@ xToolbar.appendChild(xConjButton); let xTFButton = document.createElement("div"); xTFButton.textContent = "Formater"; xTFButton.style = sButtonStyle; xTFButton.onclick = function() { - createTFPanel(); + createTFPanel(xTextArea); }; xToolbar.appendChild(xTFButton); let xLxgButton = document.createElement("div"); xLxgButton.textContent = "Analyser"; xLxgButton.style = sButtonStyle; xLxgButton.onclick = function() { - createLxgPanel(); + console.log("Analyser"); }; xToolbar.appendChild(xLxgButton); let xGCButton = document.createElement("div"); xGCButton.textContent = "Corriger"; xGCButton.style = sButtonStyle; xGCButton.onclick = function() { - createGCPanel(); + xPort.postMessage({sCommand: "parseAndSpellcheck", dParam: {sText: xTextArea.value, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {sTextAreaId: xTextArea.id}}); }; xToolbar.appendChild(xGCButton); return xToolbar; } catch (e) { showError(e); } } - function createConjPanel () { console.log("Conjugueur"); if (xConjPanel !== null) { xConjPanel.style.display = "block"; @@ -109,22 +114,32 @@ xConjPanel.appendChild(createCloseButton(xConjPanel)); document.body.appendChild(xConjPanel); } } - - -function createTFPanel () { +function createTFPanel (xTextArea) { console.log("Formateur de texte"); } -function createLxgPanel () { +function createLxgPanel (xTextArea) { console.log("Analyse"); } -function createGCPanel () { +function createGCPanel (oErrors) { console.log("Correction grammaticale"); + if (xGCPanel !== null) { + xGCPanel.style.display = "block"; + } else { + // create the panel + xGCPanel = document.createElement("div"); + xGCPanel.style = "position: fixed; left: 50%; top: 50%; z-index: 100; height: 400px; margin-top: -200px; width: 600px; margin-left: -300px; border-radius: 10px;" + + " color: hsl(210, 10%, 4%); background-color: hsl(210, 20%, 90%); border: 10px solid hsla(210, 20%, 70%, .5);"; + xGCPanel.textContent = JSON.stringify(oErrors); + xGCPanel.setAttribute("draggable", true); + xGCPanel.appendChild(createCloseButton(xGCPanel)); + document.body.appendChild(xGCPanel); + } } function createCloseButton (xParentNode) { let xButton = document.createElement("div"); xButton.style = "float: right; width: 20px; padding: 5px 10px; color: hsl(210, 0%, 100%); text-align: center;" @@ -134,22 +149,63 @@ xParentNode.style.display = "none"; } return xButton; } - -/* - Assign do_something() as a listener for messages from the extension. -*/ +function loadImage (sContainerClass, sImagePath) { + let xRequest = new XMLHttpRequest(); + xRequest.open('GET', browser.extension.getURL("")+sImagePath, false); + xRequest.responseType = "arraybuffer"; + xRequest.send(); + let blobTxt = new Blob([xRequest.response], {type: 'image/png'}); + let img = document.createElement('img'); + img.src = (URL || webkitURL).createObjectURL(blobTxt); + Array.filter(document.getElementsByClassName(sContainerClass), function (oElem) { + oElem.appendChild(img); + }); +} -function handleMessage2 (oRequest, xSender, sendResponse) { - console.log(`[Content script] received: ${oRequest.content}`); +/* + Simple message +*/ +function handleMessage (oMessage, xSender, sendResponse) { + console.log("[Content script] received:"); + console.log(oMessage); //change(request.myparam); //browser.runtime.onMessage.removeListener(handleMessage); sendResponse({response: "response from content script"}); } -browser.runtime.onMessage.addListener(handleMessage2); +browser.runtime.onMessage.addListener(handleMessage); + + +/* + Connexion +*/ +let xPort = browser.runtime.connect({name: "content-script port"}); +xPort.onMessage.addListener(function (oMessage) { + console.log("[Content script] received…"); + let {sActionDone, result, dInfo, bError} = oMessage; + switch (sActionDone) { + case "getCurrentTabId": + console.log("[Content script] tab id: " + result); + nTadId = result; + break; + case "parseAndSpellcheck": + console.log(result); + createGCPanel(result); + break; + case "getListOfTokens": + console.log(result); + break; + default: + console.log("[Content script] Unknown command: " + sActionDone); + } +}); +xPort.postMessage({sCommand: "getCurrentTabId", dParam: {}, dInfo: {}}); +/*document.body.addEventListener("click", function () { + xPort.postMessage({greeting: "they clicked the page!"}); +});*/ wrapTextareas(); Index: gc_lang/fr/webext/manifest.json ================================================================== --- gc_lang/fr/webext/manifest.json +++ gc_lang/fr/webext/manifest.json @@ -43,11 +43,12 @@ "web_accessible_resources": [ "grammalecte/_dictionaries/French.json", "grammalecte/fr/conj_data.json", "grammalecte/fr/mfsp_data.json", "grammalecte/fr/phonet_data.json", - "grammalecte/fr/tests_data.json" + "grammalecte/fr/tests_data.json", + "img/logo-16.png" ], "permissions": [ "activeTab", "contextMenus" ], Index: gc_lang/fr/webext/panel/main.html ================================================================== --- gc_lang/fr/webext/panel/main.html +++ gc_lang/fr/webext/panel/main.html @@ -22,23 +22,15 @@
  • TST
  • - -

    GRAMMALECTE

    +
    TEST

    OPTIONS GRAMMATICALES

    Index: gc_lang/fr/webext/panel/main.js ================================================================== --- gc_lang/fr/webext/panel/main.js +++ gc_lang/fr/webext/panel/main.js @@ -40,22 +40,22 @@ function (xEvent) { let xElem = xEvent.target; if (xElem.id) { switch (xElem.id) { case "text_to_test": - browser.runtime.sendMessage({sCommand: "text_to_test", sText: document.getElementById("text_to_test").value}); + browser.runtime.sendMessage({sCommand: "textToTest", dParam: {sText: document.getElementById("text_to_test").value, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {}}); break; case "fulltests": document.getElementById("tests_result").textContent = "Veuillez patienter…"; - browser.runtime.sendMessage({sCommand: "fulltests"}); + browser.runtime.sendMessage({sCommand: "fullTests", dParam: {}, dInfo: {}}); break; } } else if (xElem.className === "select") { showPage(xElem.dataset.page); - } else if (xElem.tagName === "A") { + }/* else if (xElem.tagName === "A") { openURL(xElem.getAttribute("href")); - } + }*/ }, false );