ADDED   gc_lang/fr/webext/content_scripts/event.js
Index: gc_lang/fr/webext/content_scripts/event.js
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/content_scripts/event.js
@@ -0,0 +1,109 @@
+
+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);
+}
+
+// Retourne un identifiant unique au cas ou si besoin
+// La ID unique peut être util si on permet d'intérogé grammalecte sans zone
+function sendToGrammalecte(dataAction) {
+    let dataToSend = dataAction;
+    dataToSend.IdAction = uniqueID();
+    if (dataAction.elm){
+        if (!dataAction.elm.id){
+            dataAction.elm.id = uniqueID();
+        }
+        dataToSend.elm = dataAction.elm.id;
+    }
+
+    //console.log('dataToSend', dataToSend);
+    var eventGrammalecte = new CustomEvent('GrammalecteEvent', {"detail":dataToSend});
+    document.dispatchEvent(eventGrammalecte);
+    return dataToSend.IdAction;
+}
+
+// On informe la page qu'il y a Grammalecte ;)
+var customAPILoaded = new CustomEvent('GrammalecteIsLoaded');
+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
+// Page to test v3 http://www.imathas.com/editordemo/demo.html
+if (typeof tinymce !== "undefined" && tinymce.majorVersion && tinymce.majorVersion >= 3 && tinymce.majorVersion <= 5) {
+    //console.log("Have TinyMCE");
+    let TinyOnEditor = function(event, editor = null) {
+        let xEditorAdd = editor || event.editor;
+        let bIsAdded = false;
+
+        if ( tinymce.majorVersion >= 4 ){
+            let aBtn = ["toolbar3", "toolbar2", "toolbar1", "toolbar"];
+            let nBtn = aBtn.length;
+            let iBtn = 0;
+            for (let eBtn of aBtn){
+                if ((!bIsAdded && typeof xEditorAdd.settings[eBtn] !== "undefined") || iBtn == nBtn){
+                    bIsAdded = true;
+                    xEditorAdd.settings[eBtn] = (xEditorAdd.settings[eBtn] + " Grammalecte").trim()
+                }
+                iBtn++;
+            }
+        } else if ( tinymce.majorVersion >= 3 ){
+            let aBtn = ["theme_advanced_buttons3", "theme_advanced_buttons2", "theme_advanced_buttons1"];
+            let nBtn = aBtn.length;
+            let iBtn = 0;
+            for (let eBtn of aBtn){
+                if ((!bIsAdded && typeof xEditorAdd.settings[eBtn] !== "undefined") || iBtn == nBtn){
+                    bIsAdded = true;
+                    xEditorAdd.settings[eBtn] = (xEditorAdd.settings[eBtn] + ",Grammalecte").trim()
+                }
+                iBtn++;
+            }
+        }
+
+        xEditorAdd.addButton("Grammalecte", {
+            text: "",
+            icon: false,
+            image:
+                "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAC8UlEQVQ4jX3TbUgTcRwH8P89ddu5u9tt082aZmpFEU4tFz0QGTUwCi0heniR9MSUIKRaD0RvIlKigsooo+iNFa0XJYuwIjEK19OcDtPElsG0ktyp591t7u7+vUh7MPX3+vf5/n8/+P0BmKJIPUUVlh2rdVVeesWlzEybqg+bFOsoylnqPmNavGFfknV2Omu2Lvja3vxAURKJib3opHizu8riLK6gjRyuKgmoSoMRFENRUqfXTzvBGK62LC2uoFkOl4RhjQ8+qWt7dPNE3sbdp+2LXbsGe9qb4rIo/BfwFy6nWQ4ThWGNDzbcfu29dMDh2nHU7CypYNLmzTda0/L5cNuzmDQi/A4Y27k6eQxLI79wS/11D0AAMNvs6XT6ojVJjJEgTbMy2BT77xBMp09KcpaWV1uc41jQoi0NdUHfjeOO9WWn7AVF7s7n986SithPJGeupBh2PCSP/xxqxAp3eq6wuUV7Wc6MSZIEhA8vHjbfOe/OcW3zmAuKy+nUzAyD2bow8ODaEROFq8AyZ5WBYdEZXGqGxZ61HJV+9HYCJRbTNA0QBA40HWunaKN5dKg/DBKxeCIe09Th/m4MJwiMSZmLEzMQAABQRuNqgu8NYX3doTcMpvCkLbtQZ2AJkrPOZG1zlnY13T+Hy9EehY90h57eqcorcZ/lctZuMzAsOjLEqwNv66/6vZcPYRBC+C3cGaBxhSet2av1BpYgTTY7k5y2JPT41slIR6Axv8R9nnOs+4Pf+2r992uOxGVJwgAAAEINfgt3BGgsESWtWas1iGDyl+CT/u7WpvxNFRc4x7qtBoZFhSFejb7z1fq9NYfjsiT+cwcQavBruCOgU4SIGo18amuoq3Js3FNlynVtH385+s53ze+t8cRkURx3yMTTRBAEQVAUXbFlf3XystJKA2NExeFBdWASDAAA+MQACCEEmqbJ0b6PMC7JwhDU8YFHV5u9NZ64LErT/oW/63tPV6uJwmKoOND78u7Fg5NhAAD4CVbzY9cwrWQrAAAAAElFTkSuQmCC",
+            onclick: function(e) {
+                //console.log( editorAdd.getContent() );
+                //console.log( editorAdd.getBody().innerText )
+                let sText = xEditorAdd.getBody().innerText;
+                sendToGrammalecte({ spellcheck: sText });
+            }
+        });
+    };
+    if ( tinymce.majorVersion >= 4 ){
+        tinymce.on("AddEditor", TinyOnEditor);
+    } else if ( tinymce.majorVersion >= 3 ){
+        tinymce.onAddEditor.add(TinyOnEditor);
+    }
+
+    for (var i = tinymce.editors.length - 1; i > -1; i--) {
+        let idTiny = tinymce.editors[i].id;
+        if ( tinymce.majorVersion >= 4 ){
+            tinymce.execCommand("mceRemoveEditor", true, idTiny);
+            tinymce.execCommand("mceAddEditor", true, idTiny);
+        } else if ( tinymce.majorVersion >= 3 ){
+            tinymce.execCommand("mceRemoveControl", true, idTiny);
+            tinymce.execCommand("mceAddControl", true, idTiny);
+        }
+    }
+}
+
+/* // ! In the webpage script :
+document.addEventListener('GrammalecteIsLoaded', 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?"});
+// Pour demander une correction sur un élément html
+sendToGrammalecte({"spellcheck": true, "elm": elementHTML});
+// Pour avoir le lexicographe sur un texte
+sendToGrammalecte({"lexique": "salut comment ca vaa?"});
+// Pour avoir le lexicographe sur un élément html
+sendToGrammalecte({"lexique": 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
@@ -353,5 +353,46 @@
             break;
         default:
             console.log("[Content script] Unknown command: " + sActionDone);
     }
 });
+
+/*
+    Communicate webpage script <=> web-extension
+*/
+var scriptEvent = document.createElement('script');
+scriptEvent.src = browser.extension.getURL("content_scripts/event.js");
+document.documentElement.appendChild(scriptEvent);
+
+document.addEventListener('GrammalecteEvent', function(event) {
+    let actionFromPage = event.detail;
+    //console.log(event);
+    if(actionFromPage){
+        let sText = false;
+        let dInfo = {};
+        let elmForGramma = null;
+        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
+            });
+        }
+    } else {
+        console.log("Vous devez spécifier l'action à effectuer");
+    }
+});

Index: gc_lang/fr/webext/manifest.json
==================================================================
--- gc_lang/fr/webext/manifest.json
+++ gc_lang/fr/webext/manifest.json
@@ -112,10 +112,11 @@
     "grammalecte/graphspell/_dictionaries/fr-reform.json",
     "grammalecte/fr/conj_data.json",
     "grammalecte/fr/mfsp_data.json",
     "grammalecte/fr/phonet_data.json",
     "grammalecte/fr/tests_data.json",
+    "content_scripts/event.js",
     "img/logo-16.png"
   ],
 
   "permissions": [
     "activeTab",