Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 4bb58f66236e7ff4fe1ad111373ad063c5a56b2e
      
https://github.com/WebKit/WebKit/commit/4bb58f66236e7ff4fe1ad111373ad063c5a56b2e
  Author: Wenson Hsieh <[email protected]>
  Date:   2024-02-19 (Mon, 19 Feb 2024)

  Changed paths:
    M LayoutTests/TestExpectations
    A LayoutTests/fast/text-extraction/basic-text-extraction-expected.txt
    A LayoutTests/fast/text-extraction/basic-text-extraction.html
    M LayoutTests/platform/ios-wk2/TestExpectations
    M LayoutTests/platform/mac-wk2/TestExpectations
    M LayoutTests/resources/ui-helper.js
    M Source/WebCore/page/text-extraction/TextExtraction.cpp
    M Source/WebCore/page/text-extraction/TextExtractionTypes.h
    M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
    M Source/WebKit/UIProcess/Cocoa/WKTextExtractionItem.h
    M Source/WebKit/UIProcess/Cocoa/WKTextExtractionUtilities.mm
    M Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.h
    M Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.mm
    M Source/WebKit/WebKitSwift/TextExtraction/WKTextExtractionItem.swift
    M Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl
    M Tools/TestRunnerShared/UIScriptContext/UIScriptContext.cpp
    M Tools/TestRunnerShared/UIScriptContext/UIScriptContext.h
    M Tools/TestRunnerShared/UIScriptContext/UIScriptController.h
    M Tools/WebKitTestRunner/Configurations/Base.xcconfig
    M Tools/WebKitTestRunner/TestOptions.cpp
    M Tools/WebKitTestRunner/TestOptions.h
    M Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
    M Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm
    M Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.h
    M Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.mm
    A Tools/WebKitTestRunner/cocoa/WKTextExtractionTestingHelpers.h
    A Tools/WebKitTestRunner/cocoa/WKTextExtractionTestingHelpers.mm

  Log Message:
  -----------
  Augment text extraction support to include information about the selection, 
links and editable elements
https://bugs.webkit.org/show_bug.cgi?id=269682
rdar://123201244

Reviewed by Aditya Keerthi.

Extend support for text extraction to match the latest version of the 
corresponding system APIs. See
comments below for more details.

Test: fast/text-extraction/basic-text-extraction.html

* LayoutTests/TestExpectations:
* LayoutTests/fast/text-extraction/basic-text-extraction-expected.txt: Added.
* LayoutTests/fast/text-extraction/basic-text-extraction.html: Added.

Add a new layout test to exercise this logic (enabled on WebKit2 macOS and iOS 
only). This test
includes exercises all of the different item subclasses, as well as some more 
interesting scenarios:
(1) text, links and images nested inside of other structural DOM elements 
(lists, list items), and
(2) links inside of contenteditable elements.

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

Add a new `UIHelper` method to dump the text extraction tree as text, for 
testing purposes.

* Source/WebCore/page/text-extraction/TextExtraction.cpp:

Make several changes to the underlying model objects:

1.  For the container types, remove `Link` (now that it's represented purely as 
text).

2.  Also, turn `Button` into a container type and remove `InteractiveItemData`; 
this is because
    there is not currently a system type that represents buttons/interactive 
elements.

3.  Finally, revamp how `TextItemData` works:
    a.  Treat all links as ranges in text, represented by a list of `(URL, 
Range)` per text item.
    b.  Add an optional `selectedRange` member that represents what part of the 
text item is in the
        user's current selection.
    c.  Remove `EditableItemData` below, and instead add an optional `editable` 
member to each
        text item that contains metadata about the editing host.

To match platform expectations, we now merge adjacent text items together 
during traversal, with
links and selection ranges embedded inside of text items. When encountering an 
editable container or
host (e.g. `input`, or contenteditable `div`) we now *only* extract text items 
underneath that
subtree, using the aforementioned coalescing mechanism to ensure that all text 
items in the subtree
get appended to a single item with the `editable` member. We apply a similar 
treatment to links as
well, extracting only text underneath them.

(WebCore::TextExtraction::collectText):

Refactor this `collectText` method, such that it now returns a `HashMap` of all 
text nodes with
visible text in the document, as well as ranges in the visible text that are 
selected by the user.
To achieve this, if there is a ranged selection in the document, we'll divide 
the text iteration
into three phases: (1) collecting text before the start of the selection, (2) 
collecting text inside
of the selection, and (3) collecting text after the end of the selection. These 
three results are
then stitched together to produce the above `HashMap` with per-text-node 
selection ranges.

(WebCore::TextExtraction::TraversalContext::shouldIncludeNodeWithRect const):

Add a `TraversalContext` struct to help encapsulate tree state while traversing 
the DOM to build up
text extraction results. This now includes `onlyCollectTextAndLinksCount`, 
which is set when
traversing into links or editable containers.

(WebCore::TextExtraction::canMerge):
(WebCore::TextExtraction::merge):

Add helper methods to merge text nodes into adjacent nodes.

(WebCore::TextExtraction::labelText):
(WebCore::TextExtraction::extractItemData):
(WebCore::TextExtraction::extractRecursive):
(WebCore::TextExtraction::pruneRedundantItemsRecursive):

To avoid emitting too many spurious white space nodes, add one final pass 
through the extraction
results before returning it, to prune all non-editable text nodes that only 
contain whitespace.

(WebCore::TextExtraction::extractItem):
(WebCore::TextExtraction::shouldIncludeChildren): Deleted.
* Source/WebCore/page/text-extraction/TextExtractionTypes.h:

See above for more details.

* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/UIProcess/Cocoa/WKTextExtractionItem.h:
* Source/WebKit/UIProcess/Cocoa/WKTextExtractionUtilities.mm:
(WebKit::containerType):
(WebKit::createWKTextItem):
(WebKit::createItemWithChildren):
(WebKit::createItemRecursive):
(WebKit::createItemIgnoringChildren): Deleted.
* Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.h:
* Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.mm:

Update the Swift and ObjC wrappers to match the changes in 
`TextExtractionTypes.h`.

* Source/WebKit/WebKitSwift/TextExtraction/WKTextExtractionItem.swift:
(WKTextExtractionItem.children): Deleted.
* Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
* Tools/TestRunnerShared/UIScriptContext/UIScriptContext.cpp:
(UIScriptContext::asyncTaskComplete):

Add an optional `std::initializer_list<JSValueRef>` argument here, so that we 
can pass JS values as
arguments back to test runner callbacks.

* Tools/TestRunnerShared/UIScriptContext/UIScriptContext.h:
(WTR::UIScriptContext::asyncTaskComplete):
* Tools/TestRunnerShared/UIScriptContext/UIScriptController.h:
(WTR::UIScriptController::requestTextExtraction):
* Tools/WebKitTestRunner/Configurations/Base.xcconfig:

Add `WebKit/UIProcess/Cocoa` to the header search paths, so that we can include
`WKTextExtractionItems.h` in API tests.

* Tools/WebKitTestRunner/TestOptions.cpp:
(WTR::TestOptions::defaults):
(WTR::TestOptions::keyTypeMapping):
* Tools/WebKitTestRunner/TestOptions.h:
(WTR::TestOptions::textExtractionEnabled const):

Add a test option to enable the `_textExtractionEnabled` SPI preference.

* Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
* Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm:
(WTR::TestController::cocoaResetStateToConsistentValues):
* Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.h:
* Tools/WebKitTestRunner/cocoa/UIScriptControllerCocoa.mm:
(WTR::UIScriptControllerCocoa::requestTextExtraction):
* Tools/WebKitTestRunner/cocoa/WKTextExtractionTestingHelpers.h: Copied from 
Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.h.
* Tools/WebKitTestRunner/cocoa/WKTextExtractionTestingHelpers.mm: Added.
(WTR::description):
(WTR::buildDescriptionIgnoringChildren):
(WTR::buildRecursiveDescription):
(WTR::recursiveDescription):

Add support for the new text extraction layout test; see above.

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