Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: b4d7445ce5f49f51d491b03d64e83a235949a28b
      
https://github.com/WebKit/WebKit/commit/b4d7445ce5f49f51d491b03d64e83a235949a28b
  Author: Wenson Hsieh <[email protected]>
  Date:   2024-04-19 (Fri, 19 Apr 2024)

  Changed paths:
    M LayoutTests/TestExpectations
    A 
LayoutTests/editing/input/mac/show-inline-prediction-with-adjacent-text-expected-mismatch.html
    A 
LayoutTests/editing/input/mac/show-inline-prediction-with-adjacent-text.html
    M LayoutTests/platform/mac-wk2/TestExpectations
    M LayoutTests/resources/ui-helper.js
    M Source/WebCore/editing/Editor.cpp
    M Source/WebCore/editing/Editor.h
    M Source/WebCore/rendering/updating/RenderTreeUpdaterGeneratedContent.cpp
    M Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl
    M Tools/TestRunnerShared/UIScriptContext/UIScriptController.h
    M Tools/WebKitTestRunner/ios/UIScriptControllerIOS.h
    M Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm
    M Tools/WebKitTestRunner/mac/UIScriptControllerMac.h
    M Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm

  Log Message:
  -----------
  REGRESSION (277282@main): [macOS] Writing suggestions may incorrectly render 
at the end of an editable element
https://bugs.webkit.org/show_bug.cgi?id=272898
rdar://126493252

Reviewed by Richard Robinson.

After the changes in 277282@main, inline writing suggestions use generated 
`RenderText` to render
the suggested text content after the current selection. To identify where to 
insert this generated
renderer, we currently walk up from the caret selection's container node until 
we encounter an
`Element`; this element's renderer then acts as the parent for this generated 
text renderer.

While this seems to work in most cases, it fails in the scenario where a single 
element contains
multiple text nodes underneath it, and the user is typing before a newline. 
Since we're only capable
of inserting the generated content at the end of an element renderer, it 
appears in the wrong place
(at the end of the contaiing element), rather than where the user is actually 
typing.

```
DIV     // parent element
  "Foo" // user is typing here
  "\n"  // newline
  "Bar" // writing suggestion renderer is inserted here
```

To fix this, we refactor some of this logic around managing the writing 
suggestions renderer:

1.  Instead of trying to keep track of the containing element enclosing the 
writing suggestions,
    just keep track of the node *before which* we expect writing suggestions to 
be inserted.
    Importantly, this is robust in the case described above, where we return 
`"Foo"` instead of the
    element containing all three nodes.

2.  When updating the render tree to add generated content for writing 
suggestions, use the optional
    `beforeChild` argument of `RenderTreeBuilder::attach` to ensure that the 
writing suggestions
    renderer is inserted in the right place, relative to the renderer of the 
node found in (1).

Test: editing/input/mac/show-inline-prediction-with-adjacent-text.html

* LayoutTests/TestExpectations:
* 
LayoutTests/editing/input/mac/show-inline-prediction-with-adjacent-text-expected-mismatch.html:
 Added.
* LayoutTests/editing/input/mac/show-inline-prediction-with-adjacent-text.html: 
Added.

Add a layout test to exercise the fix by verifying that the writing suggestion 
is not rendered at
the end of the editable container, in the case where the suggested text is 
being inserted before the
newline.

* LayoutTests/platform/mac-wk2/TestExpectations:
* LayoutTests/resources/ui-helper.js:
(window.UIHelper.async setInlinePrediction):

Augment an existing testing hook to insert inline predictions, so that it works 
on macOS as well.
To facilitate this, we introduce a second parameter (optional on iOS) to 
indicating the start index
of the predicted text, relative to the full text. This defaults to 0, which 
simply inserts the
inline prediction at the caret position (regardless of whether the text before 
the caret matches the
expected text).

* Source/WebCore/editing/Editor.cpp:
(WebCore::Editor::nodeBeforeWritingSuggestions const):
(WebCore::Editor::writingSuggestionsContainerElement const):

Reimplement this in terms of `nodeBeforeWritingSuggestions`; see above for more 
details.

(WebCore::Editor::removeWritingSuggestionIfNeeded):
(WebCore::Editor::setWritingSuggestion):
(WebCore::Editor::writingSuggestionsContainerElement): Deleted.
* Source/WebCore/editing/Editor.h:
* Source/WebCore/rendering/updating/RenderTreeUpdaterGeneratedContent.cpp:
(WebCore::RenderTreeUpdater::GeneratedContent::updateWritingSuggestionsRenderer):

See comments above for more details. Drive-by fix: also avoid adding extra 
renderers for empty text
nodes, in the case where there is no suffix text.

* Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:

Add test support for simulating inline predictions (writing suggestions) on 
macOS. See above.

* Tools/TestRunnerShared/UIScriptContext/UIScriptController.h:
(WTR::UIScriptController::setInlinePrediction):
* Tools/WebKitTestRunner/ios/UIScriptControllerIOS.h:
* Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm:
(WTR::UIScriptControllerIOS::setInlinePrediction):
* Tools/WebKitTestRunner/mac/UIScriptControllerMac.h:
* Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm:
(WTR::UIScriptControllerMac::setInlinePrediction):

Canonical link: https://commits.webkit.org/277756@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