[webkit-changes] [WebKit/WebKit] 05c27a: REGRESSION (268069 at main): Date picker fails to pre...

Wenson Hsieh noreply at github.com
Wed Sep 27 12:06:23 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 05c27ae25006e9c39e40a712ac4bdf28611e2884
      https://github.com/WebKit/WebKit/commit/05c27ae25006e9c39e40a712ac4bdf28611e2884
  Author: Wenson Hsieh <wenson_hsieh at apple.com>
  Date:   2023-09-27 (Wed, 27 Sep 2023)

  Changed paths:
    A LayoutTests/fast/forms/ios/change-focus-from-text-field-to-date-input-expected.txt
    A LayoutTests/fast/forms/ios/change-focus-from-text-field-to-date-input.html
    M Source/WebKit/UIProcess/ios/forms/WKDatePickerPopoverController.h
    M Source/WebKit/UIProcess/ios/forms/WKDatePickerPopoverController.mm
    M Source/WebKit/UIProcess/ios/forms/WKDateTimeInputControl.mm

  Log Message:
  -----------
  REGRESSION (268069 at main): Date picker fails to present when switching focus from a text field to a date input
https://bugs.webkit.org/show_bug.cgi?id=262144

Reviewed by Tim Horton and Aditya Keerthi.

After refactoring date pickers to use popover presentation controllers in 268069 at main, it's now
possible for the UI process to hang when presenting a date picker in the case where there's
insufficient space to present the popover, and autolayout code in UIKit takes (seemingly) forever
attempting to resize individual cells in the date picker view to make the view fit.

Avoid this problem by teaching `WKDatePickerPopoverController` to only present the popover in
directions that contain sufficient space to lay out the popover contents correctly. Additionally,
stop using `_contentRectForUserInteraction` when computing available space; this didn't really make
sense, since it considers the input view as part of the obscured inset area, despite the fact that
the popover can animate over the keyboard. Instead, just map the `targetRect` to window coordinates,
and use the containing window's bounds to compute available space.

See below for more details.

* LayoutTests/fast/forms/ios/change-focus-from-text-field-to-date-input-expected.txt: Added.
* LayoutTests/fast/forms/ios/change-focus-from-text-field-to-date-input.html: Added.

Add a layout test to exercise the change.

* Source/WebKit/UIProcess/ios/forms/WKDatePickerPopoverController.h:
* Source/WebKit/UIProcess/ios/forms/WKDatePickerPopoverController.mm:
(-[WKDatePickerPopoverView initWithDatePicker:]):

Use `-sizeToFit` to size the accessory view and date picker, and save the combined size here so that
we can estimate how much available space we need in order to present this popover.

(-[WKDatePickerPopoverView estimatedMaximumPopoverSize]):

Return an estimate of the maximum size of the content view when it's presented in a popover. Note
that we add some extra height here to ensure that the accessory view toolbar doesn't end up getting
clipped.

(-[WKDatePickerPopoverController presentInView:sourceRect:completion:]):
(-[WKDatePickerPopoverController presentInView:sourceRect:interactionBounds:completion:]): Deleted.

Use the estimated popover size above to set `permittedArrowDirections` to only the directions where
the popover has enough space to fully present, without either:

1. Hanging under autolayout code, or
2. Clipping the accessory view.

If there is not enough space to show the popover in *any* direction, instead of falling back to
`UIPopoverArrowDirectionAny`, we fall back to `0` (no permitted arrow directions), and set the
target rect to the entire bounds of the window, mapped into root view coordinates. This allows us to
simply present the popover in the center of the window with no arrow, which avoids the two issues
above.

* Source/WebKit/UIProcess/ios/forms/WKDateTimeInputControl.mm:
(-[WKDateTimePicker showDateTimePicker]):

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




More information about the webkit-changes mailing list