Legacy WebKit: Add SPI variant of -setSelectedDOMRange that can perform the selection...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Jan 2020 00:24:24 +0000 (00:24 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Jan 2020 00:24:24 +0000 (00:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=206622

Reviewed by Wenson Hsieh.

Add a new -setSelectedDOMRange SPI variant that takes a boolean to indicate whether the selection
was triggered by the user.

While I am here, I simplified and modernized the code. This includes moving the null check of
Frame::page() to the top of the function. This let me eliminate the null check for Frame::view()
because every frame that has a page must have a non-null view. I imported WebEditorClient.h
to get WebKit::core(NSSelectionAffinity) and remove a C-style cast to WebCore::EAffinity.
I also used more "auto".

* WebView/WebFrame.mm:
(-[WebFrame setSelectedDOMRange:affinity:closeTyping:]): Modified to call the newly added variant,
passing "userTriggered:NO" to keep the current behavior.
(-[WebFrame setSelectedDOMRange:affinity:closeTyping:userTriggered:]): Added.
* WebView/WebFramePrivate.h:

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

Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebView/WebFrame.mm
Source/WebKitLegacy/mac/WebView/WebFramePrivate.h

index 72eae2c..434165a 100644 (file)
@@ -1,3 +1,25 @@
+2020-01-22  Daniel Bates  <dabates@apple.com>
+
+        Legacy WebKit: Add SPI variant of -setSelectedDOMRange that can perform the selection as if triggered by the user
+        https://bugs.webkit.org/show_bug.cgi?id=206622
+
+        Reviewed by Wenson Hsieh.
+
+        Add a new -setSelectedDOMRange SPI variant that takes a boolean to indicate whether the selection
+        was triggered by the user.
+
+        While I am here, I simplified and modernized the code. This includes moving the null check of
+        Frame::page() to the top of the function. This let me eliminate the null check for Frame::view()
+        because every frame that has a page must have a non-null view. I imported WebEditorClient.h
+        to get WebKit::core(NSSelectionAffinity) and remove a C-style cast to WebCore::EAffinity.
+        I also used more "auto".
+
+        * WebView/WebFrame.mm:
+        (-[WebFrame setSelectedDOMRange:affinity:closeTyping:]): Modified to call the newly added variant,
+        passing "userTriggered:NO" to keep the current behavior.
+        (-[WebFrame setSelectedDOMRange:affinity:closeTyping:userTriggered:]): Added.
+        * WebView/WebFramePrivate.h:
+
 2020-01-22  Zalan Bujtas  <zalan@apple.com>
 
         REGRESSION (r254923): [mac-wk1] http/tests/inspector/network/har/har-page.html crashing in WebCore::Display::Box::contentBox()
index 0cb6af6..ac10e73 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2019 Apple Inc. All rights reserved.
+ * Copyright (C) 2005-2020 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -40,6 +40,7 @@
 #import "WebDataSourceInternal.h"
 #import "WebDocumentLoaderMac.h"
 #import "WebDynamicScrollBarsView.h"
+#import "WebEditorClient.h"
 #import "WebElementDictionary.h"
 #import "WebFrameLoaderClient.h"
 #import "WebFrameViewInternal.h"
 #import "WebResource.h"
 #import "WebUIKitDelegate.h"
 #import <WebCore/Document.h>
-#import <WebCore/EditorClient.h>
 #import <WebCore/FocusController.h>
 #import <WebCore/Font.h>
 #import <WebCore/FrameSelection.h>
@@ -1465,23 +1465,27 @@ static WebFrameLoadType toWebFrameLoadType(WebCore::FrameLoadType frameLoadType)
 
 - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)affinity closeTyping:(BOOL)closeTyping
 {
-    WebCore::Frame *frame = core(self);
+    [self setSelectedDOMRange:range affinity:affinity closeTyping:closeTyping userTriggered:NO];
+}
 
-    // Ensure the view becomes first responder.
-    // This does not happen automatically on iOS because we don't forward
-    // all the click events to WebKit.
-    if (auto* frameView = frame->view()) {
-        if (NSView *documentView = frameView->documentView()) {
-            auto* page = frame->page();
-            if (!page)
-                return;
-            page->chrome().focusNSView(documentView);
-        }
-    }
+- (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)affinity closeTyping:(BOOL)closeTyping userTriggered:(BOOL)userTriggered
+{
+    using namespace WebCore;
+
+    auto& frame = *core(self);
+    if (!frame.page())
+        return;
+
+    // Ensure the view becomes first responder. This does not happen automatically on iOS because
+    // we don't forward all the click events to WebKit.
+    if (NSView *documentView = frame.view()->documentView())
+        frame.page()->chrome().focusNSView(documentView);
 
-    frame->selection().setSelectedRange(core(range), (WebCore::EAffinity)affinity, closeTyping ? WebCore::FrameSelection::ShouldCloseTyping::Yes : WebCore::FrameSelection::ShouldCloseTyping::No);
+    auto coreCloseTyping = closeTyping ? FrameSelection::ShouldCloseTyping::Yes : FrameSelection::ShouldCloseTyping::No;
+    auto coreUserTriggered = userTriggered ? UserTriggered : NotUserTriggered;
+    frame.selection().setSelectedRange(core(range), core(affinity), coreCloseTyping, coreUserTriggered);
     if (!closeTyping)
-        frame->editor().ensureLastEditCommandHasCurrentSelectionIfOpenForMoreTyping();
+        frame.editor().ensureLastEditCommandHasCurrentSelectionIfOpenForMoreTyping();
 }
 
 - (NSSelectionAffinity)selectionAffinity
index 6a938c2..a211a0f 100644 (file)
@@ -150,6 +150,7 @@ typedef enum {
 
 - (DOMRange *)selectedDOMRange;
 - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)affinity closeTyping:(BOOL)closeTyping;
+- (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)affinity closeTyping:(BOOL)closeTyping userTriggered:(BOOL)userTriggered;
 - (NSSelectionAffinity)selectionAffinity;
 - (void)expandSelectionToElementContainingCaretSelection;
 - (DOMRange *)elementRangeContainingCaretSelection;