diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index 2b90f4bfb2b..c3581cb1564 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -434,17 +434,22 @@ var ListRenderer = BasicRenderer.extend({ var $el = this._renderFieldWidget(node, record, _.pick(options, 'mode')); return $td.append($el); } + this._handleAttributes($td, node); var name = node.attrs.name; var field = this.state.fields[name]; var value = record.data[name]; - var formattedValue = field_utils.format[field.type](value, field, { - data: record.data, + var formatter = field_utils.format[field.type]; + var formatOptions = { escape: true, + data: record.data, isPassword: 'password' in node.attrs, digits: node.attrs.digits && JSON.parse(node.attrs.digits), - }); - this._handleAttributes($td, node); - var title = field.type !== 'boolean' ? formattedValue : ''; + }; + var formattedValue = formatter(value, field, formatOptions); + var title = ''; + if (field.type !== 'boolean') { + title = formatter(value, field, _.extend(formatOptions, {escape: false})); + } return $td.html(formattedValue).attr('title', title); }, /** diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index bc3e34840b1..91486579b04 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -315,6 +315,24 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('field titles are not escaped', async function (assert) { + assert.expect(2); + + this.data.foo.records[0].foo = '
Hello
'; + + const list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '', + }); + + assert.strictEqual(list.$('tbody tr:first .o_data_cell').text(), "
Hello
"); + assert.strictEqual(list.$('tbody tr:first .o_data_cell').attr('title'), "
Hello
"); + + list.destroy(); + }); + QUnit.test('record-depending invisible lines are correctly aligned', async function (assert) { assert.expect(4);