Title: [176364] tags/Safari-601.1.10/Source/WebKit2

Diff

Modified: tags/Safari-601.1.10/Source/WebKit2/ChangeLog (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/ChangeLog	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/ChangeLog	2014-11-20 00:14:13 UTC (rev 176364)
@@ -1,3 +1,49 @@
+2014-11-19  Babak Shafiei  <[email protected]>
+
+        Merge r176337.
+
+    2014-11-19  Enrica Casucci  <[email protected]>
+
+            Refactor iOS selection gestures.
+            https://bugs.webkit.org/show_bug.cgi?id=138720
+            rdar://problem/18964359
+
+            Reviewed by Benjamin Poulain.
+
+            This is a first step towards refactoring the selection gestures code.
+            It introduces more general selection movement functions that can be used to build
+            the gestures.
+
+            * UIProcess/WebPageProxy.h:
+            * UIProcess/ios/WKContentViewInteraction.h:
+            * UIProcess/ios/WKContentViewInteraction.mm:
+            (toWKTextGranularity):
+            (toWKSelectionDirection):
+            (-[WKContentView selectPositionAtPoint:completionHandler:]):
+            (-[WKContentView selectPositionAtBoundary:inDirection:fromPoint:completionHandler:]):
+            (-[WKContentView selectTextWithGranularity:atPoint:completionHandler:]):
+            (-[WKContentView beginSelectionInDirection:completionHandler:]):
+            (-[WKContentView updateSelectionWithExtentPoint:completionHandler:]):
+            (-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:userObject:]):
+            * UIProcess/ios/WebPageProxyIOS.mm:
+            (WebKit::WebPageProxy::selectTextWithGranularityAtPoint):
+            (WebKit::WebPageProxy::selectPositionAtBoundaryWithDirection):
+            (WebKit::WebPageProxy::selectPositionAtPoint):
+            (WebKit::WebPageProxy::beginSelectionInDirection):
+            (WebKit::WebPageProxy::updateSelectionWithExtentPoint):
+            * WebProcess/WebPage/WebPage.cpp:
+            (WebKit::WebPage::WebPage):
+            * WebProcess/WebPage/WebPage.h:
+            * WebProcess/WebPage/WebPage.messages.in:
+            * WebProcess/WebPage/ios/WebPageIOS.mm:
+            (WebKit::WebPage::selectWithGesture):
+            (WebKit::WebPage::visiblePositionInFocusedNodeForPoint):
+            (WebKit::WebPage::selectPositionAtPoint):
+            (WebKit::WebPage::selectPositionAtBoundaryWithDirection):
+            (WebKit::WebPage::selectTextWithGranularityAtPoint):
+            (WebKit::WebPage::beginSelectionInDirection):
+            (WebKit::WebPage::updateSelectionWithExtentPoint):
+
 2014-11-19  Michael Catanzaro  <[email protected]>
 
         [GTK] Error in documentation of webkit_print_operation_get_page_setup()

Modified: tags/Safari-601.1.10/Source/WebKit2/UIProcess/WebPageProxy.h (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/UIProcess/WebPageProxy.h	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/UIProcess/WebPageProxy.h	2014-11-20 00:14:13 UTC (rev 176364)
@@ -69,6 +69,7 @@
 #include <WebCore/TextChecking.h>
 #include <WebCore/TextGranularity.h>
 #include <WebCore/ViewState.h>
+#include <WebCore/VisibleSelection.h>
 #include <memory>
 #include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
@@ -423,6 +424,11 @@
     void extendSelection(WebCore::TextGranularity);
     void selectWordBackward();
     void moveSelectionByOffset(int32_t offset, std::function<void (CallbackBase::Error)>);
+    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 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)>);
     void applyAutocorrection(const String& correction, const String& originalText, std::function<void (const String&, CallbackBase::Error)>);
     bool applyAutocorrection(const String& correction, const String& originalText);

Modified: tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h	2014-11-20 00:14:13 UTC (rev 176364)
@@ -71,6 +71,8 @@
 typedef void (^UIWKAutocorrectionCompletionHandler)(UIWKAutocorrectionRects *rectsForInput);
 typedef void (^UIWKAutocorrectionContextHandler)(UIWKAutocorrectionContext *autocorrectionContext);
 typedef void (^UIWKDictationContextHandler)(NSString *selectedText, NSString *beforeText, NSString *afterText);
+typedef void (^UIWKSelectionCompletionHandler)(void);
+typedef void (^UIWKSelectionWithDirectionCompletionHandler)(BOOL selectionEndIsMoving);
 
 namespace WebKit {
 struct WKAutoCorrectionData {

Modified: tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2014-11-20 00:14:13 UTC (rev 176364)
@@ -1637,6 +1637,40 @@
     }
 }
 
+static inline WebCore::TextGranularity toWKTextGranularity(UITextGranularity granularity)
+{
+    switch (granularity) {
+    case UITextGranularityCharacter:
+        return CharacterGranularity;
+    case UITextGranularityWord:
+        return WordGranularity;
+    case UITextGranularitySentence:
+        return SentenceGranularity;
+    case UITextGranularityParagraph:
+        return ParagraphGranularity;
+    case UITextGranularityLine:
+        return LineGranularity;
+    case UITextGranularityDocument:
+        return DocumentGranularity;
+    }
+}
+
+static inline WebCore::SelectionDirection toWKSelectionDirection(UITextDirection direction)
+{
+    switch (direction) {
+    case UITextLayoutDirectionDown:
+    case UITextLayoutDirectionRight:
+        return DirectionRight;
+    case UITextLayoutDirectionUp:
+    case UITextLayoutDirectionLeft:
+        return DirectionLeft;
+    default:
+        // UITextDirection is not an enum, but we only want to accept values from UITextLayoutDirection.
+        ASSERT_NOT_REACHED();
+        return DirectionRight;
+    }
+}
+
 static void selectionChangedWithGesture(WKContentView *view, const WebCore::IntPoint& point, uint32_t gestureType, uint32_t gestureState, uint32_t flags, CallbackBase::Error error)
 {
     if (error != CallbackBase::Error::None) {
@@ -1749,6 +1783,56 @@
     });
 }
 
+- (void)selectPositionAtPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
+{
+    UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    
+    _page->selectPositionAtPoint(WebCore::IntPoint(point), [selectionHandler](CallbackBase::Error error) {
+        selectionHandler();
+        [selectionHandler release];
+    });
+}
+
+- (void)selectPositionAtBoundary:(UITextGranularity)granularity inDirection:(UITextDirection)direction fromPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
+{
+    UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+    
+    _page->selectPositionAtBoundaryWithDirection(WebCore::IntPoint(point), toWKTextGranularity(granularity), toWKSelectionDirection(direction), [selectionHandler](CallbackBase::Error error) {
+        selectionHandler();
+        [selectionHandler release];
+    });
+}
+
+- (void)selectTextWithGranularity:(UITextGranularity)granularity atPoint:(CGPoint)point completionHandler:(void (^)(void))completionHandler
+{
+    UIWKSelectionCompletionHandler selectionHandler = [completionHandler copy];
+
+    _page->selectTextWithGranularityAtPoint(WebCore::IntPoint(point), toWKTextGranularity(granularity), [selectionHandler](CallbackBase::Error error) {
+        selectionHandler();
+        [selectionHandler release];
+    });
+}
+
+- (void)beginSelectionInDirection:(UITextDirection)direction completionHandler:(void (^)(BOOL endIsMoving))completionHandler
+{
+    UIWKSelectionWithDirectionCompletionHandler selectionHandler = [completionHandler copy];
+
+    _page->beginSelectionInDirection(toWKSelectionDirection(direction), [selectionHandler](bool endIsMoving, CallbackBase::Error error) {
+        selectionHandler(endIsMoving);
+        [selectionHandler release];
+    });
+}
+
+- (void)updateSelectionWithExtentPoint:(CGPoint)point completionHandler:(void (^)(BOOL endIsMoving))completionHandler
+{
+    UIWKSelectionWithDirectionCompletionHandler selectionHandler = [completionHandler copy];
+    
+    _page->updateSelectionWithExtentPoint(WebCore::IntPoint(point), [selectionHandler](bool endIsMoving, CallbackBase::Error error) {
+        selectionHandler(endIsMoving);
+        [selectionHandler release];
+    });
+}
+
 - (UTF32Char)_characterBeforeCaretSelection
 {
     return _page->editorState().characterBeforeSelection;
@@ -2575,6 +2659,8 @@
     if (![self isFirstResponder])
         [self becomeFirstResponder];
 
+    [self reloadInputViews];
+    
     switch (information.elementType) {
     case InputType::Select:
     case InputType::DateTimeLocal:
@@ -2589,8 +2675,7 @@
     
     if (information.insideFixedPosition)
         [_webView _updateVisibleContentRects];
-
-    [self reloadInputViews];
+    
     [self _displayFormNodeInputView];
 
     // _inputPeripheral has been initialized in inputView called by reloadInputViews.

Modified: tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm	2014-11-20 00:14:13 UTC (rev 176364)
@@ -430,6 +430,62 @@
     return autocorrectionApplied;
 }
 
+void WebPageProxy::selectTextWithGranularityAtPoint(const WebCore::IntPoint point, WebCore::TextGranularity granularity, std::function<void (CallbackBase::Error)> callbackFunction)
+{
+    if (!isValid()) {
+        callbackFunction(CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), std::make_unique<ProcessThrottler::BackgroundActivityToken>(m_process->throttler()));
+    m_process->send(Messages::WebPage::SelectTextWithGranularityAtPoint(point, static_cast<uint32_t>(granularity), callbackID), m_pageID);
+}
+
+void WebPageProxy::selectPositionAtBoundaryWithDirection(const WebCore::IntPoint point, 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), std::make_unique<ProcessThrottler::BackgroundActivityToken>(m_process->throttler()));
+    m_process->send(Messages::WebPage::SelectPositionAtBoundaryWithDirection(point, 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()) {
+        callbackFunction(CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), std::make_unique<ProcessThrottler::BackgroundActivityToken>(m_process->throttler()));
+    m_process->send(Messages::WebPage::SelectPositionAtPoint(point, callbackID), m_pageID);
+}
+
+void WebPageProxy::beginSelectionInDirection(WebCore::SelectionDirection direction, std::function<void (uint64_t, CallbackBase::Error)> callbackFunction)
+{
+    if (!isValid()) {
+        callbackFunction(0, CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), std::make_unique<ProcessThrottler::BackgroundActivityToken>(m_process->throttler()));
+    m_process->send(Messages::WebPage::BeginSelectionInDirection(direction, callbackID), m_pageID);
+}
+
+void WebPageProxy::updateSelectionWithExtentPoint(const WebCore::IntPoint point, std::function<void (uint64_t, CallbackBase::Error)> callbackFunction)
+{
+    if (!isValid()) {
+        callbackFunction(0, CallbackBase::Error::Unknown);
+        return;
+    }
+    
+    uint64_t callbackID = m_callbacks.put(WTF::move(callbackFunction), std::make_unique<ProcessThrottler::BackgroundActivityToken>(m_process->throttler()));
+    m_process->send(Messages::WebPage::UpdateSelectionWithExtentPoint(point, callbackID), m_pageID);
+    
+}
+
 void WebPageProxy::requestDictationContext(std::function<void (const String&, const String&, const String&, CallbackBase::Error)> callbackFunction)
 {
     if (!isValid()) {

Modified: tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2014-11-20 00:14:13 UTC (rev 176364)
@@ -300,6 +300,7 @@
     , m_isShowingContextMenu(false)
 #endif
 #if PLATFORM(IOS)
+    , m_selectionAnchor(Start)
     , m_firstLayerTreeTransactionIDAfterDidCommitLoad(0)
     , m_hasReceivedVisibleContentRectsAfterDidCommitLoad(false)
     , m_scaleWasSetByUIProcess(false)

Modified: tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.h (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.h	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.h	2014-11-20 00:14:13 UTC (rev 176364)
@@ -490,6 +490,12 @@
     void extendSelection(uint32_t granularity);
     void selectWordBackward();
     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 selectPositionAtPoint(const WebCore::IntPoint&, uint64_t callbackID);
+    void beginSelectionInDirection(uint32_t direction, uint64_t callbackID);
+    void updateSelectionWithExtentPoint(const WebCore::IntPoint&, uint64_t callbackID);
+
     void elementDidFocus(WebCore::Node*);
     void elementDidBlur(WebCore::Node*);
     void requestDictationContext(uint64_t callbackID);
@@ -876,6 +882,7 @@
     void completeSyntheticClick(WebCore::Node* nodeRespondingToClick, const WebCore::FloatPoint& location);
     void sendTapHighlightForNodeIfNecessary(uint64_t requestID, WebCore::Node*);
     void resetTextAutosizingBeforeLayoutIfNeeded(const WebCore::FloatSize& oldSize, const WebCore::FloatSize& newSize);
+    WebCore::VisiblePosition visiblePositionInFocusedNodeForPoint(WebCore::Frame&, const WebCore::IntPoint&);
 #endif
 #if !PLATFORM(COCOA)
     static const char* interpretKeyEvent(const WebCore::KeyboardEvent*);
@@ -1242,6 +1249,12 @@
     RefPtr<WebCore::Range> m_currentWordRange;
     RefPtr<WebCore::Node> m_interactionNode;
     WebCore::IntPoint m_lastInteractionLocation;
+    
+    enum SelectionAnchor {
+        Start,
+        End
+    };
+    SelectionAnchor m_selectionAnchor;
 
     RefPtr<WebCore::Node> m_potentialTapNode;
     WebCore::FloatPoint m_potentialTapLocation;

Modified: tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2014-11-20 00:14:13 UTC (rev 176364)
@@ -64,6 +64,11 @@
     ExtendSelection(uint32_t granularity)
     SelectWordBackward()
     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)
+    SelectPositionAtPoint(WebCore::IntPoint point, uint64_t callbackID)
+    BeginSelectionInDirection(uint32_t direction, uint64_t callbackID)
+    UpdateSelectionWithExtentPoint(WebCore::IntPoint point, uint64_t callbackID)
     RequestDictationContext(uint64_t callbackID)
     ReplaceDictatedText(String oldText, String newText)
     ReplaceSelectedText(String oldText, String newText)

Modified: tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (176363 => 176364)


--- tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2014-11-20 00:10:57 UTC (rev 176363)
+++ tags/Safari-601.1.10/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm	2014-11-20 00:14:13 UTC (rev 176364)
@@ -816,10 +816,8 @@
 void WebPage::selectWithGesture(const IntPoint& point, uint32_t granularity, uint32_t gestureType, uint32_t gestureState, uint64_t callbackID)
 {
     Frame& frame = m_page->focusController().focusedOrMainFrame();
-    IntPoint adjustedPoint(frame.view()->rootViewToContents(point));
+    VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point);
 
-    IntPoint constrainedPoint = m_assistedNode ? constrainPoint(adjustedPoint, &frame, m_assistedNode.get()) : adjustedPoint;
-    VisiblePosition position = frame.visiblePositionForPoint(constrainedPoint);
     if (position.isNull()) {
         send(Messages::WebPageProxy::GestureCallback(point, gestureType, gestureState, 0, callbackID));
         return;
@@ -853,12 +851,11 @@
             // Don't cross line boundaries.
             result = position;
         } else if (withinTextUnitOfGranularity(position, WordGranularity, DirectionForward)) {
-            // The position lies within a word.
-            RefPtr<Range> wordRange = enclosingTextUnitOfGranularity(position, WordGranularity, DirectionForward);
-
-            result = wordRange->startPosition();
-            if (distanceBetweenPositions(position, result) > 1)
-                result = wordRange->endPosition();
+            // The position lies within a word, we want to select the word.
+            if (frame.selection().isCaret())
+                range = enclosingTextUnitOfGranularity(position, WordGranularity, DirectionForward);
+            else if (frame.selection().isRange() && (position < frame.selection().selection().start() || position > frame.selection().selection().end()))
+                result = position;
         } else if (atBoundaryOfGranularity(position, WordGranularity, DirectionBackward)) {
             // The position is at the end of a word.
             result = position;
@@ -1553,6 +1550,112 @@
     send(Messages::WebPageProxy::VoidCallback(callbackID));
 }
 
+VisiblePosition WebPage::visiblePositionInFocusedNodeForPoint(Frame& frame, const IntPoint& point)
+{
+    IntPoint adjustedPoint(frame.view()->rootViewToContents(point));
+    IntPoint constrainedPoint = m_assistedNode ? constrainPoint(adjustedPoint, &frame, m_assistedNode.get()) : adjustedPoint;
+    return frame.visiblePositionForPoint(constrainedPoint);
+}
+
+void WebPage::selectPositionAtPoint(const WebCore::IntPoint& point, uint64_t callbackID)
+{
+    Frame& frame = m_page->focusController().focusedOrMainFrame();
+    VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point);
+    
+    if (position.isNotNull())
+        frame.selection().setSelectedRange(Range::create(*frame.document(), position, position).get(), position.affinity(), true);
+    send(Messages::WebPageProxy::VoidCallback(callbackID));
+}
+
+void WebPage::selectPositionAtBoundaryWithDirection(const WebCore::IntPoint& point, uint32_t granularity, uint32_t direction, uint64_t callbackID)
+{
+    Frame& frame = m_page->focusController().focusedOrMainFrame();
+    VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point);
+
+    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).get(), UPSTREAM, 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();
+    VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point);
+
+    RefPtr<Range> range;
+    switch (static_cast<WebCore::TextGranularity>(granularity)) {
+    case WordGranularity:
+        range = wordRangeFromPosition(position);
+        break;
+    case SentenceGranularity:
+        range = enclosingTextUnitOfGranularity(position, SentenceGranularity, DirectionForward);
+        break;
+    case ParagraphGranularity:
+        range = enclosingTextUnitOfGranularity(position, ParagraphGranularity, DirectionForward);
+        break;
+    case DocumentGranularity:
+        frame.selection().selectAll();
+        break;
+    default:
+        break;
+    }
+    if (range)
+        frame.selection().setSelectedRange(range.get(), UPSTREAM, true);
+    send(Messages::WebPageProxy::VoidCallback(callbackID));
+}
+
+void WebPage::beginSelectionInDirection(uint32_t direction, uint64_t callbackID)
+{
+    m_selectionAnchor = (static_cast<SelectionDirection>(direction) == DirectionLeft) ? Start : End;
+    send(Messages::WebPageProxy::UnsignedCallback(m_selectionAnchor == Start, callbackID));
+}
+    
+void WebPage::updateSelectionWithExtentPoint(const WebCore::IntPoint& point, uint64_t callbackID)
+{
+    Frame& frame = m_page->focusController().focusedOrMainFrame();
+    VisiblePosition position = visiblePositionInFocusedNodeForPoint(frame, point);
+
+    if (position.isNull()) {
+        send(Messages::WebPageProxy::UnsignedCallback(false, callbackID));
+        return;
+    }
+
+    RefPtr<Range> range;
+    VisiblePosition selectionStart;
+    VisiblePosition selectionEnd;
+    
+    if (m_selectionAnchor == Start) {
+        selectionStart = frame.selection().selection().visibleStart();
+        selectionEnd = position;
+
+        if (position <= selectionStart) {
+            selectionStart = selectionStart.previous();
+            selectionEnd = frame.selection().selection().visibleEnd();
+            m_selectionAnchor = End;
+        }
+    } else {
+        selectionStart = position;
+        selectionEnd = frame.selection().selection().visibleEnd();
+        
+        if (position >= selectionEnd) {
+            selectionStart = frame.selection().selection().visibleStart();
+            selectionEnd = selectionEnd.next();
+            m_selectionAnchor = Start;
+        }
+    }
+    
+    if (selectionStart.isNotNull() && selectionEnd.isNotNull())
+        range = Range::create(*frame.document(), selectionStart, selectionEnd);
+
+    if (range)
+        frame.selection().setSelectedRange(range.get(), UPSTREAM, true);
+
+    send(Messages::WebPageProxy::UnsignedCallback(m_selectionAnchor == Start, callbackID));
+}
+
 void WebPage::convertSelectionRectsToRootView(FrameView* view, Vector<SelectionRect>& selectionRects)
 {
     for (size_t i = 0; i < selectionRects.size(); ++i) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to