[webkit-changes] [WebKit/WebKit] 851a94: [iOS] [UIAsyncTextInput] WKWebView AutoFill input ...
Wenson Hsieh
noreply at github.com
Mon Jan 22 13:32:39 PST 2024
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 851a94731a2a59de7b93907417f505c76b1082ea
https://github.com/WebKit/WebKit/commit/851a94731a2a59de7b93907417f505c76b1082ea
Author: Wenson Hsieh <wenson_hsieh at apple.com>
Date: 2024-01-22 (Mon, 22 Jan 2024)
Changed paths:
M Source/WebKit/Shared/ios/WebAutocorrectionContext.h
M Source/WebKit/Shared/ios/WebAutocorrectionContext.serialization.in
M Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
M Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
M Tools/TestRunnerShared/spi/UIKitSPIForTesting.h
M Tools/TestWebKitAPI/Tests/ios/AutocorrectionTestsIOS.mm
M Tools/TestWebKitAPI/cocoa/TestWKWebView.h
M Tools/TestWebKitAPI/cocoa/TestWKWebView.mm
Log Message:
-----------
[iOS] [UIAsyncTextInput] WKWebView AutoFill input assistant item doesn't show up in the keyboard
https://bugs.webkit.org/show_bug.cgi?id=267865
rdar://121160501
Reviewed by Aditya Keerthi and Abrar Rahman Protyasha.
When async text input is enabled, we use `-requestTextContextForAutocorrectionWithCompletionHandler:`
to surface autocorrection context information to UIKit. The conversion from
`WebAutocorrectionContext::markedTextRange` to `DocumentEditingContext::selectedRangeInMarkedText`
is currently straightforward:
```
editingContext.selectedRangeInMarkedText = {
.location = correctionContext.selectedRangeInMarkedText.location,
.length = correctionContext.selectedRangeInMarkedText.length
};
```
…however, this hides a subtle bug, since the "not found" location of `markedTextRange` (an
`EditingRange`) is represented using `WTF::notFound`, while the `selectedRangeInMarkedText`
represents "not found" with `NSNotFound`, directly mirroring `NSRange`. The `NSRange` operator in
`EditingRange` is aware of this difference:
```
operator NSRange() const
{
if (location == notFound)
return NSMakeRange(NSNotFound, 0);
return NSMakeRange(location, length);
}
```
…but we don't use it in the above code since we set the location and length directly. Fix this by
simply mapping `notFound` to `NSNotFound` when creating the platform context in the async text input
codepath.
Test: AutocorrectionTests.AutocorrectionContextBeforeAndAfterEditing
* Source/WebKit/Shared/ios/WebAutocorrectionContext.h:
* Source/WebKit/Shared/ios/WebAutocorrectionContext.serialization.in:
While we're here, also rename `markedTextRange` to `selectedRangeInMarkedText`, to clarify what this
range actually represents.
* Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView requestTextContextForAutocorrectionWithCompletionHandler:]):
(+[WKAutocorrectionContext autocorrectionContextWithWebContext:]):
* Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::autocorrectionContext):
* Tools/TestRunnerShared/spi/UIKitSPIForTesting.h:
* Tools/TestWebKitAPI/Tests/ios/AutocorrectionTestsIOS.mm:
Augment an existing API test to also verify that when there's no IME composition range, `markedText`
is `nil` and `selectedRangeInMarkedText` is exactly equal to `{ NSNotFound, 0 }`.
* Tools/TestWebKitAPI/cocoa/TestWKWebView.h:
* Tools/TestWebKitAPI/cocoa/TestWKWebView.mm:
(-[WKWebView autocorrectionContext]):
Canonical link: https://commits.webkit.org/273316@main
More information about the webkit-changes
mailing list