Source/WebKit:
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Nov 2018 19:00:04 +0000 (19:00 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Nov 2018 19:00:04 +0000 (19:00 +0000)
[Cocoa] [WebKit2] Hook up some more editing actions (-_pasteAndMatchStyle:, -makeTextWritingDirectionNatural:)
https://bugs.webkit.org/show_bug.cgi?id=191605
<rdar://problem/45813991>

Reviewed by Dean Jackson.

Hook up a couple of editing actions on iOS and macOS. The `-pasteAndMatchStyle:` selector is privately declared
in UIKit, but does not exist on macOS; as such, add `-_pasteAndMatchStyle:` as SPI on WKWebView, and
additionally implement the unprefixed version, `-pasteAndMatchStyle:`, on iOS.

Since `-makeTextWritingDirectionNatural:` is already declared on both iOS and macOS (SPI on UIResponder and API
on macOS, respectively) we simply implement the unprefixed variant on both platforms.

* Platform/spi/ios/UIKitSPI.h:
* UIProcess/API/Cocoa/WKWebView.mm:
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView makeTextWritingDirectionNaturalForWebView:]):
(-[WKContentView canPerformActionForWebView:withSender:]):

Tools:
[Cocoa] [WebKit2] Hook up some more editing actions (-pasteAndMatchStyle:, -makeTextWritingDirectionNatural:)
https://bugs.webkit.org/show_bug.cgi?id=191605
<rdar://problem/45813991>

Reviewed by Dean Jackson.

Adds two new API tests to exercise -_pasteAndMatchStyle: and -makeTextWritingDirectionNatural:.

* TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm:
(-[TestWKWebView _synchronouslyExecuteEditCommand:argument:]): Deleted.
* TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEditActions.mm:
(TestWebKitAPI::TEST):
* TestWebKitAPI/cocoa/TestWKWebView.h:
* TestWebKitAPI/cocoa/TestWKWebView.mm:

Pull `-_synchronouslyExecuteEditCommand:argument:` out of WKAttachmentTests and into shared code, in a new
category on WKWebView declared in TestWKWebView. Also, fix an unrelated typo in a nearby category.

(-[WKWebView _synchronouslyExecuteEditCommand:argument:]):
* TestWebKitAPI/ios/UIKitSPI.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@238186 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebKit/ChangeLog
Source/WebKit/Platform/spi/ios/UIKitSPI.h
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
Source/WebKit/UIProcess/ios/WKContentViewInteraction.h
Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm
Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEditActions.mm
Tools/TestWebKitAPI/cocoa/TestWKWebView.h
Tools/TestWebKitAPI/cocoa/TestWKWebView.mm
Tools/TestWebKitAPI/ios/UIKitSPI.h

index 665e988..19aa1bc 100644 (file)
@@ -1,3 +1,26 @@
+2018-11-14  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [Cocoa] [WebKit2] Hook up some more editing actions (-_pasteAndMatchStyle:, -makeTextWritingDirectionNatural:)
+        https://bugs.webkit.org/show_bug.cgi?id=191605
+        <rdar://problem/45813991>
+
+        Reviewed by Dean Jackson.
+
+        Hook up a couple of editing actions on iOS and macOS. The `-pasteAndMatchStyle:` selector is privately declared
+        in UIKit, but does not exist on macOS; as such, add `-_pasteAndMatchStyle:` as SPI on WKWebView, and
+        additionally implement the unprefixed version, `-pasteAndMatchStyle:`, on iOS.
+
+        Since `-makeTextWritingDirectionNatural:` is already declared on both iOS and macOS (SPI on UIResponder and API
+        on macOS, respectively) we simply implement the unprefixed variant on both platforms.
+
+        * Platform/spi/ios/UIKitSPI.h:
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView makeTextWritingDirectionNaturalForWebView:]):
+        (-[WKContentView canPerformActionForWebView:withSender:]):
+
 2018-11-14  Per Arne Vollan  <pvollan@apple.com>
 
         REGRESSION (WEBPROCESS_WINDOWSERVER_BLOCKING): requestAnimationFrame Stops Completing
index 275fa5f..f295b13 100644 (file)
@@ -1078,6 +1078,8 @@ typedef NSInteger UICompositingMode;
 
 @interface UIResponder ()
 - (UIResponder *)firstResponder;
+- (void)pasteAndMatchStyle:(id)sender;
+- (void)makeTextWritingDirectionNatural:(id)sender;
 @end
 
 @interface _UINavigationInteractiveTransitionBase ()
index b864c52..1553f9f 100644 (file)
@@ -4331,7 +4331,8 @@ WEBCORE_PRIVATE_COMMAND(insertNestedOrderedList)
 WEBCORE_PRIVATE_COMMAND(insertNestedUnorderedList)
 WEBCORE_PRIVATE_COMMAND(indent)
 WEBCORE_PRIVATE_COMMAND(outdent)
-WEBCORE_PRIVATE_COMMAND(pasteAsQuotation);
+WEBCORE_PRIVATE_COMMAND(pasteAsQuotation)
+WEBCORE_PRIVATE_COMMAND(pasteAndMatchStyle)
 
 #undef WEBCORE_PRIVATE_COMMAND
 
index 23e68da..43825e9 100644 (file)
@@ -203,6 +203,7 @@ typedef NS_OPTIONS(NSUInteger, _WKRectEdge) {
 - (IBAction)_decreaseListLevel:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (IBAction)_changeListType:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (IBAction)_pasteAsQuotation:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (IBAction)_pasteAndMatchStyle:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 #if TARGET_OS_IPHONE
 
index 5c41425..de058f2 100644 (file)
@@ -132,7 +132,9 @@ typedef std::pair<WebKit::InteractionInformationRequest, InteractionInformationC
     M(alignLeft) \
     M(alignRight) \
     M(alignCenter) \
-    M(alignJustified)
+    M(alignJustified) \
+    M(pasteAndMatchStyle) \
+    M(makeTextWritingDirectionNatural)
 
 #define FOR_EACH_PRIVATE_WKCONTENTVIEW_ACTION(M) \
     M(_alignCenter) \
@@ -149,7 +151,8 @@ typedef std::pair<WebKit::InteractionInformationRequest, InteractionInformationC
     M(_increaseListLevel) \
     M(_decreaseListLevel) \
     M(_changeListType) \
-    M(_pasteAsQuotation)
+    M(_pasteAsQuotation) \
+    M(_pasteAndMatchStyle)
 
 namespace WebKit {
 
index b887b77..508e1ea 100644 (file)
@@ -2261,6 +2261,11 @@ FOR_EACH_PRIVATE_WKCONTENTVIEW_ACTION(FORWARD_ACTION_TO_WKWEBVIEW)
     return (NSString *)_page->editorState().postLayoutData().wordAtSelection;
 }
 
+- (void)makeTextWritingDirectionNaturalForWebView:(id)sender
+{
+    _page->executeEditCommand("makeTextWritingDirectionNatural"_s);
+}
+
 - (BOOL)isReplaceAllowed
 {
     return _page->editorState().postLayoutData().isReplaceAllowed;
@@ -2308,6 +2313,7 @@ WEBCORE_COMMAND_FOR_WEBVIEW(alignLeft);
 WEBCORE_COMMAND_FOR_WEBVIEW(alignRight);
 WEBCORE_COMMAND_FOR_WEBVIEW(alignCenter);
 WEBCORE_COMMAND_FOR_WEBVIEW(alignJustified);
+WEBCORE_COMMAND_FOR_WEBVIEW(pasteAndMatchStyle);
 #undef WEBCORE_COMMAND_FOR_WEBVIEW
 
 - (void)_increaseListLevelForWebView:(id)sender
@@ -2448,7 +2454,8 @@ WEBCORE_COMMAND_FOR_WEBVIEW(alignJustified);
         || action == @selector(increaseSize:) || action == @selector(decreaseSize:)
         || action == @selector(toggleStrikeThrough:) || action == @selector(insertOrderedList:) || action == @selector(insertUnorderedList:) || action == @selector(indent:) || action == @selector(outdent:)
         || action == @selector(alignLeft:) || action == @selector(alignRight:) || action == @selector(alignCenter:) || action == @selector(alignJustified:)
-        || action == @selector(setTextColor:sender:) || action == @selector(setFont:sender:) || action == @selector(setFontSize:sender:)) {
+        || action == @selector(setTextColor:sender:) || action == @selector(setFont:sender:) || action == @selector(setFontSize:sender:)
+        || action == @selector(makeTextWritingDirectionNatural:)) {
         // FIXME: This should be more nuanced in the future, rather than returning YES for all richly editable areas. For instance, outdent: should be disabled when the selection is already
         // at the outermost indentation level.
         return editorState.isContentRichlyEditable;
@@ -2456,7 +2463,7 @@ WEBCORE_COMMAND_FOR_WEBVIEW(alignJustified);
     if (action == @selector(cut:))
         return !editorState.isInPasswordField && editorState.isContentEditable && editorState.selectionIsRange;
     
-    if (action == @selector(paste:) || action == @selector(_pasteAsQuotation:)) {
+    if (action == @selector(paste:) || action == @selector(_pasteAsQuotation:) || action == @selector(_pasteAndMatchStyle:) || action == @selector(pasteAndMatchStyle:)) {
         if (editorState.selectionIsNone || !editorState.isContentEditable)
             return NO;
         UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
index ba21985..cc2651f 100644 (file)
@@ -1,3 +1,26 @@
+2018-11-14  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [Cocoa] [WebKit2] Hook up some more editing actions (-pasteAndMatchStyle:, -makeTextWritingDirectionNatural:)
+        https://bugs.webkit.org/show_bug.cgi?id=191605
+        <rdar://problem/45813991>
+
+        Reviewed by Dean Jackson.
+
+        Adds two new API tests to exercise -_pasteAndMatchStyle: and -makeTextWritingDirectionNatural:.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm:
+        (-[TestWKWebView _synchronouslyExecuteEditCommand:argument:]): Deleted.
+        * TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEditActions.mm:
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/cocoa/TestWKWebView.h:
+        * TestWebKitAPI/cocoa/TestWKWebView.mm:
+
+        Pull `-_synchronouslyExecuteEditCommand:argument:` out of WKAttachmentTests and into shared code, in a new
+        category on WKWebView declared in TestWKWebView. Also, fix an unrelated typo in a nearby category.
+
+        (-[WKWebView _synchronouslyExecuteEditCommand:argument:]):
+        * TestWebKitAPI/ios/UIKitSPI.h:
+
 2018-11-14  Chris Dumez  <cdumez@apple.com>
 
         WebKit.ApplicationManifestBasic API test is failing when enabling PSON
index 7964df1..8f13b78 100644 (file)
@@ -246,18 +246,6 @@ static NSData *testPDFData()
     [self expectElementTagsInOrder:@[tagName, otherTagName]];
 }
 
-- (BOOL)_synchronouslyExecuteEditCommand:(NSString *)command argument:(NSString *)argument
-{
-    __block bool done = false;
-    __block bool success;
-    [self _executeEditCommand:command argument:argument completion:^(BOOL completionSuccess) {
-        done = true;
-        success = completionSuccess;
-    }];
-    TestWebKitAPI::Util::run(&done);
-    return success;
-}
-
 - (_WKAttachment *)synchronouslyInsertAttachmentWithFileWrapper:(NSFileWrapper *)fileWrapper contentType:(NSString *)contentType
 {
     __block bool done = false;
index 4bf5914..33700e0 100644 (file)
@@ -240,6 +240,31 @@ TEST(WKWebViewEditActions, PasteAsQuotation)
     EXPECT_TRUE([webView querySelectorExists:@"blockquote"]);
 }
 
+TEST(WKWebViewEditActions, PasteAndMatchStyle)
+{
+    auto source = webViewForEditActionTesting();
+    auto destination = webViewForEditActionTesting(@"<div><br></div>");
+
+    [source selectAll:nil];
+    [source evaluateJavaScript:@"document.execCommand('bold'); document.execCommand('underline'); document.execCommand('italic')" completionHandler:nil];
+    [source _synchronouslyExecuteEditCommand:@"Copy" argument:nil];
+
+    [destination _pasteAndMatchStyle:nil];
+    [destination selectAll:nil];
+    EXPECT_FALSE([destination stringByEvaluatingJavaScript:@"document.queryCommandState('bold')"].boolValue);
+    EXPECT_FALSE([destination stringByEvaluatingJavaScript:@"document.queryCommandState('italic')"].boolValue);
+    EXPECT_FALSE([destination stringByEvaluatingJavaScript:@"document.queryCommandState('underline')"].boolValue);
+    EXPECT_WK_STREQ("WebKit", [destination stringByEvaluatingJavaScript:@"getSelection().toString()"]);
+}
+
+TEST(WKWebViewEditActions, ModifyTextWritingDirection)
+{
+    auto webView = webViewForEditActionTesting(@"<div id='text' style='direction: rtl; unicode-bidi: bidi-override;'>WebKit</div>");
+    [webView selectAll:nil];
+    [webView makeTextWritingDirectionNatural:nil];
+    EXPECT_WK_STREQ("normal", [webView stringByEvaluatingJavaScript:@"getComputedStyle(text).unicodeBidi"]);
+}
+
 #if PLATFORM(IOS_FAMILY)
 
 TEST(WKWebViewEditActions, ChangeFontSize)
index 4dda93f..6ee17d7 100644 (file)
 #endif
 @end
 
+@interface WKWebView (TestWebKitAPI)
+- (BOOL)_synchronouslyExecuteEditCommand:(NSString *)command argument:(NSString *)argument;
+@end
+
 @interface TestMessageHandler : NSObject <WKScriptMessageHandler>
 - (void)addMessage:(NSString *)message withHandler:(dispatch_block_t)handler;
 @end
index d88f937..67e36d1 100644 (file)
@@ -50,7 +50,7 @@
 SOFT_LINK_FRAMEWORK(UIKit)
 SOFT_LINK_CLASS(UIKit, UIWindow)
 
-@implementation WKWebView (WKWebViewTestingQuicks)
+@implementation WKWebView (WKWebViewTestingQuirks)
 
 // TestWebKitAPI is currently not a UIApplication so we are unable to track if it is in
 // the background or not (https://bugs.webkit.org/show_bug.cgi?id=175204). This can
@@ -63,6 +63,22 @@ SOFT_LINK_CLASS(UIKit, UIWindow)
 @end
 #endif
 
+@implementation WKWebView (TestWebKitAPI)
+
+- (BOOL)_synchronouslyExecuteEditCommand:(NSString *)command argument:(NSString *)argument
+{
+    __block bool done = false;
+    __block bool success;
+    [self _executeEditCommand:command argument:argument completion:^(BOOL completionSuccess) {
+        done = true;
+        success = completionSuccess;
+    }];
+    TestWebKitAPI::Util::run(&done);
+    return success;
+}
+
+@end
+
 @implementation TestMessageHandler {
     NSMutableDictionary<NSString *, dispatch_block_t> *_messageHandlers;
 }
index 68db680..64a6e59 100644 (file)
@@ -162,6 +162,7 @@ WTF_EXTERN_C_END
 
 @interface UIResponder (UIKitSPI)
 - (UIResponder *)firstResponder;
+- (void)makeTextWritingDirectionNatural:(id)sender;
 @end
 
 @interface UIKeyboard ()