Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: fa3afaa2ad393deee894e62a7dc2ef11e7be50d3
      
https://github.com/WebKit/WebKit/commit/fa3afaa2ad393deee894e62a7dc2ef11e7be50d3
  Author: Wenson Hsieh <[email protected]>
  Date:   2024-10-27 (Sun, 27 Oct 2024)

  Changed paths:
    M LayoutTests/editing/execCommand/outdent-break-with-style-expected.txt
    M LayoutTests/editing/execCommand/outdent-regular-blockquote-expected.txt
    M LayoutTests/editing/execCommand/outdent-selection-expected.txt
    M 
LayoutTests/editing/execCommand/unindent-nested-blockquote-with-inner-div-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/editing/run/outdent_1-1000-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/editing/run/outdent_2001-last-expected.txt
    M Source/WebCore/editing/IndentOutdentCommand.cpp

  Log Message:
  -----------
  mail.yahoo.com: caret jumps to the start of the editor after outdenting out 
of a blockquote
https://bugs.webkit.org/show_bug.cgi?id=282142
rdar://138081308

Reviewed by Ryosuke Niwa.

In Yahoo Mail, when outdenting to break out of a blockquote element on a line 
with no content, the
selection is always reset to the top of the editable root. Suppose we're 
outdenting in a simple DOM
tree on Yahoo:

```
--- Safari, before outdenting

<DIV contenteditable> # Yahoo's root editable element
    <BLOCKQUOTE>
        <DIV>
            Some text
        <DIV>
            # Selection is here.
            <BR>
```

1.  When clicking on the outdent menu item in Yahoo Mail's UI, Yahoo triggers 
the `Outdent` editing
    command. This executes as expected, and places the ending selection in the 
correct location
    (depicted below).

```
--- Safari, after outdenting

<DIV contenteditable> # Yahoo's root editable element
    <BLOCKQUOTE>
        <DIV>
            Some text
    # Selection is here
    <BR>
```

2.  However, immediately after this happens, the menu dismisses, which runs 
some other JavaScript
    that then attempts to "fix up" the DOM selection. This JavaScript always 
moves the selection to
    the start of the editable root, under 3 specific conditions:

    a. The selection is collapsed.
    b. The editable root (i.e. contenteditable `DIV` marked above) has ≥1 
children.
    c. The selection anchor (`getSelection().anchorNode`) is equal to the 
editable root.

Because we satisfy all three of the above conditions (since the selection 
anchor is at offset 1 in
the editable root), the selection is always moved to the start, which causes 
the bug.

This does not happen in Chrome because, upon initially creating the 
`BLOCKQUOTE` element, Chrome
wraps the block quote in a redundant `DIV`, such that the final selection after 
outdenting places
the selection anchor under this new `DIV` rather than under the root editable.

```
--- Chrome, after outdenting

<DIV contenteditable> # Editable root
    <DIV>
        <BLOCKQUOTE>
            <DIV>
                Some text
        # Selection is here
        <BR>
```

This also does not happen in Firefox because outdenting creates a DOM structure 
that has an extra
`DIV` element containing the `BR`:

```
--- Firefox, after outdenting

<DIV contenteditable> # Editable root
    <BLOCKQUOTE>
        <DIV>
            Some text
    <DIV>
        # Selection is here
        <BR>
```

To address this issue, this patch aligns our behavior to Firefox, by ensuring 
that the placeholder
`BR` above is additionally contained in the document's default paragraph 
element (i.e. `DIV`). This
approach is a bit less intrusive of a change than adjusting to match Chrome's 
behavior, but still
avoids this bug.

* LayoutTests/editing/execCommand/outdent-break-with-style-expected.txt:
* LayoutTests/editing/execCommand/outdent-regular-blockquote-expected.txt:
* LayoutTests/editing/execCommand/outdent-selection-expected.txt:
* 
LayoutTests/editing/execCommand/unindent-nested-blockquote-with-inner-div-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/editing/run/outdent_1-1000-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/editing/run/outdent_2001-last-expected.txt:

Rebaseline various layout tests to account for the new behavior.

* Source/WebCore/editing/IndentOutdentCommand.cpp:
(WebCore::IndentOutdentCommand::outdentParagraph):

Canonical link: https://commits.webkit.org/285745@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to