diff --git a/addons/web_editor/static/src/js/widgets/widgets.js b/addons/web_editor/static/src/js/widgets/widgets.js index 7f0f64ec0c9..b0ff59cec96 100644 --- a/addons/web_editor/static/src/js/widgets/widgets.js +++ b/addons/web_editor/static/src/js/widgets/widgets.js @@ -1189,6 +1189,7 @@ var LinkDialog = Dialog.extend({ } this.data.range = range.create(sc, so, ec, eo); + $(editable).data("range", this.data.range); this.data.range.select(); } else { nodes = dom.ancestor(sc, dom.isAnchor).childNodes; diff --git a/addons/web_editor/static/tests/web_editor_tests.js b/addons/web_editor/static/tests/web_editor_tests.js index 2ea6078c44b..e0a6051a78b 100644 --- a/addons/web_editor/static/tests/web_editor_tests.js +++ b/addons/web_editor/static/tests/web_editor_tests.js @@ -5,6 +5,7 @@ var FormView = require('web.FormView'); var testUtils = require('web.test_utils'); var core = require('web.core'); var web_editor = require('web_editor.editor'); +var LinkDialog = require('web_editor.widget').LinkDialog; var _t = core._t; @@ -324,4 +325,64 @@ QUnit.test('html_frame saving in edit mode (editor and content fully loaded)', f }); +QUnit.test('discard on link dialog should select content of link in web_editor', function (assert) { + var done = assert.async(); + assert.expect(5); + + var form = testUtils.createView({ + View: FormView, + model: 'mass.mailing', + data: this.data, + arch: '
' + + '' + + '', + res_id: 1, + }); + + form.$buttons.find('.o_form_button_edit').click(); + + assert.strictEqual(form.$('.note-editable').html(), '
yep
', + "should have rendered the field correctly in edit"); + + var $fieldEdit = form.$('.oe_form_field[name="body"]'); + var $editable = $fieldEdit.find('.field_body'); + + // create range, default startoffset:0, endOffset:length of element + var range = document.createRange(); + var selection = window.getSelection(); + range.selectNodeContents($editable[0].childNodes[0]); + selection.removeAllRanges(); + selection.addRange(range); + + var content = selection.getRangeAt(range); + assert.strictEqual(content.startOffset, 0, "selection starts at index 0"); + assert.strictEqual(content.endOffset, 3, "selection ends at index 3"); + + var defLinkDialog = $.Deferred(); + testUtils.patch(LinkDialog, { + init: function () { + this._super.apply(this, arguments); + this.opened(defLinkDialog.resolve.bind(defLinkDialog)); + } + }); + + // click on 'link' button + $fieldEdit.find('.note-toolbar button[data-event="showLinkDialog"]').click(); + + defLinkDialog.then(function () { + $('.modal .modal-footer .btn-default').click(); // click on 'discard' + + var content = selection.getRangeAt(range); + assert.strictEqual(content.startOffset, 0, + "selection should remain same after discarding modal, starts at index 0"); + assert.strictEqual(content.endOffset, 3, + "selection should remain same after discarding modal, ends at index 3"); + + testUtils.unpatch(LinkDialog); + form.destroy(); + done(); + }); + +}); + });