Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 7eae9413cc52a9fee6d2a50316c753e86aa4d5a5
https://github.com/WebKit/WebKit/commit/7eae9413cc52a9fee6d2a50316c753e86aa4d5a5
Author: Wenson Hsieh <[email protected]>
Date: 2025-02-21 (Fri, 21 Feb 2025)
Changed paths:
M Source/WTF/wtf/cocoa/RuntimeApplicationChecksCocoa.h
M Source/WebCore/dom/Element.cpp
Log Message:
-----------
[iOS] Unable to focus phone number field in Takeout/Ele.me (饿了么) Alipay mini
program when adding a new delivery address
https://bugs.webkit.org/show_bug.cgi?id=288201
rdar://145026254
Reviewed by Aditya Keerthi.
Add a new linked-on-or-after check to restore the order in which we dispatch
the `focus` event and
notify the embedding client about the newly focused element, for apps linked on
or before iOS 18.3.
In this particular case, this new ordering causes a certain telephone number
field in the Ele.me
mini-program (in Alipay) to fail to show the keyboard when tapped. This phone
number text field is
special because it's tagged with a `data-keyboard=number` DOM attribute, which
the embedding context
(Alipay) handles in the following way:
1. When the `focus` DOM event is dispatched for this text field, the page
immediately calls `blur`
on the text field, and posts a custom message to message handler in the
app, which tells it to
show a custom input view: `updateNativeKeyBoardInput`.
2. In response to receiving this message, a `H5KeyboardField` (`UITextField`
subclass) is unhidden,
made first responder, and then positioned over the input field in the DOM,
such that the text in
this native field appears as if it were part of the web content. The input
view used for this
`H5KeyboardField` is custom — in this particular case, their own version of
a numeric (0-9)
keyplane.
Crucially, however, this step appears to only happen if `-reloadInputViews`
has been called on
the content view *right before* receiving this message — on shipping
versions of iOS, this
happens as a result of handling the `WebPageProxy_ElementDidFocus` IPC
message.
3. As the user types, the value of the phone number field in the DOM is
updated to reflect the text
in the native `H5KeyboardField`.
Since the order in which this IPC is dispatched and when the `focus` DOM event
is dispatched was
inverted in https://commits.webkit.org/287924@main, step (2) no longer works
properly, because the
UI process never receives the focused element information for an element that
is immediately blurred
upon being focused. This new behavior is generally correct, so we can avoid
this binary
incompatibility by deploying a linked-on-or-after check guarding this new
behavior.
Note that Alipay has several ways to fix this issue with the new ordering,
including:
- Using `inputmode=none` on the input field instead of blurring it.
- Override `-[WKWebView inputView]` to show their own custom view instead of
blurring the field.
- Calling `blur()` on a zero-delay timer.
* Source/WTF/wtf/cocoa/RuntimeApplicationChecksCocoa.h:
* Source/WebCore/dom/Element.cpp:
(WebCore::Element::dispatchFocusEvent):
Add the new linked-on-or-after check here, cached behind a global static
variable.
Canonical link: https://commits.webkit.org/290818@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