Log Message
[Cocoa] Add shouldChangeSelectedRange to WKWebProcessPlugInEditingDelegate https://bugs.webkit.org/show_bug.cgi?id=168097
Reviewed by Tim Horton. Source/WebCore: Added a userTriggered argument to FrameSelection::setSelectedRange so that WebKit2 can indicate that changes should be agreed to by the delegate. * editing/FrameSelection.cpp: (WebCore::FrameSelection::setSelectedRange): If the change is user-triggered, check with shouldChangeSelection. * editing/FrameSelection.h: Source/WebKit2: * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h: Declared new delegate method. * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm: (-[WKWebProcessPlugInBrowserContextController _setEditingDelegate:]): Dispatch new delegate method. * WebProcess/WebPage/ios/WebPageIOS.mm: (WebKit::WebPage::selectWithGesture): Pass UserTriggered whan calling WebCore::Frame::Selection::setSelectedRange, so that the delegate is consulted. (WebKit::WebPage::changeBlockSelection): Ditto. (WebKit::WebPage::updateSelectionWithTouches): Ditto. (WebKit::WebPage::selectWithTwoTouches): Ditto. (WebKit::WebPage::extendSelection): Ditto. (WebKit::WebPage::selectWordBackward): Ditto, (WebKit::WebPage::moveSelectionByOffset): Ditto. (WebKit::WebPage::selectPositionAtPoint): Ditto. (WebKit::WebPage::selectPositionAtBoundaryWithDirection): Ditto. (WebKit::WebPage::moveSelectionAtBoundaryWithDirection): Ditto. (WebKit::WebPage::selectTextWithGranularityAtPoint): Ditto. (WebKit::WebPage::updateSelectionWithExtentPointAndBoundary): Ditto. (WebKit::WebPage::updateSelectionWithExtentPoint): Ditto.
Modified Paths
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/editing/FrameSelection.cpp
- trunk/Source/WebCore/editing/FrameSelection.h
- trunk/Source/WebKit2/ChangeLog
- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h
- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm
- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm
Diff
Modified: trunk/Source/WebCore/ChangeLog (212148 => 212149)
--- trunk/Source/WebCore/ChangeLog 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebCore/ChangeLog 2017-02-10 22:16:19 UTC (rev 212149)
@@ -1,3 +1,18 @@
+2017-02-10 Dan Bernstein <m...@apple.com>
+
+ [Cocoa] Add shouldChangeSelectedRange to WKWebProcessPlugInEditingDelegate
+ https://bugs.webkit.org/show_bug.cgi?id=168097
+
+ Reviewed by Tim Horton.
+
+ Added a userTriggered argument to FrameSelection::setSelectedRange so that WebKit2 can
+ indicate that changes should be agreed to by the delegate.
+
+ * editing/FrameSelection.cpp:
+ (WebCore::FrameSelection::setSelectedRange): If the change is user-triggered, check with
+ shouldChangeSelection.
+ * editing/FrameSelection.h:
+
2017-02-10 Jonathan Bedard <jbed...@apple.com>
Removing LayoutTestRelay
Modified: trunk/Source/WebCore/editing/FrameSelection.cpp (212148 => 212149)
--- trunk/Source/WebCore/editing/FrameSelection.cpp 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebCore/editing/FrameSelection.cpp 2017-02-10 22:16:19 UTC (rev 212149)
@@ -1943,7 +1943,7 @@
}
}
-bool FrameSelection::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping)
+bool FrameSelection::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping, EUserTriggered userTriggered)
{
if (!range)
return false;
@@ -1957,6 +1957,14 @@
return false;
#endif
+ if (userTriggered == UserTriggered) {
+ FrameSelection trialFrameSelection;
+ trialFrameSelection.setSelection(newSelection, ClearTypingStyle | (closeTyping ? CloseTyping : 0));
+
+ if (!shouldChangeSelection(trialFrameSelection.selection()))
+ return false;
+ }
+
setSelection(newSelection, ClearTypingStyle | (closeTyping ? CloseTyping : 0));
return true;
}
Modified: trunk/Source/WebCore/editing/FrameSelection.h (212148 => 212149)
--- trunk/Source/WebCore/editing/FrameSelection.h 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebCore/editing/FrameSelection.h 2017-02-10 22:16:19 UTC (rev 212149)
@@ -145,7 +145,7 @@
const VisibleSelection& selection() const { return m_selection; }
WEBCORE_EXPORT void setSelection(const VisibleSelection&, SetSelectionOptions = defaultSetSelectionOptions(), AXTextStateChangeIntent = AXTextStateChangeIntent(), CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
- WEBCORE_EXPORT bool setSelectedRange(Range*, EAffinity, bool closeTyping);
+ WEBCORE_EXPORT bool setSelectedRange(Range*, EAffinity, bool closeTyping, EUserTriggered = NotUserTriggered);
WEBCORE_EXPORT void selectAll();
WEBCORE_EXPORT void clear();
void prepareForDestruction();
Modified: trunk/Source/WebKit2/ChangeLog (212148 => 212149)
--- trunk/Source/WebKit2/ChangeLog 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebKit2/ChangeLog 2017-02-10 22:16:19 UTC (rev 212149)
@@ -1,3 +1,32 @@
+2017-02-10 Dan Bernstein <m...@apple.com>
+
+ [Cocoa] Add shouldChangeSelectedRange to WKWebProcessPlugInEditingDelegate
+ https://bugs.webkit.org/show_bug.cgi?id=168097
+
+ Reviewed by Tim Horton.
+
+ * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h:
+ Declared new delegate method.
+ * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm:
+ (-[WKWebProcessPlugInBrowserContextController _setEditingDelegate:]): Dispatch new delegate
+ method.
+
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::selectWithGesture): Pass UserTriggered whan calling
+ WebCore::Frame::Selection::setSelectedRange, so that the delegate is consulted.
+ (WebKit::WebPage::changeBlockSelection): Ditto.
+ (WebKit::WebPage::updateSelectionWithTouches): Ditto.
+ (WebKit::WebPage::selectWithTwoTouches): Ditto.
+ (WebKit::WebPage::extendSelection): Ditto.
+ (WebKit::WebPage::selectWordBackward): Ditto,
+ (WebKit::WebPage::moveSelectionByOffset): Ditto.
+ (WebKit::WebPage::selectPositionAtPoint): Ditto.
+ (WebKit::WebPage::selectPositionAtBoundaryWithDirection): Ditto.
+ (WebKit::WebPage::moveSelectionAtBoundaryWithDirection): Ditto.
+ (WebKit::WebPage::selectTextWithGranularityAtPoint): Ditto.
+ (WebKit::WebPage::updateSelectionWithExtentPointAndBoundary): Ditto.
+ (WebKit::WebPage::updateSelectionWithExtentPoint): Ditto.
+
2017-02-10 Brady Eidson <beid...@apple.com>
Replace all WebKit Library Version checks in WK2 with SDK version checks.
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h (212148 => 212149)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInEditingDelegate.h 2017-02-10 22:16:19 UTC (rev 212149)
@@ -30,6 +30,12 @@
#import <WebKit/WKWebProcessPlugInBrowserContextController.h>
#import <WebKit/WKWebProcessPlugInRangeHandle.h>
+#if TARGET_OS_IPHONE
+#import <UIKit/UIKit.h>
+#else
+#import <AppKit/AppKit.h>
+#endif
+
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, WKEditorInsertAction) {
@@ -44,6 +50,11 @@
@optional
- (BOOL)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller shouldInsertText:(NSString *)text replacingRange:(WKWebProcessPlugInRangeHandle *)range givenAction:(WKEditorInsertAction)action;
+#if TARGET_OS_IPHONE
+- (BOOL)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller shouldChangeSelectedRange:(WKDOMRange *)currentRange toRange:(WKDOMRange *)proposedRange affinity:(UITextStorageDirection)selectionAffinity stillSelecting:(BOOL)stillSelecting;
+#else
+- (BOOL)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller shouldChangeSelectedRange:(WKDOMRange *)currentRange toRange:(WKDOMRange *)proposedRange affinity:(NSSelectionAffinity)selectionAffinity stillSelecting:(BOOL)stillSelecting;
+#endif
- (void)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller willWriteRangeToPasteboard:(WKWebProcessPlugInRangeHandle *)range;
- (NSDictionary<NSString *, NSData *> *)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller pasteboardDataForRange:(WKWebProcessPlugInRangeHandle *)range;
- (void)_webProcessPlugInBrowserContextControllerDidWriteToPasteboard:(WKWebProcessPlugInBrowserContextController *)controller;
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm (212148 => 212149)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm 2017-02-10 22:16:19 UTC (rev 212149)
@@ -606,6 +606,22 @@
return [m_controller->_editingDelegate.get() _webProcessPlugInBrowserContextController:m_controller shouldInsertText:String(text) replacingRange:wrapper(*InjectedBundleRangeHandle::getOrCreate(rangeToReplace)) givenAction:toWK(action)];
}
+ bool shouldChangeSelectedRange(WebPage&, Range* fromRange, Range* toRange, EAffinity affinity, bool stillSelecting) final
+ {
+ if (!m_delegateMethods.shouldChangeSelectedRange)
+ return true;
+
+ auto apiFromRange = fromRange ? adoptNS([[WKDOMRange alloc] _initWithImpl:fromRange]) : nil;
+ auto apiToRange = toRange ? adoptNS([[WKDOMRange alloc] _initWithImpl:toRange]) : nil;
+#if PLATFORM(IOS)
+ UITextStorageDirection apiAffinity = affinity == UPSTREAM ? UITextStorageDirectionBackward : UITextStorageDirectionForward;
+#else
+ NSSelectionAffinity apiAffinity = affinity == UPSTREAM ? NSSelectionAffinityUpstream : NSSelectionAffinityDownstream;
+#endif
+
+ return [m_controller->_editingDelegate.get() _webProcessPlugInBrowserContextController:m_controller shouldChangeSelectedRange:apiFromRange.get() toRange:apiToRange.get() affinity:apiAffinity stillSelecting:stillSelecting];
+ }
+
void willWriteToPasteboard(WebKit::WebPage&, WebCore::Range* range) final
{
if (!m_delegateMethods.willWriteToPasteboard)
@@ -638,6 +654,7 @@
const struct DelegateMethods {
DelegateMethods(RetainPtr<id <WKWebProcessPlugInEditingDelegate>> delegate)
: shouldInsertText([delegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:shouldInsertText:replacingRange:givenAction:)])
+ , shouldChangeSelectedRange([delegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:shouldChangeSelectedRange:toRange:affinity:stillSelecting:)])
, willWriteToPasteboard([delegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:willWriteRangeToPasteboard:)])
, getPasteboardDataForRange([delegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:pasteboardDataForRange:)])
, didWriteToPasteboard([delegate respondsToSelector:@selector(_webProcessPlugInBrowserContextControllerDidWriteToPasteboard:)])
@@ -645,6 +662,7 @@
}
bool shouldInsertText;
+ bool shouldChangeSelectedRange;
bool willWriteToPasteboard;
bool getPasteboardDataForRange;
bool didWriteToPasteboard;
Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (212148 => 212149)
--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2017-02-10 21:58:23 UTC (rev 212148)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2017-02-10 22:16:19 UTC (rev 212149)
@@ -1160,7 +1160,7 @@
break;
}
if (range)
- frame.selection().setSelectedRange(range.get(), position.affinity(), true);
+ frame.selection().setSelectedRange(range.get(), position.affinity(), true, UserTriggered);
send(Messages::WebPageProxy::GestureCallback(point, gestureType, gestureState, static_cast<uint32_t>(flags), callbackID));
}
@@ -1613,7 +1613,7 @@
if (newRange) {
m_currentBlockSelection = newRange;
- frame.selection().setSelectedRange(newRange.get(), VP_DEFAULT_AFFINITY, true);
+ frame.selection().setSelectedRange(newRange.get(), VP_DEFAULT_AFFINITY, true, UserTriggered);
}
computeExpandAndShrinkThresholdsForHandle(point, handlePosition, growThreshold, shrinkThreshold);
@@ -1737,13 +1737,13 @@
break;
}
if (range && flags != IsBlockSelection)
- frame.selection().setSelectedRange(range.get(), position.affinity(), true);
+ frame.selection().setSelectedRange(range.get(), position.affinity(), true, UserTriggered);
send(Messages::WebPageProxy::TouchesCallback(point, touches, flags, callbackID));
if (range && flags == IsBlockSelection) {
// We just switched to block selection therefore we need to compute the thresholds.
m_currentBlockSelection = range;
- frame.selection().setSelectedRange(range.get(), position.affinity(), true);
+ frame.selection().setSelectedRange(range.get(), position.affinity(), true, UserTriggered);
float growThreshold = 0;
float shrinkThreshold = 0;
@@ -1763,7 +1763,7 @@
range = Range::create(*frame.document(), fromPosition, toPosition);
else
range = Range::create(*frame.document(), toPosition, fromPosition);
- frame.selection().setSelectedRange(range.get(), fromPosition.affinity(), true);
+ frame.selection().setSelectedRange(range.get(), fromPosition.affinity(), true, UserTriggered);
}
// We can use the same callback for the gestures with one point.
@@ -1778,7 +1778,7 @@
return;
VisiblePosition position = frame.selection().selection().start();
- frame.selection().setSelectedRange(wordRangeFromPosition(position).get(), position.affinity(), true);
+ frame.selection().setSelectedRange(wordRangeFromPosition(position).get(), position.affinity(), true, UserTriggered);
}
void WebPage::selectWordBackward()
@@ -1790,7 +1790,7 @@
VisiblePosition position = frame.selection().selection().start();
VisiblePosition startPosition = positionOfNextBoundaryOfGranularity(position, WordGranularity, DirectionBackward);
if (startPosition.isNotNull() && startPosition != position)
- frame.selection().setSelectedRange(Range::create(*frame.document(), startPosition, position).ptr(), position.affinity(), true);
+ frame.selection().setSelectedRange(Range::create(*frame.document(), startPosition, position).ptr(), position.affinity(), true, UserTriggered);
}
void WebPage::moveSelectionByOffset(int32_t offset, uint64_t callbackID)
@@ -1808,7 +1808,7 @@
break;
}
if (position.isNotNull() && startPosition != position)
- frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), position.affinity(), true);
+ frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), position.affinity(), true, UserTriggered);
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
@@ -1903,7 +1903,7 @@
VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point, isInteractingWithAssistedNode);
if (position.isNotNull())
- frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), position.affinity(), true);
+ frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), position.affinity(), true, UserTriggered);
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
@@ -1915,7 +1915,7 @@
if (position.isNotNull()) {
position = positionOfNextBoundaryOfGranularity(position, static_cast<WebCore::TextGranularity>(granularity), static_cast<SelectionDirection>(direction));
if (position.isNotNull())
- frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), UPSTREAM, true);
+ frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), UPSTREAM, true, UserTriggered);
}
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
@@ -1929,7 +1929,7 @@
VisiblePosition position = (isForward) ? frame.selection().selection().visibleEnd() : frame.selection().selection().visibleStart();
position = positionOfNextBoundaryOfGranularity(position, static_cast<WebCore::TextGranularity>(granularity), static_cast<SelectionDirection>(direction));
if (position.isNotNull())
- frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), isForward? UPSTREAM : DOWNSTREAM, true);
+ frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).ptr(), isForward? UPSTREAM : DOWNSTREAM, true, UserTriggered);
}
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
@@ -1986,7 +1986,7 @@
}
if (range)
- frame.selection().setSelectedRange(range.get(), UPSTREAM, true);
+ frame.selection().setSelectedRange(range.get(), UPSTREAM, true, UserTriggered);
m_initialSelection = range;
send(Messages::WebPageProxy::VoidCallback(callbackID));
}
@@ -2021,7 +2021,7 @@
range = Range::create(*frame.document(), selectionStart, selectionEnd);
if (range)
- frame.selection().setSelectedRange(range.get(), UPSTREAM, true);
+ frame.selection().setSelectedRange(range.get(), UPSTREAM, true, UserTriggered);
send(Messages::WebPageProxy::UnsignedCallback(selectionStart == m_initialSelection->startPosition(), callbackID));
}
@@ -2064,7 +2064,7 @@
range = Range::create(*frame.document(), selectionStart, selectionEnd);
if (range)
- frame.selection().setSelectedRange(range.get(), UPSTREAM, true);
+ frame.selection().setSelectedRange(range.get(), UPSTREAM, true, UserTriggered);
send(Messages::WebPageProxy::UnsignedCallback(m_selectionAnchor == Start, callbackID));
}
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes