[webkit-changes] [WebKit/WebKit] 2aa41e: [iOS] [SelectionHonorsOverflowScrolling] Selection...

Wenson Hsieh noreply at github.com
Sun Dec 22 09:27:13 PST 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 2aa41ea14b83de5fc8af2827129307dd821a5233
      https://github.com/WebKit/WebKit/commit/2aa41ea14b83de5fc8af2827129307dd821a5233
  Author: Wenson Hsieh <wenson_hsieh at apple.com>
  Date:   2024-12-22 (Sun, 22 Dec 2024)

  Changed paths:
    A LayoutTests/editing/selection/ios/selection-after-reparenting-view-and-becoming-first-responder-expected.txt
    A LayoutTests/editing/selection/ios/selection-after-reparenting-view-and-becoming-first-responder.html
    M Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
    M Source/WebKit/UIProcess/ios/WKTextInteractionWrapper.h
    M Source/WebKit/UIProcess/ios/WKTextInteractionWrapper.mm

  Log Message:
  -----------
  [iOS] [SelectionHonorsOverflowScrolling] Selection rects are sometimes offset after switching back to a tab
https://bugs.webkit.org/show_bug.cgi?id=285072
rdar://141885834

Reviewed by Abrar Rahman Protyasha.

When `SelectionHonorsOverflowScrolling` is enabled, it's possible to get the text selection
highlight view into a state where it's in the wrong place after switching away and then back to a
tab in Safari. When performing this workflow (switching from web view A to B, and then back to A)…

1.  Safari removes A from the view hierarchy, replacing it with B. Underlying compositing views
    (one of which may contain selection views) are also removed from the view hierarchy in the
    process. The text interaction is also deactivated, as a result of the view no longer being
    parented.

2.  When switching back, Safari reinserts A in the view hierarchy, and immediately proceeds to call
    `-becomeFirstResponder` on the web view. In `-[WKContentView becomeFirstResponderForWebView]`,
    this causes us to activate the selection right away, which leads to UIKit regenerating
    selection highlight views by mapping from `WKContentView` coordinates to selection container
    coordinates. However, when `SelectionHonorsOverflowScrolling` is enabled, the selection is in a
    compositing view that still hasn't been reparented in the view hierarchy at this point, so the
    coordinate space mapping produces an incorrect result.

3.  After the first presentation update that follows, the compositing views are reinserted. However,
    because the text selection display interaction is already active and UIKit has already laid out
    selection rects, we bail early on updating native selection views because we think we're already
    up to date.

Consequently, the selection ends up being offset until the next selection change (or any other
layout change that forces the selection display interaction to update again). To fix this, we simply
defer the selection activation until the next presentation update (when the layer tree is up to
date), and also call `-setNeedsSelectionUpdate` to ensure that UIKit lays out selection views using
up-to-date selection geometry.

* LayoutTests/editing/selection/ios/selection-after-reparenting-view-and-becoming-first-responder-expected.txt: Added.
* LayoutTests/editing/selection/ios/selection-after-reparenting-view-and-becoming-first-responder.html: Added.

Add a layout test to exercise the bug, by simulating switching away and then back to a tab in
Safari and verifying that the selection highlight rect appears in the same place.

* Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView becomeFirstResponderForWebView]):

See above for more details.

(-[WKContentView _shouldActivateSelectionAfterBecomingFirstResponder]):
* Source/WebKit/UIProcess/ios/WKTextInteractionWrapper.h:
* Source/WebKit/UIProcess/ios/WKTextInteractionWrapper.mm:
(-[WKTextInteractionWrapper setNeedsSelectionUpdate]):

Add a helper method to call `-setNeedsSelectionUpdate` on the underlying text selection display
interaction.

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



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list