Diff
Modified: trunk/Source/WebKit/ChangeLog (236868 => 236869)
--- trunk/Source/WebKit/ChangeLog 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Source/WebKit/ChangeLog 2018-10-05 07:49:56 UTC (rev 236869)
@@ -1,3 +1,20 @@
+2018-10-05 Zach Li <[email protected]>
+
+ Expose whether WKWebProcessPlugInNodeHandle is a select element to clients
+ https://bugs.webkit.org/show_bug.cgi?id=190302
+ <rdar://problem/45031469>
+
+ Reviewed by Tim Horton.
+
+ * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.h:
+ Introduce a new property `isSelectElement`.
+ * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.mm:
+ (-[WKWebProcessPlugInNodeHandle isSelectElement]):
+ * WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp:
+ (WebKit::InjectedBundleNodeHandle::isSelectElement const):
+ Check whether the node is a select element.
+ * WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.h:
+
2018-10-04 Wenson Hsieh <[email protected]>
[iOS] [WK2] Expose some more editing SPI on WKWebView
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.h (236868 => 236869)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.h 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.h 2018-10-05 07:49:56 UTC (rev 236869)
@@ -57,6 +57,7 @@
@property (nonatomic, readonly) BOOL HTMLTextAreaElementIsUserEdited;
@property (nonatomic, readonly) WKWebProcessPlugInNodeHandle *HTMLTableCellElementCellAbove;
@property (nonatomic, readonly) WKWebProcessPlugInFrame *frame;
+@property (nonatomic, readonly) BOOL isSelectElement WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
- (BOOL)isTextField;
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.mm (236868 => 236869)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.mm 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInNodeHandle.mm 2018-10-05 07:49:56 UTC (rev 236869)
@@ -174,6 +174,11 @@
return _nodeHandle->htmlTextAreaElementLastChangeWasUserEdit();
}
+- (BOOL)isSelectElement
+{
+ return _nodeHandle->isSelectElement();
+}
+
- (BOOL)isTextField
{
return _nodeHandle->isTextField();
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp (236868 => 236869)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp 2018-10-05 07:49:56 UTC (rev 236869)
@@ -41,6 +41,7 @@
#include <WebCore/HTMLIFrameElement.h>
#include <WebCore/HTMLInputElement.h>
#include <WebCore/HTMLNames.h>
+#include <WebCore/HTMLSelectElement.h>
#include <WebCore/HTMLTableCellElement.h>
#include <WebCore/HTMLTextAreaElement.h>
#include <WebCore/IntRect.h>
@@ -336,6 +337,11 @@
return downcast<HTMLInputElement>(m_node.get()).isTextField();
}
+bool InjectedBundleNodeHandle::isSelectElement() const
+{
+ return is<HTMLSelectElement>(m_node);
+}
+
RefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::htmlTableCellElementCellAbove()
{
if (!is<HTMLTableCellElement>(m_node))
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.h (236868 => 236869)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.h 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.h 2018-10-05 07:49:56 UTC (rev 236869)
@@ -78,6 +78,7 @@
bool htmlInputElementLastChangeWasUserEdit();
bool htmlTextAreaElementLastChangeWasUserEdit();
bool isTextField() const;
+ bool isSelectElement() const;
RefPtr<InjectedBundleNodeHandle> htmlTableCellElementCellAbove();
Modified: trunk/Tools/ChangeLog (236868 => 236869)
--- trunk/Tools/ChangeLog 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Tools/ChangeLog 2018-10-05 07:49:56 UTC (rev 236869)
@@ -1,3 +1,19 @@
+2018-10-05 Zach Li <[email protected]>
+
+ Expose whether WKWebProcessPlugInNodeHandle is a select element to clients
+ https://bugs.webkit.org/show_bug.cgi?id=190302
+ <rdar://problem/45031469>
+
+ Reviewed by Tim Horton.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/InjectedBundleNodeHandleIsSelectElement.mm: Added.
+ (-[InjectedBundleNodeHandleIsSelectElement verifySelectElementForHTMLElementTag:document:jsContext:expectedResult:failedElementTags:]):
+ (-[InjectedBundleNodeHandleIsSelectElement webProcessPlugIn:didCreateBrowserContextController:]):
+ * TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm:
+ (-[InjectedBundleNodeHandleIsSelectElementDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+ (TEST):
+
2018-10-04 Wenson Hsieh <[email protected]>
[iOS] [WK2] Expose some more editing SPI on WKWebView
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (236868 => 236869)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-10-05 07:49:56 UTC (rev 236869)
@@ -35,6 +35,7 @@
07E1F6A31FFC4B760096C7EC /* GetDisplayMedia.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E1F6A01FFC3A080096C7EC /* GetDisplayMedia.mm */; };
07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */; };
07F4E92E20AF59E2002E3803 /* UserMediaSimulateFailedSandbox.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07F4E92D20AF58D3002E3803 /* UserMediaSimulateFailedSandbox.mm */; };
+ 0E404A8C2166DE0A008271BA /* InjectedBundleNodeHandleIsSelectElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0E404A8A2166DDF8008271BA /* InjectedBundleNodeHandleIsSelectElement.mm */; };
0EBBCC661FFF9E0C00FA42AB /* pop-up-check.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 0EBBCC651FFF9DCE00FA42AB /* pop-up-check.html */; };
0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */; };
0F139E781A423A6B00F590F5 /* PlatformUtilitiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E721A423A2B00F590F5 /* PlatformUtilitiesCocoa.mm */; };
@@ -1238,6 +1239,7 @@
07F4E92D20AF58D3002E3803 /* UserMediaSimulateFailedSandbox.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserMediaSimulateFailedSandbox.mm; sourceTree = "<group>"; };
0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashMap.cpp; sourceTree = "<group>"; };
0BCD85691485C98B00EA2003 /* SetForScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SetForScope.cpp; sourceTree = "<group>"; };
+ 0E404A8A2166DDF8008271BA /* InjectedBundleNodeHandleIsSelectElement.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InjectedBundleNodeHandleIsSelectElement.mm; sourceTree = "<group>"; };
0EBBCC651FFF9DCE00FA42AB /* pop-up-check.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "pop-up-check.html"; sourceTree = "<group>"; };
0F139E721A423A2B00F590F5 /* PlatformUtilitiesCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PlatformUtilitiesCocoa.mm; path = cocoa/PlatformUtilitiesCocoa.mm; sourceTree = "<group>"; };
0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WeakObjCPtr.mm; path = cocoa/WeakObjCPtr.mm; sourceTree = "<group>"; };
@@ -2363,6 +2365,7 @@
51BCEE491C84F4AF0042C82E /* IndexedDBMultiProcess.mm */,
51B1EE8D1C80F5880064FB98 /* IndexedDBPersistence.mm */,
57599E201F07191700A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.mm */,
+ 0E404A8A2166DDF8008271BA /* InjectedBundleNodeHandleIsSelectElement.mm */,
79C5D430209D768300F1E7CA /* InjectedBundleNodeHandleIsTextField.mm */,
2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */,
5C69BDD41F82A7EB000F4F4B /* _javascript_DuringNavigation.mm */,
@@ -4147,6 +4150,7 @@
CEA7F57D2089624B0078EF6E /* DidResignInputElementStrongPasswordAppearance.mm in Sources */,
518EE51920A78CE500E024F3 /* DoubleDefersLoadingPlugin.mm in Sources */,
5CB5B3C21FFC55CF00C27BB0 /* FrameHandleSerialization.mm in Sources */,
+ 0E404A8C2166DE0A008271BA /* InjectedBundleNodeHandleIsSelectElement.mm in Sources */,
79C5D431209D768300F1E7CA /* InjectedBundleNodeHandleIsTextField.mm in Sources */,
F44C7A0020F9EEBF0014478C /* ParserYieldTokenPlugIn.mm in Sources */,
A13EBBAB1B87434600097110 /* PlatformUtilitiesCocoa.mm in Sources */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InjectedBundleNodeHandleIsSelectElement.mm (0 => 236869)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InjectedBundleNodeHandleIsSelectElement.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InjectedBundleNodeHandleIsSelectElement.mm 2018-10-05 07:49:56 UTC (rev 236869)
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if WK_API_ENABLED
+
+#import <WebKit/WKDOMDocument.h>
+#import <WebKit/WKDOMElement.h>
+#import <WebKit/WKWebProcessPlugIn.h>
+#import <WebKit/WKWebProcessPlugInBrowserContextControllerPrivate.h>
+#import <WebKit/WKWebProcessPlugInFrame.h>
+#import <WebKit/WKWebProcessPlugInNodeHandle.h>
+#import <WebKit/WKWebProcessPlugInScriptWorld.h>
+
+@interface InjectedBundleNodeHandleIsSelectElement : NSObject <WKWebProcessPlugIn>
+@end
+
+@implementation InjectedBundleNodeHandleIsSelectElement
+
+- (void)verifySelectElementForHTMLElementTag:(NSString *)htmlElementTag document:(WKDOMDocument *)document jsContext:(JSContext *)jsContext expectedResult:(BOOL)expectedResult failedElementTags:(NSMutableArray<NSString *> *)failedElementTags
+{
+ WKDOMElement *htmlElement = [document createElement:htmlElementTag];
+ [document.body appendChild:htmlElement];
+
+ NSString *scriptString = [NSString stringWithFormat:@"document.querySelector('%@')", htmlElementTag];
+ JSValue *jsValue = [jsContext evaluateScript:scriptString];
+ WKWebProcessPlugInNodeHandle * nodeHandle = [WKWebProcessPlugInNodeHandle nodeHandleWithJSValue:jsValue inContext:jsContext];
+ if (nodeHandle.isSelectElement != expectedResult)
+ [failedElementTags addObject:htmlElementTag];
+
+ [document.body removeChild:htmlElement];
+}
+
+- (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController
+{
+ WKDOMDocument *document = [browserContextController mainFrameDocument];
+ auto *jsContext = [[browserContextController mainFrame] jsContextForWorld:[WKWebProcessPlugInScriptWorld normalWorld]];
+
+ NSMutableArray <NSString *> *failedElementTags = [NSMutableArray array];
+
+ [self verifySelectElementForHTMLElementTag:@"select" document:document jsContext:jsContext expectedResult:YES failedElementTags:failedElementTags];
+ [self verifySelectElementForHTMLElementTag:@"input" document:document jsContext:jsContext expectedResult:NO failedElementTags:failedElementTags];
+
+ if (!failedElementTags.count) {
+ [[[browserContextController mainFrame] jsContextForWorld:[WKWebProcessPlugInScriptWorld normalWorld]] evaluateScript:@"alert('isSelectElement success')"];
+ return;
+ }
+
+ [[[browserContextController mainFrame] jsContextForWorld:[WKWebProcessPlugInScriptWorld normalWorld]] evaluateScript:[NSString stringWithFormat:@"alert('isSelectElement failed for %@')", [failedElementTags componentsJoinedByString:@", "]]];
+}
+
+@end
+
+#endif // WK_API_ENABLED
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm (236868 => 236869)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm 2018-10-05 04:04:10 UTC (rev 236868)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UIDelegate.mm 2018-10-05 07:49:56 UTC (rev 236869)
@@ -173,6 +173,30 @@
TestWebKitAPI::Util::run(&done);
}
+@interface InjectedBundleNodeHandleIsSelectElementDelegate : NSObject <WKUIDelegatePrivate>
+@end
+
+@implementation InjectedBundleNodeHandleIsSelectElementDelegate
+
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler
+{
+ completionHandler();
+ done = true;
+ ASSERT_STREQ(message.UTF8String, "isSelectElement success");
+}
+
+@end
+
+TEST(WebKit, InjectedBundleNodeHandleIsSelectElement)
+{
+ WKWebViewConfiguration *configuration = [WKWebViewConfiguration _test_configurationWithTestPlugInClassName:@"InjectedBundleNodeHandleIsSelectElement"];
+
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]);
+ auto delegate = adoptNS([[InjectedBundleNodeHandleIsSelectElementDelegate alloc] init]);
+ [webView setUIDelegate:delegate.get()];
+ TestWebKitAPI::Util::run(&done);
+}
+
#if PLATFORM(MAC)
@class UITestDelegate;