Index: gc_lang/fr/webext/background.js ================================================================== --- gc_lang/fr/webext/background.js +++ gc_lang/fr/webext/background.js @@ -8,12 +8,12 @@ /* Worker (separate thread to avoid freezing Firefox) */ //let xGCEWorker = new Worker("gce_worker.js"); -let xGCESharedWorker = new SharedWorker(browser.extension.getURL("gce_sharedworker.js")); -let xGCEWorker = xGCESharedWorker.port; +var xGCESharedWorker = xGCESharedWorker || new SharedWorker(browser.extension.getURL("gce_sharedworker.js"), {type:"classic", credentials:"omit", name:"GrammarWorker"}); +var xGCEWorker = xGCESharedWorker.port; xGCEWorker.onmessage = function (e) { // https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent try { switch (e.data[0]) { Index: gc_lang/fr/webext/content_scripts/communicate.js ================================================================== --- gc_lang/fr/webext/content_scripts/communicate.js +++ gc_lang/fr/webext/content_scripts/communicate.js @@ -1,71 +1,70 @@ -let xGCEWorker = null; + console.log('[Iframe] Loaded'); +/*console.log(self); +console.log(browser); +console.log(location); +console.log(window.parent.location);*/ + +var sPathOrigin, + sPathExtension = browser.extension.getURL(""); /* Worker (separate thread to avoid freezing Firefox) */ -function createSharedWorker (sPath) { - try { - xGCEWorker = new SharedWorker(sPath+"gce_sharedworker.js"); - } - catch (e) { - console.error(e); - } - - xGCEWorker.onerror = function(e) { - console.log('There is an error with your worker!'); - console.log(typeof(e)); - console.log(e); - } - - xGCEWorker.port.onmessage = function (e) { - // https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent - try { - // On retransmet directement le message à la page - console.log("[Iframe] send from Message Worker"); - window.postMessage({SharedWorker: e.data}, sPath); - } - catch (e) { - console.error(e); - } - }; - xGCEWorker.port.start(); - - console.log("[Iframe] [worker]"); - console.log(xGCEWorker); - - //xGCEWorker.port.start(); - //console.log("Content script [port started]"); - - xGCEWorker.port.postMessage(["init", {sExtensionPath: sPath, sOptions: "", sContext: "Firefox"}]); - //xGCEWorker.port.postMessage(["parse", {sText: "Vas... J’en aie mare...", sCountry: "FR", bDebug: false, bContext: false}]); - //xGCEWorker.port.postMessage(["parseAndSpellcheck", {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}]); - //xGCEWorker.port.postMessage(["getListOfTokens", {sText: oRequest.sText}]); - //xGCEWorker.port.postMessage(["textToTest", {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}]); - //xGCEWorker.port.postMessage(["fullTests"]); -} - - -var sPathOrigin = ''; -console.log('[Iframe] Set receivedMessageWeb'); -function receivedMessageWeb (oEvent) { - // Pour être sûr que ça vient bien de notre iframe ;) - if (!xGCEWorker && typeof oEvent.data.sPath !== "undefined" && typeof oEvent.data.sPage !== "undefined" && oEvent.data.sPage === oEvent.origin) { - console.log('[Iframe] Create the Sharedworker ', oEvent.origin); - sPathOrigin = oEvent.origin; - createSharedWorker(oEvent.data.sPath); - } else if (xGCEWorker && sPathOrigin === oEvent.origin && typeof oEvent.data.SharedWorker === "undefined") { +var xGCESharedWorker = xGCESharedWorker || new SharedWorker(browser.extension.getURL("gce_sharedworker.js"), {type:"classic", credentials:"omit", name:"GrammarWorker"}); +var xGCEWorker = xGCESharedWorker.port; + +xGCESharedWorker.onerror = function(e) { + console.log('There is an error with your worker!'); + console.log(typeof(e)); + console.log(e); +} + +xGCEWorker.onmessage = function (e) { + // https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent + try { + // On retransmet directement le message à la page + console.log("[Iframe] send from Message Worker ",sPathExtension); + window.postMessage({SharedWorker: e.data}, sPathExtension); + } + catch (e) { + console.error(e); + } +}; +xGCEWorker.start(); + +console.log("[Iframe] [worker]"); +console.log(xGCESharedWorker); + +//xGCEWorker.start(); +//console.log("Content script [port started]"); + +xGCEWorker.postMessage(["init", {sExtensionPath: browser.extension.getURL(""), sOptions: "", sContext: "Firefox"}]); +//xGCEWorker.postMessage(["parse", {sText: "Vas... J’en aie mare...", sCountry: "FR", bDebug: false, bContext: false}]); +//xGCEWorker.postMessage(["parseAndSpellcheck", {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}]); +//xGCEWorker.postMessage(["getListOfTokens", {sText: oRequest.sText}]); +//xGCEWorker.postMessage(["textToTest", {sText: oRequest.sText, sCountry: "FR", bDebug: false, bContext: false}]); +//xGCEWorker.postMessage(["fullTests"]); + + +console.log('[Iframe] Set receivedMessageWeb'); +function receivedMessageWeb (oEvent) { + // Pour être sûr que ça vient bien de notre iframe ;) + if (typeof oEvent.data.sPage !== "undefined" && oEvent.data.sPage === oEvent.origin) { + console.log('[Iframe] Create the Sharedworker ', oEvent.origin); + sPathOrigin = oEvent.origin; + } else if (sPathOrigin === oEvent.origin && typeof oEvent.data.SharedWorker === "undefined") { console.log('[Iframe] received (no SharedWorker):', oEvent, oEvent.origin); // Les messages reçus maintenant ont un SharedWorker fonctionnel // On transmet au SharedWorker uniquement si ça vient de la page web et on s’assure que ce n’est pas une réponse du SharedWorker. // TODO: Établir un protocole de communication afin de traiter uniquement les messages utiles console.log('[Iframe] exec command with SharedWorker'); - xGCEWorker.port.postMessage(oEvent.data); + xGCEWorker.postMessage(oEvent.data); console.log('[Iframe] end send message to worker'); } } window.addEventListener("message", receivedMessageWeb, false); console.log('[Iframe] END'); 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 @@ -25,10 +25,18 @@ } break; } } } + +/* +* Inject a script to page site to define extension path +*/ +/*var xScript = document.createElement('script'); +xScript.textContent = 'var sExtensionPath = "'+browser.extension.getURL("")+'";'; +document.body.appendChild(xScript);*/ + /* * Creation d'une iframe pour communiquer entre la page visitée et le Shareworker */ var sFrameID = browser.extension.getURL("").split('/')[2]; @@ -44,14 +52,14 @@ xFrameContent.addEventListener("message", receivedMessageFromIframe, false); try { //La frame est chargé on envoie l'initialisation du Sharedworker console.log('[Web] Initialise the worker :s'); console.log('[Web] Domaine ext: '+browser.extension.getURL("")); - xFrameContent.postMessage({sPath: browser.extension.getURL(""), sPage: location.origin.trim("/")}, browser.extension.getURL("")); + xFrameContent.postMessage({sPage: location.origin.trim("/")}, browser.extension.getURL("")); //Un petit test pour débogage ;) console.log('[Web] Test the worker :s'); - xFrameContent.postMessage(["parse", {sText: "Vas... J’en aie mare...", sCountry: "FR", bDebug: false, bContext: false}], browser.extension.getURL("")); + //xFrameContent.postMessage(["parse", {sText: "Vas... J’en aie mare...", sCountry: "FR", bDebug: false, bContext: false}], browser.extension.getURL("")); //Un test qui envoie a tout le monde xFrameContent.postMessage(["all", {}], browser.extension.getURL("")); //Un test qui envoie aux autres xFrameContent.postMessage(["other", {}], browser.extension.getURL("")); } Index: gc_lang/fr/webext/gce_sharedworker.js ================================================================== --- gc_lang/fr/webext/gce_sharedworker.js +++ gc_lang/fr/webext/gce_sharedworker.js @@ -57,98 +57,98 @@ /* Message Event Object https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */ -let xListPort = []; -let xPort = null; - function showError (e) { for (let sParam in e) { console.log(sParam); console.log(e[sParam]); } } + +var xListPort = xListPort || []; +//var xPort = null; self.addEventListener("connect", function(e){ console.log("START CONNECTION"); - xPort = e.ports[0]; + var xPort = e.ports[0]; xListPort.push(xPort); + + xPort.addEventListener("message", function(e){ console.log("[Sharedworker] ONMESSAGE"); console.log(e); console.log(e.data[0]); + let oReplyToSend; let oParam = e.data[1]; switch (e.data[0]) { case "init": - loadGrammarChecker(oParam.sExtensionPath, oParam.sOptions, oParam.sContext); + oReplyToSend = loadGrammarChecker(oParam.sExtensionPath, oParam.sOptions, oParam.sContext); break; case "parse": - parse(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); + oReplyToSend = parse(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); break; case "parseAndSpellcheck": - parseAndSpellcheck(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); + oReplyToSend = parseAndSpellcheck(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); break; case "getOptions": - getOptions(); + oReplyToSend = getOptions(); break; case "getDefaultOptions": - getDefaultOptions(); + oReplyToSend = getDefaultOptions(); break; case "setOptions": - setOptions(oParam.sOptions); + oReplyToSend = setOptions(oParam.sOptions); break; case "setOption": - setOption(oParam.sOptName, oParam.bValue); + oReplyToSend = setOption(oParam.sOptName, oParam.bValue); break; case "resetOptions": - resetOptions(); + oReplyToSend = resetOptions(); break; case "textToTest": - textToTest(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); + oReplyToSend = textToTest(oParam.sText, oParam.sCountry, oParam.bDebug, oParam.bContext); break; case "fullTests": - fullTests(); + oReplyToSend = fullTests(); break; case "getListOfTokens": - getListOfTokens(oParam.sText); + oReplyToSend = getListOfTokens(oParam.sText); break; case "other": - console.log("[Sharedworker Other] Number of client: "+xListPort.length); - console.log("Message to Other"); - toReply.Other("Message to Other"); + oReplyToSend = "Message to Other"; break; case "all": - console.log("[Sharedworker All] Number of client: "+xListPort.length); - console.log("Message to All"); - toReply.All("Message to All"); + oReplyToSend = "Message to All"; break; default: console.log("Unknown command: " + showError(e.data[0])); } + + console.log("[Sharedworker PortList] ",xListPort,this); + if ( e.data[0] == "all" ) { + console.log("[Sharedworker All] Number of client: "+xListPort.length); + xListPort.forEach(function(client){ + client.postMessage(oReplyToSend); + }); + } else if ( e.data[0] == "other" ) { + console.log("[Sharedworker Other] Number of client: "+xListPort.length); + xListPort.forEach(function(client){ + if (client !== this){ + client.postMessage(oReplyToSend); + } + }); + } else { + console.log("[Sharedworker Direct reply]"); + this.postMessage(oReplyToSend); + } + }); xPort.start(); }); -let toReply = { - All: function(data){ - xListPort.forEach(function(client){ - client.postMessage(data); - }); - }, - Other: function(data){ - xListPort.forEach(function(client){ - if (client !== xPort){ - client.postMessage(data); - } - }); - }, - Me: function(data){ - xPort.postMessage(data); - } -} - let oDict = null; let oTokenizer = null; let oLxg = null; let oTest = null; @@ -169,50 +169,50 @@ gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); } oTokenizer = new Tokenizer("fr"); //tests(); // we always retrieve options from the gc_engine, for setOptions filters obsolete options - toReply.Me(["options", gc_engine.getOptions().gl_toString()]); + return ["options", gc_engine.getOptions().gl_toString()]; } catch (e) { console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); - toReply.Me(["error", e.message]); + return ["error", e.message]; } } function parse (sText, sCountry, bDebug, bContext) { let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext); - toReply.Me(["grammar_errors", {aGrammErr: aGrammErr}]); + return ["grammar_errors", {aGrammErr: aGrammErr}]; } function parseAndSpellcheck (sText, sCountry, bDebug, bContext) { let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext); let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict); - toReply.Me(["spelling_and_grammar_errors", {aGrammErr: aGrammErr, aSpellErr: aSpellErr}]); + return ["spelling_and_grammar_errors", {aGrammErr: aGrammErr, aSpellErr: aSpellErr}]; } function getOptions () { - toReply.Me(["options", gc_engine.getOptions().gl_toString()]); + return ["options", gc_engine.getOptions().gl_toString()]; } function getDefaultOptions () { - toReply.Me(["options", gc_engine.getDefaultOptions().gl_toString()]); + return ["options", gc_engine.getDefaultOptions().gl_toString()]; } function setOptions (sGCOptions) { gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); - toReply.Me(["options", gc_engine.getOptions().gl_toString()]); + return ["options", gc_engine.getOptions().gl_toString()]; } function setOption (sOptName, bValue) { gc_engine.setOptions(new Map([ [sOptName, bValue] ])); - toReply.Me(["options", gc_engine.getOptions().gl_toString()]); + return ["options", gc_engine.getOptions().gl_toString()]; } function resetOptions () { gc_engine.resetOptions(); - toReply.Me(["options", gc_engine.getOptions().gl_toString()]); + return ["options", gc_engine.getOptions().gl_toString()]; } function tests () { console.log(conj.getConj("devenir", ":E", ":2s")); console.log(mfsp.getMasForm("emmerdeuse", true)); @@ -224,25 +224,23 @@ } } function textToTest (sText, sCountry, bDebug, bContext) { if (!gc_engine || !oDict) { - toReply.Me(["error", "# Error: grammar checker or dictionary not loaded."]); - return; + return ["error", "# Error: grammar checker or dictionary not loaded."]; } let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext); let sMsg = ""; for (let oErr of aGrammErr) { sMsg += text.getReadableError(oErr) + "\n"; } - toReply.Me(["text_to_test_result", sMsg]); + return ["text_to_test_result", sMsg]; } function fullTests (sGCOptions='{"nbsp":true, "esp":true, "unit":true, "num":true}') { if (!gc_engine || !oDict) { - toReply.Me(["error", "# Error: grammar checker or dictionary not loaded."]); - return; + return ["error", "# Error: grammar checker or dictionary not loaded."]; } let dMemoOptions = gc_engine.getOptions(); if (sGCOptions) { gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); } @@ -250,11 +248,11 @@ for (let sRes of oTest.testParse()) { sMsg += sRes + "\n"; console.log(sRes); } gc_engine.setOptions(dMemoOptions); - toReply.Me(["fulltests_result", sMsg]); + return ["fulltests_result", sMsg]; } // Lexicographer @@ -266,12 +264,12 @@ aRes = oLxg.getInfoForToken(oToken); if (aRes) { aElem.push(aRes); } } - toReply.Me(["tokens", aElem]); + return ["tokens", aElem]; } catch (e) { helpers.logerror(e); - toReply.Me(["error", e.message]); + return ["error", e.message]; } }