-
Notifications
You must be signed in to change notification settings - Fork 67
[FIX] composer: fix get/setText of the content editable helper #7331
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FIX] composer: fix get/setText of the content editable helper #7331
Conversation
fd01c9d to
f2d64d4
Compare
|
|
||
| function isEmptyParagraph(node: Node) { | ||
| return ["<br>", "<span><br></span>"].includes( | ||
| (node as HTMLElement).innerHTML.replaceAll(/\s(class|style)="[^"]*"/g, "") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It doesn't behave as expected if I type class="sdf" in a cell (plain text).
Also, it doesn't seem be problematic in this specific case, but as always, playing with innerHTML is dangerous. It doesn't trigger the security check in odoo, but it should if it was stricter
Any easy other way to achieve the same thing ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the problem arises with our own way of injecting stuff in the composer html,
theoretically, the other part of the fix (not adding empty classes) should fix the issue at hand but it quite fragile and someone else that works on the content helper (the upcoming dark theme PR might be a good candidate as it injects style AFAIK) might break it again. I will see if we can have a more solid comparison without crushing the performances
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the good solution would be to use innerText all the way but requires some polyfill for the tests, I'm not sure we will reach a "good" point where we don't end up testing the polyfill in the existing tests though
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@LucasLefevre I added a wip commit with an alternative implementation using actual node comparison. I did not notice any performance issue with it and the initial problem seems fixed as well :)
b76ceac to
a68674f
Compare
The recent use of the property "plaintext-only" came with a change of
behaviour in the composers, specifically in Firefox.
How to reproduce in FF:
- write a single character in a grid composer
- delete the character
-> a new line is inserted
Apparently, when setting the attribute `contentEditable` to
`plaintext-only`, deleting the single character does not delete the span
that encapsulates it if the latter has a class attribute. This couples
with a recent refactoring of the content editable helper to handle new
line characters and the empty composer is not detected as such
What happens currently?
Consider the composer content after inputing the letter 'W':
```html
<p>
<span class="">
w
</span>
</p>
```
The cursor is set just after the letter W.
In a chromium-based browser, hitting the `Delete` key yeilds the
following result:
```html
<p>
<span>
<br>
</span>
</p>
```
The letter is replaced by `<br>` which could be interpreted as a
newline, except that in this situation, we do not want a newline to
appear as we meerly deleted the single character of the composer, so
we do not want new characters.
Also, we introduced some logic to fight this side-effect when we
introduced the support of newlines of pasted content (#6467)
However, it turns out that in firefox, hitting `Delete` will yield this
result
```html
<p>
<span class="">
<br>
</span>
</p>
```
The class attribute is not cleared up! And unfortunately, the logic that
counteracts the presence of the unwelcome `<br>` would test against the
exact form seen in a chromium-based browser, so it did not work on
Firefox.
This commit extends the check to work on both Firefox-based and
Chromium-based browsers.
Note that other leads were investigated and it seems that if we stopped
using paragraphs to represent new lines, this issue with the `<br>`
doesn't seem to occur. An improvement (and good cleanup) could be
achieved by dropping that paragraph strategy and rely on spans and br
characters.
Task: 5082601
a68674f to
046821a
Compare
LucasLefevre
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
robodoo r+
The recent use of the property "plaintext-only" came with a change of
behaviour in the composers, specifically in Firefox.
How to reproduce in FF:
- write a single character in a grid composer
- delete the character
-> a new line is inserted
Apparently, when setting the attribute `contentEditable` to
`plaintext-only`, deleting the single character does not delete the span
that encapsulates it if the latter has a class attribute. This couples
with a recent refactoring of the content editable helper to handle new
line characters and the empty composer is not detected as such
What happens currently?
Consider the composer content after inputing the letter 'W':
```html
<p>
<span class="">
w
</span>
</p>
```
The cursor is set just after the letter W.
In a chromium-based browser, hitting the `Delete` key yeilds the
following result:
```html
<p>
<span>
<br>
</span>
</p>
```
The letter is replaced by `<br>` which could be interpreted as a
newline, except that in this situation, we do not want a newline to
appear as we meerly deleted the single character of the composer, so
we do not want new characters.
Also, we introduced some logic to fight this side-effect when we
introduced the support of newlines of pasted content (#6467)
However, it turns out that in firefox, hitting `Delete` will yield this
result
```html
<p>
<span class="">
<br>
</span>
</p>
```
The class attribute is not cleared up! And unfortunately, the logic that
counteracts the presence of the unwelcome `<br>` would test against the
exact form seen in a chromium-based browser, so it did not work on
Firefox.
This commit extends the check to work on both Firefox-based and
Chromium-based browsers.
Note that other leads were investigated and it seems that if we stopped
using paragraphs to represent new lines, this issue with the `<br>`
doesn't seem to occur. An improvement (and good cleanup) could be
achieved by dropping that paragraph strategy and rely on spans and br
characters.
closes #7331
Task: 5082601
Signed-off-by: Lucas Lefèvre (lul) <[email protected]>

The recent use of the property "plaintext-only" came with a change of
behaviour in the composers, specifically in Firefox.
How to reproduce in FF:
-> a new line is inserted
Apparently, when setting the attribute
contentEditabletoplaintext-only, deleting the single character does not delete the spanthat encapsulates it if the latter has a class attribute. This couples
with a recent refactoring of the content editable helper to handle new
line characters and the empty composer is not detected as such
What happens currently?
Consider the composer content after inputing the letter 'W':
The cursor is set just after the letter W.
In a chromium-based browser, hitting the
Deletekey yeilds thefollowing result:
The letter is replaced by
<br>which could be interpreted as anewline, except that in this situation, we do not want a newline to
appear as we meerly deleted the single character of the composer, so
we do not want new characters.
Also, we introduced some logic to fight this side-effect when we
introduced the support of newlines of pasted content (#6467)
However, it turns out that in firefox, hitting
Deletewill yield thisresult
The class attribute is not cleared up! And unfortunately, the logic that
counteracts the presence of the unwelcome
<br>would test against theexact form seen in a chromium-based browser, so it did not work on
Firefox.
This commit extends the check to work on both Firefox-based and
Chromium-based browsers.
Note that other leads were investigated and it seems that if we stopped
using paragraphs to represent new lines, this issue with the
<br>doesn't seem to occur. An improvement (and good cleanup) could be
achieved by dropping that paragraph strategy and rely on spans and br
characters.
Task: 5082601
Task: 5082601
Description:
description of this task, what is implemented and why it is implemented that way.
Task: 5082601
review checklist