[WK2] [macOS] Implement a mechanism to test drag and drop
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Aug 2018 21:07:55 +0000 (21:07 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Aug 2018 21:07:55 +0000 (21:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=181898
<rdar://problem/39181698>

Reviewed by Simon Fraser.

Source/WebKit:

Adds a new SPI method, `-_doAfterProcessingAllPendingMouseEvents:`, to WKWebView. This invokes the given
callback after all queued mouse events have been handled by the web process. See Tools/ChangeLog for more
detail.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _doAfterProcessingAllPendingMouseEvents:]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/API/gtk/PageClientImpl.h:
* UIProcess/API/wpe/PageClientImpl.h:
* UIProcess/Cocoa/WebViewImpl.h:
* UIProcess/Cocoa/WebViewImpl.mm:
(WebKit::WebViewImpl::processDidExit):

Invoke any outstanding callbacks for processing pending mouse events when the web process is terminated.

(WebKit::WebViewImpl::doAfterProcessingAllPendingMouseEvents):

Either invoke the callback immediately if there are no mouse events to be processed, or insert the callback in
a queue that will be flushed once all mouse events have been handled.

(WebKit::WebViewImpl::didFinishProcessingAllPendingMouseEvents):
(WebKit::WebViewImpl::flushPendingMouseEventCallbacks):
* UIProcess/PageClient.h:
(WebKit::PageClient::pinnedStateWillChange):
(WebKit::PageClient::pinnedStateDidChange):
(WebKit::PageClient::videoControlsManagerDidChange):

Drive-by tweaks: remove unnecessary semicolons after empty implementation stubs.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didReceiveEvent):

Notify the page client when there are no remaining mouse events left in the queue.

* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/mac/PageClientImplMac.h:
* UIProcess/mac/PageClientImplMac.mm:
(WebKit::PageClientImpl::didFinishProcessingAllPendingMouseEvents):

Add some plumbing through PageClient, so that WebPageProxy can tell WebViewImpl when it is finished processing
all mouse events.

* UIProcess/win/PageClientImpl.h:

Tools:

Implements the currently stubbed DragAndDropSimulator on macOS, and introduces a new API test for r227266. See
comments below for more detail.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm: Copied from Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm.

Introduce a file for cross-platform drag and drop tests, currently for iOS and macOS. Additionally add a test
for r227266, which was fixed earlier this year but could not be tested due to a lack of testing mechanism on
macOS in WebKit2.

(TEST):
* TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html: Added.

Minor tweaks to this test page to add "dragover" and "drop" event handlers.

* TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html:
* TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html: Added.

Add a new test page that includes a link embedded within an iframe below a plain text input.

* TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm: Added.
(TEST):
* TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm: Renamed from Tools/TestWebKitAPI/Tests/mac/DragAndDropPasteboardTests.mm.

Move only existing WebKit2 macOS drag and drop test (DragAndDropPasteboardTests.NumberOfValidItemsForDrop) out
of DragAndDropPasteboardTests.mm and into a new file, DragAndDropTestsMac.mm. Additionally, rename
DragAndDropPasteboardTests to LegacyDragAndDropTests, since it now only contains two legacy WebView tests for
drag and drop.

(+[FrameLoadCompletionListener listenerWithCompletionBlock:]):
(-[FrameLoadCompletionListener initWithCompletionBlock:]):
(-[FrameLoadCompletionListener webView:didFinishLoadForFrame:]):
(-[DragSource draggingSourceOperationMaskForLocal:]):
(-[DragInfo initWithImage:offset:pasteboard:source:destinationWindow:]):
(-[DragInfo lastMousePosition]):
(-[DragInfo setLastMousePosition:]):
(-[DragInfo draggingDestinationWindow]):
(-[DragInfo draggingSourceOperationMask]):
(-[DragInfo draggingLocation]):
(-[DragInfo draggedImageLocation]):
(-[DragInfo draggedImage]):
(-[DragInfo draggingPasteboard]):
(-[DragInfo draggingSource]):
(-[DragInfo draggingSequenceNumber]):
(-[DragInfo slideDraggedImageTo:]):
(-[DragInfo namesOfPromisedFilesDroppedAtDestination:]):
(-[DragInfo draggingFormation]):
(-[DragInfo setDraggingFormation:]):
(-[DragInfo animatesToDestination]):
(-[DragInfo setAnimatesToDestination:]):
(-[DragInfo numberOfValidItemsForDrop]):
(-[DragInfo setNumberOfValidItemsForDrop:]):
(-[DragInfo enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:]):
(-[DragInfo springLoadingHighlight]):
(-[DragInfo resetSpringLoading]):
(TestWebKitAPI::getTestImage):
(TestWebKitAPI::webViewAfterPerformingDragOperation):
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/mac/full-page-dropzone.html: Removed.
* TestWebKitAPI/cocoa/DragAndDropSimulator.h:

Flesh out some of the DragAndDropSimulator API for macOS, exposing (among other things) the drag pasteboard,
the current NSDraggingInfo, the initial location of the drag image, and the drag image itself.

* TestWebKitAPI/cocoa/TestWKWebView.h:
* TestWebKitAPI/cocoa/TestWKWebView.mm:
(-[TestWKWebView mouseDownAtPoint:simulatePressure:]):
(-[TestWKWebView mouseUpAtPoint:]):
(-[TestWKWebView mouseMoveToPoint:withFlags:]):
(-[TestWKWebView sendClicksAtPoint:numberOfClicks:]):
(-[TestWKWebView mouseEnterAtPoint:]):
(-[TestWKWebView mouseExitAtPoint:]):
(-[TestWKWebView mouseDragToPoint:]):
(-[TestWKWebView _mouseEventWithType:atLocation:]):
(-[TestWKWebView _mouseEventWithType:atLocation:flags:timestamp:clickCount:]):

Add TestWKWebView helpers to send MouseMove, MouseEnter and MouseDrag NSEvents to the web view. Additionally,
rename parameter names to these helpers to make it more obvious that these locations are all in NSWindow
coordinates.

(-[TestWKWebView typeCharacter:]):

Drive-by style fix: put this opening brace on the beginning of the next line.

* TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm:
(-[DragAndDropSimulator initWithWebViewFrame:]):
(-[DragAndDropSimulator initWithWebViewFrame:configuration:]):
(-[DragAndDropSimulator webView]):

Small iOS DragAndDropSimulator adjustments for new DragAndDropSimulator interfaces.

* TestWebKitAPI/mac/DragAndDropSimulatorMac.mm:
(-[DragAndDropTestWKWebView initWithFrame:configuration:simulator:]):

Introduce a WKWebView subclass for testing drag and drop that overrides `-dragImage:at:offset:…`, and instead
allows DragAndDropSimulator to take over the drag.

(-[DragAndDropTestWKWebView dragImage:at:offset:event:pasteboard:source:slideBack:]):

Override this entry point into drag and drop code, and instead call out to the DragAndDropSimulator to
coordinate the drag.

(-[DragAndDropTestWKWebView waitForPendingMouseEvents]):

Helper method to wait for the web process to finish handling all in-flight mouse events.

(defaultExternalDragImage):

Set this image as the default drag image when simulating an incoming drag session from outside of the web view.

(-[DragAndDropSimulator initWithWebViewFrame:]):
(-[DragAndDropSimulator initWithWebViewFrame:configuration:]):
(-[DragAndDropSimulator flipAboutXAxisInHostWindow:]):

Helper method to flip a given point about the X axis of the window.

(-[DragAndDropSimulator locationInViewForCurrentProgress]):

Map a progress value (between 0 and 1) to a drag location.

(-[DragAndDropSimulator initialProgressForMouseDrag]):

Determines the initial progress value when initiation a drag in web content. This is the initial progress
required to ensure that the first mouse drag event exceeds the drag distance hysteresis and causes any drag
(if applicable) to begin.

(-[DragAndDropSimulator runFrom:to:]):
(-[DragAndDropSimulator performDragInWebView:atLocation:withImage:pasteboard:source:]):

Helper to coordinate drag updates in both the cases where we're simulating a drag session entering from outside
of the web view, and in the case where we've initiated a drag from the web view itself.

(-[DragAndDropSimulator webView]):
(-[DragAndDropSimulator setExternalDragPasteboard:]):
(-[DragAndDropSimulator externalDragPasteboard]):

Just like its iOS counterpart (setExternalItemProviders:), setting an external drag pasteboard on macOS puts the
DragAndDropSimulator in a mode that simulates a drag coming in from outside the web view, using the given
pasteboard.

(-[DragAndDropSimulator setExternalDragImage:]):
(-[DragAndDropSimulator externalDragImage]):

May be optionally set when specifying an external drag pasteboard to specify the drag image used. If no external
drag image is specified, falls back to the default image returned by `defaultExternalDragImage()`.

(-[DragAndDropSimulator draggingInfo]):
(-[DragAndDropSimulator willEndDraggingHandler]):
(-[DragAndDropSimulator setWillEndDraggingHandler:]):

Hook to allow tests to run logic right before performing the drop (if the current drag operation is not none) or
ending the drag session without performing a drag operation.

(-[DragAndDropSimulator initWithWebView:]): Deleted.
(-[DragAndDropSimulator dealloc]): Deleted.
(-[DragAndDropSimulator phase]): Deleted.
* TestWebKitAPI/mac/TestDraggingInfo.h: Copied from Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm.
* TestWebKitAPI/mac/TestDraggingInfo.mm: Added.

Mock object conforming to NSDraggingInfo that is passed to WKWebView when invoking -draggingUpdated:,
-draggingEntered: and -draggingExited:.

(-[TestDraggingInfo draggingPasteboard]):
(-[TestDraggingInfo setDraggingPasteboard:]):
(-[TestDraggingInfo draggingSource]):
(-[TestDraggingInfo setDraggingSource:]):
(-[TestDraggingInfo enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:]):
(-[TestDraggingInfo draggingDestinationWindow]):
(-[TestDraggingInfo draggedImage]):
(-[TestDraggingInfo setDraggedImage:]):
(-[TestDraggingInfo slideDraggedImageTo:]):
(-[TestDraggingInfo namesOfPromisedFilesDroppedAtDestination:]):
(-[TestDraggingInfo resetSpringLoading]):

Empty method stubs, to be implemented in the future as needed.

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

29 files changed:
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
Source/WebKit/UIProcess/API/gtk/PageClientImpl.h
Source/WebKit/UIProcess/API/wpe/PageClientImpl.h
Source/WebKit/UIProcess/Cocoa/WebViewImpl.h
Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
Source/WebKit/UIProcess/PageClient.h
Source/WebKit/UIProcess/WebPageProxy.cpp
Source/WebKit/UIProcess/ios/PageClientImplIOS.h
Source/WebKit/UIProcess/mac/PageClientImplMac.h
Source/WebKit/UIProcess/mac/PageClientImplMac.mm
Source/WebKit/UIProcess/win/PageClientImpl.h
Tools/ChangeLog
Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
Tools/TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm [new file with mode: 0644]
Tools/TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html [new file with mode: 0644]
Tools/TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html
Tools/TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html [new file with mode: 0644]
Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm [new file with mode: 0644]
Tools/TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm [moved from Tools/TestWebKitAPI/Tests/mac/DragAndDropPasteboardTests.mm with 83% similarity]
Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html [deleted file]
Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h
Tools/TestWebKitAPI/cocoa/TestWKWebView.h
Tools/TestWebKitAPI/cocoa/TestWKWebView.mm
Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm
Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm
Tools/TestWebKitAPI/mac/TestDraggingInfo.h [new file with mode: 0644]
Tools/TestWebKitAPI/mac/TestDraggingInfo.mm [new file with mode: 0644]

index 9e3abc0..91b71f7 100644 (file)
@@ -1,3 +1,55 @@
+2018-08-13  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [WK2] [macOS] Implement a mechanism to test drag and drop
+        https://bugs.webkit.org/show_bug.cgi?id=181898
+        <rdar://problem/39181698>
+
+        Reviewed by Simon Fraser.
+
+        Adds a new SPI method, `-_doAfterProcessingAllPendingMouseEvents:`, to WKWebView. This invokes the given
+        callback after all queued mouse events have been handled by the web process. See Tools/ChangeLog for more
+        detail.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _doAfterProcessingAllPendingMouseEvents:]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/API/gtk/PageClientImpl.h:
+        * UIProcess/API/wpe/PageClientImpl.h:
+        * UIProcess/Cocoa/WebViewImpl.h:
+        * UIProcess/Cocoa/WebViewImpl.mm:
+        (WebKit::WebViewImpl::processDidExit):
+
+        Invoke any outstanding callbacks for processing pending mouse events when the web process is terminated.
+
+        (WebKit::WebViewImpl::doAfterProcessingAllPendingMouseEvents):
+
+        Either invoke the callback immediately if there are no mouse events to be processed, or insert the callback in
+        a queue that will be flushed once all mouse events have been handled.
+
+        (WebKit::WebViewImpl::didFinishProcessingAllPendingMouseEvents):
+        (WebKit::WebViewImpl::flushPendingMouseEventCallbacks):
+        * UIProcess/PageClient.h:
+        (WebKit::PageClient::pinnedStateWillChange):
+        (WebKit::PageClient::pinnedStateDidChange):
+        (WebKit::PageClient::videoControlsManagerDidChange):
+
+        Drive-by tweaks: remove unnecessary semicolons after empty implementation stubs.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::didReceiveEvent):
+
+        Notify the page client when there are no remaining mouse events left in the queue.
+
+        * UIProcess/ios/PageClientImplIOS.h:
+        * UIProcess/mac/PageClientImplMac.h:
+        * UIProcess/mac/PageClientImplMac.mm:
+        (WebKit::PageClientImpl::didFinishProcessingAllPendingMouseEvents):
+
+        Add some plumbing through PageClient, so that WebPageProxy can tell WebViewImpl when it is finished processing
+        all mouse events.
+
+        * UIProcess/win/PageClientImpl.h:
+
 2018-08-13  Alex Christensen  <achristensen@webkit.org>
 
         Fix linux build after r234811
index 3ccda9d..8d00145 100644 (file)
@@ -6337,6 +6337,11 @@ static WebCore::UserInterfaceLayoutDirection toUserInterfaceLayoutDirection(UISe
     _page->setFooterBannerHeightForTesting(height);
 }
 
+- (void)_doAfterProcessingAllPendingMouseEvents:(dispatch_block_t)action
+{
+    _impl->doAfterProcessingAllPendingMouseEvents(action);
+}
+
 #endif // PLATFORM(MAC)
 
 - (void)_requestActiveNowPlayingSessionInfo:(void(^)(BOOL, BOOL, NSString*, double, double, NSInteger))callback
index 652812b..581a4a6 100644 (file)
@@ -445,6 +445,7 @@ typedef NS_OPTIONS(NSUInteger, _WKRectEdge) {
 
 - (void)_setHeaderBannerHeight:(int)height WK_API_AVAILABLE(macosx(10.12.3));
 - (void)_setFooterBannerHeight:(int)height WK_API_AVAILABLE(macosx(10.12.3));
+- (void)_doAfterProcessingAllPendingMouseEvents:(dispatch_block_t)action WK_API_AVAILABLE(macosx(WK_MAC_TBA));
 #endif
 
 - (void)_requestActiveNowPlayingSessionInfo:(void(^)(BOOL, BOOL, NSString*, double, double, NSInteger))callback WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
index 0c5b1d5..d36539f 100644 (file)
@@ -145,6 +145,8 @@ private:
     void isPlayingAudioWillChange() final { }
     void isPlayingAudioDidChange() final { }
 
+    void didFinishProcessingAllPendingMouseEvents() final { }
+
 #if ENABLE(VIDEO) && USE(GSTREAMER)
     bool decidePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&) override;
 #endif
index 24d9f83..ca21d8b 100644 (file)
@@ -139,6 +139,8 @@ private:
     void beganExitFullScreen(const WebCore::IntRect& initialFrame, const WebCore::IntRect& finalFrame) override;
 #endif
 
+    void didFinishProcessingAllPendingMouseEvents() final { }
+
     WebCore::UserInterfaceLayoutDirection userInterfaceLayoutDirection() override;
 
     WKWPE::View& m_view;
index 26db6bd..428aec3 100644 (file)
@@ -526,6 +526,9 @@ public:
 
     void handleAcceptedCandidate(NSTextCheckingResult *acceptedCandidate);
 
+    void doAfterProcessingAllPendingMouseEvents(dispatch_block_t action);
+    void didFinishProcessingAllPendingMouseEvents();
+
 #if HAVE(TOUCH_BAR)
     NSTouchBar *makeTouchBar();
     void updateTouchBar();
@@ -622,6 +625,7 @@ private:
     bool mightBeginScrollWhileInactive();
 
     void handleRequestedCandidates(NSInteger sequenceNumber, NSArray<NSTextCheckingResult *> *candidates);
+    void flushPendingMouseEventCallbacks();
 
     WeakObjCPtr<NSView<WebViewImplDelegate>> m_view;
     std::unique_ptr<PageClient> m_pageClient;
@@ -732,6 +736,7 @@ private:
     // that has been already sent to WebCore.
     RetainPtr<NSEvent> m_keyDownEventBeingResent;
     Vector<WebCore::KeypressCommand>* m_collectedKeypressCommands { nullptr };
+    Vector<BlockPtr<void()>> m_callbackHandlersAfterProcessingPendingMouseEvents;
 
     String m_lastStringForCandidateRequest;
     NSInteger m_lastCandidateRequestSequenceNumber;
index 180989d..56de23c 100644 (file)
@@ -1378,6 +1378,7 @@ void WebViewImpl::processDidExit()
         setAcceleratedCompositingRootLayer(nil);
 
     updateRemoteAccessibilityRegistration(false);
+    flushPendingMouseEventCallbacks();
 
     m_gestureController = nullptr;
 }
@@ -3144,6 +3145,29 @@ void WebViewImpl::handleAcceptedCandidate(NSTextCheckingResult *acceptedCandidat
     m_page->handleAcceptedCandidate(textCheckingResultFromNSTextCheckingResult(acceptedCandidate));
 }
 
+void WebViewImpl::doAfterProcessingAllPendingMouseEvents(dispatch_block_t action)
+{
+    if (!m_page->isProcessingMouseEvents()) {
+        action();
+        return;
+    }
+
+    m_callbackHandlersAfterProcessingPendingMouseEvents.append(makeBlockPtr(action));
+}
+
+void WebViewImpl::didFinishProcessingAllPendingMouseEvents()
+{
+    flushPendingMouseEventCallbacks();
+}
+
+void WebViewImpl::flushPendingMouseEventCallbacks()
+{
+    for (auto& callback : m_callbackHandlersAfterProcessingPendingMouseEvents)
+        callback();
+
+    m_callbackHandlersAfterProcessingPendingMouseEvents.clear();
+}
+
 void WebViewImpl::preferencesDidChange()
 {
     BOOL needsViewFrameInWindowCoordinates = m_page->preferences().pluginsEnabled();
index 7ea82ba..e2c691e 100644 (file)
@@ -393,8 +393,8 @@ public:
     virtual void didChangeBackgroundColor() = 0;
     virtual void isPlayingAudioWillChange() = 0;
     virtual void isPlayingAudioDidChange() = 0;
-    virtual void pinnedStateWillChange() { };
-    virtual void pinnedStateDidChange() { };
+    virtual void pinnedStateWillChange() { }
+    virtual void pinnedStateDidChange() { }
 
 #if PLATFORM(MAC)
     virtual void didPerformImmediateActionHitTest(const WebHitTestResultData&, bool contentPreventsDefault, API::Object*) = 0;
@@ -403,8 +403,9 @@ public:
 
     virtual void didHandleAcceptedCandidate() = 0;
 #endif
+    virtual void didFinishProcessingAllPendingMouseEvents() = 0;
 
-    virtual void videoControlsManagerDidChange() { };
+    virtual void videoControlsManagerDidChange() { }
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     virtual WebCore::WebMediaSessionManager& mediaSessionManager() = 0;
index cd16a84..2dc0f33 100644 (file)
@@ -5538,8 +5538,11 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
         if (!m_mouseEventQueue.isEmpty()) {
             LOG(MouseHandling, " UIProcess: handling a queued mouse event from didReceiveEvent");
             processNextQueuedMouseEvent();
-        } else if (auto* automationSession = process().processPool().automationSession())
-            automationSession->mouseEventsFlushedForPage(*this);
+        } else {
+            if (auto* automationSession = process().processPool().automationSession())
+                automationSession->mouseEventsFlushedForPage(*this);
+            m_pageClient.didFinishProcessingAllPendingMouseEvents();
+        }
 
         break;
     }
index a71fd42..1c7abfc 100644 (file)
@@ -218,6 +218,8 @@ private:
     void didChangeDataInteractionCaretRect(const WebCore::IntRect& previousCaretRect, const WebCore::IntRect& caretRect) override;
 #endif
 
+    void didFinishProcessingAllPendingMouseEvents() final { }
+
     WKContentView *m_contentView;
     RetainPtr<WKEditorUndoTargetObjC> m_undoTarget;
 };
index eae1605..972ca64 100644 (file)
@@ -238,6 +238,8 @@ private:
     _WKRemoteObjectRegistry *remoteObjectRegistry() override;
 #endif
 
+    void didFinishProcessingAllPendingMouseEvents() final;
+
     NSView *m_view;
     WebViewImpl* m_impl { nullptr };
 #if USE(AUTOCORRECTION_PANEL)
index 4798271..3a59379 100644 (file)
@@ -888,6 +888,11 @@ _WKRemoteObjectRegistry *PageClientImpl::remoteObjectRegistry()
 }
 #endif
 
+void PageClientImpl::didFinishProcessingAllPendingMouseEvents()
+{
+    m_impl->didFinishProcessingAllPendingMouseEvents();
+}
+
 void PageClientImpl::didRestoreScrollPosition()
 {
     m_impl->didRestoreScrollPosition();
index ead717b..14fa9c6 100644 (file)
@@ -140,6 +140,8 @@ private:
 
     WebCore::UserInterfaceLayoutDirection userInterfaceLayoutDirection() override { return WebCore::UserInterfaceLayoutDirection::LTR; }
 
+    void didFinishProcessingAllPendingMouseEvents() final { }
+
     // Members of PageClientImpl class
     DefaultUndoController m_undoController;
 
index 2354784..f73d3a8 100644 (file)
@@ -1,3 +1,187 @@
+2018-08-13  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [WK2] [macOS] Implement a mechanism to test drag and drop
+        https://bugs.webkit.org/show_bug.cgi?id=181898
+        <rdar://problem/39181698>
+
+        Reviewed by Simon Fraser.
+
+        Implements the currently stubbed DragAndDropSimulator on macOS, and introduces a new API test for r227266. See
+        comments below for more detail.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm: Copied from Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm.
+
+        Introduce a file for cross-platform drag and drop tests, currently for iOS and macOS. Additionally add a test
+        for r227266, which was fixed earlier this year but could not be tested due to a lack of testing mechanism on
+        macOS in WebKit2.
+
+        (TEST):
+        * TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html: Added.
+
+        Minor tweaks to this test page to add "dragover" and "drop" event handlers.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html:
+        * TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html: Added.
+
+        Add a new test page that includes a link embedded within an iframe below a plain text input.
+
+        * TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm: Added.
+        (TEST):
+        * TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm: Renamed from Tools/TestWebKitAPI/Tests/mac/DragAndDropPasteboardTests.mm.
+
+        Move only existing WebKit2 macOS drag and drop test (DragAndDropPasteboardTests.NumberOfValidItemsForDrop) out
+        of DragAndDropPasteboardTests.mm and into a new file, DragAndDropTestsMac.mm. Additionally, rename
+        DragAndDropPasteboardTests to LegacyDragAndDropTests, since it now only contains two legacy WebView tests for
+        drag and drop.
+
+        (+[FrameLoadCompletionListener listenerWithCompletionBlock:]):
+        (-[FrameLoadCompletionListener initWithCompletionBlock:]):
+        (-[FrameLoadCompletionListener webView:didFinishLoadForFrame:]):
+        (-[DragSource draggingSourceOperationMaskForLocal:]):
+        (-[DragInfo initWithImage:offset:pasteboard:source:destinationWindow:]):
+        (-[DragInfo lastMousePosition]):
+        (-[DragInfo setLastMousePosition:]):
+        (-[DragInfo draggingDestinationWindow]):
+        (-[DragInfo draggingSourceOperationMask]):
+        (-[DragInfo draggingLocation]):
+        (-[DragInfo draggedImageLocation]):
+        (-[DragInfo draggedImage]):
+        (-[DragInfo draggingPasteboard]):
+        (-[DragInfo draggingSource]):
+        (-[DragInfo draggingSequenceNumber]):
+        (-[DragInfo slideDraggedImageTo:]):
+        (-[DragInfo namesOfPromisedFilesDroppedAtDestination:]):
+        (-[DragInfo draggingFormation]):
+        (-[DragInfo setDraggingFormation:]):
+        (-[DragInfo animatesToDestination]):
+        (-[DragInfo setAnimatesToDestination:]):
+        (-[DragInfo numberOfValidItemsForDrop]):
+        (-[DragInfo setNumberOfValidItemsForDrop:]):
+        (-[DragInfo enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:]):
+        (-[DragInfo springLoadingHighlight]):
+        (-[DragInfo resetSpringLoading]):
+        (TestWebKitAPI::getTestImage):
+        (TestWebKitAPI::webViewAfterPerformingDragOperation):
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/Tests/mac/full-page-dropzone.html: Removed.
+        * TestWebKitAPI/cocoa/DragAndDropSimulator.h:
+
+        Flesh out some of the DragAndDropSimulator API for macOS, exposing (among other things) the drag pasteboard,
+        the current NSDraggingInfo, the initial location of the drag image, and the drag image itself.
+
+        * TestWebKitAPI/cocoa/TestWKWebView.h:
+        * TestWebKitAPI/cocoa/TestWKWebView.mm:
+        (-[TestWKWebView mouseDownAtPoint:simulatePressure:]):
+        (-[TestWKWebView mouseUpAtPoint:]):
+        (-[TestWKWebView mouseMoveToPoint:withFlags:]):
+        (-[TestWKWebView sendClicksAtPoint:numberOfClicks:]):
+        (-[TestWKWebView mouseEnterAtPoint:]):
+        (-[TestWKWebView mouseExitAtPoint:]):
+        (-[TestWKWebView mouseDragToPoint:]):
+        (-[TestWKWebView _mouseEventWithType:atLocation:]):
+        (-[TestWKWebView _mouseEventWithType:atLocation:flags:timestamp:clickCount:]):
+
+        Add TestWKWebView helpers to send MouseMove, MouseEnter and MouseDrag NSEvents to the web view. Additionally,
+        rename parameter names to these helpers to make it more obvious that these locations are all in NSWindow
+        coordinates.
+
+        (-[TestWKWebView typeCharacter:]):
+
+        Drive-by style fix: put this opening brace on the beginning of the next line.
+
+        * TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm:
+        (-[DragAndDropSimulator initWithWebViewFrame:]):
+        (-[DragAndDropSimulator initWithWebViewFrame:configuration:]):
+        (-[DragAndDropSimulator webView]):
+
+        Small iOS DragAndDropSimulator adjustments for new DragAndDropSimulator interfaces.
+
+        * TestWebKitAPI/mac/DragAndDropSimulatorMac.mm:
+        (-[DragAndDropTestWKWebView initWithFrame:configuration:simulator:]):
+
+        Introduce a WKWebView subclass for testing drag and drop that overrides `-dragImage:at:offset:…`, and instead
+        allows DragAndDropSimulator to take over the drag.
+
+        (-[DragAndDropTestWKWebView dragImage:at:offset:event:pasteboard:source:slideBack:]):
+
+        Override this entry point into drag and drop code, and instead call out to the DragAndDropSimulator to
+        coordinate the drag.
+
+        (-[DragAndDropTestWKWebView waitForPendingMouseEvents]):
+
+        Helper method to wait for the web process to finish handling all in-flight mouse events.
+
+        (defaultExternalDragImage):
+
+        Set this image as the default drag image when simulating an incoming drag session from outside of the web view.
+
+        (-[DragAndDropSimulator initWithWebViewFrame:]):
+        (-[DragAndDropSimulator initWithWebViewFrame:configuration:]):
+        (-[DragAndDropSimulator flipAboutXAxisInHostWindow:]):
+
+        Helper method to flip a given point about the X axis of the window.
+
+        (-[DragAndDropSimulator locationInViewForCurrentProgress]):
+
+        Map a progress value (between 0 and 1) to a drag location.
+
+        (-[DragAndDropSimulator initialProgressForMouseDrag]):
+
+        Determines the initial progress value when initiation a drag in web content. This is the initial progress
+        required to ensure that the first mouse drag event exceeds the drag distance hysteresis and causes any drag
+        (if applicable) to begin.
+
+        (-[DragAndDropSimulator runFrom:to:]):
+        (-[DragAndDropSimulator performDragInWebView:atLocation:withImage:pasteboard:source:]):
+
+        Helper to coordinate drag updates in both the cases where we're simulating a drag session entering from outside
+        of the web view, and in the case where we've initiated a drag from the web view itself.
+
+        (-[DragAndDropSimulator webView]):
+        (-[DragAndDropSimulator setExternalDragPasteboard:]):
+        (-[DragAndDropSimulator externalDragPasteboard]):
+
+        Just like its iOS counterpart (setExternalItemProviders:), setting an external drag pasteboard on macOS puts the
+        DragAndDropSimulator in a mode that simulates a drag coming in from outside the web view, using the given
+        pasteboard.
+
+        (-[DragAndDropSimulator setExternalDragImage:]):
+        (-[DragAndDropSimulator externalDragImage]):
+
+        May be optionally set when specifying an external drag pasteboard to specify the drag image used. If no external
+        drag image is specified, falls back to the default image returned by `defaultExternalDragImage()`.
+
+        (-[DragAndDropSimulator draggingInfo]):
+        (-[DragAndDropSimulator willEndDraggingHandler]):
+        (-[DragAndDropSimulator setWillEndDraggingHandler:]):
+
+        Hook to allow tests to run logic right before performing the drop (if the current drag operation is not none) or
+        ending the drag session without performing a drag operation.
+
+        (-[DragAndDropSimulator initWithWebView:]): Deleted.
+        (-[DragAndDropSimulator dealloc]): Deleted.
+        (-[DragAndDropSimulator phase]): Deleted.
+        * TestWebKitAPI/mac/TestDraggingInfo.h: Copied from Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm.
+        * TestWebKitAPI/mac/TestDraggingInfo.mm: Added.
+
+        Mock object conforming to NSDraggingInfo that is passed to WKWebView when invoking -draggingUpdated:,
+        -draggingEntered: and -draggingExited:.
+
+        (-[TestDraggingInfo draggingPasteboard]):
+        (-[TestDraggingInfo setDraggingPasteboard:]):
+        (-[TestDraggingInfo draggingSource]):
+        (-[TestDraggingInfo setDraggingSource:]):
+        (-[TestDraggingInfo enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:]):
+        (-[TestDraggingInfo draggingDestinationWindow]):
+        (-[TestDraggingInfo draggedImage]):
+        (-[TestDraggingInfo setDraggedImage:]):
+        (-[TestDraggingInfo slideDraggedImageTo:]):
+        (-[TestDraggingInfo namesOfPromisedFilesDroppedAtDestination:]):
+        (-[TestDraggingInfo resetSpringLoading]):
+
+        Empty method stubs, to be implemented in the future as needed.
+
 2018-08-13  Thomas Denney  <tdenney@apple.com>
 
         Added Thomas Denney to contributors.json.
index fdf454c..766bfb2 100644 (file)
                6BFD294C1D5E6C1D008EC968 /* HashCountedSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A38D7E51C752D5F004F157D /* HashCountedSet.cpp */; };
                751B05D61F8EAC410028A09E /* DatabaseTrackerTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 751B05D51F8EAC1A0028A09E /* DatabaseTrackerTest.mm */; };
                754CEC811F6722F200D0039A /* AutoFillAvailable.mm in Sources */ = {isa = PBXBuildFile; fileRef = 754CEC801F6722DC00D0039A /* AutoFillAvailable.mm */; };
-               764322D71B61CCC30024F801 /* WordBoundaryTypingAttributes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 764322D51B61CCA40024F801 /* WordBoundaryTypingAttributes.mm */; };
                7673499D1930C5BB00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad_bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7673499A1930182E00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad_bundle.cpp */; };
                76E182DD1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */; };
                76E182DF154767E600F1FADD /* auto-submitting-form.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 76E182DE15475A8300F1FADD /* auto-submitting-form.html */; };
                A179918B1E1CA24100A505ED /* SharedBufferTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A17991891E1CA24100A505ED /* SharedBufferTest.cpp */; };
                A17EAC55208305A00084B41B /* find.pdf in Copy Resources */ = {isa = PBXBuildFile; fileRef = A17EAC542083056E0084B41B /* find.pdf */; };
                A180C0FA1EE67DF000468F47 /* RunOpenPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = A180C0F91EE67DF000468F47 /* RunOpenPanel.mm */; };
-               A1819B13208975D300C09B83 /* full-page-dropzone.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = A1819B1220894D0400C09B83 /* full-page-dropzone.html */; };
                A1C4FB731BACD1CA003742D0 /* pages.pages in Copy Resources */ = {isa = PBXBuildFile; fileRef = A1C4FB721BACD1B7003742D0 /* pages.pages */; };
                A1DF74321C41B65800A2F4D0 /* AlwaysRevalidatedURLSchemes.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1DF74301C41B65800A2F4D0 /* AlwaysRevalidatedURLSchemes.mm */; };
                A1EC11881F42541200D0146E /* PreviewLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1EC11871F42541200D0146E /* PreviewLoader.cpp */; };
                F45E15732112CE2900307E82 /* KeyboardInputTestsIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = F45E15722112CE2900307E82 /* KeyboardInputTestsIOS.mm */; };
                F45E15762112CE6200307E82 /* TestInputDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = F45E15752112CE6200307E82 /* TestInputDelegate.mm */; };
                F46128B7211C8ED500D9FADB /* DragAndDropSimulatorMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = F46128B6211C8ED500D9FADB /* DragAndDropSimulatorMac.mm */; };
+               F46128CB211D475100D9FADB /* TestDraggingInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = F46128CA211D475100D9FADB /* TestDraggingInfo.mm */; };
+               F46128D4211E40FD00D9FADB /* link-in-iframe-and-input.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F46128D1211E2D2500D9FADB /* link-in-iframe-and-input.html */; };
+               F46128D7211E489C00D9FADB /* DragAndDropTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F46128D6211E489C00D9FADB /* DragAndDropTests.mm */; };
                F464AF9220BB66EA007F9B18 /* RenderingProgressTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F464AF9120BB66EA007F9B18 /* RenderingProgressTests.mm */; };
                F46849BE1EEF58E400B937FE /* UIPasteboardTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F46849BD1EEF58E400B937FE /* UIPasteboardTests.mm */; };
                F46849C01EEF5EF300B937FE /* rich-and-plain-text.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F46849BF1EEF5EDC00B937FE /* rich-and-plain-text.html */; };
                F4AB578A1F65165400DB0DA1 /* custom-draggable-div.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */; };
                F4B825D81EF4DBFB006E417F /* compressed-files.zip in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4B825D61EF4DBD4006E417F /* compressed-files.zip */; };
                F4B86D4F20BCD5B20099A7E6 /* paint-significant-area-milestone.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4B86D4E20BCD5970099A7E6 /* paint-significant-area-milestone.html */; };
-               F4BFA68E1E4AD08000154298 /* DragAndDropPasteboardTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4BFA68C1E4AD08000154298 /* DragAndDropPasteboardTests.mm */; };
+               F4BFA68E1E4AD08000154298 /* LegacyDragAndDropTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4BFA68C1E4AD08000154298 /* LegacyDragAndDropTests.mm */; };
                F4C2AB221DD6D95E00E06D5B /* enormous-video-with-sound.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4C2AB211DD6D94100E06D5B /* enormous-video-with-sound.html */; };
                F4C8797F2059D8D3009CD00B /* ScrollViewInsetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4C8797E2059D8D3009CD00B /* ScrollViewInsetTests.mm */; };
                F4CD74C620FDACFA00DE3794 /* text-with-async-script.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4CD74C520FDACF500DE3794 /* text-with-async-script.html */; };
                F4D65DA81F5E4704009D8C27 /* selected-text-image-link-and-editable.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4D65DA71F5E46C0009D8C27 /* selected-text-image-link-and-editable.html */; };
                F4DEF6ED1E9B4DB60048EF61 /* image-in-link-and-input.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4DEF6EC1E9B4D950048EF61 /* image-in-link-and-input.html */; };
                F4E0A296211FC5FB00AF7C7F /* selected-text-and-textarea.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4E0A295211FC5A300AF7C7F /* selected-text-and-textarea.html */; };
+               F4E0A28B211E4A2B00AF7C7F /* full-page-dropzone.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F46128D8211E496300D9FADB /* full-page-dropzone.html */; };
+               F4E0A28F211E5D5B00AF7C7F /* DragAndDropTestsMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4E0A28E211E5D5B00AF7C7F /* DragAndDropTestsMac.mm */; };
                F4E3D80820F70BB9007B58C5 /* significant-text-milestone-article.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4E3D80720F708E4007B58C5 /* significant-text-milestone-article.html */; };
                F4F137921D9B683E002BEC57 /* large-video-test-now-playing.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4F137911D9B6832002BEC57 /* large-video-test-now-playing.html */; };
                F4F405BC1D4C0D1C007A9707 /* full-size-autoplaying-video-with-audio.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4F405BA1D4C0CF8007A9707 /* full-size-autoplaying-video-with-audio.html */; };
                                932AE53D1D371047005DFFAF /* focus-inputs.html in Copy Resources */,
                                1A7E8B3618120B2F00AEB74A /* FragmentNavigation.html in Copy Resources */,
                                F47728991E4AE3C1007ABF6A /* full-page-contenteditable.html in Copy Resources */,
-                               A1819B13208975D300C09B83 /* full-page-dropzone.html in Copy Resources */,
+                               F4E0A28B211E4A2B00AF7C7F /* full-page-dropzone.html in Copy Resources */,
                                F4F405BC1D4C0D1C007A9707 /* full-size-autoplaying-video-with-audio.html in Copy Resources */,
                                CD78E11E1DB7EE2A0014A2DE /* FullscreenDelegate.html in Copy Resources */,
                                3FBD1B4A1D3D66AB00E6D6FA /* FullscreenLayoutConstraints.html in Copy Resources */,
                                C25CCA0B1E5140C10026CB8A /* LineBreaking.html in Copy Resources */,
                                F41AB9A61EF4696B0083FA08 /* link-and-input.html in Copy Resources */,
                                F41AB9A71EF4696B0083FA08 /* link-and-target-div.html in Copy Resources */,
+                               F46128D4211E40FD00D9FADB /* link-in-iframe-and-input.html in Copy Resources */,
                                8361F1781E610B4E00759B25 /* link-with-download-attribute-with-slashes.html in Copy Resources */,
                                8349D3C41DB9728E004A9F65 /* link-with-download-attribute.html in Copy Resources */,
                                378E64791632707400B6C676 /* link-with-title.html in Copy Resources */,
                754CEC801F6722DC00D0039A /* AutoFillAvailable.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AutoFillAvailable.mm; sourceTree = "<group>"; };
                7560917719259C59009EF06E /* MemoryCacheAddImageToCacheIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MemoryCacheAddImageToCacheIOS.mm; sourceTree = "<group>"; };
                75F3133F18C171B70041CAEC /* EphemeralSessionPushStateNoHistoryCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EphemeralSessionPushStateNoHistoryCallback.cpp; sourceTree = "<group>"; };
-               764322D51B61CCA40024F801 /* WordBoundaryTypingAttributes.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WordBoundaryTypingAttributes.mm; sourceTree = "<group>"; };
                76734997193016DC00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StopLoadingDuringDidFailProvisionalLoad.cpp; sourceTree = "<group>"; };
                7673499A1930182E00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad_bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StopLoadingDuringDidFailProvisionalLoad_bundle.cpp; sourceTree = "<group>"; };
                76E182D91547550100F1FADD /* WillSendSubmitEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillSendSubmitEvent.cpp; sourceTree = "<group>"; };
                A179918A1E1CA24100A505ED /* SharedBufferTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedBufferTest.h; sourceTree = "<group>"; };
                A17EAC542083056E0084B41B /* find.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = find.pdf; path = Tests/WebKit/find.pdf; sourceTree = SOURCE_ROOT; };
                A180C0F91EE67DF000468F47 /* RunOpenPanel.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RunOpenPanel.mm; sourceTree = "<group>"; };
-               A1819B1220894D0400C09B83 /* full-page-dropzone.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "full-page-dropzone.html"; sourceTree = "<group>"; };
                A18AA8CC1C3FA218009B2B97 /* ContentFiltering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentFiltering.h; sourceTree = "<group>"; };
                A1A4FE5D18DD3DB700B5EA8A /* Download.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Download.mm; sourceTree = "<group>"; };
                A1C4FB6C1BACCE50003742D0 /* QuickLook.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickLook.mm; sourceTree = "<group>"; };
                F45E15752112CE6200307E82 /* TestInputDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TestInputDelegate.mm; sourceTree = "<group>"; };
                F46128B4211C861A00D9FADB /* DragAndDropSimulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DragAndDropSimulator.h; path = cocoa/DragAndDropSimulator.h; sourceTree = "<group>"; };
                F46128B6211C8ED500D9FADB /* DragAndDropSimulatorMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropSimulatorMac.mm; sourceTree = "<group>"; };
+               F46128C9211D475100D9FADB /* TestDraggingInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestDraggingInfo.h; sourceTree = "<group>"; };
+               F46128CA211D475100D9FADB /* TestDraggingInfo.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TestDraggingInfo.mm; sourceTree = "<group>"; };
+               F46128D1211E2D2500D9FADB /* link-in-iframe-and-input.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "link-in-iframe-and-input.html"; sourceTree = "<group>"; };
+               F46128D6211E489C00D9FADB /* DragAndDropTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropTests.mm; sourceTree = "<group>"; };
+               F46128D8211E496300D9FADB /* full-page-dropzone.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "full-page-dropzone.html"; sourceTree = "<group>"; };
                F464AF9120BB66EA007F9B18 /* RenderingProgressTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderingProgressTests.mm; sourceTree = "<group>"; };
                F46849BD1EEF58E400B937FE /* UIPasteboardTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = UIPasteboardTests.mm; sourceTree = "<group>"; };
                F46849BF1EEF5EDC00B937FE /* rich-and-plain-text.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "rich-and-plain-text.html"; sourceTree = "<group>"; };
                F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "custom-draggable-div.html"; sourceTree = "<group>"; };
                F4B825D61EF4DBD4006E417F /* compressed-files.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = "compressed-files.zip"; sourceTree = "<group>"; };
                F4B86D4E20BCD5970099A7E6 /* paint-significant-area-milestone.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "paint-significant-area-milestone.html"; sourceTree = "<group>"; };
-               F4BFA68C1E4AD08000154298 /* DragAndDropPasteboardTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropPasteboardTests.mm; sourceTree = "<group>"; };
+               F4BFA68C1E4AD08000154298 /* LegacyDragAndDropTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LegacyDragAndDropTests.mm; sourceTree = "<group>"; };
                F4C2AB211DD6D94100E06D5B /* enormous-video-with-sound.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "enormous-video-with-sound.html"; sourceTree = "<group>"; };
                F4C8797E2059D8D3009CD00B /* ScrollViewInsetTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollViewInsetTests.mm; sourceTree = "<group>"; };
                F4CD74C520FDACF500DE3794 /* text-with-async-script.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "text-with-async-script.html"; sourceTree = "<group>"; };
                F4D65DA71F5E46C0009D8C27 /* selected-text-image-link-and-editable.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "selected-text-image-link-and-editable.html"; sourceTree = "<group>"; };
                F4DEF6EC1E9B4D950048EF61 /* image-in-link-and-input.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "image-in-link-and-input.html"; sourceTree = "<group>"; };
                F4E0A295211FC5A300AF7C7F /* selected-text-and-textarea.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "selected-text-and-textarea.html"; sourceTree = "<group>"; };
+               F4E0A28E211E5D5B00AF7C7F /* DragAndDropTestsMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DragAndDropTestsMac.mm; sourceTree = "<group>"; };
                F4E3D80720F708E4007B58C5 /* significant-text-milestone-article.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "significant-text-milestone-article.html"; sourceTree = "<group>"; };
                F4F137911D9B6832002BEC57 /* large-video-test-now-playing.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-video-test-now-playing.html"; sourceTree = "<group>"; };
                F4F405BA1D4C0CF8007A9707 /* full-size-autoplaying-video-with-audio.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "full-size-autoplaying-video-with-audio.html"; sourceTree = "<group>"; };
                                518EE51620A78CDF00E024F3 /* DoubleDefersLoading.mm */,
                                518EE51720A78CDF00E024F3 /* DoubleDefersLoadingPlugin.mm */,
                                A1A4FE5D18DD3DB700B5EA8A /* Download.mm */,
+                               F46128D6211E489C00D9FADB /* DragAndDropTests.mm */,
                                A15502281E05020B00A24C57 /* DuplicateCompletionHandlerCalls.mm */,
                                F44D06461F395C4D001A0E29 /* EditorStateTests.mm */,
                                CDA29B2820FD2A9900F15CED /* ExitFullscreenOnEnterPiP.mm */,
                                A17EAC542083056E0084B41B /* find.pdf */,
                                F43E3BC020DADB8000A4E7ED /* fixed-nav-bar.html */,
                                93575C551D30366E000D604D /* focus-inputs.html */,
+                               F46128D8211E496300D9FADB /* full-page-dropzone.html */,
                                F4F405BA1D4C0CF8007A9707 /* full-size-autoplaying-video-with-audio.html */,
                                CD78E11B1DB7EA360014A2DE /* FullscreenDelegate.html */,
                                3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */,
                                C25CCA0A1E513F490026CB8A /* LineBreaking.html */,
                                F41AB9961EF4692C0083FA08 /* link-and-input.html */,
                                F41AB99D1EF4692C0083FA08 /* link-and-target-div.html */,
+                               F46128D1211E2D2500D9FADB /* link-in-iframe-and-input.html */,
                                8C10AF97206467830018FD90 /* localstorage-empty-string-value.html */,
                                51E6A8951D2F1C7700C004B6 /* LocalStorageClear.html */,
                                46C519E21D35629600DAA51A /* LocalStorageNullEntries.html */,
                                C081224413FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m */,
                                29AB8AA3164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.h */,
                                29AB8AA2164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm */,
+                               F46128C9211D475100D9FADB /* TestDraggingInfo.h */,
+                               F46128CA211D475100D9FADB /* TestDraggingInfo.mm */,
                                C08587BE13FE956C001EF4E5 /* WebKitAgnosticTest.h */,
                                C08587BD13FE956C001EF4E5 /* WebKitAgnosticTest.mm */,
                        );
                                46397B941DC2C850009A78AE /* DOMNode.mm */,
                                3751AF7A169518F800764319 /* DOMNodeFromJSObject.mm */,
                                37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */,
-                               F4BFA68C1E4AD08000154298 /* DragAndDropPasteboardTests.mm */,
+                               F4E0A28E211E5D5B00AF7C7F /* DragAndDropTestsMac.mm */,
                                C07E6CAE13FD67650038B22B /* DynamicDeviceScaleFactor.mm */,
                                1A9FB6CC1CA34BE500966124 /* EarlyKVOCrash.mm */,
                                4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */,
                                C507E8A614C6545B005D6B3B /* InspectorBar.mm */,
                                57F10D921C7E7B3800ECDF30 /* IsNavigationActionTrusted.mm */,
                                4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */,
+                               F4BFA68C1E4AD08000154298 /* LegacyDragAndDropTests.mm */,
                                7A7B0E7E1EAFE454006AB8AE /* LimitTitleSize.mm */,
                                57901FAE1CAF137100ED64F9 /* LoadInvalidURLRequest.mm */,
                                CDA315961ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm */,
                                1A7BFC0A171A0BDB00BC5F64 /* WillSendSubmitEvent.mm */,
                                A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */,
                                F4FA917F1E61849B007B8C1D /* WKWebViewMacEditingTests.mm */,
-                               764322D51B61CCA40024F801 /* WordBoundaryTypingAttributes.mm */,
                        );
                        path = mac;
                        sourceTree = "<group>";
                                F4FA91821E618566007B8C1D /* double-click-does-not-select-trailing-space.html */,
                                1A7E8B351812093600AEB74A /* FragmentNavigation.html */,
                                F47728981E4AE3AD007ABF6A /* full-page-contenteditable.html */,
-                               A1819B1220894D0400C09B83 /* full-page-dropzone.html */,
                                CDBFCC421A9FF44800A7B691 /* FullscreenZoomInitialFrame.html */,
                                9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */,
                                9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */,
                                518EE51820A78CE200E024F3 /* DoubleDefersLoading.mm in Sources */,
                                7CCE7F231A411AF600447C4C /* Download.mm in Sources */,
                                7CCE7EEE1A411AE600447C4C /* DownloadDecideDestinationCrash.cpp in Sources */,
-                               F4BFA68E1E4AD08000154298 /* DragAndDropPasteboardTests.mm in Sources */,
                                F4D4F3B61E4E2BCB00BB2767 /* DragAndDropSimulatorIOS.mm in Sources */,
                                F46128B7211C8ED500D9FADB /* DragAndDropSimulatorMac.mm in Sources */,
+                               F46128D7211E489C00D9FADB /* DragAndDropTests.mm in Sources */,
                                F4D4F3B91E4E36E400BB2767 /* DragAndDropTestsIOS.mm in Sources */,
+                               F4E0A28F211E5D5B00AF7C7F /* DragAndDropTestsMac.mm in Sources */,
                                A155022A1E05020B00A24C57 /* DuplicateCompletionHandlerCalls.mm in Sources */,
                                7CCE7EBE1A411A7E00447C4C /* DynamicDeviceScaleFactor.mm in Sources */,
                                5C0BF8921DD599B600B00328 /* EarlyKVOCrash.mm in Sources */,
                                F45E15732112CE2900307E82 /* KeyboardInputTestsIOS.mm in Sources */,
                                7CCE7F061A411AE600447C4C /* LayoutMilestonesWithAllContentInFrame.cpp in Sources */,
                                7CCE7EDF1A411A9200447C4C /* LayoutUnit.cpp in Sources */,
+                               F4BFA68E1E4AD08000154298 /* LegacyDragAndDropTests.mm in Sources */,
                                7A66BDB61EAF14EF00CCC924 /* LimitTitleSize.cpp in Sources */,
                                7A7B0E7F1EAFE4C3006AB8AE /* LimitTitleSize.mm in Sources */,
                                C25CCA061E51380B0026CB8A /* LineBreaking.mm in Sources */,
                                1C734B5320788C4800F430EA /* SystemColors.mm in Sources */,
                                7CCE7F161A411AE600447C4C /* TerminateTwice.cpp in Sources */,
                                7CCE7EA91A411A1D00447C4C /* TestBrowsingContextLoadDelegate.mm in Sources */,
+                               F46128CB211D475100D9FADB /* TestDraggingInfo.mm in Sources */,
                                F45E15762112CE6200307E82 /* TestInputDelegate.mm in Sources */,
                                2D1C04A71D76298B000A6816 /* TestNavigationDelegate.mm in Sources */,
                                A14FC5901B8AE36F00D107EB /* TestProtocol.mm in Sources */,
                                F4FA91811E61849B007B8C1D /* WKWebViewMacEditingTests.mm in Sources */,
                                93F56DA91E5F919D003EDE84 /* WKWebViewSnapshot.mm in Sources */,
                                9984FACC1CFFAF60008D198C /* WKWebViewTextInput.mm in Sources */,
-                               764322D71B61CCC30024F801 /* WordBoundaryTypingAttributes.mm in Sources */,
                                9C64DC321D76198A004B598E /* YouTubePluginReplacement.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm
new file mode 100644 (file)
index 0000000..b4f6745
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "DragAndDropSimulator.h"
+#import "PlatformUtilities.h"
+
+#if WK_API_ENABLED && ENABLE(DRAG_SUPPORT)
+
+TEST(DragAndDropTests, DragImageLocationForLinkInSubframe)
+{
+    auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebViewFrame:CGRectMake(0, 0, 400, 400)]);
+    [[simulator webView] synchronouslyLoadTestPageNamed:@"link-in-iframe-and-input"];
+    [simulator runFrom:NSMakePoint(200, 375) to:NSMakePoint(200, 125)];
+
+    EXPECT_WK_STREQ("https://www.apple.com/", [[simulator webView] stringByEvaluatingJavaScript:@"document.querySelector('input').value"]);
+
+#if PLATFORM(MAC)
+    EXPECT_TRUE(NSPointInRect([simulator initialDragImageLocationInView], NSMakeRect(0, 250, 400, 250)));
+#endif
+}
+
+#endif // WK_API_ENABLED && ENABLE(DRAG_SUPPORT)
diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html b/Tools/TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html
new file mode 100644 (file)
index 0000000..7931971
--- /dev/null
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width">
+<body style="width: 100vw; height: 100vh; margin: 0;"
+    ondragenter="window.observedDragEnter = true; return false;"
+    ondragover="window.observedDragOver = true; return false;"
+    ondrop="window.observedDrop = true; return false;">
index 20bce25..951cf5c 100644 (file)
@@ -25,6 +25,6 @@
 </head>
 
 <body>
-    <div><a id="link" href="https://www.apple.com"><img src="icon.png"></img></a></div>
-    <div><input id="editor"></input></div>
+    <div id="top"><a id="link" href="https://www.apple.com"><img src="icon.png"></img></a></div>
+    <div id="bottom"><input id="editor"></input></div>
 </body>
diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html b/Tools/TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html
new file mode 100644 (file)
index 0000000..89e83e6
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<style>
+body, html {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+}
+
+iframe, input {
+    width: 100%;
+    height: 250px;
+    display: block;
+    font-size: 100px;
+}
+</style>
+</head>
+<body>
+<input></input>
+<iframe srcdoc="<a href='https://www.apple.com/' style='font-size: 100px;'>Link to apple.com</a>">
+</body>
diff --git a/Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm b/Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm
new file mode 100644 (file)
index 0000000..41c4cb3
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "DragAndDropSimulator.h"
+#import "PlatformUtilities.h"
+
+#if WK_API_ENABLED && ENABLE(DRAG_SUPPORT) && PLATFORM(MAC)
+
+TEST(DragAndDropTests, NumberOfValidItemsForDrop)
+{
+    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName];
+    [pasteboard declareTypes:@[NSFilenamesPboardType] owner:nil];
+    [pasteboard setPropertyList:@[@"file-name"] forType:NSFilenamesPboardType];
+
+    auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebViewFrame:NSMakeRect(0, 0, 400, 400)]);
+    TestWKWebView *webView = [simulator webView];
+    [simulator setExternalDragPasteboard:pasteboard];
+
+    auto hostWindow = adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 400) styleMask:0 backing:NSBackingStoreBuffered defer:NO]);
+    [hostWindow setFrameOrigin:NSMakePoint(0, 0)];
+    [[hostWindow contentView] addSubview:webView];
+    [webView synchronouslyLoadTestPageNamed:@"full-page-dropzone"];
+
+    NSInteger numberOfValidItemsForDrop = 0;
+    [simulator setWillEndDraggingHandler:[&numberOfValidItemsForDrop, simulator] {
+        numberOfValidItemsForDrop = [simulator draggingInfo].numberOfValidItemsForDrop;
+    }];
+
+    [simulator runFrom:NSMakePoint(0, 0) to:NSMakePoint(200, 200)];
+
+    EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"observedDragEnter"].boolValue);
+    EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"observedDragOver"].boolValue);
+    EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"observedDrop"].boolValue);
+    EXPECT_EQ(1U, numberOfValidItemsForDrop);
+}
+
+#endif // WK_API_ENABLED && ENABLE(DRAG_SUPPORT) && PLATFORM(MAC)
@@ -35,7 +35,7 @@
 #import <wtf/RetainPtr.h>
 
 @interface FrameLoadCompletionListener : NSObject<WebFrameLoadDelegate> {
-    BlockPtr<void (void)> _completionBlock;
+    BlockPtr<void()> _completionBlock;
 }
 + (instancetype)listenerWithCompletionBlock:(dispatch_block_t)completionBlock;
 @end
@@ -234,7 +234,7 @@ static WebView *webViewAfterPerformingDragOperation(NSPasteboard *pasteboard)
     return destination.get();
 }
 
-TEST(DragAndDropPasteboardTests, DropUTF8PlainText)
+TEST(LegacyDragAndDropTests, DropUTF8PlainText)
 {
     NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName];
     [pasteboard setData:[@"I am a WebKit." dataUsingEncoding:NSUTF8StringEncoding] forType:(__bridge NSString *)kUTTypeUTF8PlainText];
@@ -243,7 +243,7 @@ TEST(DragAndDropPasteboardTests, DropUTF8PlainText)
     EXPECT_TRUE([[resultingWebView stringByEvaluatingJavaScriptFromString:@"document.body.textContent"] containsString:@"I am a WebKit."]);
 }
 
-TEST(DragAndDropPasteboardTests, DropJPEG)
+TEST(LegacyDragAndDropTests, DropJPEG)
 {
     NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName];
     NSImage *icon = getTestImage();
@@ -253,35 +253,6 @@ TEST(DragAndDropPasteboardTests, DropJPEG)
     RetainPtr<WebView> resultingWebView = webViewAfterPerformingDragOperation(pasteboard);
     EXPECT_TRUE([[resultingWebView stringByEvaluatingJavaScriptFromString:@"document.querySelector('img').tagName === 'IMG'"] isEqualToString:@"true"]);
 }
-    
-#if WK_API_ENABLED
-
-TEST(DragAndDropPasteboardTests, NumberOfValidItemsForDrop)
-{
-    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName];
-    [pasteboard declareTypes:@[NSFilenamesPboardType] owner:nil];
-    [pasteboard setPropertyList:@[@"file-name"] forType:NSFilenamesPboardType];
-
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
-    auto hostWindow = adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 400) styleMask:0 backing:NSBackingStoreBuffered defer:NO]);
-    [hostWindow setFrameOrigin:NSMakePoint(0, 0)];
-    [[hostWindow contentView] addSubview:webView.get()];
-
-    [webView synchronouslyLoadTestPageNamed:@"full-page-dropzone"];
-
-    auto dragSource = adoptNS([[DragSource alloc] init]);
-    auto dragInfo = adoptNS([[DragInfo alloc] initWithImage:getTestImage() offset:NSMakeSize(0, 0) pasteboard:pasteboard source:dragSource.get() destinationWindow:hostWindow.get()]);
-
-    [dragInfo setLastMousePosition:NSMakePoint(0, 200)];
-    [webView draggingEntered:dragInfo.get()];
-    EXPECT_WK_STREQ(@"1", [webView stringByEvaluatingJavaScript:@"window.dragEnteredForTesting"]);
-
-    [dragInfo setLastMousePosition:NSMakePoint(200, 200)];
-    [webView draggingUpdated:dragInfo.get()];
-    EXPECT_EQ(1U, [dragInfo numberOfValidItemsForDrop]);
-}
-
-#endif // WK_API_ENABLED
 
 } // namespace TestWebKitAPI
 
diff --git a/Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html b/Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html
deleted file mode 100644 (file)
index 094598a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<body style="width: 100vw; height: 100vh; margin: 0;" ondragenter="window.dragEnteredForTesting = true; return false;">
index f3b1288..84c8be3 100644 (file)
@@ -37,6 +37,8 @@
 #import <UIKit/NSItemProvider+UIKitAdditions.h>
 #endif
 
+#if PLATFORM(IOS)
+
 typedef NS_ENUM(NSInteger, DragAndDropPhase) {
     DragAndDropPhaseCancelled = 0,
     DragAndDropPhaseBeginning = 1,
@@ -45,8 +47,6 @@ typedef NS_ENUM(NSInteger, DragAndDropPhase) {
     DragAndDropPhasePerformingDrop = 4
 };
 
-#if PLATFORM(IOS)
-
 typedef NSDictionary<NSNumber *, NSValue *> *ProgressToCGPointValueMap;
 
 @interface MockDragDropSession : NSObject <UIDragDropSession> {
@@ -75,19 +75,22 @@ typedef NSDictionary<NSNumber *, NSValue *> *ProgressToCGPointValueMap;
 
 @interface DragAndDropSimulator : NSObject<WKUIDelegatePrivate, _WKInputDelegate>
 
-- (instancetype)initWithWebView:(TestWKWebView *)webView;
+- (instancetype)initWithWebViewFrame:(CGRect)frame;
+- (instancetype)initWithWebViewFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
 // The start location, end location, and locations of additional item requests are all in window coordinates.
 - (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation;
 @property (nonatomic, readonly) NSArray<_WKAttachment *> *insertedAttachments;
 @property (nonatomic, readonly) NSArray<_WKAttachment *> *removedAttachments;
-@property (nonatomic, readonly) DragAndDropPhase phase;
+@property (nonatomic, readonly) TestWKWebView *webView;
 
 #if PLATFORM(IOS)
 
+- (instancetype)initWithWebView:(TestWKWebView *)webView;
 - (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation additionalItemRequestLocations:(ProgressToCGPointValueMap)additionalItemRequestLocations;
 - (void)waitForInputSession;
 - (void)endDataTransfer;
 
+@property (nonatomic, readonly) DragAndDropPhase phase;
 @property (nonatomic) BOOL allowsFocusToStartInputSession;
 @property (nonatomic) BOOL shouldEnsureUIApplication;
 @property (nonatomic) BOOL shouldAllowMoveOperation;
@@ -106,6 +109,17 @@ typedef NSDictionary<NSNumber *, NSValue *> *ProgressToCGPointValueMap;
 
 #endif // PLATFORM(IOS)
 
+#if PLATFORM(MAC)
+
+@property (nonatomic, readonly) id <NSDraggingInfo> draggingInfo;
+@property (nonatomic, readonly) NSPoint initialDragImageLocationInView;
+@property (nonatomic, readonly) NSDragOperation currentDragOperation;
+@property (nonatomic, strong) NSPasteboard *externalDragPasteboard;
+@property (nonatomic, strong) NSImage *externalDragImage;
+@property (nonatomic, copy) dispatch_block_t willEndDraggingHandler;
+
+#endif // PLATFORM(MAC)
+
 @end
 
 #endif // ENABLE(DRAG_SUPPORT) && WK_API_ENABLED
index cf98daa..051fa29 100644 (file)
 #if PLATFORM(MAC)
 @interface TestWKWebView (MacOnly)
 // Simulates clicking with a pressure-sensitive device, if possible.
-- (void)mouseDownAtPoint:(NSPoint)point simulatePressure:(BOOL)simulatePressure;
-- (void)mouseUpAtPoint:(NSPoint)point;
-- (void)mouseMoveToPoint:(NSPoint)point withFlags:(NSEventModifierFlags)flags;
-- (void)sendClicksAtPoint:(NSPoint)point numberOfClicks:(NSUInteger)numberOfClicks;
+- (void)mouseDownAtPoint:(NSPoint)pointInWindow simulatePressure:(BOOL)simulatePressure;
+- (void)mouseDragToPoint:(NSPoint)pointInWindow;
+- (void)mouseEnterAtPoint:(NSPoint)pointInWindow;
+- (void)mouseUpAtPoint:(NSPoint)pointInWindow;
+- (void)mouseMoveToPoint:(NSPoint)pointInWindow withFlags:(NSEventModifierFlags)flags;
+- (void)sendClicksAtPoint:(NSPoint)pointInWindow numberOfClicks:(NSUInteger)numberOfClicks;
 - (NSWindow *)hostWindow;
 - (void)typeCharacter:(char)character;
 @end
index 3740d58..d096cf0 100644 (file)
@@ -372,26 +372,52 @@ NSEventMask __simulated_forceClickAssociatedEventsMask(id self, SEL _cmd)
 
 #if PLATFORM(MAC)
 @implementation TestWKWebView (MacOnly)
-- (void)mouseDownAtPoint:(NSPoint)point simulatePressure:(BOOL)simulatePressure
+- (void)mouseDownAtPoint:(NSPoint)pointInWindow simulatePressure:(BOOL)simulatePressure
 {
-    [_hostWindow _mouseDownAtPoint:point simulatePressure:simulatePressure clickCount:1];
+    [_hostWindow _mouseDownAtPoint:pointInWindow simulatePressure:simulatePressure clickCount:1];
 }
 
-- (void)mouseUpAtPoint:(NSPoint)point
+- (void)mouseUpAtPoint:(NSPoint)pointInWindow
 {
-    [_hostWindow _mouseUpAtPoint:point clickCount:1];
+    [_hostWindow _mouseUpAtPoint:pointInWindow clickCount:1];
 }
 
-- (void)mouseMoveToPoint:(NSPoint)point withFlags:(NSEventModifierFlags)flags
+- (void)mouseMoveToPoint:(NSPoint)pointInWindow withFlags:(NSEventModifierFlags)flags
 {
-    [self mouseMoved:[NSEvent mouseEventWithType:NSEventTypeMouseMoved location:point modifierFlags:flags timestamp:GetCurrentEventTime() windowNumber:[_hostWindow windowNumber] context:[NSGraphicsContext currentContext] eventNumber:++gEventNumber clickCount:0 pressure:0]];
+    [self mouseMoved:[self _mouseEventWithType:NSEventTypeMouseMoved atLocation:pointInWindow flags:flags timestamp:GetCurrentEventTime() clickCount:0]];
 }
 
-- (void)sendClicksAtPoint:(NSPoint)point numberOfClicks:(NSUInteger)numberOfClicks
+- (void)sendClicksAtPoint:(NSPoint)pointInWindow numberOfClicks:(NSUInteger)numberOfClicks
 {
     for (NSUInteger clickCount = 1; clickCount <= numberOfClicks; ++clickCount) {
-        [_hostWindow _mouseDownAtPoint:point simulatePressure:NO clickCount:clickCount];
-        [_hostWindow _mouseUpAtPoint:point clickCount:clickCount];
+        [_hostWindow _mouseDownAtPoint:pointInWindow simulatePressure:NO clickCount:clickCount];
+        [_hostWindow _mouseUpAtPoint:pointInWindow clickCount:clickCount];
+    }
+}
+
+- (void)mouseEnterAtPoint:(NSPoint)pointInWindow
+{
+    [self mouseEntered:[self _mouseEventWithType:NSEventTypeMouseEntered atLocation:pointInWindow]];
+}
+
+- (void)mouseDragToPoint:(NSPoint)pointInWindow
+{
+    [self mouseDragged:[self _mouseEventWithType:NSEventTypeLeftMouseDragged atLocation:pointInWindow]];
+}
+
+- (NSEvent *)_mouseEventWithType:(NSEventType)type atLocation:(NSPoint)pointInWindow
+{
+    return [self _mouseEventWithType:type atLocation:pointInWindow flags:0 timestamp:GetCurrentEventTime() clickCount:0];
+}
+
+- (NSEvent *)_mouseEventWithType:(NSEventType)type atLocation:(NSPoint)locationInWindow flags:(NSEventModifierFlags)flags timestamp:(NSTimeInterval)timestamp clickCount:(NSUInteger)clickCount
+{
+    switch (type) {
+    case NSEventTypeMouseEntered:
+    case NSEventTypeMouseExited:
+        return [NSEvent enterExitEventWithType:type location:locationInWindow modifierFlags:flags timestamp:timestamp windowNumber:[_hostWindow windowNumber] context:[NSGraphicsContext currentContext] eventNumber:++gEventNumber trackingNumber:1 userData:nil];
+    default:
+        return [NSEvent mouseEventWithType:type location:locationInWindow modifierFlags:flags timestamp:timestamp windowNumber:[_hostWindow windowNumber] context:[NSGraphicsContext currentContext] eventNumber:++gEventNumber clickCount:clickCount pressure:0];
     }
 }
 
@@ -400,7 +426,8 @@ NSEventMask __simulated_forceClickAssociatedEventsMask(id self, SEL _cmd)
     return _hostWindow.get();
 }
 
-- (void)typeCharacter:(char)character {
+- (void)typeCharacter:(char)character
+{
     NSString *characterAsString = [NSString stringWithFormat:@"%c" , character];
     NSEventType keyDownEventType = NSEventTypeKeyDown;
     NSEventType keyUpEventType = NSEventTypeKeyUp;
index 43eecd9..9e1f21e 100644 (file)
@@ -318,6 +318,19 @@ static NSArray *dragAndDropEventNames()
     RetainPtr<UIDropProposal> _currentDropProposal;
 }
 
+- (instancetype)initWithWebViewFrame:(CGRect)frame
+{
+    return [self initWithWebViewFrame:frame configuration:nil];
+}
+
+- (instancetype)initWithWebViewFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
+{
+    if (configuration)
+        return [self initWithWebView:[[[TestWKWebView alloc] initWithFrame:frame configuration:configuration] autorelease]];
+
+    return [self initWithWebView:[[[TestWKWebView alloc] initWithFrame:frame] autorelease]];
+}
+
 - (instancetype)initWithWebView:(TestWKWebView *)webView
 {
     if (self = [super init]) {
@@ -623,6 +636,11 @@ static NSArray *dragAndDropEventNames()
     [[_webView dragInteractionDelegate] dragInteraction:[_webView dragInteraction] sessionDidTransferItems:_dragSession.get()];
 }
 
+- (TestWKWebView *)webView
+{
+    return _webView.get();
+}
+
 #pragma mark - WKUIDelegatePrivate
 
 - (void)_webView:(WKWebView *)webView dataInteractionOperationWasHandled:(BOOL)handled forSession:(id)session itemProviders:(NSArray<UIItemProvider *> *)itemProviders
index 9a7918c..f5a7a1f 100644 (file)
 
 #if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) && WK_API_ENABLED
 
+#import "PlatformUtilities.h"
+#import "TestDraggingInfo.h"
 #import "TestWKWebView.h"
+#import <cmath>
+#import <wtf/WeakObjCPtr.h>
+
+@class DragAndDropTestWKWebView;
+
+@interface DragAndDropSimulator ()
+- (void)performDragInWebView:(DragAndDropTestWKWebView *)webView atLocation:(NSPoint)viewLocation withImage:(NSImage *)image pasteboard:(NSPasteboard *)pasteboard source:(id)source;
+@end
+
+@interface DragAndDropTestWKWebView : TestWKWebView
+@end
+
+@implementation DragAndDropTestWKWebView {
+    WeakObjCPtr<DragAndDropSimulator> _dragAndDropSimulator;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration simulator:(DragAndDropSimulator *)simulator
+{
+    if (self = [super initWithFrame:frame configuration:configuration])
+        _dragAndDropSimulator = simulator;
+    return self;
+}
+
+- (void)dragImage:(NSImage *)image at:(NSPoint)viewLocation offset:(NSSize)initialOffset event:(NSEvent *)event pasteboard:(NSPasteboard *)pboard source:(id)sourceObj slideBack:(BOOL)slideFlag
+{
+    [_dragAndDropSimulator performDragInWebView:self atLocation:viewLocation withImage:image pasteboard:pboard source:sourceObj];
+}
+
+- (void)waitForPendingMouseEvents
+{
+    __block bool doneProcessMouseEvents = false;
+    [self _doAfterProcessingAllPendingMouseEvents:^{
+        doneProcessMouseEvents = true;
+    }];
+    TestWebKitAPI::Util::run(&doneProcessMouseEvents);
+}
+
+@end
+
+// This exceeds the default drag hysteresis of all potential drag types.
+const double initialMouseDragDistance = 45;
+const double dragUpdateProgressIncrement = 0.05;
+
+static NSImage *defaultExternalDragImage()
+{
+    return [[[NSImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"icon" withExtension:@"png" subdirectory:@"TestWebKitAPI.resources"]] autorelease];
+}
 
 @implementation DragAndDropSimulator {
-    RetainPtr<TestWKWebView> _webView;
+    RetainPtr<DragAndDropTestWKWebView> _webView;
+    RetainPtr<TestDraggingInfo> _draggingInfo;
+    RetainPtr<NSPasteboard> _externalDragPasteboard;
+    RetainPtr<NSImage> _externalDragImage;
+    BlockPtr<void()> _willEndDraggingHandler;
+    NSPoint _startLocationInWindow;
+    NSPoint _endLocationInWindow;
+    double _progress;
+}
+
+@synthesize currentDragOperation=_currentDragOperation;
+@synthesize initialDragImageLocationInView=_initialDragImageLocationInView;
+
+- (instancetype)initWithWebViewFrame:(CGRect)frame
+{
+    return [self initWithWebViewFrame:frame configuration:nil];
 }
 
-- (instancetype)initWithWebView:(TestWKWebView *)webView
+- (instancetype)initWithWebViewFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
 {
     if (self = [super init]) {
-        _webView = webView;
+        _webView = adoptNS([[DragAndDropTestWKWebView alloc] initWithFrame:frame configuration:configuration ?: [[[WKWebViewConfiguration alloc] init] autorelease] simulator:self]);
         [_webView setUIDelegate:self];
-        [_webView _setInputDelegate:self];
     }
     return self;
 }
 
-- (void)dealloc
+- (NSPoint)flipAboutXAxisInHostWindow:(NSPoint)point
 {
-    if ([_webView UIDelegate] == self)
-        [_webView setUIDelegate:nil];
+    return { point.x, NSHeight([[_webView hostWindow] frame]) - point.y };
+}
 
-    if ([_webView _inputDelegate] == self)
-        [_webView _setInputDelegate:nil];
+- (NSPoint)locationInViewForCurrentProgress
+{
+    return {
+        _startLocationInWindow.x + (_endLocationInWindow.x - _startLocationInWindow.x) * _progress,
+        _startLocationInWindow.y + (_endLocationInWindow.y - _startLocationInWindow.y) * _progress
+    };
+}
 
-    [super dealloc];
+- (double)initialProgressForMouseDrag
+{
+    double totalDistance = std::sqrt(std::pow(_startLocationInWindow.x - _endLocationInWindow.x, 2) + std::pow(_startLocationInWindow.y - _endLocationInWindow.y, 2));
+    return !totalDistance ? 1 : std::min<double>(1, initialMouseDragDistance / totalDistance);
 }
 
-- (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation
+- (void)runFrom:(CGPoint)flippedStartLocation to:(CGPoint)flippedEndLocation
 {
-    // FIXME: Add a mechanism to simulate dragging on macOS.
-    UNUSED_PARAM(startLocation);
-    UNUSED_PARAM(endLocation);
+    _startLocationInWindow = [self flipAboutXAxisInHostWindow:flippedStartLocation];
+    _endLocationInWindow = [self flipAboutXAxisInHostWindow:flippedEndLocation];
+    _currentDragOperation = NSDragOperationNone;
+    _draggingInfo = nil;
+    _progress = 0;
+
+    if (NSPasteboard *pasteboard = self.externalDragPasteboard) {
+        NSPoint startLocationInView = [_webView convertPoint:_startLocationInWindow fromView:nil];
+        NSImage *dragImage = self.externalDragImage ?: defaultExternalDragImage();
+        [self performDragInWebView:_webView.get() atLocation:startLocationInView withImage:dragImage pasteboard:pasteboard source:nil];
+        return;
+    }
+
+    _progress = [self initialProgressForMouseDrag];
+    if (_progress == 1) {
+        [NSException raise:@"DragAndDropSimulator" format:@"Drag start (%@) and drag end (%@) locations are too close!", NSStringFromPoint(flippedStartLocation), NSStringFromPoint(flippedEndLocation)];
+        return;
+    }
+
+    [_webView mouseEnterAtPoint:_startLocationInWindow];
+    [_webView mouseMoveToPoint:_startLocationInWindow withFlags:0];
+    [_webView mouseDownAtPoint:_startLocationInWindow simulatePressure:NO];
+    [_webView mouseDragToPoint:[self locationInViewForCurrentProgress]];
+    [_webView waitForPendingMouseEvents];
+
+    [_webView mouseUpAtPoint:_endLocationInWindow];
+    [_webView waitForPendingMouseEvents];
+}
+
+- (void)performDragInWebView:(DragAndDropTestWKWebView *)webView atLocation:(NSPoint)viewLocation withImage:(NSImage *)image pasteboard:(NSPasteboard *)pasteboard source:(id)source
+{
+    _initialDragImageLocationInView = viewLocation;
+    _draggingInfo = adoptNS([[TestDraggingInfo alloc] init]);
+    [_draggingInfo setDraggedImage:image];
+    [_draggingInfo setDraggingPasteboard:pasteboard];
+    [_draggingInfo setDraggingSource:source];
+    [_draggingInfo setDraggingLocation:[self locationInViewForCurrentProgress]];
+    [_draggingInfo setDraggingSourceOperationMask:NSDragOperationEvery];
+    [_draggingInfo setNumberOfValidItemsForDrop:pasteboard.pasteboardItems.count];
+
+    _currentDragOperation = [_webView draggingEntered:_draggingInfo.get()];
+    [_webView waitForNextPresentationUpdate];
+
+    while (_progress != 1) {
+        _progress = std::min<double>(1, _progress + dragUpdateProgressIncrement);
+        [_draggingInfo setDraggingLocation:[self locationInViewForCurrentProgress]];
+        _currentDragOperation = [_webView draggingUpdated:_draggingInfo.get()];
+        [_webView waitForNextPresentationUpdate];
+    }
+
+    [_draggingInfo setDraggingLocation:_endLocationInWindow];
+
+    if (_willEndDraggingHandler)
+        _willEndDraggingHandler();
+
+    if (_currentDragOperation != NSDragOperationNone && [_webView prepareForDragOperation:_draggingInfo.get()])
+        [_webView performDragOperation:_draggingInfo.get()];
+    else if (_currentDragOperation == NSDragOperationNone)
+        [_webView draggingExited:_draggingInfo.get()];
+    [_webView waitForNextPresentationUpdate];
+
+    if (!self.externalDragPasteboard) {
+        [_webView draggedImage:[_draggingInfo draggedImage] endedAt:_endLocationInWindow operation:_currentDragOperation];
+        [_webView waitForNextPresentationUpdate];
+    }
 }
 
 - (NSArray<_WKAttachment *> *)insertedAttachments
     return @[ ];
 }
 
-- (DragAndDropPhase)phase
+- (TestWKWebView *)webView
+{
+    return _webView.get();
+}
+
+- (void)setExternalDragPasteboard:(NSPasteboard *)externalDragPasteboard
+{
+    _externalDragPasteboard = externalDragPasteboard;
+}
+
+- (NSPasteboard *)externalDragPasteboard
+{
+    return _externalDragPasteboard.get();
+}
+
+- (void)setExternalDragImage:(NSImage *)externalDragImage
+{
+    _externalDragImage = externalDragImage;
+}
+
+- (NSImage *)externalDragImage
+{
+    return _externalDragImage.get();
+}
+
+- (id <NSDraggingInfo>)draggingInfo
+{
+    return _draggingInfo.get();
+}
+
+- (dispatch_block_t)willEndDraggingHandler
+{
+    return _willEndDraggingHandler.get();
+}
+
+- (void)setWillEndDraggingHandler:(dispatch_block_t)willEndDraggingHandler
 {
-    return DragAndDropPhaseCancelled;
+    _willEndDraggingHandler = makeBlockPtr(willEndDraggingHandler);
 }
 
 @end
diff --git a/Tools/TestWebKitAPI/mac/TestDraggingInfo.h b/Tools/TestWebKitAPI/mac/TestDraggingInfo.h
new file mode 100644 (file)
index 0000000..5897391
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) && WK_API_ENABLED
+
+#import <AppKit/NSDragging.h>
+
+@interface TestDraggingInfo : NSObject <NSDraggingInfo>
+
+@property (nonatomic) NSPoint draggingLocation;
+@property (nonatomic) NSPoint draggedImageLocation;
+@property (nonatomic) NSInteger draggingSequenceNumber;
+@property (nonatomic) NSDragOperation draggingSourceOperationMask;
+@property (nonatomic, strong) NSPasteboard *draggingPasteboard;
+@property (nonatomic, strong) NSImage *draggedImage;
+@property (nonatomic, weak) id draggingSource;
+
+@end
+
+#endif // ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) && WK_API_ENABLED
diff --git a/Tools/TestWebKitAPI/mac/TestDraggingInfo.mm b/Tools/TestWebKitAPI/mac/TestDraggingInfo.mm
new file mode 100644 (file)
index 0000000..3e211dd
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "TestDraggingInfo.h"
+
+#if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) && WK_API_ENABLED
+
+#import <wtf/WeakObjCPtr.h>
+
+@implementation TestDraggingInfo {
+    WeakObjCPtr<id> _source;
+    RetainPtr<NSPasteboard> _pasteboard;
+    RetainPtr<NSImage> _draggedImage;
+}
+
+@synthesize draggingSourceOperationMask=_draggingSourceOperationMask;
+@synthesize draggingLocation=_draggingLocation;
+@synthesize draggingFormation=_draggingFormation;
+@synthesize numberOfValidItemsForDrop=_numberOfValidItemsForDrop;
+
+- (NSPasteboard *)draggingPasteboard
+{
+    return _pasteboard.get();
+}
+
+- (void)setDraggingPasteboard:(NSPasteboard *)draggingPasteboard
+{
+    _pasteboard = draggingPasteboard;
+}
+
+- (id)draggingSource
+{
+    return _source.get().get();
+}
+
+- (void)setDraggingSource:(id)draggingSource
+{
+    _source = draggingSource;
+}
+
+- (void)enumerateDraggingItemsWithOptions:(NSDraggingItemEnumerationOptions)enumOpts forView:(NSView *)view classes:(NSArray<Class> *)classArray searchOptions:(NSDictionary<NSString *, id> *)searchOptions usingBlock:(void (^)(NSDraggingItem *, NSInteger, BOOL *))block
+{
+    // FIXME: Implement this to test file promise drop handling.
+}
+
+// The following methods are not currently used by WebKit.
+
+@synthesize draggedImageLocation=_draggedImageLocation;
+@synthesize draggingSequenceNumber=_draggingSequenceNumber;
+@synthesize animatesToDestination=_animatesToDestination;
+@synthesize springLoadingHighlight=_springLoadingHighlight;
+
+- (NSWindow *)draggingDestinationWindow
+{
+    return nil;
+}
+
+- (NSImage *)draggedImage
+{
+    return _draggedImage.get();
+}
+
+- (void)setDraggedImage:(NSImage *)draggedImage
+{
+    _draggedImage = draggedImage;
+}
+
+- (void)slideDraggedImageTo:(NSPoint)screenPoint
+{
+}
+
+- (NSArray<NSString *> *)namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
+{
+    return @[ ];
+}
+
+- (void)resetSpringLoading
+{
+}
+
+@end
+
+#endif // ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) && WK_API_ENABLED