[FIX] mail: speed up render of Message by inserting content manually
`t-raw` is too slow due to parsing the HTML in JS, converting it to VDOM and comparing to existing VDOM. Here we can make a custom comparison based on actual string, and directly replace in DOM if needed. Part of task-2399731 closes odoo/odoo#63539 X-original-commit: cc531a07002fd8642f53e77c0fa52a49753e9df8 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com> Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
@@ -83,6 +83,16 @@ class Message extends Component {
|
||||
* The intent of the reply button depends on the last rendered state.
|
||||
*/
|
||||
this._wasSelected;
|
||||
/**
|
||||
* Value of the last rendered prettyBody. Useful to compare to new value
|
||||
* to decide if it has to be updated.
|
||||
*/
|
||||
this._lastPrettyBody;
|
||||
/**
|
||||
* Reference to element containing the prettyBody. Useful to be able to
|
||||
* replace prettyBody with new value in JS (which is faster than t-raw).
|
||||
*/
|
||||
this._prettyBodyRef = useRef('prettyBody');
|
||||
/**
|
||||
* Reference to the content of the message.
|
||||
*/
|
||||
@@ -382,6 +392,10 @@ class Message extends Component {
|
||||
if (!this.message) {
|
||||
return;
|
||||
}
|
||||
if (this._prettyBodyRef.el && this.message.prettyBody !== this._lastPrettyBody) {
|
||||
this._prettyBodyRef.el.innerHTML = this.message.prettyBody;
|
||||
this._lastPrettyBody = this.message.prettyBody;
|
||||
}
|
||||
// Remove all readmore before if any before reinsert them with _insertReadMoreLess.
|
||||
// This is needed because _insertReadMoreLess is working with direct DOM mutations
|
||||
// which are not sync with Owl.
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
</t>
|
||||
</t>
|
||||
<div class="o_Message_content" t-ref="content">
|
||||
<t t-raw="message.prettyBody"/>
|
||||
<div class="o_Message_prettyBody" t-ref="prettyBody"/><!-- message.prettyBody is inserted here from _update() -->
|
||||
<t t-if="message.subtype_description and !message.isBodyEqualSubtypeDescription">
|
||||
<p t-esc="message.subtype_description"/>
|
||||
</t>
|
||||
|
||||
@@ -111,7 +111,7 @@ QUnit.test('basic rendering', async function (assert) {
|
||||
"message should display the content"
|
||||
);
|
||||
assert.strictEqual(
|
||||
messageEl.querySelector(`:scope .o_Message_content`).innerHTML,
|
||||
messageEl.querySelector(`:scope .o_Message_prettyBody`).innerHTML,
|
||||
"<p>Test</p>",
|
||||
"message should display the correct content"
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user