WebKit Bugzilla
Attachment 347033 Details for
Bug 181898
: [WK2] [macOS] Implement a mechanism to test drag and drop
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-181898-20180813132819.patch (text/plain), 94.63 KB, created by
Wenson Hsieh
on 2018-08-13 13:28:20 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Wenson Hsieh
Created:
2018-08-13 13:28:20 PDT
Size:
94.63 KB
patch
obsolete
>Subversion Revision: 234809 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 013287fdf4f2c248f863a6ee8c0c2e1bbaf8af0e..02d72b860f1a66bf3170c0702de98bf34a366cd8 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -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> > > Use a 1-byte enum class for TextDirection >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >index 3ccda9df440a5bc4111ff16c3ebef1cbd0537c7b..8d00145e036723a16daaeb9ad64a48b25ea1d7c8 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm >@@ -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 >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >index 652812b1cc937df1299155ceb09e17e31a3c677d..581a4a67d18686b61128f867fb4981a7c6f7fc29 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h >@@ -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)); >diff --git a/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h b/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h >index 0c5b1d545244fb95f415856219cab0a6139818c0..d36539f69a8f3d7d41b30668abe360e5191f1507 100644 >--- a/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h >+++ b/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h >@@ -145,6 +145,8 @@ private: > void isPlayingAudioWillChange() final { } > void isPlayingAudioDidChange() final { } > >+ void didFinishProcessingAllPendingMouseEvents() final { } >+ > #if ENABLE(VIDEO) && USE(GSTREAMER) > bool decidePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&) override; > #endif >diff --git a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >index 24d9f833fc1188a9f5a4881f6709d2e0f109d602..ca21d8be6e1504c21972015e136c19eef5c47694 100644 >--- a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >+++ b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >@@ -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; >diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >index 26db6bd0a522997c1df8b8740c90c533c931972a..428aec3efa2fd0a2f02137446b42072ed0d7942e 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h >@@ -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; >diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >index 180989d7bd0d51978cc33a77bc7c2c4ddf89164a..56de23c36e44819bdd8e8c1c26124c9ceaddbcf2 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >@@ -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(); >diff --git a/Source/WebKit/UIProcess/PageClient.h b/Source/WebKit/UIProcess/PageClient.h >index 7ea82baf0d797c02e536c40a954585f5dd0c02a6..e2c691e1cdc540c42cf8d51507828bac5740153f 100644 >--- a/Source/WebKit/UIProcess/PageClient.h >+++ b/Source/WebKit/UIProcess/PageClient.h >@@ -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; >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index cd16a84b275c1045e6df1d8caa7ee4823d5b3830..2dc0f33885b690584f47117e69deeef28c022a47 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -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; > } >diff --git a/Source/WebKit/UIProcess/ios/PageClientImplIOS.h b/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >index a71fd426886ca7029592d73618f4fdeeb0469484..1c7abfc26c636d9480e3fddc7c6bea51332f26b9 100644 >--- a/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >+++ b/Source/WebKit/UIProcess/ios/PageClientImplIOS.h >@@ -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; > }; >diff --git a/Source/WebKit/UIProcess/mac/PageClientImplMac.h b/Source/WebKit/UIProcess/mac/PageClientImplMac.h >index eae1605332791c8934b3cb48ce6c597a5d98911f..972ca64ff7c75bcd84c173912ce06c6bd5f475a1 100644 >--- a/Source/WebKit/UIProcess/mac/PageClientImplMac.h >+++ b/Source/WebKit/UIProcess/mac/PageClientImplMac.h >@@ -238,6 +238,8 @@ private: > _WKRemoteObjectRegistry *remoteObjectRegistry() override; > #endif > >+ void didFinishProcessingAllPendingMouseEvents() final; >+ > NSView *m_view; > WebViewImpl* m_impl { nullptr }; > #if USE(AUTOCORRECTION_PANEL) >diff --git a/Source/WebKit/UIProcess/mac/PageClientImplMac.mm b/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >index 4798271161852319f770ed07c01f2ab65bdac895..3a5937934d8b8d064423e75166a66b58a0593446 100644 >--- a/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >+++ b/Source/WebKit/UIProcess/mac/PageClientImplMac.mm >@@ -888,6 +888,11 @@ _WKRemoteObjectRegistry *PageClientImpl::remoteObjectRegistry() > } > #endif > >+void PageClientImpl::didFinishProcessingAllPendingMouseEvents() >+{ >+ m_impl->didFinishProcessingAllPendingMouseEvents(); >+} >+ > void PageClientImpl::didRestoreScrollPosition() > { > m_impl->didRestoreScrollPosition(); >diff --git a/Source/WebKit/UIProcess/win/PageClientImpl.h b/Source/WebKit/UIProcess/win/PageClientImpl.h >index ead717bdecac741f8746934481b69f81a234fc0c..14fa9c64a8d35cbfaa839ed49e218e96407415d8 100644 >--- a/Source/WebKit/UIProcess/win/PageClientImpl.h >+++ b/Source/WebKit/UIProcess/win/PageClientImpl.h >@@ -140,6 +140,8 @@ private: > > WebCore::UserInterfaceLayoutDirection userInterfaceLayoutDirection() override { return WebCore::UserInterfaceLayoutDirection::LTR; } > >+ void didFinishProcessingAllPendingMouseEvents() final { } >+ > // Members of PageClientImpl class > DefaultUndoController m_undoController; > >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index e21a553efda5227271a15eb87ef76eb4e5eeba06..bb8eecdf0cd9b191c30d8868a9dbebf7656bb821 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -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 Wenson Hsieh <wenson_hsieh@apple.com> > > [iOS] Dragging a non-editable text selection into a plain text input inserts HTML markup >diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >index fdf454cfd9faf6a9f8125624e51ef686a3603fa4..766bfb2b9f12132b0666863cdcaa56bfb8043326 100644 >--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >@@ -303,7 +303,6 @@ > 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 */; }; >@@ -660,7 +659,6 @@ > 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 */; }; >@@ -813,6 +811,9 @@ > 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 */; }; >@@ -828,7 +829,7 @@ > 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 */; }; >@@ -840,6 +841,8 @@ > 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 */; }; >@@ -1013,7 +1016,7 @@ > 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 */, >@@ -1085,6 +1088,7 @@ > 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 */, >@@ -1585,7 +1589,6 @@ > 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>"; }; >@@ -1791,7 +1794,6 @@ > 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>"; }; >@@ -2048,6 +2050,11 @@ > 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>"; }; >@@ -2064,7 +2071,7 @@ > 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>"; }; >@@ -2077,6 +2084,7 @@ > 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>"; }; >@@ -2299,6 +2307,7 @@ > 518EE51620A78CDF00E024F3 /* DoubleDefersLoading.mm */, > 518EE51720A78CDF00E024F3 /* DoubleDefersLoadingPlugin.mm */, > A1A4FE5D18DD3DB700B5EA8A /* Download.mm */, >+ F46128D6211E489C00D9FADB /* DragAndDropTests.mm */, > A15502281E05020B00A24C57 /* DuplicateCompletionHandlerCalls.mm */, > F44D06461F395C4D001A0E29 /* EditorStateTests.mm */, > CDA29B2820FD2A9900F15CED /* ExitFullscreenOnEnterPiP.mm */, >@@ -2632,6 +2641,7 @@ > 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 */, >@@ -2686,6 +2696,7 @@ > 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 */, >@@ -3127,6 +3138,8 @@ > C081224413FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m */, > 29AB8AA3164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.h */, > 29AB8AA2164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm */, >+ F46128C9211D475100D9FADB /* TestDraggingInfo.h */, >+ F46128CA211D475100D9FADB /* TestDraggingInfo.mm */, > C08587BE13FE956C001EF4E5 /* WebKitAgnosticTest.h */, > C08587BD13FE956C001EF4E5 /* WebKitAgnosticTest.mm */, > ); >@@ -3171,7 +3184,7 @@ > 46397B941DC2C850009A78AE /* DOMNode.mm */, > 3751AF7A169518F800764319 /* DOMNodeFromJSObject.mm */, > 37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */, >- F4BFA68C1E4AD08000154298 /* DragAndDropPasteboardTests.mm */, >+ F4E0A28E211E5D5B00AF7C7F /* DragAndDropTestsMac.mm */, > C07E6CAE13FD67650038B22B /* DynamicDeviceScaleFactor.mm */, > 1A9FB6CC1CA34BE500966124 /* EarlyKVOCrash.mm */, > 4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */, >@@ -3184,6 +3197,7 @@ > C507E8A614C6545B005D6B3B /* InspectorBar.mm */, > 57F10D921C7E7B3800ECDF30 /* IsNavigationActionTrusted.mm */, > 4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */, >+ F4BFA68C1E4AD08000154298 /* LegacyDragAndDropTests.mm */, > 7A7B0E7E1EAFE454006AB8AE /* LimitTitleSize.mm */, > 57901FAE1CAF137100ED64F9 /* LoadInvalidURLRequest.mm */, > CDA315961ED53651009F60D3 /* MediaPlaybackSleepAssertion.mm */, >@@ -3220,7 +3234,6 @@ > 1A7BFC0A171A0BDB00BC5F64 /* WillSendSubmitEvent.mm */, > A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */, > F4FA917F1E61849B007B8C1D /* WKWebViewMacEditingTests.mm */, >- 764322D51B61CCA40024F801 /* WordBoundaryTypingAttributes.mm */, > ); > path = mac; > sourceTree = "<group>"; >@@ -3240,7 +3253,6 @@ > 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 */, >@@ -3713,10 +3725,11 @@ > 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 */, >@@ -3802,6 +3815,7 @@ > 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 */, >@@ -3940,6 +3954,7 @@ > 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 */, >@@ -4036,7 +4051,6 @@ > 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 >index 0000000000000000000000000000000000000000..b4f6745bfb0733f2922a2b82974fe0c6814d97e2 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm >@@ -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 >index 0000000000000000000000000000000000000000..79319718b99e6c4f41af2551b407472dfa1406c1 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/full-page-dropzone.html >@@ -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;"> >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html b/Tools/TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html >index 20bce2508a055c260e446d39266b53cb97c68629..951cf5cd3215e05fcb8c612aa2907a0df603b9f3 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/image-in-link-and-input.html >@@ -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 >index 0000000000000000000000000000000000000000..89e83e6ef95c853b30161e6543345df0f1ad42f1 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/link-in-iframe-and-input.html >@@ -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/DragAndDropPasteboardTests.mm b/Tools/TestWebKitAPI/Tests/mac/DragAndDropPasteboardTests.mm >deleted file mode 100644 >index 481bbae0c7ae5425274caa8a3a1f6f4a01444dcf..0000000000000000000000000000000000000000 >--- a/Tools/TestWebKitAPI/Tests/mac/DragAndDropPasteboardTests.mm >+++ /dev/null >@@ -1,288 +0,0 @@ >-/* >- * Copyright (C) 2017 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. >- */ >- >-#include "config.h" >- >-#if PLATFORM(MAC) >- >-#import "PlatformUtilities.h" >-#import "TestWKWebView.h" >-#import <AppKit/NSDragging.h> >-#import <WebKit/WebView.h> >-#import <wtf/BlockPtr.h> >-#import <wtf/RetainPtr.h> >- >-@interface FrameLoadCompletionListener : NSObject<WebFrameLoadDelegate> { >- BlockPtr<void (void)> _completionBlock; >-} >-+ (instancetype)listenerWithCompletionBlock:(dispatch_block_t)completionBlock; >-@end >- >-@implementation FrameLoadCompletionListener >- >-+ (instancetype)listenerWithCompletionBlock:(dispatch_block_t)completionBlock >-{ >- return [[[FrameLoadCompletionListener alloc] initWithCompletionBlock:completionBlock] autorelease]; >-} >- >-- (instancetype)initWithCompletionBlock:(dispatch_block_t)completionBlock >-{ >- if (self = [super init]) >- _completionBlock = completionBlock; >- >- return self; >-} >- >-- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame >-{ >- if (_completionBlock) >- _completionBlock(); >-} >-@end >- >-@interface DragSource : NSObject >-- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag; >-@end >- >-@implementation DragSource >- >-- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag >-{ >- return NSDragOperationCopy; >-} >- >-@end >- >-@interface DragInfo : NSObject<NSDraggingInfo> { >- NSPoint _lastMousePosition; >- RetainPtr<NSImage> _image; >- RetainPtr<NSPasteboard> _pasteboard; >- RetainPtr<DragSource> _source; >- RetainPtr<NSWindow> _window; >- NSSize _offset; >- NSInteger _numberOfValidItemsForDrop; >-} >-@property (nonatomic) NSPoint lastMousePosition; >-@end >- >-@implementation DragInfo >- >-- (id)initWithImage:(NSImage *)image offset:(NSSize)offset pasteboard:(NSPasteboard *)pasteboard source:(DragSource *)source destinationWindow:(NSWindow *)destinationWindow >-{ >- if (self = [super init]) { >- _image = image; >- _pasteboard = pasteboard; >- _source = source; >- _window = destinationWindow; >- _offset = offset; >- } >- return self; >-} >- >-- (NSPoint)lastMousePosition >-{ >- return _lastMousePosition; >-} >- >-- (void)setLastMousePosition:(NSPoint)lastMousePosition >-{ >- _lastMousePosition = lastMousePosition; >-} >- >-- (NSWindow *)draggingDestinationWindow >-{ >- return _window.get(); >-} >- >-- (NSDragOperation)draggingSourceOperationMask >-{ >- return NSDragOperationCopy; >-} >- >-- (NSPoint)draggingLocation >-{ >- return _lastMousePosition; >-} >- >-- (NSPoint)draggedImageLocation >-{ >- return NSMakePoint(_lastMousePosition.x + _offset.width, _lastMousePosition.y + _offset.height); >-} >- >-- (NSImage *)draggedImage >-{ >- return _image.get(); >-} >- >-- (NSPasteboard *)draggingPasteboard >-{ >- return _pasteboard.get(); >-} >- >-- (id)draggingSource >-{ >- return _source.get(); >-} >- >-- (NSInteger)draggingSequenceNumber >-{ >- return 0; >-} >- >-- (void)slideDraggedImageTo:(NSPoint)screenPoint >-{ >-} >- >-- (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination >-{ >- return nil; >-} >- >-- (NSDraggingFormation)draggingFormation >-{ >- return NSDraggingFormationDefault; >-} >- >-- (void)setDraggingFormation:(NSDraggingFormation)formation >-{ >-} >- >-- (BOOL)animatesToDestination >-{ >- return NO; >-} >- >-- (void)setAnimatesToDestination:(BOOL)flag >-{ >-} >- >-- (NSInteger)numberOfValidItemsForDrop >-{ >- return _numberOfValidItemsForDrop; >-} >- >-- (void)setNumberOfValidItemsForDrop:(NSInteger)number >-{ >- _numberOfValidItemsForDrop = number; >-} >- >-- (void)enumerateDraggingItemsWithOptions:(NSEnumerationOptions)enumOpts forView:(NSView *)view classes:(NSArray *)classArray searchOptions:(NSDictionary *)searchOptions usingBlock:(void (^)(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop))block >-{ >-} >- >-- (NSSpringLoadingHighlight)springLoadingHighlight >-{ >- return NSSpringLoadingHighlightNone; >-} >- >-- (void)resetSpringLoading >-{ >-} >- >-@end >- >-namespace TestWebKitAPI { >- >-static NSImage *getTestImage() >-{ >- return [[[NSImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"icon" withExtension:@"png" subdirectory:@"TestWebKitAPI.resources"]] autorelease]; >-} >- >-static WebView *webViewAfterPerformingDragOperation(NSPasteboard *pasteboard) >-{ >- RetainPtr<WebView> destination = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]); >- RetainPtr<NSWindow> hostWindow = adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 400) styleMask:0 backing:NSBackingStoreBuffered defer:NO]); >- [hostWindow setFrameOrigin:NSMakePoint(0, 0)]; >- [[hostWindow contentView] addSubview:destination.get()]; >- __block bool isDone = false; >- [destination setFrameLoadDelegate:[FrameLoadCompletionListener listenerWithCompletionBlock:^() { >- RetainPtr<DragSource> source = adoptNS([[DragSource alloc] init]); >- RetainPtr<DragInfo> info = adoptNS([[DragInfo alloc] initWithImage:getTestImage() offset:NSMakeSize(0, 0) pasteboard:pasteboard source:source.get() destinationWindow:hostWindow.get()]); >- [info setLastMousePosition:NSMakePoint(0, 200)]; >- [destination draggingEntered:info.get()]; >- [info setLastMousePosition:NSMakePoint(200, 200)]; >- [destination draggingUpdated:info.get()]; >- >- EXPECT_TRUE([destination performDragOperation:info.get()]); >- isDone = true; >- }]]; >- [[destination mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"full-page-contenteditable" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]]; >- >- TestWebKitAPI::Util::run(&isDone); >- return destination.get(); >-} >- >-TEST(DragAndDropPasteboardTests, DropUTF8PlainText) >-{ >- NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName]; >- [pasteboard setData:[@"I am a WebKit." dataUsingEncoding:NSUTF8StringEncoding] forType:(__bridge NSString *)kUTTypeUTF8PlainText]; >- >- RetainPtr<WebView> resultingWebView = webViewAfterPerformingDragOperation(pasteboard); >- EXPECT_TRUE([[resultingWebView stringByEvaluatingJavaScriptFromString:@"document.body.textContent"] containsString:@"I am a WebKit."]); >-} >- >-TEST(DragAndDropPasteboardTests, DropJPEG) >-{ >- NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName]; >- NSImage *icon = getTestImage(); >- NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:icon.TIFFRepresentation]; >- [pasteboard setData:[imageRep representationUsingType:NSJPEGFileType properties:@{ NSImageCompressionFactor: @(0.9) }] forType:(__bridge NSString *)kUTTypeJPEG]; >- >- 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 >- >-#endif >diff --git a/Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm b/Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..41c4cb3f0441ac96db96839eda329bc130f36f0f >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/mac/DragAndDropTestsMac.mm >@@ -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) >diff --git a/Tools/TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm b/Tools/TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..b2b6c40178395e6579a57ff68c8fd5220370fbfd >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/mac/LegacyDragAndDropTests.mm >@@ -0,0 +1,259 @@ >+/* >+ * Copyright (C) 2017 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. >+ */ >+ >+#include "config.h" >+ >+#if PLATFORM(MAC) >+ >+#import "PlatformUtilities.h" >+#import "TestWKWebView.h" >+#import <AppKit/NSDragging.h> >+#import <WebKit/WebView.h> >+#import <wtf/BlockPtr.h> >+#import <wtf/RetainPtr.h> >+ >+@interface FrameLoadCompletionListener : NSObject<WebFrameLoadDelegate> { >+ BlockPtr<void()> _completionBlock; >+} >++ (instancetype)listenerWithCompletionBlock:(dispatch_block_t)completionBlock; >+@end >+ >+@implementation FrameLoadCompletionListener >+ >++ (instancetype)listenerWithCompletionBlock:(dispatch_block_t)completionBlock >+{ >+ return [[[FrameLoadCompletionListener alloc] initWithCompletionBlock:completionBlock] autorelease]; >+} >+ >+- (instancetype)initWithCompletionBlock:(dispatch_block_t)completionBlock >+{ >+ if (self = [super init]) >+ _completionBlock = completionBlock; >+ >+ return self; >+} >+ >+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame >+{ >+ if (_completionBlock) >+ _completionBlock(); >+} >+@end >+ >+@interface DragSource : NSObject >+- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag; >+@end >+ >+@implementation DragSource >+ >+- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag >+{ >+ return NSDragOperationCopy; >+} >+ >+@end >+ >+@interface DragInfo : NSObject<NSDraggingInfo> { >+ NSPoint _lastMousePosition; >+ RetainPtr<NSImage> _image; >+ RetainPtr<NSPasteboard> _pasteboard; >+ RetainPtr<DragSource> _source; >+ RetainPtr<NSWindow> _window; >+ NSSize _offset; >+ NSInteger _numberOfValidItemsForDrop; >+} >+@property (nonatomic) NSPoint lastMousePosition; >+@end >+ >+@implementation DragInfo >+ >+- (id)initWithImage:(NSImage *)image offset:(NSSize)offset pasteboard:(NSPasteboard *)pasteboard source:(DragSource *)source destinationWindow:(NSWindow *)destinationWindow >+{ >+ if (self = [super init]) { >+ _image = image; >+ _pasteboard = pasteboard; >+ _source = source; >+ _window = destinationWindow; >+ _offset = offset; >+ } >+ return self; >+} >+ >+- (NSPoint)lastMousePosition >+{ >+ return _lastMousePosition; >+} >+ >+- (void)setLastMousePosition:(NSPoint)lastMousePosition >+{ >+ _lastMousePosition = lastMousePosition; >+} >+ >+- (NSWindow *)draggingDestinationWindow >+{ >+ return _window.get(); >+} >+ >+- (NSDragOperation)draggingSourceOperationMask >+{ >+ return NSDragOperationCopy; >+} >+ >+- (NSPoint)draggingLocation >+{ >+ return _lastMousePosition; >+} >+ >+- (NSPoint)draggedImageLocation >+{ >+ return NSMakePoint(_lastMousePosition.x + _offset.width, _lastMousePosition.y + _offset.height); >+} >+ >+- (NSImage *)draggedImage >+{ >+ return _image.get(); >+} >+ >+- (NSPasteboard *)draggingPasteboard >+{ >+ return _pasteboard.get(); >+} >+ >+- (id)draggingSource >+{ >+ return _source.get(); >+} >+ >+- (NSInteger)draggingSequenceNumber >+{ >+ return 0; >+} >+ >+- (void)slideDraggedImageTo:(NSPoint)screenPoint >+{ >+} >+ >+- (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination >+{ >+ return nil; >+} >+ >+- (NSDraggingFormation)draggingFormation >+{ >+ return NSDraggingFormationDefault; >+} >+ >+- (void)setDraggingFormation:(NSDraggingFormation)formation >+{ >+} >+ >+- (BOOL)animatesToDestination >+{ >+ return NO; >+} >+ >+- (void)setAnimatesToDestination:(BOOL)flag >+{ >+} >+ >+- (NSInteger)numberOfValidItemsForDrop >+{ >+ return _numberOfValidItemsForDrop; >+} >+ >+- (void)setNumberOfValidItemsForDrop:(NSInteger)number >+{ >+ _numberOfValidItemsForDrop = number; >+} >+ >+- (void)enumerateDraggingItemsWithOptions:(NSEnumerationOptions)enumOpts forView:(NSView *)view classes:(NSArray *)classArray searchOptions:(NSDictionary *)searchOptions usingBlock:(void (^)(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop))block >+{ >+} >+ >+- (NSSpringLoadingHighlight)springLoadingHighlight >+{ >+ return NSSpringLoadingHighlightNone; >+} >+ >+- (void)resetSpringLoading >+{ >+} >+ >+@end >+ >+namespace TestWebKitAPI { >+ >+static NSImage *getTestImage() >+{ >+ return [[[NSImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"icon" withExtension:@"png" subdirectory:@"TestWebKitAPI.resources"]] autorelease]; >+} >+ >+static WebView *webViewAfterPerformingDragOperation(NSPasteboard *pasteboard) >+{ >+ RetainPtr<WebView> destination = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]); >+ RetainPtr<NSWindow> hostWindow = adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 400) styleMask:0 backing:NSBackingStoreBuffered defer:NO]); >+ [hostWindow setFrameOrigin:NSMakePoint(0, 0)]; >+ [[hostWindow contentView] addSubview:destination.get()]; >+ __block bool isDone = false; >+ [destination setFrameLoadDelegate:[FrameLoadCompletionListener listenerWithCompletionBlock:^() { >+ RetainPtr<DragSource> source = adoptNS([[DragSource alloc] init]); >+ RetainPtr<DragInfo> info = adoptNS([[DragInfo alloc] initWithImage:getTestImage() offset:NSMakeSize(0, 0) pasteboard:pasteboard source:source.get() destinationWindow:hostWindow.get()]); >+ [info setLastMousePosition:NSMakePoint(0, 200)]; >+ [destination draggingEntered:info.get()]; >+ [info setLastMousePosition:NSMakePoint(200, 200)]; >+ [destination draggingUpdated:info.get()]; >+ >+ EXPECT_TRUE([destination performDragOperation:info.get()]); >+ isDone = true; >+ }]]; >+ [[destination mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"full-page-contenteditable" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]]; >+ >+ TestWebKitAPI::Util::run(&isDone); >+ return destination.get(); >+} >+ >+TEST(LegacyDragAndDropTests, DropUTF8PlainText) >+{ >+ NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName]; >+ [pasteboard setData:[@"I am a WebKit." dataUsingEncoding:NSUTF8StringEncoding] forType:(__bridge NSString *)kUTTypeUTF8PlainText]; >+ >+ RetainPtr<WebView> resultingWebView = webViewAfterPerformingDragOperation(pasteboard); >+ EXPECT_TRUE([[resultingWebView stringByEvaluatingJavaScriptFromString:@"document.body.textContent"] containsString:@"I am a WebKit."]); >+} >+ >+TEST(LegacyDragAndDropTests, DropJPEG) >+{ >+ NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName]; >+ NSImage *icon = getTestImage(); >+ NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:icon.TIFFRepresentation]; >+ [pasteboard setData:[imageRep representationUsingType:NSJPEGFileType properties:@{ NSImageCompressionFactor: @(0.9) }] forType:(__bridge NSString *)kUTTypeJPEG]; >+ >+ RetainPtr<WebView> resultingWebView = webViewAfterPerformingDragOperation(pasteboard); >+ EXPECT_TRUE([[resultingWebView stringByEvaluatingJavaScriptFromString:@"document.querySelector('img').tagName === 'IMG'"] isEqualToString:@"true"]); >+} >+ >+} // namespace TestWebKitAPI >+ >+#endif >diff --git a/Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html b/Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html >deleted file mode 100644 >index 094598a0bdc1401444ed431fe1753211d65353c7..0000000000000000000000000000000000000000 >--- a/Tools/TestWebKitAPI/Tests/mac/full-page-dropzone.html >+++ /dev/null >@@ -1,2 +0,0 @@ >-<!DOCTYPE html> >-<body style="width: 100vw; height: 100vh; margin: 0;" ondragenter="window.dragEnteredForTesting = true; return false;"> >diff --git a/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h b/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h >index f3b1288675aa374ecb1d13cefc357a70d4c19691..84c8be3fd7945442e49fc2bf47a105e940bc3736 100644 >--- a/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h >+++ b/Tools/TestWebKitAPI/cocoa/DragAndDropSimulator.h >@@ -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 >diff --git a/Tools/TestWebKitAPI/cocoa/TestWKWebView.h b/Tools/TestWebKitAPI/cocoa/TestWKWebView.h >index cf98daa234c09857a65e56a2b28e2ee090a7e947..051fa292dc7cb063f322a9479e176d87524e0c67 100644 >--- a/Tools/TestWebKitAPI/cocoa/TestWKWebView.h >+++ b/Tools/TestWebKitAPI/cocoa/TestWKWebView.h >@@ -72,10 +72,12 @@ > #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 >diff --git a/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm b/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm >index 3740d582f3f51eb7dd70164bdeb3e711be57f805..d096cf09c55cdf1c6244662d31adab16b278ec98 100644 >--- a/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm >+++ b/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm >@@ -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; >diff --git a/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm b/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm >index 43eecd9494d5964f50711709d602f13d6894cabe..9e1f21ee1d53bdd46c333810210ed070df132c8a 100644 >--- a/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm >+++ b/Tools/TestWebKitAPI/ios/DragAndDropSimulatorIOS.mm >@@ -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 >diff --git a/Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm b/Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm >index 9a7918cc4839a8757baf60b88f23861ad22d0a5f..f5a7a1fc5826a418953a7e80ae686ad284d34a1f 100644 >--- a/Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm >+++ b/Tools/TestWebKitAPI/mac/DragAndDropSimulatorMac.mm >@@ -28,38 +28,171 @@ > > #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 >@@ -72,9 +205,44 @@ > 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 >index 0000000000000000000000000000000000000000..58973919b1151a12ab560537f91339e792daacac >--- /dev/null >+++ b/Tools/TestWebKitAPI/mac/TestDraggingInfo.h >@@ -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 >index 0000000000000000000000000000000000000000..3e211dd4407455b954214786a203c88470af4ef5 >--- /dev/null >+++ b/Tools/TestWebKitAPI/mac/TestDraggingInfo.mm >@@ -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
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 181898
:
346946
|
346951
|
346956
|
346957
| 347033