[iOS DnD] [WK1] Dropping links onto UIWebViews should not trigger navigation by default
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Jun 2017 04:06:04 +0000 (04:06 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Jun 2017 04:06:04 +0000 (04:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173454
<rdar://problem/31720671>

Reviewed by Tim Horton.

Adds -webView:dragDestinationActionMaskForSession: as SPI to WebUIDelegate.
If unimplemented, the default UI delegate allows all actions except for URL loading.

* DefaultDelegates/WebDefaultUIDelegate.mm:
(-[WebDefaultUIDelegate webView:dragDestinationActionMaskForSession:]):
* WebView/WebUIDelegatePrivate.h:
* WebView/WebView.mm:
(-[WebView dragDestinationActionMaskForSession:]):

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

Source/WebKit/mac/ChangeLog
Source/WebKit/mac/DefaultDelegates/WebDefaultUIDelegate.mm
Source/WebKit/mac/WebView/WebUIDelegatePrivate.h
Source/WebKit/mac/WebView/WebView.mm

index 7ec6777..1e01ca2 100644 (file)
@@ -1,5 +1,22 @@
 2017-06-15  Wenson Hsieh  <wenson_hsieh@apple.com>
 
+        [iOS DnD] [WK1] Dropping links onto UIWebViews should not trigger navigation by default
+        https://bugs.webkit.org/show_bug.cgi?id=173454
+        <rdar://problem/31720671>
+
+        Reviewed by Tim Horton.
+
+        Adds -webView:dragDestinationActionMaskForSession: as SPI to WebUIDelegate.
+        If unimplemented, the default UI delegate allows all actions except for URL loading.
+
+        * DefaultDelegates/WebDefaultUIDelegate.mm:
+        (-[WebDefaultUIDelegate webView:dragDestinationActionMaskForSession:]):
+        * WebView/WebUIDelegatePrivate.h:
+        * WebView/WebView.mm:
+        (-[WebView dragDestinationActionMaskForSession:]):
+
+2017-06-15  Wenson Hsieh  <wenson_hsieh@apple.com>
+
         Using -[WebItemProviderPasteboard setItemProviders:] to swap out item providers before a drop breaks item provider loading
         https://bugs.webkit.org/show_bug.cgi?id=173338
         <rdar://problem/32777720>
index 62e2a83..61f9934 100644 (file)
@@ -270,6 +270,13 @@ static WebDefaultUIDelegate *sharedDelegate = nil;
 - (void)webViewSupportedOrientationsUpdated:(WebView *)sender
 {
 }
+
+#if ENABLE(DRAG_SUPPORT)
+- (WebDragDestinationAction)webView:(WebView *)sender dragDestinationActionMaskForSession:(id <UIDropSession>)session
+{
+    return WebDragDestinationActionAny & ~WebDragDestinationActionLoad;
+}
+#endif
 #endif
 
 @end
index 274b287..f9fce6f 100644 (file)
 #endif
 #endif
 
+#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000
+@protocol UIDropSession;
+#endif
+
 #define WEBMENUITEMTAG_WEBKIT_3_0_SPI_START 2000
 enum { 
     // FIXME: These should move to WebUIDelegate.h as part of the WebMenuItemTag enum there, when we're not in API freeze
@@ -290,6 +294,16 @@ extern NSString *WebConsoleMessageErrorMessageLevel;
 - (void)webViewSupportedOrientationsUpdated:(WebView *)sender;
 
 - (BOOL)webViewCanCheckGeolocationAuthorizationStatus:(WebView *)sender;
+
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000
+/*!
+ @method webView:dragDestinationActionMaskForSession:
+ @param sender The WebView sending the delegate method
+ @param session The drop session which this destination action mask will affect
+ @abstract May be implemented to adjust which destination actions are allowed upon dropping the given session.
+ */
+- (WebDragDestinationAction)webView:(WebView *)sender dragDestinationActionMaskForSession:(id <UIDropSession>)session;
+#endif
 #endif
 
 - (NSData *)webCryptoMasterKeyForWebView:(WebView *)sender;
index ed9aa2d..54e3dd3 100644 (file)
@@ -1898,6 +1898,11 @@ static Vector<FloatRect> floatRectsForCGRectArray(NSArray<NSValue *> *rectValues
     return [previewImage retain];
 }
 
+- (WebDragDestinationAction)dragDestinationActionMaskForSession:(id <UIDropSession>)session
+{
+    return [self._UIDelegateForwarder webView:self dragDestinationActionMaskForSession:session];
+}
+
 #if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/WebViewAdditions.mm>)
 #include <WebKitAdditions/WebViewAdditions.mm>
 #endif