Refactor drag and drop for WebKit2 to encode DragData message exchange.
authorenrica@apple.com <enrica@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Nov 2016 23:35:28 +0000 (23:35 +0000)
committerenrica@apple.com <enrica@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Nov 2016 23:35:28 +0000 (23:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=164945

Reviewed by Tim Horton.

Source/WebCore:

No new tests. No change in functionality.

* loader/EmptyClients.h:
* page/DragClient.h:
* page/DragController.cpp:
(WebCore::createMouseEvent):
(WebCore::documentFragmentFromDragData):
(WebCore::DragController::dragIsMove):
(WebCore::DragController::dragEntered):
(WebCore::DragController::dragExited):
(WebCore::DragController::dragUpdated):
(WebCore::DragController::performDragOperation):
(WebCore::DragController::dragEnteredOrUpdated):
(WebCore::DragController::tryDocumentDrag):
(WebCore::DragController::operationForLoad):
(WebCore::DragController::dispatchTextInputEventFor):
(WebCore::DragController::concludeEditDrag):
(WebCore::DragController::canProcessDrag):
(WebCore::DragController::tryDHTMLDrag):
* page/DragController.h:
* page/efl/DragControllerEfl.cpp:
(WebCore::DragController::isCopyKeyDown):
(WebCore::DragController::dragOperation):
* page/gtk/DragControllerGtk.cpp:
(WebCore::DragController::isCopyKeyDown):
(WebCore::DragController::dragOperation):
* page/mac/DragControllerMac.mm:
(WebCore::DragController::isCopyKeyDown):
(WebCore::DragController::dragOperation):
* page/win/DragControllerWin.cpp:
(WebCore::DragController::dragOperation):
(WebCore::DragController::isCopyKeyDown):
* platform/DragData.h:
(WebCore::DragData::DragData):

Source/WebKit/mac:

* WebCoreSupport/WebDragClient.h:
* WebCoreSupport/WebDragClient.mm:
(WebDragClient::actionMaskForDrag):
(WebDragClient::willPerformDragDestinationAction):

Source/WebKit2:

* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<DragData>::encode):
(IPC::ArgumentCoder<DragData>::decode):
* Shared/WebCoreArgumentCoders.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::performDragControllerAction):
* WebProcess/WebCoreSupport/WebDragClient.cpp:
(WebKit::WebDragClient::willPerformDragDestinationAction):
(WebKit::WebDragClient::actionMaskForDrag):
* WebProcess/WebCoreSupport/WebDragClient.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::performDragControllerAction):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

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

24 files changed:
Source/WebCore/ChangeLog
Source/WebCore/loader/EmptyClients.h
Source/WebCore/page/DragClient.h
Source/WebCore/page/DragController.cpp
Source/WebCore/page/DragController.h
Source/WebCore/page/efl/DragControllerEfl.cpp
Source/WebCore/page/gtk/DragControllerGtk.cpp
Source/WebCore/page/mac/DragControllerMac.mm
Source/WebCore/page/win/DragControllerWin.cpp
Source/WebCore/platform/DragData.h
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/WebCoreSupport/WebDragClient.h
Source/WebKit/mac/WebCoreSupport/WebDragClient.mm
Source/WebKit/win/WebCoreSupport/WebDragClient.cpp
Source/WebKit/win/WebCoreSupport/WebDragClient.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/WebCoreArgumentCoders.cpp
Source/WebKit2/Shared/WebCoreArgumentCoders.h
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebDragClient.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebDragClient.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.h
Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

index 80c6c7c..bcb61d0 100644 (file)
@@ -1,3 +1,45 @@
+2016-11-18  Enrica Casucci  <enrica@apple.com>
+
+        Refactor drag and drop for WebKit2 to encode DragData message exchange.
+        https://bugs.webkit.org/show_bug.cgi?id=164945
+
+        Reviewed by Tim Horton.
+
+        No new tests. No change in functionality.
+
+        * loader/EmptyClients.h:
+        * page/DragClient.h:
+        * page/DragController.cpp:
+        (WebCore::createMouseEvent):
+        (WebCore::documentFragmentFromDragData):
+        (WebCore::DragController::dragIsMove):
+        (WebCore::DragController::dragEntered):
+        (WebCore::DragController::dragExited):
+        (WebCore::DragController::dragUpdated):
+        (WebCore::DragController::performDragOperation):
+        (WebCore::DragController::dragEnteredOrUpdated):
+        (WebCore::DragController::tryDocumentDrag):
+        (WebCore::DragController::operationForLoad):
+        (WebCore::DragController::dispatchTextInputEventFor):
+        (WebCore::DragController::concludeEditDrag):
+        (WebCore::DragController::canProcessDrag):
+        (WebCore::DragController::tryDHTMLDrag):
+        * page/DragController.h:
+        * page/efl/DragControllerEfl.cpp:
+        (WebCore::DragController::isCopyKeyDown):
+        (WebCore::DragController::dragOperation):
+        * page/gtk/DragControllerGtk.cpp:
+        (WebCore::DragController::isCopyKeyDown):
+        (WebCore::DragController::dragOperation):
+        * page/mac/DragControllerMac.mm:
+        (WebCore::DragController::isCopyKeyDown):
+        (WebCore::DragController::dragOperation):
+        * page/win/DragControllerWin.cpp:
+        (WebCore::DragController::dragOperation):
+        (WebCore::DragController::isCopyKeyDown):
+        * platform/DragData.h:
+        (WebCore::DragData::DragData):
+
 2016-11-18  Jeremy Jones  <jeremyj@apple.com>
 
         Add runtime flag to enable pointer lock. Enable pointer lock feature for mac.
index 8be77ab..0397b0d 100644 (file)
@@ -589,9 +589,9 @@ class EmptyDragClient : public DragClient {
 public:
     EmptyDragClient() { }
     virtual ~EmptyDragClient() {}
-    void willPerformDragDestinationAction(DragDestinationAction, DragData&) override { }
+    void willPerformDragDestinationAction(DragDestinationAction, const DragData&) override { }
     void willPerformDragSourceAction(DragSourceAction, const IntPoint&, DataTransfer&) override { }
-    DragDestinationAction actionMaskForDrag(DragData&) override { return DragDestinationActionNone; }
+    DragDestinationAction actionMaskForDrag(const DragData&) override { return DragDestinationActionNone; }
     DragSourceAction dragSourceActionMaskForPoint(const IntPoint&) override { return DragSourceActionNone; }
     void startDrag(DragImageRef, const IntPoint&, const IntPoint&, DataTransfer&, Frame&, bool) override { }
     void dragControllerDestroyed() override { }
index 8edba38..99a76ec 100644 (file)
@@ -41,9 +41,9 @@ class DragClient {
 public:
     virtual void dragControllerDestroyed() = 0;
 
-    virtual void willPerformDragDestinationAction(DragDestinationAction, DragData&) = 0;
+    virtual void willPerformDragDestinationAction(DragDestinationAction, const DragData&) = 0;
     virtual void willPerformDragSourceAction(DragSourceAction, const IntPoint&, DataTransfer&) = 0;
-    virtual DragDestinationAction actionMaskForDrag(DragData&) = 0;
+    virtual DragDestinationAction actionMaskForDrag(const DragData&) = 0;
     virtual DragSourceAction dragSourceActionMaskForPoint(const IntPoint& rootViewPoint) = 0;
     
     virtual void startDrag(DragImageRef, const IntPoint& dragImageOrigin, const IntPoint& eventPos, DataTransfer&, Frame&, bool linkDrag = false) = 0;
index 43dac75..b822672 100644 (file)
@@ -94,7 +94,7 @@ bool isDraggableLink(const Element& element)
 
 #if ENABLE(DRAG_SUPPORT)
     
-static PlatformMouseEvent createMouseEvent(DragData& dragData)
+static PlatformMouseEvent createMouseEvent(const DragData& dragData)
 {
     bool shiftKey = false;
     bool ctrlKey = false;
@@ -125,7 +125,7 @@ DragController::~DragController()
     m_client.dragControllerDestroyed();
 }
 
-static RefPtr<DocumentFragment> documentFragmentFromDragData(DragData& dragData, Frame& frame, Range& context, bool allowPlainText, bool& chosePlainText)
+static RefPtr<DocumentFragment> documentFragmentFromDragData(const DragData& dragData, Frame& frame, Range& context, bool allowPlainText, bool& chosePlainText)
 {
     chosePlainText = false;
 
@@ -162,7 +162,7 @@ static RefPtr<DocumentFragment> documentFragmentFromDragData(DragData& dragData,
     return nullptr;
 }
 
-bool DragController::dragIsMove(FrameSelection& selection, DragData& dragData)
+bool DragController::dragIsMove(FrameSelection& selection, const DragData& dragData)
 {
     const VisibleSelection& visibleSelection = selection.selection();
     return m_documentUnderMouse == m_dragInitiator && visibleSelection.isContentEditable() && visibleSelection.isRange() && !isCopyKeyDown(dragData);
@@ -182,12 +182,12 @@ void DragController::dragEnded()
     m_client.dragEnded();
 }
 
-DragOperation DragController::dragEntered(DragData& dragData)
+DragOperation DragController::dragEntered(const DragData& dragData)
 {
     return dragEnteredOrUpdated(dragData);
 }
 
-void DragController::dragExited(DragData& dragData)
+void DragController::dragExited(const DragData& dragData)
 {
     if (RefPtr<FrameView> v = m_page.mainFrame().view()) {
 #if ENABLE(DASHBOARD_SUPPORT)
@@ -207,12 +207,12 @@ void DragController::dragExited(DragData& dragData)
     m_fileInputElementUnderMouse = nullptr;
 }
 
-DragOperation DragController::dragUpdated(DragData& dragData)
+DragOperation DragController::dragUpdated(const DragData& dragData)
 {
     return dragEnteredOrUpdated(dragData);
 }
 
-bool DragController::performDragOperation(DragData& dragData)
+bool DragController::performDragOperation(const DragData& dragData)
 {
     m_documentUnderMouse = m_page.mainFrame().documentAtPoint(dragData.clientPosition());
 
@@ -264,7 +264,7 @@ void DragController::mouseMovedIntoDocument(Document* newDocument)
     m_documentUnderMouse = newDocument;
 }
 
-DragOperation DragController::dragEnteredOrUpdated(DragData& dragData)
+DragOperation DragController::dragEnteredOrUpdated(const DragData& dragData)
 {
     mouseMovedIntoDocument(m_page.mainFrame().documentAtPoint(dragData.clientPosition()));
 
@@ -316,7 +316,7 @@ static Element* elementUnderMouse(Document* documentUnderMouse, const IntPoint&
     return downcast<Element>(node);
 }
 
-bool DragController::tryDocumentDrag(DragData& dragData, DragDestinationAction actionMask, DragOperation& dragOperation)
+bool DragController::tryDocumentDrag(const DragData& dragData, DragDestinationAction actionMask, DragOperation& dragOperation)
 {
     if (!m_documentUnderMouse)
         return false;
@@ -411,7 +411,7 @@ DragSourceAction DragController::delegateDragSourceAction(const IntPoint& rootVi
     return m_dragSourceAction;
 }
 
-DragOperation DragController::operationForLoad(DragData& dragData)
+DragOperation DragController::operationForLoad(const DragData& dragData)
 {
     Document* document = m_page.mainFrame().documentAtPoint(dragData.clientPosition());
 
@@ -442,7 +442,7 @@ static bool setSelectionToDragCaret(Frame* frame, VisibleSelection& dragCaret, R
     return !frame->selection().isNone() && frame->selection().selection().isContentEditable();
 }
 
-bool DragController::dispatchTextInputEventFor(Frame* innerFrame, DragData& dragData)
+bool DragController::dispatchTextInputEventFor(Frame* innerFrame, const DragData& dragData)
 {
     ASSERT(m_page.dragCaretController().hasCaret());
     String text = m_page.dragCaretController().isContentRichlyEditable() ? emptyString() : dragData.asPlainText();
@@ -450,7 +450,7 @@ bool DragController::dispatchTextInputEventFor(Frame* innerFrame, DragData& drag
     return target->dispatchEvent(TextEvent::createForDrop(innerFrame->document()->domWindow(), text));
 }
 
-bool DragController::concludeEditDrag(DragData& dragData)
+bool DragController::concludeEditDrag(const DragData& dragData)
 {
     RefPtr<HTMLInputElement> fileInput = m_fileInputElementUnderMouse;
     if (m_fileInputElementUnderMouse) {
@@ -554,7 +554,7 @@ bool DragController::concludeEditDrag(DragData& dragData)
     return true;
 }
 
-bool DragController::canProcessDrag(DragData& dragData)
+bool DragController::canProcessDrag(const DragData& dragData)
 {
     if (!dragData.containsCompatibleContent())
         return false;
@@ -603,7 +603,7 @@ static DragOperation defaultOperationForDrag(DragOperation srcOpMask)
     return DragOperationGeneric;
 }
 
-bool DragController::tryDHTMLDrag(DragData& dragData, DragOperation& operation)
+bool DragController::tryDHTMLDrag(const DragData& dragData, DragOperation& operation)
 {
     ASSERT(m_documentUnderMouse);
     Ref<MainFrame> mainFrame(m_page.mainFrame());
index 64d3209..deddad8 100644 (file)
@@ -56,10 +56,10 @@ namespace WebCore {
 
         DragClient& client() const { return m_client; }
 
-        WEBCORE_EXPORT DragOperation dragEntered(DragData&);
-        WEBCORE_EXPORT void dragExited(DragData&);
-        WEBCORE_EXPORT DragOperation dragUpdated(DragData&);
-        WEBCORE_EXPORT bool performDragOperation(DragData&);
+        WEBCORE_EXPORT DragOperation dragEntered(const DragData&);
+        WEBCORE_EXPORT void dragExited(const DragData&);
+        WEBCORE_EXPORT DragOperation dragUpdated(const DragData&);
+        WEBCORE_EXPORT bool performDragOperation(const DragData&);
 
         bool mouseIsOverFileInput() const { return m_fileInputElementUnderMouse; }
         unsigned numberOfItemsToBeAccepted() const { return m_numberOfItemsToBeAccepted; }
@@ -96,17 +96,17 @@ namespace WebCore {
         static const float DragImageAlpha;
 
     private:
-        bool dispatchTextInputEventFor(Frame*, DragData&);
-        bool canProcessDrag(DragData&);
-        bool concludeEditDrag(DragData&);
-        DragOperation dragEnteredOrUpdated(DragData&);
-        DragOperation operationForLoad(DragData&);
-        bool tryDocumentDrag(DragData&, DragDestinationAction, DragOperation&);
-        bool tryDHTMLDrag(DragData&, DragOperation&);
-        DragOperation dragOperation(DragData&);
+        bool dispatchTextInputEventFor(Frame*, const DragData&);
+        bool canProcessDrag(const DragData&);
+        bool concludeEditDrag(const DragData&);
+        DragOperation dragEnteredOrUpdated(const DragData&);
+        DragOperation operationForLoad(const DragData&);
+        bool tryDocumentDrag(const DragData&, DragDestinationAction, DragOperation&);
+        bool tryDHTMLDrag(const DragData&, DragOperation&);
+        DragOperation dragOperation(const DragData&);
         void clearDragCaret();
-        bool dragIsMove(FrameSelection&, DragData&);
-        bool isCopyKeyDown(DragData&);
+        bool dragIsMove(FrameSelection&, const DragData&);
+        bool isCopyKeyDown(const DragData&);
 
         void mouseMovedIntoDocument(Document*);
 
index f75a0ab..7835e6d 100644 (file)
@@ -45,12 +45,12 @@ const int DragController::DragIconBottomInset = 3;
 
 const float DragController::DragImageAlpha = 0.75f;
 
-bool DragController::isCopyKeyDown(DragData&)
+bool DragController::isCopyKeyDown(const DragData&)
 {
     return false;
 }
 
-DragOperation DragController::dragOperation(DragData& dragData)
+DragOperation DragController::dragOperation(const DragData& dragData)
 {
     if (dragData.containsURL())
         return DragOperationCopy;
index 1581c5b..37463d3 100644 (file)
@@ -46,12 +46,12 @@ const int DragController::DragIconBottomInset = 3;
 
 const float DragController::DragImageAlpha = 0.75f;
 
-bool DragController::isCopyKeyDown(DragData&)
+bool DragController::isCopyKeyDown(const DragData&)
 {
     return false;
 }
 
-DragOperation DragController::dragOperation(DragData& dragData)
+DragOperation DragController::dragOperation(const DragData& dragData)
 {
     // FIXME: This logic is incomplete
     if (dragData.containsURL())
index 0983e2a..4ce4f18 100644 (file)
@@ -54,12 +54,12 @@ const int DragController::DragIconBottomInset = 3;
 
 const float DragController::DragImageAlpha = 0.75f;
 
-bool DragController::isCopyKeyDown(DragData& dragData)
+bool DragController::isCopyKeyDown(const DragData& dragData)
 {
     return dragData.flags() & DragApplicationIsCopyKeyDown;
 }
     
-DragOperation DragController::dragOperation(DragData& dragData)
+DragOperation DragController::dragOperation(const DragData& dragData)
 {
     if ((dragData.flags() & DragApplicationIsModal) || !dragData.containsURL())
         return DragOperationNone;
index 2c2198e..9b49619 100644 (file)
@@ -43,7 +43,7 @@ const int DragController::DragIconBottomInset = 3;
 
 const float DragController::DragImageAlpha = 0.75f;
 
-DragOperation DragController::dragOperation(DragData& dragData)
+DragOperation DragController::dragOperation(const DragData& dragData)
 {
     //FIXME: to match the macos behaviour we should return DragOperationNone
     //if we are a modal window, we are the drag source, or the window is an attached sheet
@@ -52,7 +52,7 @@ DragOperation DragController::dragOperation(DragData& dragData)
     return dragData.containsURL() && !m_didInitiateDrag ? DragOperationCopy : DragOperationNone;
 }
 
-bool DragController::isCopyKeyDown(DragData&)
+bool DragController::isCopyKeyDown(const DragData&)
 {
     return ::GetAsyncKeyState(VK_CONTROL);
 }
index 9401eda..1077fa4 100644 (file)
@@ -80,6 +80,9 @@ public:
     // clientPosition is taken to be the position of the drag event within the target window, with (0,0) at the top left
     WEBCORE_EXPORT DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
     WEBCORE_EXPORT DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
+    // This constructor should used only by WebKit2 IPC because DragData
+    // is initialized by the decoder and not in the constructor.
+    DragData() { }
 #if PLATFORM(WIN)
     WEBCORE_EXPORT DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags = DragApplicationNone);
     const DragDataMap& dragDataMap();
@@ -107,9 +110,6 @@ public:
 #endif
 
 #if PLATFORM(GTK)
-    // This constructor should used only by WebKit2 IPC because DragData
-    // is initialized by the decoder and not in the constructor.
-    DragData() { }
 
     DragData& operator =(const DragData& data)
     {
index b076aa0..3f84fdb 100644 (file)
@@ -1,3 +1,15 @@
+2016-11-18  Enrica Casucci  <enrica@apple.com>
+
+        Refactor drag and drop for WebKit2 to encode DragData message exchange.
+        https://bugs.webkit.org/show_bug.cgi?id=164945
+
+        Reviewed by Tim Horton.
+
+        * WebCoreSupport/WebDragClient.h:
+        * WebCoreSupport/WebDragClient.mm:
+        (WebDragClient::actionMaskForDrag):
+        (WebDragClient::willPerformDragDestinationAction):
+
 2016-11-18  Jeremy Jones  <jeremyj@apple.com>
 
         Add runtime flag to enable pointer lock. Enable pointer lock feature for mac.
index 618e13e..417060b 100644 (file)
@@ -32,9 +32,9 @@
 class WebDragClient : public WebCore::DragClient {
 public:
     WebDragClient(WebView*);
-    void willPerformDragDestinationAction(WebCore::DragDestinationAction, WebCore::DragData&) override;
+    void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&) override;
     void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&) override;
-    WebCore::DragDestinationAction actionMaskForDrag(WebCore::DragData&) override;
+    WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&) override;
     void dragControllerDestroyed() override;
     WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint& windowPoint) override;
     void startDrag(WebCore::DragImageRef, const WebCore::IntPoint& dragPos, const WebCore::IntPoint& eventPos, WebCore::DataTransfer&, WebCore::Frame&, bool linkDrag) override;
index a8d04c0..ff90d59 100644 (file)
@@ -66,12 +66,12 @@ static WebHTMLView *getTopHTMLView(Frame* frame)
     return (WebHTMLView*)[[kit(&frame->page()->mainFrame()) frameView] documentView];
 }
 
-WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(WebCore::DragData& dragData)
+WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(const WebCore::DragData& dragData)
 {
     return (WebCore::DragDestinationAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragDestinationActionMaskForDraggingInfo:dragData.platformData()];
 }
 
-void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, WebCore::DragData& dragData)
+void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, const WebCore::DragData& dragData)
 {
     [[m_webView _UIDelegateForwarder] webView:m_webView willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:dragData.platformData()];
 }
index 28b895c..6a0ddce 100644 (file)
@@ -64,7 +64,7 @@ WebDragClient::WebDragClient(WebView* webView)
     ASSERT(webView);
 }
 
-DragDestinationAction WebDragClient::actionMaskForDrag(DragData& dragData)
+DragDestinationAction WebDragClient::actionMaskForDrag(const DragData& dragData)
 {
     COMPtr<IWebUIDelegate> delegateRef = 0;
     //Default behaviour (eg. no delegate, or callback not implemented) is to allow
@@ -76,7 +76,7 @@ DragDestinationAction WebDragClient::actionMaskForDrag(DragData& dragData)
     return (DragDestinationAction)mask;
 }
 
-void WebDragClient::willPerformDragDestinationAction(DragDestinationAction action, DragData& dragData)
+void WebDragClient::willPerformDragDestinationAction(DragDestinationAction action, const DragData& dragData)
 {
     //Default delegate for willPerformDragDestinationAction has no side effects
     //so we just call the delegate, and don't worry about whether it's implemented
index a269761..095c60f 100644 (file)
@@ -35,9 +35,9 @@ public:
     WebDragClient(WebView*);
     virtual void dragControllerDestroyed();
 
-    virtual WebCore::DragDestinationAction actionMaskForDrag(WebCore::DragData&);
+    virtual WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&);
     virtual WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint&);
-    virtual void willPerformDragDestinationAction(WebCore::DragDestinationAction, WebCore::DragData&);
+    virtual void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&);
     virtual void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&);
     virtual void startDrag(WebCore::DragImageRef, const WebCore::IntPoint&, const WebCore::IntPoint&, WebCore::DataTransfer&, WebCore::Frame&, bool);
 
index 80ab02c..4c4e475 100644 (file)
@@ -1,3 +1,25 @@
+2016-11-18  Enrica Casucci  <enrica@apple.com>
+
+        Refactor drag and drop for WebKit2 to encode DragData message exchange.
+        https://bugs.webkit.org/show_bug.cgi?id=164945
+
+        Reviewed by Tim Horton.
+
+        * Shared/WebCoreArgumentCoders.cpp:
+        (IPC::ArgumentCoder<DragData>::encode):
+        (IPC::ArgumentCoder<DragData>::decode):
+        * Shared/WebCoreArgumentCoders.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::performDragControllerAction):
+        * WebProcess/WebCoreSupport/WebDragClient.cpp:
+        (WebKit::WebDragClient::willPerformDragDestinationAction):
+        (WebKit::WebDragClient::actionMaskForDrag):
+        * WebProcess/WebCoreSupport/WebDragClient.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::performDragControllerAction):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
 2016-11-18  Jeremy Jones  <jeremyj@apple.com>
 
         Add runtime flag to enable pointer lock. Enable pointer lock feature for mac.
index 39ee406..0b270ce 100644 (file)
@@ -37,6 +37,7 @@
 #include <WebCore/DatabaseDetails.h>
 #include <WebCore/DictationAlternative.h>
 #include <WebCore/DictionaryPopupInfo.h>
+#include <WebCore/DragData.h>
 #include <WebCore/Editor.h>
 #include <WebCore/EventTrackingRegions.h>
 #include <WebCore/FileChooser.h>
@@ -1183,6 +1184,47 @@ bool ArgumentCoder<Color>::decode(Decoder& decoder, Color& color)
     return true;
 }
 
+#if ENABLE(DRAG_SUPPORT)
+void ArgumentCoder<DragData>::encode(Encoder& encoder, const DragData& dragData)
+{
+    encoder << dragData.clientPosition();
+    encoder << dragData.globalPosition();
+    encoder.encodeEnum(dragData.draggingSourceOperationMask());
+    encoder.encodeEnum(dragData.flags());
+#if PLATFORM(MAC)
+    encoder << dragData.pasteboardName();
+#endif
+}
+
+bool ArgumentCoder<DragData>::decode(Decoder& decoder, DragData& dragData)
+{
+    IntPoint clientPosition;
+    if (!decoder.decode(clientPosition))
+        return false;
+
+    IntPoint globalPosition;
+    if (!decoder.decode(globalPosition))
+        return false;
+
+    DragOperation draggingSourceOperationMask;
+    if (!decoder.decodeEnum(draggingSourceOperationMask))
+        return false;
+
+    DragApplicationFlags applicationFlags;
+    if (!decoder.decodeEnum(applicationFlags))
+        return false;
+
+    String pasteboardName;
+#if PLATFORM(MAC)
+    if (!decoder.decode(pasteboardName))
+        return false;
+#endif
+
+    dragData = DragData(pasteboardName, clientPosition, globalPosition, draggingSourceOperationMask, applicationFlags);
+
+    return true;
+}
+#endif
 
 void ArgumentCoder<CompositionUnderline>::encode(Encoder& encoder, const CompositionUnderline& underline)
 {
index d6ef3dd..3154062 100644 (file)
@@ -41,6 +41,7 @@ class Credential;
 class CubicBezierTimingFunction;
 class Cursor;
 class DatabaseDetails;
+class DragData;
 class FilterOperation;
 class FilterOperations;
 class FloatPoint;
@@ -326,6 +327,13 @@ template<> struct ArgumentCoder<WebCore::Color> {
     static bool decode(Decoder&, WebCore::Color&);
 };
 
+#if ENABLE(DRAG_SUPPORT)
+template<> struct ArgumentCoder<WebCore::DragData> {
+    static void encode(Encoder&, const WebCore::DragData&);
+    static bool decode(Decoder&, WebCore::DragData&);
+};
+#endif
+
 #if PLATFORM(COCOA)
 template<> struct ArgumentCoder<WebCore::MachSendRight> {
     static void encode(Encoder&, const WebCore::MachSendRight&);
index 49dd1bd..d812dd4 100644 (file)
@@ -1809,7 +1809,7 @@ void WebPageProxy::performDragControllerAction(DragControllerAction action, Drag
     WebSelectionData selection(*dragData.platformData());
     m_process->send(Messages::WebPage::PerformDragControllerAction(action, dragData.clientPosition(), dragData.globalPosition(), dragData.draggingSourceOperationMask(), selection, dragData.flags()), m_pageID);
 #else
-    m_process->send(Messages::WebPage::PerformDragControllerAction(action, dragData.clientPosition(), dragData.globalPosition(), dragData.draggingSourceOperationMask(), dragStorageName, dragData.flags(), sandboxExtensionHandle, sandboxExtensionsForUpload), m_pageID);
+    m_process->send(Messages::WebPage::PerformDragControllerAction(action, dragData, sandboxExtensionHandle, sandboxExtensionsForUpload), m_pageID);
 #endif
 }
 
index 1cb8692..a95d260 100644 (file)
@@ -34,7 +34,7 @@ using namespace WebCore;
 
 namespace WebKit {
 
-void WebDragClient::willPerformDragDestinationAction(DragDestinationAction action, DragData&)
+void WebDragClient::willPerformDragDestinationAction(DragDestinationAction action, const DragData&)
 {
     if (action == DragDestinationActionLoad)
         m_page->willPerformLoadDragDestinationAction();
@@ -46,7 +46,7 @@ void WebDragClient::willPerformDragSourceAction(DragSourceAction, const IntPoint
 {
 }
 
-DragDestinationAction WebDragClient::actionMaskForDrag(DragData&)
+DragDestinationAction WebDragClient::actionMaskForDrag(const DragData&)
 {
     return DragDestinationActionAny;
 }
index 5f4da75..c957c8e 100644 (file)
@@ -42,9 +42,9 @@ public:
     }
 
 private:
-    void willPerformDragDestinationAction(WebCore::DragDestinationAction, WebCore::DragData&) override;
+    void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&) override;
     void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&) override;
-    WebCore::DragDestinationAction actionMaskForDrag(WebCore::DragData&) override;
+    WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&) override;
     WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint& windowPoint) override;
 
     void startDrag(WebCore::DragImageRef, const WebCore::IntPoint& dragImageOrigin, const WebCore::IntPoint& eventPos, WebCore::DataTransfer&, WebCore::Frame&, bool linkDrag = false) override;
index 8872690..f1f431e 100644 (file)
@@ -3449,14 +3449,13 @@ void WebPage::performDragControllerAction(uint64_t action, const IntPoint& clien
     }
 }
 #else
-void WebPage::performDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, const String& dragStorageName, uint32_t flags, const SandboxExtension::Handle& sandboxExtensionHandle, const SandboxExtension::HandleArray& sandboxExtensionsHandleArray)
+void WebPage::performDragControllerAction(uint64_t action, const WebCore::DragData& dragData, const SandboxExtension::Handle& sandboxExtensionHandle, const SandboxExtension::HandleArray& sandboxExtensionsHandleArray)
 {
     if (!m_page) {
         send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone, false, 0));
         return;
     }
 
-    DragData dragData(dragStorageName, clientPosition, globalPosition, static_cast<DragOperation>(draggingSourceOperationMask), static_cast<DragApplicationFlags>(flags));
     switch (action) {
     case DragControllerActionEntered: {
         DragOperation resolvedDragOperation = m_page->dragController().dragEntered(dragData);
index 2b560e2..938e89e 100644 (file)
@@ -734,7 +734,7 @@ public:
 #if PLATFORM(GTK)
     void performDragControllerAction(uint64_t action, const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_t draggingSourceOperationMask, WebSelectionData&&, uint32_t flags);
 #else
-    void performDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, const WTF::String& dragStorageName, uint32_t flags, const SandboxExtension::Handle&, const SandboxExtension::HandleArray&);
+    void performDragControllerAction(uint64_t action, const WebCore::DragData&, const SandboxExtension::Handle&, const SandboxExtension::HandleArray&);
 #endif
     void dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation);
 
index 62f55d5..069bec6 100644 (file)
@@ -238,7 +238,7 @@ messages -> WebPage LegacyReceiver {
     PerformDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, struct WebKit::WebSelectionData selection, uint32_t flags)
 #endif
 #if !PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
-    PerformDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, String dragStorageName, uint32_t flags, WebKit::SandboxExtension::Handle sandboxExtensionHandle, WebKit::SandboxExtension::HandleArray sandboxExtensionsForUpload)
+    PerformDragControllerAction(uint64_t action, WebCore::DragData dragData, WebKit::SandboxExtension::Handle sandboxExtensionHandle, WebKit::SandboxExtension::HandleArray sandboxExtensionsForUpload)
 #endif
 #if ENABLE(DRAG_SUPPORT)
     DidStartDrag()