diff --git a/addons/web/static/src/core/code_editor/code_editor.js b/addons/web/static/src/core/code_editor/code_editor.js index aecaab91ec4..c9f7395c243 100644 --- a/addons/web/static/src/core/code_editor/code_editor.js +++ b/addons/web/static/src/core/code_editor/code_editor.js @@ -89,7 +89,7 @@ export class CodeEditor extends Component { if (!sessions[this.props.sessionId]) { sessions[this.props.sessionId] = session; } - aceEditor.setValue(this.props.value); + session.setValue(this.props.value); session.on("change", () => { if (this.props.onChange && !ignoredAceChange) { this.props.onChange(this.aceEditor.getValue()); diff --git a/addons/web/static/tests/core/code_editor_tests.js b/addons/web/static/tests/core/code_editor_tests.js index cd37b6e104d..d836c85bb97 100644 --- a/addons/web/static/tests/core/code_editor_tests.js +++ b/addons/web/static/tests/core/code_editor_tests.js @@ -8,6 +8,7 @@ import { mount, nextTick, editInput, + triggerEvents, } from "@web/../tests/helpers/utils"; import { Component, markup, useState, xml } from "@odoo/owl"; @@ -184,7 +185,8 @@ QUnit.module("Web Components", (hooks) => { const codeEditor = await mount(Parent, target, { env }); await nextTick(); assert.equal(getDomValue(), textA, "Default value correctly set"); - + const aceEditor = window.ace.edit(target.querySelector(".ace_editor")); + aceEditor.selectAll(); await edit(textB); assert.equal( getDomValue(), @@ -261,4 +263,38 @@ QUnit.module("Web Components", (hooks) => { await nextTick(); assert.verifySteps(["ace/theme/monokai"], "Monokai theme should be loaded"); }); + + QUnit.test("initial value cannot be undone", async (assert) => { + class Parent extends Component { + static components = { CodeEditor }; + static template = xml``; + } + await mount(Parent, target, { env }); + await nextTick(); + assert.containsOnce(target, ".ace_editor", "Code editor is rendered"); + assert.strictEqual( + target.querySelector(".ace_editor .ace_content").textContent, + "some value" + ); + const editor = window.ace.edit(target.querySelector(".ace_editor")); + const undo = editor.session.$undoManager.undo.bind(editor.session.$undoManager); + editor.session.$undoManager.undo = (...args) => { + assert.step("ace undo"); + return undo(...args); + }; + await triggerEvents(target, ".ace_editor textarea.ace_text-input", [ + ["keydown", { key: "Control", keyCode: 17, which: 17 }], + ["keypress", { key: "Control", ctrlKey: true, keyCode: 17, which: 17 }], + ["keydown", { key: "z", ctrlKey: true, keyCode: 90, which: 90 }], + ["keypress", { key: "z", ctrlKey: true, keyCode: 90, which: 90 }], + ["keyup", { key: "z", ctrlKey: true, keyCode: 90, which: 90 }], + ["keyup", { key: "Control", keyCode: 17, which: 17 }], + ]); + await nextTick(); + assert.strictEqual( + target.querySelector(".ace_editor .ace_content").textContent, + "some value" + ); + assert.verifySteps(["ace undo"]); + }); });