[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) <dmo@odoo.com>
This commit is contained in:
David Monjoie
2022-09-08 10:42:53 +02:00
parent a60532fcff
commit ffd238316c
2 changed files with 25 additions and 27 deletions
@@ -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];
}
@@ -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;
}