diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm index f06139527932..7976052f367e 100644 --- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm +++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm @@ -6057,7 +6057,7 @@ - (void)insertTextSuggestion:(WKSETextSuggestion *)textSuggestion id <_WKInputDelegate> inputDelegate = [_webView _inputDelegate]; if ([inputDelegate respondsToSelector:@selector(_webView:insertTextSuggestion:inInputSession:)]) { #if SERVICE_EXTENSIONS_TEXT_INPUT_IS_AVAILABLE - RetainPtr uiTextSuggestion = [UITextSuggestion textSuggestionWithInputText:textSuggestion.inputText]; + RetainPtr uiTextSuggestion = [textSuggestion _uikitTextSuggestion]; #else RetainPtr uiTextSuggestion = textSuggestion; #endif diff --git a/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.h b/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.h index b14a00594f9a..7a0974e38a73 100644 --- a/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.h +++ b/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.h @@ -37,6 +37,7 @@ @property (nonatomic, copy) void (^didStartInputSessionHandler)(WKWebView *, id <_WKFormInputSession>); @property (nonatomic, copy) NSDictionary * (^webViewAdditionalContextForStrongPasswordAssistanceHandler)(WKWebView *); @property (nonatomic, copy) BOOL (^focusRequiresStrongPasswordAssistanceHandler)(WKWebView *, id <_WKFocusedElementInfo>); +@property (nonatomic, copy) void (^insertTextSuggestionHandler)(WKWebView *, UITextSuggestion *, id<_WKFormInputSession>); @end #endif diff --git a/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.mm b/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.mm index 962ca7f48785..06b6b2239aa7 100644 --- a/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.mm +++ b/Tools/TestWebKitAPI/Tests/ios/TestInputDelegate.mm @@ -31,11 +31,22 @@ #import @implementation TestInputDelegate { - BlockPtr<_WKFocusStartsInputSessionPolicy(WKWebView *, id <_WKFocusedElementInfo>)> _focusStartsInputSessionPolicyHandler; - BlockPtr)> _willStartInputSessionHandler; - BlockPtr)> _didStartInputSessionHandler; + BlockPtr<_WKFocusStartsInputSessionPolicy(WKWebView *, id<_WKFocusedElementInfo>)> _focusStartsInputSessionPolicyHandler; + BlockPtr)> _willStartInputSessionHandler; + BlockPtr)> _didStartInputSessionHandler; BlockPtr *(WKWebView *)> _webViewAdditionalContextForStrongPasswordAssistanceHandler; - BlockPtr)> _focusRequiresStrongPasswordAssistanceHandler; + BlockPtr)> _focusRequiresStrongPasswordAssistanceHandler; + BlockPtr)> _insertTextSuggestionHandler; +} + +- (void)setInsertTextSuggestionHandler:(void (^)(WKWebView *, UITextSuggestion *, id<_WKFormInputSession>))insertTextSuggestionHandler +{ + _insertTextSuggestionHandler = makeBlockPtr(insertTextSuggestionHandler); +} + +- (void(^)(WKWebView *, UITextSuggestion *, id<_WKFormInputSession>))insertTextSuggestionHandler +{ + return _insertTextSuggestionHandler.get(); } - (void)setFocusStartsInputSessionPolicyHandler:(_WKFocusStartsInputSessionPolicy (^)(WKWebView *, id <_WKFocusedElementInfo>))handler @@ -119,6 +130,12 @@ - (BOOL)_webView:(WKWebView *)webView focusRequiresStrongPasswordAssistance:(id return NO; } +- (void)_webView:(WKWebView *)webView insertTextSuggestion:(UITextSuggestion *)suggestion inInputSession:(id<_WKFormInputSession>)inputSession +{ + if (_insertTextSuggestionHandler) + _insertTextSuggestionHandler(webView, suggestion, inputSession); +} + @end #endif // PLATFORM(IOS_FAMILY) diff --git a/Tools/TestWebKitAPI/Tests/ios/WKWebViewAutofillTests.mm b/Tools/TestWebKitAPI/Tests/ios/WKWebViewAutofillTests.mm index 6bea73e32755..f4f468ea6ed1 100644 --- a/Tools/TestWebKitAPI/Tests/ios/WKWebViewAutofillTests.mm +++ b/Tools/TestWebKitAPI/Tests/ios/WKWebViewAutofillTests.mm @@ -32,9 +32,20 @@ #import "TestInputDelegate.h" #import "TestWKWebView.h" #import "UIKitSPIForTesting.h" +#import "WKSEDefinitions.h" #import #import +#if SERVICE_EXTENSIONS_TEXT_INPUT_IS_AVAILABLE +#import +#endif + +@interface CustomTextSuggestion : UITextSuggestion +@end + +@implementation CustomTextSuggestion +@end + @protocol WKTextInputSuggestionDelegate - (NSArray *)suggestions; @end @@ -232,6 +243,35 @@ static BOOL overrideIsInHardwareKeyboardMode() EXPECT_FALSE([webView acceptsAutoFillLoginCredentials]); } +#if SERVICE_EXTENSIONS_TEXT_INPUT_IS_AVAILABLE + +TEST(WKWebViewAutoFillTests, AutoFillPreservesTextSuggestion) +{ + __block bool doneFocusing = false; + auto webView = adoptNS([[AutoFillTestView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]); + auto inputDelegate = static_cast([webView _inputDelegate]); + [inputDelegate setFocusStartsInputSessionPolicyHandler:^(WKWebView *, id<_WKFocusedElementInfo>) { + doneFocusing = true; + return _WKFocusStartsInputSessionPolicyAllow; + }]; + + __block bool insertedSuggestion = false; + RetainPtr customSuggestion = [CustomTextSuggestion textSuggestionWithInputText:@"foo"]; + [inputDelegate setInsertTextSuggestionHandler:^(WKWebView *, UITextSuggestion *suggestion, id<_WKFormInputSession>) { + EXPECT_EQ(customSuggestion.get(), suggestion); + insertedSuggestion = true; + }]; + [webView synchronouslyLoadHTMLString:@""]; + [webView stringByEvaluatingJavaScript:@"user.focus()"]; + Util::run(&doneFocusing); + + auto suggestion = adoptNS([[BETextSuggestion alloc] _initWithUIKitTextSuggestion:customSuggestion.get()]); + [[webView asyncTextInput] insertTextSuggestion:suggestion.get()]; + EXPECT_TRUE(insertedSuggestion); +} + +#endif // SERVICE_EXTENSIONS_TEXT_INPUT_IS_AVAILABLE + #if PLATFORM(WATCHOS) TEST(WKWebViewAutoFillTests, DoNotShowBlankTextSuggestions)