From ffd238316c6d7cdebc280c9e9f6fcfbc49820e88 Mon Sep 17 00:00:00 2001 From: David Monjoie Date: Tue, 6 Sep 2022 14:48:03 +0000 Subject: [PATCH] [FIX] web_editor: fix Firefox NS_ERROR_FAILURE in util Firefox throws NS_ERROR_FAILURE when setting selection on element with contentEditable=false for no valid reason since non-editable content are selectable by the user anyway. task-2809451 closes odoo/odoo#99706 closes odoo/odoo#99777 Signed-off-by: David Monjoie (dmo) --- .../js/editor/odoo-editor/src/utils/utils.js | 29 ++++++++++++------- .../src/js/editor/odoo-editor/test/utils.js | 23 ++++----------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js b/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js index 8cb4fe1ec7e..f029e1ee9cd 100644 --- a/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js +++ b/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js @@ -586,17 +586,26 @@ export function setSelection( if (!sel) { return null; } - const range = new Range(); - if (direction === DIRECTIONS.RIGHT) { - range.setStart(anchorNode, anchorOffset); - range.collapse(true); - } else { - range.setEnd(anchorNode, anchorOffset); - range.collapse(false); + try { + const range = new Range(); + if (direction === DIRECTIONS.RIGHT) { + range.setStart(anchorNode, anchorOffset); + range.collapse(true); + } else { + range.setEnd(anchorNode, anchorOffset); + range.collapse(false); + } + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(focusNode, focusOffset); + } catch (e) { + // Firefox throws NS_ERROR_FAILURE when setting selection on element + // with contentEditable=false for no valid reason since non-editable + // content are selectable by the user anyway. + if (e.name !== 'NS_ERROR_FAILURE') { + throw e; + } } - sel.removeAllRanges(); - sel.addRange(range); - sel.extend(focusNode, focusOffset); return [anchorNode, anchorOffset, focusNode, focusOffset]; } diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/test/utils.js b/addons/web_editor/static/src/js/editor/odoo-editor/test/utils.js index de34e8a1e54..a29a988c99c 100644 --- a/addons/web_editor/static/src/js/editor/odoo-editor/test/utils.js +++ b/addons/web_editor/static/src/js/editor/odoo-editor/test/utils.js @@ -154,7 +154,9 @@ export function setTestSelection(selection, doc = document) { try { domSelection.extend(selection.focusNode, selection.focusOffset); } catch { - // Firefox yells not happy when setting selection on elem with contentEditable=false. + // Firefox throws NS_ERROR_FAILURE when setting selection on element + // with contentEditable=false for no valid reason since non-editable + // content are selectable by the user anyway. } triggerEvent(selection.anchorNode, 'selectionchange'); } @@ -280,7 +282,6 @@ export async function testEditor(Editor = OdooEditor, spec, options = {}) { const selection = parseTextualSelection(testNode); const editor = new Editor(testNode, Object.assign({ toSanitize: false }, options)); - let firefoxExecCommandError = false; let error = false; try { editor.keyboardType = 'PHYSICAL'; @@ -308,18 +309,10 @@ export async function testEditor(Editor = OdooEditor, spec, options = {}) { } if (spec.stepFunction) { - try { - await spec.stepFunction(editor); - } catch (err) { - if (typeof err === 'object' && err.name === 'NS_ERROR_FAILURE') { - firefoxExecCommandError = true; - } else { - throw err; - } - } + await spec.stepFunction(editor); } - if (spec.contentAfterEdit && !firefoxExecCommandError) { + if (spec.contentAfterEdit) { renderTextualSelection(); const afterEditValue = testNode.innerHTML; window.chai.expect(afterEditValue).to.be.equal( @@ -341,7 +334,7 @@ export async function testEditor(Editor = OdooEditor, spec, options = {}) { if (!error) { try { - if (spec.contentAfter && !firefoxExecCommandError) { + if (spec.contentAfter) { renderTextualSelection(); // remove all check-ids (checklists, stars) @@ -363,10 +356,6 @@ export async function testEditor(Editor = OdooEditor, spec, options = {}) { await testNode.remove(); - if (firefoxExecCommandError) { - // FIXME - throw new Error('Firefox was not able to test this case because of an execCommand error'); - } if (error) { throw error; }