diff --git a/addons/web_editor/static/src/js/backend/field_html.js b/addons/web_editor/static/src/js/backend/field_html.js index 02bdbee2125..dec2d9b7ed7 100644 --- a/addons/web_editor/static/src/js/backend/field_html.js +++ b/addons/web_editor/static/src/js/backend/field_html.js @@ -307,6 +307,7 @@ var FieldHtml = basic_fields.DebouncedField.extend(TranslatableFieldMixin, { var def = new Promise(function (resolve) { resolver = resolve; }); + const externalLinkSelector = `a:not([href^="${location.origin}"]):not([href^="/"])`; if (this.nodeOptions.cssReadonly) { this.$iframe = $(''); this.$iframe.appendTo(this.$el); @@ -372,6 +373,12 @@ var FieldHtml = basic_fields.DebouncedField.extend(TranslatableFieldMixin, { self._onClick(ev); } }); + + // Ensure all external links are opened in a new tab. + for (const externalLink of cwindow.document.body.querySelectorAll(externalLinkSelector)) { + externalLink.setAttribute('target', '_blank'); + externalLink.setAttribute('rel', 'noreferrer'); + } }); }); } else { @@ -379,6 +386,11 @@ var FieldHtml = basic_fields.DebouncedField.extend(TranslatableFieldMixin, { this.$content.appendTo(this.$el); this._qwebPlugin = new QWebPlugin(); this._qwebPlugin.sanitizeElement(this.$content[0]); + // Ensure all external links are opened in a new tab. + for (const externalLink of this.$content.find(externalLinkSelector)) { + externalLink.setAttribute('target', '_blank'); + externalLink.setAttribute('rel', 'noreferrer'); + } resolver(); } diff --git a/addons/web_editor/static/tests/field_html_tests.js b/addons/web_editor/static/tests/field_html_tests.js index 907aebbff3d..3efbeda9b1d 100644 --- a/addons/web_editor/static/tests/field_html_tests.js +++ b/addons/web_editor/static/tests/field_html_tests.js @@ -448,7 +448,7 @@ QUnit.module('web_editor', {}, function () { }); let $field = form.$('.oe_form_field[name="body"]'); assert.strictEqual($field.children('.o_readonly').html(), - '
', + '', "should have rendered a div with correct content in readonly"); const promise = new Promise((resolve) => _formResolveTestPromise = resolve); @@ -476,7 +476,7 @@ QUnit.module('web_editor', {}, function () { $field = form.$('.oe_form_field[name="body"]'); assert.strictEqual($field.children('.o_readonly').html(), - '', + '', "the link shouldn't change"); testUtils.mock.unpatch(LinkDialog); @@ -575,7 +575,7 @@ QUnit.module('web_editor', {}, function () { $field = form.$('.oe_form_field[name="body"]'); assert.strictEqual($field.children('.o_readonly').html(), - '', + '', "the link should be created with the right format"); testUtils.mock.unpatch(LinkDialog);