[FIX] web_editor: address zero-width-space bug in link inner content

This commit resolves a bug related to zero-width spaces within the inner
content of a link. The bug led to a systematic test failure in 17.0
link_tools when comparing the input value with the expected value.
The bug originated from [1] that manipulates zero-width spaces to allow
users to select the edges of the link.

Steps to reproduce:
- Navigate to the Project app and open a random task (create one if none
  exists).
- Select the "Description" tab.
- Enter "/link" and press "Enter" to activate the link tools dialog box.
- In the link label field, input "The Website".
- In the URL or email field, input "localhost:8069".
- Save the changes.
- A new div is generated with the class "note-editable".
- Click on the newly created link.
- Edit the link by clicking on the edit icon in the popover.
- Direct the focus to the link label field at the end of the string "The
  Website".
- Press the "Backspace" key — observe that nothing happens.

This fix is actually a complement to [2].
The test added in [3] eliminates zero-width-spaces prior to asserting
the equality of values. This was appropriately addresses and handled in
this commit.

In version 16.2 [4], they refactored and improved the handling of
zero-width spaces (ZWS). As a result, ZWS in the link are now escaped
when the selection is made, eliminating the need to filter out these
empty characters. So, I added two assertions that provide more
comprehensive test coverage. The previous test only accounted for one
way to open the LinkDialog: selecting a part of the link and clicking on
the toolbox icon. Another method is to simply click on the link. In this
case, a popover appears, allowing link editing via the edit-link icon.
In the latter case, the test fails without the fix.

In version 16.4, the link component was migrated to OWL. So the bug
isn't there anymore. The new test is kept. Note that after this commit's
merge in 16.4, it was patched with [5]. This forward-ported version
includes the patch directly.

[1]: https://github.com/odoo/odoo/commit/99bc9b115dbdfc29260b4ccdb55ffa2ed16dffb3
[2]: https://github.com/odoo/odoo/commit/71feab51f41f0658f4ad61f99386c9c6978c6025
[3]: https://github.com/odoo/odoo/commit/a56586119845969e9d867a220f5330a6c7daa5c2
[4]: https://github.com/odoo/odoo/commit/89b0ce0c74458342fea5e1b093e9383f82e2440f
[5]: https://github.com/odoo/odoo/pull/154644

runbot-44779

closes odoo/odoo#154474

X-original-commit: 9db065e75d7b31febe4a42138308b47d0fa46508
Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
Co-authored-by: Rodolpho Lima <rcdl@odoo.com>
This commit is contained in:
Serge Bayet (seba)
2024-02-20 16:35:35 +00:00
committed by qsm-odoo
co-authored by Rodolpho Lima
parent abe7fb5123
commit 6d2daa0013
@@ -959,7 +959,7 @@ QUnit.module("WebEditor.HtmlField", ({ beforeEach }) => {
QUnit.module("Link");
QUnit.test("link preview in Link Dialog", async (assert) => {
assert.expect(4);
assert.expect(6);
serverData.models.partner.records.push({
id: 1,
@@ -976,6 +976,26 @@ QUnit.module("WebEditor.HtmlField", ({ beforeEach }) => {
</form>`,
});
// Test the popover option to edit the link
const a = document.querySelector(".test_target a");
// Wait for the popover to appear
await nextTick();
a.click();
await nextTick();
// Click on the edit link icon
document.querySelector("a.mx-1.o_we_edit_link.text-dark").click();
// Make sure popover is closed
await new Promise(resolve => $(a).on('hidden.bs.popover.link_popover', resolve));
let labelInputField = document.querySelector(".modal input#o_link_dialog_label_input");
let linkPreview = document.querySelector(".modal a#link-preview");
assert.strictEqual(labelInputField.value, 'This website',
"The label input field should match the link's content");
assert.strictEqual(linkPreview.innerText.replaceAll("\u200B", ""), "This website",
"Link label in preview should match label input field");
// Click on discard
await click(document, ".modal .modal-footer button.btn-secondary");
const p = document.querySelector(".test_target");
// Select link label to open the floating toolbar.
setSelection(p, 0, p, 1);
@@ -984,8 +1004,8 @@ QUnit.module("WebEditor.HtmlField", ({ beforeEach }) => {
document.querySelector("#toolbar #create-link").click();
await nextTick();
const labelInputField = document.querySelector(".modal input#o_link_dialog_label_input");
const linkPreview = document.querySelector(".modal a#link-preview");
labelInputField = document.querySelector(".modal input#o_link_dialog_label_input");
linkPreview = document.querySelector(".modal a#link-preview");
assert.strictEqual(labelInputField.value, 'This website',
"The label input field should match the link's content");
assert.strictEqual(linkPreview.innerText, 'This website',