Title: [183592] trunk/Source/WebKit2
Revision
183592
Author
[email protected]
Date
2015-04-29 17:21:20 -0700 (Wed, 29 Apr 2015)

Log Message

Adding the ability to move selection by granularity on iOS.
https://bugs.webkit.org/show_bug.cgi?id=144410
rdar://problem/19213337

Reviewed by Benjamin Poulain.

This patch also correctly sets _usingGestureForSelection for all
the functions that change the selection with a gesture.
This way we make sure that the selection drawing is not delayed
until the next time we paint.

* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView moveSelectionAtBoundary:inDirection:completionHandler:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::moveSelectionAtBoundaryWithDirection):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::moveSelectionAtBoundaryWithDirection):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (183591 => 183592)


--- trunk/Source/WebKit2/ChangeLog	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/ChangeLog	2015-04-30 00:21:20 UTC (rev 183592)
@@ -1,3 +1,26 @@
+2015-04-29  Enrica Casucci  <[email protected]>
+
+        Adding the ability to move selection by granularity on iOS.
+        https://bugs.webkit.org/show_bug.cgi?id=144410
+        rdar://problem/19213337
+
+        Reviewed by Benjamin Poulain.
+
+        This patch also correctly sets _usingGestureForSelection for all
+        the functions that change the selection with a gesture.
+        This way we make sure that the selection drawing is not delayed
+        until the next time we paint.
+
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView moveSelectionAtBoundary:inDirection:completionHandler:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::moveSelectionAtBoundaryWithDirection):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::moveSelectionAtBoundaryWithDirection):
+
 2015-04-29  Tim Horton  <[email protected]>
 
         UI process sometimes crashes under _takeViewSnapshot when the window is off-screen

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (183591 => 183592)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2015-04-30 00:21:20 UTC (rev 183592)
@@ -470,6 +470,7 @@
     void selectTextWithGranularityAtPoint(const WebCore::IntPoint, WebCore::TextGranularity, std::function<void (CallbackBase::Error)>);
     void selectPositionAtPoint(const WebCore::IntPoint, std::function<void (CallbackBase::Error)>);
     void selectPositionAtBoundaryWithDirection(const WebCore::IntPoint, WebCore::TextGranularity, WebCore::SelectionDirection, std::function<void (CallbackBase::Error)>);
+    void moveSelectionAtBoundaryWithDirection(WebCore::TextGranularity, WebCore::SelectionDirection, std::function<void(CallbackBase::Error)>);
     void beginSelectionInDirection(WebCore::SelectionDirection, std::function<void (uint64_t, CallbackBase::Error)>);
     void updateSelectionWithExtentPoint(const WebCore::IntPoint, std::function<void (uint64_t, CallbackBase::Error)>);
     void requestAutocorrectionData(const String& textForAutocorrection, std::function<void (const Vector<WebCore::FloatRect>&, const String&, double, uint64_t, CallbackBase::Error)>);

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (183591 => 183592)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2015-04-30 00:21:20 UTC (rev 183592)
@@ -1974,30 +1974,52 @@
 
 - (void)selectPositionAtPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
 {
+    _usingGestureForSelection = YES;
     UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    RetainPtr<WKContentView> view = self;
     
-    _page->selectPositionAtPoint(WebCore::IntPoint(point), [selectionHandler](WebKit::CallbackBase::Error error) {
+    _page->selectPositionAtPoint(WebCore::IntPoint(point), [view, selectionHandler](WebKit::CallbackBase::Error error) {
         selectionHandler();
+        view->_usingGestureForSelection = NO;
         [selectionHandler release];
     });
 }
 
 - (void)selectPositionAtBoundary:(UITextGranularity)granularity inDirection:(UITextDirection)direction fromPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
 {
+    _usingGestureForSelection = YES;
     UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    RetainPtr<WKContentView> view = self;
     
-    _page->selectPositionAtBoundaryWithDirection(WebCore::IntPoint(point), toWKTextGranularity(granularity), toWKSelectionDirection(direction), [selectionHandler](WebKit::CallbackBase::Error error) {
+    _page->selectPositionAtBoundaryWithDirection(WebCore::IntPoint(point), toWKTextGranularity(granularity), toWKSelectionDirection(direction), [view, selectionHandler](WebKit::CallbackBase::Error error) {
         selectionHandler();
+        view->_usingGestureForSelection = NO;
         [selectionHandler release];
     });
 }
 
+- (void)moveSelectionAtBoundary:(UITextGranularity)granularity inDirection:(UITextDirection)direction completionHandler:(void (^)(void))completionHandler
+{
+    _usingGestureForSelection = YES;
+    UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    RetainPtr<WKContentView> view = self;
+    
+    _page->moveSelectionAtBoundaryWithDirection(toWKTextGranularity(granularity), toWKSelectionDirection(direction), [view, selectionHandler](WebKit::CallbackBase::Error error) {
+        selectionHandler();
+        view->_usingGestureForSelection = NO;
+        [selectionHandler release];
+    });
+}
+
 - (void)selectTextWithGranularity:(UITextGranularity)granularity atPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
 {
+    _usingGestureForSelection = YES;
     UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    RetainPtr<WKContentView> view = self;
 
-    _page->selectTextWithGranularityAtPoint(WebCore::IntPoint(point), toWKTextGranularity(granularity), [selectionHandler](WebKit::CallbackBase::Error error) {
+    _page->selectTextWithGranularityAtPoint(WebCore::IntPoint(point), toWKTextGranularity(granularity), [view, selectionHandler](WebKit::CallbackBase::Error error) {
         selectionHandler();
+        view->_usingGestureForSelection = NO;
         [selectionHandler release];
     });
 }

Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (183591 => 183592)


--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2015-04-30 00:21:20 UTC (rev 183592)
@@ -452,6 +452,17 @@
     m_process->send(Messages::WebPage::SelectPositionAtBoundaryWithDirection(point, static_cast<uint32_t>(granularity), static_cast<uint32_t>(direction), callbackID), m_pageID);
 }
 
+void WebPageProxy::moveSelectionAtBoundaryWithDirection(WebCore::TextGranularity granularity, WebCore::SelectionDirection direction, std::function<void(CallbackBase::Error)> callbackFunction)
+{
+    if (!isValid()) {
+        callbackFunction(CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), m_process->throttler().backgroundActivityToken());
+    m_process->send(Messages::WebPage::MoveSelectionAtBoundaryWithDirection(static_cast<uint32_t>(granularity), static_cast<uint32_t>(direction), callbackID), m_pageID);
+}
+    
 void WebPageProxy::selectPositionAtPoint(const WebCore::IntPoint point, std::function<void (CallbackBase::Error)> callbackFunction)
 {
     if (!isValid()) {

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (183591 => 183592)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2015-04-30 00:21:20 UTC (rev 183592)
@@ -500,6 +500,7 @@
     void moveSelectionByOffset(int32_t offset, uint64_t callbackID);
     void selectTextWithGranularityAtPoint(const WebCore::IntPoint&, uint32_t granularity, uint64_t callbackID);
     void selectPositionAtBoundaryWithDirection(const WebCore::IntPoint&, uint32_t granularity, uint32_t direction, uint64_t callbackID);
+    void moveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID);
     void selectPositionAtPoint(const WebCore::IntPoint&, uint64_t callbackID);
     void beginSelectionInDirection(uint32_t direction, uint64_t callbackID);
     void updateSelectionWithExtentPoint(const WebCore::IntPoint&, uint64_t callbackID);

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (183591 => 183592)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2015-04-30 00:21:20 UTC (rev 183592)
@@ -66,6 +66,7 @@
     MoveSelectionByOffset(int32_t offset, uint64_t callbackID)
     SelectTextWithGranularityAtPoint(WebCore::IntPoint point, uint32_t granularity, uint64_t callbackID)
     SelectPositionAtBoundaryWithDirection(WebCore::IntPoint point, uint32_t granularity, uint32_t direction, uint64_t callbackID)
+    MoveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID)
     SelectPositionAtPoint(WebCore::IntPoint point, uint64_t callbackID)
     BeginSelectionInDirection(uint32_t direction, uint64_t callbackID)
     UpdateSelectionWithExtentPoint(WebCore::IntPoint point, uint64_t callbackID)

Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (183591 => 183592)


--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2015-04-30 00:12:25 UTC (rev 183591)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2015-04-30 00:21:20 UTC (rev 183592)
@@ -1695,6 +1695,20 @@
     send(Messages::WebPageProxy::VoidCallback(callbackID));
 }
 
+void WebPage::moveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID)
+{
+    Frame& frame = m_page->focusController().focusedOrMainFrame();
+    
+    if (!frame.selection().selection().isNone()) {
+        bool isForward = (direction == DirectionForward || direction == DirectionRight);
+        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);
+    }
+    send(Messages::WebPageProxy::VoidCallback(callbackID));
+}
+
 void WebPage::selectTextWithGranularityAtPoint(const WebCore::IntPoint& point, uint32_t granularity, uint64_t callbackID)
 {
     Frame& frame = m_page->focusController().focusedOrMainFrame();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to