[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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user