Overview
| Comment: | [fx] find the first editable node for context menu and shortcuts too |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk | fx |
| Files: | files | file ages | folders |
| SHA3-256: |
9bc8d9a943ea31b919795eefde225830 |
| User & Date: | olr on 2020-04-09 07:04:54 |
| Other Links: | manifest | tags |
Context
|
2020-04-09
| ||
| 11:10 | [fr] ajustements check-in: 8075dc7ae3 user: olr tags: trunk, fr | |
| 07:04 | [fx] find the first editable node for context menu and shortcuts too check-in: 9bc8d9a943 user: olr tags: trunk, fx | |
|
2020-04-08
| ||
| 20:12 | [fx] button: node examination update check-in: f16babf55d user: olr tags: trunk, fx | |
Changes
Modified gc_lang/fr/webext/background.js from [6e8ab066e7] to [3958c7eb7d].
| ︙ | ︙ | |||
338 339 340 341 342 343 344 |
browser.contextMenus.create({ id: "grammar_checker_page", title: "Analyser la page", contexts: ["all"] });
browser.contextMenus.create({ id: "separator_tools", type: "separator", contexts: ["all"] });
// Tools
browser.contextMenus.create({ id: "conjugueur_tab", title: "Conjugueur [onglet]", contexts: ["all"] });
browser.contextMenus.create({ id: "conjugueur_window", title: "Conjugueur [fenêtre]", contexts: ["all"] });
//browser.contextMenus.create({ id: "dictionaries", title: "Dictionnaires", contexts: ["all"] });
browser.contextMenus.create({ id: "lexicon_editor", title: "Éditeur lexical", contexts: ["all"] });
| < < | 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
browser.contextMenus.create({ id: "grammar_checker_page", title: "Analyser la page", contexts: ["all"] });
browser.contextMenus.create({ id: "separator_tools", type: "separator", contexts: ["all"] });
// Tools
browser.contextMenus.create({ id: "conjugueur_tab", title: "Conjugueur [onglet]", contexts: ["all"] });
browser.contextMenus.create({ id: "conjugueur_window", title: "Conjugueur [fenêtre]", contexts: ["all"] });
//browser.contextMenus.create({ id: "dictionaries", title: "Dictionnaires", contexts: ["all"] });
browser.contextMenus.create({ id: "lexicon_editor", title: "Éditeur lexical", contexts: ["all"] });
browser.contextMenus.onClicked.addListener(function (xInfo, xTab) {
// xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData
// xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab
// confusing: no way to get the node where we click?!
switch (xInfo.menuItemId) {
|
| ︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/init.js from [56313a38a6] to [d79ff895de].
| ︙ | ︙ | |||
170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
}
return xNode;
}
catch (e) {
showError(e);
}
},
getCaretPosition: function (xElement) {
// JS awfulness again.
// recepie from https://stackoverflow.com/questions/4811822/get-a-ranges-start-and-end-offsets-relative-to-its-parent-container
let nCaretOffsetStart = 0;
let nCaretOffsetEnd = 0;
let xSelection = window.getSelection();
| > > > > > > > > > > > > > | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
}
return xNode;
}
catch (e) {
showError(e);
}
},
findOriginEditableNode: function (xNode) {
if (!xNode) {
return null;
}
if (xNode.tagName == "TEXTAREA" || xNode.tagName == "INPUT" || xNode.tagName == "IFRAME") {
return xNode;
}
const findNode = function (xNode) {
return (!xNode.parentNode.isContentEditable) ? xNode : findNode(xNode.parentNode);
}
return findNode(xNode);
},
getCaretPosition: function (xElement) {
// JS awfulness again.
// recepie from https://stackoverflow.com/questions/4811822/get-a-ranges-start-and-end-offsets-relative-to-its-parent-container
let nCaretOffsetStart = 0;
let nCaretOffsetEnd = 0;
let xSelection = window.getSelection();
|
| ︙ | ︙ | |||
274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
Send messages to the background
object {
sCommand: the action to perform
oParam: parameters necessary for the execution of the action
oInfo: all kind of informations that needs to be sent back (usually to know where to use the result)
}
*/
parseAndSpellcheck: function (sText, sDestination) {
this.xConnect.postMessage({
sCommand: "parseAndSpellcheck",
oParam: { sText: sText, sCountry: "FR", bDebug: false, bContext: false },
oInfo: { sDestination: sDestination }
});
},
| > > > > > > > | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
Send messages to the background
object {
sCommand: the action to perform
oParam: parameters necessary for the execution of the action
oInfo: all kind of informations that needs to be sent back (usually to know where to use the result)
}
*/
checkConnection: function () {
if (!this.xConnect) {
this.xConnect = browser.runtime.connect({name: "content-script port"});
}
},
parseAndSpellcheck: function (sText, sDestination) {
this.xConnect.postMessage({
sCommand: "parseAndSpellcheck",
oParam: { sText: sText, sCountry: "FR", bDebug: false, bContext: false },
oInfo: { sDestination: sDestination }
});
},
|
| ︙ | ︙ | |||
396 397 398 399 400 401 402 |
/*
Commands received from the context menu
(Context menu are initialized in background)
*/
// Grammar checker commands
case "grammar_checker_editable":
if (oGrammalecte.xRightClickedNode !== null) {
| > | | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
/*
Commands received from the context menu
(Context menu are initialized in background)
*/
// Grammar checker commands
case "grammar_checker_editable":
if (oGrammalecte.xRightClickedNode !== null) {
let xNode = oGrammalecte.findOriginEditableNode(oGrammalecte.xRightClickedNode);
oGrammalecte.startGCPanel(xNode);
} else {
oGrammalecte.showMessage("Erreur. Le node sur lequel vous avez cliqué n’a pas pu être identifié. Sélectionnez le texte à corriger et relancez le correcteur via le menu contextuel.");
}
break;
case "grammar_checker_page":
oGrammalecte.startGCPanel(oGrammalecte.getPageText());
break;
|
| ︙ | ︙ | |||
428 429 430 431 432 433 434 |
/*
Other messages from background
*/
listen2: function () {
browser.runtime.onMessage.addListener(function (oMessage) {
let {sActionRequest} = oMessage;
| | | 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
/*
Other messages from background
*/
listen2: function () {
browser.runtime.onMessage.addListener(function (oMessage) {
let {sActionRequest} = oMessage;
let xActiveNode = oGrammalecte.findOriginEditableNode(document.activeElement);
switch (sActionRequest) {
/*
Commands received from the keyboard (shortcuts)
*/
case "shortcutGrammarChecker":
if (xActiveNode && (xActiveNode.tagName == "TEXTAREA" || xActiveNode.tagName == "INPUT" || xActiveNode.isContentEditable)) {
oGrammalecte.startGCPanel(xActiveNode);
|
| ︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/menu.js from [56c56fae1e] to [60324e1838].
| ︙ | ︙ | |||
52 53 54 55 56 57 58 |
|| (xNode.tagName == "IFRAME" && this._bIframe) )
&& !(xNode.dataset.grammalecte_button && xNode.dataset.grammalecte_button == "false") ) {
// textarea or iframe
this.accept(xNode)
}
else if (xNode.isContentEditable && this._bEditableNode) {
// editable node
| < < < | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|| (xNode.tagName == "IFRAME" && this._bIframe) )
&& !(xNode.dataset.grammalecte_button && xNode.dataset.grammalecte_button == "false") ) {
// textarea or iframe
this.accept(xNode)
}
else if (xNode.isContentEditable && this._bEditableNode) {
// editable node
xNode = oGrammalecte.findOriginEditableNode(xNode);
if ((xNode.tagName == "P" || xNode.tagName == "DIV") && !(xNode.dataset.grammalecte_button && xNode.dataset.grammalecte_button == "false")) {
this.accept(xNode);
} else {
this.reject();
}
} else {
this.reject();
|
| ︙ | ︙ |