Changeset 214403 in webkit


Ignore:
Timestamp:
Mar 25, 2017 1:24:17 PM (7 years ago)
Author:
Wenson Hsieh
Message:

[WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
https://bugs.webkit.org/show_bug.cgi?id=169168
<rdar://problem/30688374>

Reviewed by Tim Horton.

Source/WebCore:

Refactor client hooks for the drag destination action in WebCore to ask for the drag destination action mask
upon initializing the DragData. In DragController, rather than setting m_dragDestinationAction to the result of
m_client.actionMaskForDrag, we instead set it to the DragData's destination action.

Tests to come in a future patch.

  • loader/EmptyClients.cpp:
  • page/DragClient.h:

Rather than pass in a DragData, pass in only the platform data that we need to hand to the delegate. This is
because we now ask for drag destination actions prior to creating the DragData.

  • page/DragController.cpp:

(WebCore::DragController::dragEnteredOrUpdated):

Update the available drag destination actions in WebCore using the destination actions stored in DragData rather
than calling out to the client delegate.

  • loader/EmptyClients.cpp:
  • platform/DragData.cpp:

(WebCore::DragData::DragData):

  • platform/DragData.h:

(WebCore::DragData::dragDestinationAction):
(WebCore::DragData::operator =):

  • platform/mac/DragDataMac.mm:

(WebCore::DragData::DragData):

Source/WebKit:

See WebKit ChangeLog for more details. Renames WebDefaultUIDelegate.m => WebDefaultUIDelegate.mm.

  • WebKit.xcodeproj/project.pbxproj:

Source/WebKit/mac:

Refactors WebDragClient::actionMaskForDrag to take platform data only, rather than the entire DragData. See the
WebCore ChangeLog entry for more details. Also renames WebDefaultUIDelegate.m to WebDefaultUIDelegate.mm, since
we need to import a C++ header for linkedOnOrAfter().

The default delegate implementation of webView:dragDestinationActionMaskForDraggingInfo: now checks if the current
application is linking against 10.12 or earlier, and if so, will allow any drag destination action instead of
the new default value of everything but DragDestinationActionLoad.

  • DefaultDelegates/WebDefaultUIDelegate.mm: Renamed from Source/WebKit/mac/DefaultDelegates/WebDefaultUIDelegate.m.

(-[WebDefaultUIDelegate webView:dragDestinationActionMaskForDraggingInfo:]):

  • Misc/WebKitVersionChecks.h:
  • WebCoreSupport/WebDragClient.h:
  • WebCoreSupport/WebDragClient.mm:

(WebDragClient::actionMaskForDrag): Deleted.

  • WebView/WebView.mm:

(-[WebView draggingEntered:]):
(-[WebView draggingUpdated:]):

Source/WebKit/win:

Minor tweak to adjust for a changed interface. See WebKit and WebCore ChangeLogs for more information.

  • WebCoreSupport/WebDragClient.cpp:

(WebDragClient::actionMaskForDrag):

  • WebCoreSupport/WebDragClient.h:

Source/WebKit2:

Support customizing the set of allowed actions on drop in WebKit2 by introducing a new method to WKUIDelegatePrivate
that returns a WKDragDestinationAction given platform dragging info. These flags are then used to initialize the
DragData sent over to the web process, where they update DragController's view of the allowed destination actions.

Moving forward, the default action mask for WKWebViews will include everything except WKDragDestinationActionLoad,
though for applciations linked on or before 10.12, we will still default to WKDragDestinationActionAny to mitigate
any compatibility risk.

  • Shared/API/Cocoa/WKDragDestinationAction.h:

Introduce WK2 client-facing versions of WebCore::DragDestinationAction flags.

  • Shared/WebCoreArgumentCoders.cpp:

(IPC::ArgumentCoder<DragData>::encode):
(IPC::ArgumentCoder<DragData>::decode):

Serialize DragData's destination actions when sending DragData over IPC.

  • UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _web_dragDestinationActionForDraggingInfo:]):

For WKWebView, allow all drag destination actions except for loading (i.e. drop-to-navigate).

  • UIProcess/API/mac/WKView.mm:

(-[WKView _web_dragDestinationActionForDraggingInfo:]):

For WKView, allow all types of drag destination actions.

  • UIProcess/Cocoa/VersionChecks.h:
  • UIProcess/Cocoa/WebViewImpl.h:
  • UIProcess/Cocoa/WebViewImpl.mm:

(WebKit::WebViewImpl::draggingEntered):
(WebKit::WebViewImpl::draggingUpdated):

  • WebKit2.xcodeproj/project.pbxproj:
  • WebProcess/WebCoreSupport/WebDragClient.cpp:

(WebKit::WebDragClient::actionMaskForDrag):

  • WebProcess/WebCoreSupport/WebDragClient.h:
Location:
trunk/Source
Files:
29 edited
1 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r214400 r214403  
     12017-03-24  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
     4        https://bugs.webkit.org/show_bug.cgi?id=169168
     5        <rdar://problem/30688374>
     6
     7        Reviewed by Tim Horton.
     8
     9        Refactor client hooks for the drag destination action in WebCore to ask for the drag destination action mask
     10        upon initializing the DragData. In DragController, rather than setting m_dragDestinationAction to the result of
     11        m_client.actionMaskForDrag, we instead set it to the DragData's destination action.
     12
     13        Tests to come in a future patch.
     14
     15        * loader/EmptyClients.cpp:
     16        * page/DragClient.h:
     17
     18        Rather than pass in a DragData, pass in only the platform data that we need to hand to the delegate. This is
     19        because we now ask for drag destination actions prior to creating the DragData.
     20
     21        * page/DragController.cpp:
     22        (WebCore::DragController::dragEnteredOrUpdated):
     23
     24        Update the available drag destination actions in WebCore using the destination actions stored in DragData rather
     25        than calling out to the client delegate.
     26
     27        * loader/EmptyClients.cpp:
     28        * platform/DragData.cpp:
     29        (WebCore::DragData::DragData):
     30        * platform/DragData.h:
     31        (WebCore::DragData::dragDestinationAction):
     32        (WebCore::DragData::operator =):
     33        * platform/mac/DragDataMac.mm:
     34        (WebCore::DragData::DragData):
     35
    1362017-03-25  Aaron Chu  <aaron_chu@apple.com>
    237
  • trunk/Source/WebCore/loader/EmptyClients.cpp

    r214266 r214403  
    130130    void willPerformDragDestinationAction(DragDestinationAction, const DragData&) final { }
    131131    void willPerformDragSourceAction(DragSourceAction, const IntPoint&, DataTransfer&) final { }
    132     DragDestinationAction actionMaskForDrag(const DragData&) final { return DragDestinationActionNone; }
    133132    DragSourceAction dragSourceActionMaskForPoint(const IntPoint&) final { return DragSourceActionNone; }
    134133    void startDrag(DragImage, const IntPoint&, const IntPoint&, const FloatPoint&, DataTransfer&, Frame&, DragSourceAction) final { }
  • trunk/Source/WebCore/page/DragClient.h

    r213627 r214403  
    2727
    2828#include "DragActions.h"
     29#include "DragData.h"
    2930#include "DragItem.h"
    3031#include "FloatPoint.h"
     
    3435   
    3536class DataTransfer;
    36 class DragData;
    3737class Element;
    3838class Frame;
     
    4848    virtual void willPerformDragSourceAction(DragSourceAction, const IntPoint&, DataTransfer&) = 0;
    4949    virtual void didConcludeEditDrag() { }
    50     virtual DragDestinationAction actionMaskForDrag(const DragData&) = 0;
    5150    virtual DragSourceAction dragSourceActionMaskForPoint(const IntPoint& rootViewPoint) = 0;
    5251   
  • trunk/Source/WebCore/page/DragController.cpp

    r214331 r214403  
    282282    mouseMovedIntoDocument(m_page.mainFrame().documentAtPoint(dragData.clientPosition()));
    283283
    284     m_dragDestinationAction = m_client.actionMaskForDrag(dragData);
     284    m_dragDestinationAction = dragData.dragDestinationAction();
    285285    if (m_dragDestinationAction == DragDestinationActionNone) {
    286286        clearDragCaret(); // FIXME: Why not call mouseMovedIntoDocument(nullptr)?
  • trunk/Source/WebCore/platform/DragData.cpp

    r204972 r214403  
    3333
    3434#if !PLATFORM(COCOA)
    35 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition,
    36     DragOperation sourceOperationMask, DragApplicationFlags flags)
     35DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, DragDestinationAction destinationAction)
    3736    : m_clientPosition(clientPosition)
    3837    , m_globalPosition(globalPosition)
     
    4039    , m_draggingSourceOperationMask(sourceOperationMask)
    4140    , m_applicationFlags(flags)
     41    , m_dragDestinationAction(destinationAction)
    4242
    4343}
    4444
    45 DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition,
    46     DragOperation sourceOperationMask, DragApplicationFlags flags)
     45DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, DragDestinationAction destinationAction)
    4746    : m_clientPosition(clientPosition)
    4847    , m_globalPosition(globalPosition)
     
    5049    , m_draggingSourceOperationMask(sourceOperationMask)
    5150    , m_applicationFlags(flags)
     51    , m_dragDestinationAction(destinationAction)
    5252{
    5353}
  • trunk/Source/WebCore/platform/DragData.h

    r212484 r214403  
    7979
    8080    // clientPosition is taken to be the position of the drag event within the target window, with (0,0) at the top left
    81     WEBCORE_EXPORT DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
    82     WEBCORE_EXPORT DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone);
     81    WEBCORE_EXPORT DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone, DragDestinationAction actions = DragDestinationActionAny);
     82    WEBCORE_EXPORT DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone, DragDestinationAction actions = DragDestinationActionAny);
    8383    // This constructor should used only by WebKit2 IPC because DragData
    8484    // is initialized by the decoder and not in the constructor.
     
    106106    bool containsFiles() const;
    107107    unsigned numberOfFiles() const;
     108    DragDestinationAction dragDestinationAction() const { return m_dragDestinationAction; }
    108109    void setFileNames(Vector<String>& fileNames) { m_fileNames = WTFMove(fileNames); }
    109110    const Vector<String>& fileNames() const { return m_fileNames; }
     
    122123        m_draggingSourceOperationMask = data.m_draggingSourceOperationMask;
    123124        m_applicationFlags = data.m_applicationFlags;
     125        m_dragDestinationAction = data.m_dragDestinationAction;
    124126        return *this;
    125127    }
     
    133135    DragApplicationFlags m_applicationFlags;
    134136    Vector<String> m_fileNames;
     137    DragDestinationAction m_dragDestinationAction;
    135138#if PLATFORM(COCOA)
    136139    String m_pasteboardName;
  • trunk/Source/WebCore/platform/mac/DragDataMac.mm

    r212930 r214403  
    8484namespace WebCore {
    8585
    86 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition,
    87     DragOperation sourceOperationMask, DragApplicationFlags flags)
     86DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, DragDestinationAction destinationAction)
    8887    : m_clientPosition(clientPosition)
    8988    , m_globalPosition(globalPosition)
     
    9190    , m_draggingSourceOperationMask(sourceOperationMask)
    9291    , m_applicationFlags(flags)
     92    , m_dragDestinationAction(destinationAction)
    9393#if PLATFORM(MAC)
    9494    , m_pasteboardName([[m_platformDragData draggingPasteboard] name])
     
    9999}
    100100
    101 DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition,
    102     DragOperation sourceOperationMask, DragApplicationFlags flags)
     101DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, DragDestinationAction destinationAction)
    103102    : m_clientPosition(clientPosition)
    104103    , m_globalPosition(globalPosition)
     
    106105    , m_draggingSourceOperationMask(sourceOperationMask)
    107106    , m_applicationFlags(flags)
     107    , m_dragDestinationAction(destinationAction)
    108108    , m_pasteboardName(dragStorageName)
    109109{
  • trunk/Source/WebKit/ChangeLog

    r214177 r214403  
     12017-03-24  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
     4        https://bugs.webkit.org/show_bug.cgi?id=169168
     5        <rdar://problem/30688374>
     6
     7        Reviewed by Tim Horton.
     8
     9        See WebKit ChangeLog for more details. Renames WebDefaultUIDelegate.m => WebDefaultUIDelegate.mm.
     10
     11        * WebKit.xcodeproj/project.pbxproj:
     12
    1132017-03-20  Dan Bernstein  <mitz@apple.com>
    214
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r214177 r214403  
    330330                939811070824BF01008DF038 /* WebView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51A8B57A042834F700CA2D3A /* WebView.mm */; };
    331331                939811080824BF01008DF038 /* WebPolicyDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51443F9B0429392B00CA2D3A /* WebPolicyDelegate.mm */; };
    332                 9398110A0824BF01008DF038 /* WebDefaultUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.m */; };
     332                9398110A0824BF01008DF038 /* WebDefaultUIDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.mm */; };
    333333                939811120824BF01008DF038 /* WebNSURLExtras.mm in Sources */ = {isa = PBXBuildFile; fileRef = BE6DC39A04C62C4E004D0EF6 /* WebNSURLExtras.mm */; };
    334334                939811130824BF01008DF038 /* WebHistory.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65DA2608052CC18700A97B31 /* WebHistory.mm */; };
     
    967967                515E27CC0458C86500CA2D3A /* WebUIDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebUIDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    968968                515E27CF0458CA4B00CA2D3A /* WebDefaultUIDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDefaultUIDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    969                 515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebDefaultUIDelegate.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
     969                515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDefaultUIDelegate.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    970970                516F296F03A6C45A00CA2D3A /* WebHistoryItemInternal.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebHistoryItemInternal.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    971971                5185F62510712B80007AA393 /* WebNavigationData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebNavigationData.h; sourceTree = "<group>"; };
     
    19511951                                5152FAE0033FC50400CA2ACD /* WebDefaultPolicyDelegate.m */,
    19521952                                515E27CF0458CA4B00CA2D3A /* WebDefaultUIDelegate.h */,
    1953                                 515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.m */,
     1953                                515E27D00458CA4B00CA2D3A /* WebDefaultUIDelegate.mm */,
    19541954                        );
    19551955                        name = "Default Delegates";
     
    35813581                                939810F00824BF01008DF038 /* WebDefaultPolicyDelegate.m in Sources */,
    35823582                                A10C1D1D18202F9C0036883A /* WebDefaultResourceLoadDelegate.m in Sources */,
    3583                                 9398110A0824BF01008DF038 /* WebDefaultUIDelegate.m in Sources */,
     3583                                9398110A0824BF01008DF038 /* WebDefaultUIDelegate.mm in Sources */,
    35843584                                A10C1D1F18202F9C0036883A /* WebDefaultUIKitDelegate.m in Sources */,
    35853585                                BC542C430FD7766F00D8AB5D /* WebDelegateImplementationCaching.mm in Sources */,
  • trunk/Source/WebKit/mac/ChangeLog

    r214284 r214403  
     12017-03-24  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
     4        https://bugs.webkit.org/show_bug.cgi?id=169168
     5        <rdar://problem/30688374>
     6
     7        Reviewed by Tim Horton.
     8
     9        Refactors WebDragClient::actionMaskForDrag to take platform data only, rather than the entire DragData. See the
     10        WebCore ChangeLog entry for more details. Also renames WebDefaultUIDelegate.m to WebDefaultUIDelegate.mm, since
     11        we need to import a C++ header for linkedOnOrAfter().
     12
     13        The default delegate implementation of webView:dragDestinationActionMaskForDraggingInfo: now checks if the current
     14        application is linking against 10.12 or earlier, and if so, will allow any drag destination action instead of
     15        the new default value of everything but DragDestinationActionLoad.
     16
     17        * DefaultDelegates/WebDefaultUIDelegate.mm: Renamed from Source/WebKit/mac/DefaultDelegates/WebDefaultUIDelegate.m.
     18        (-[WebDefaultUIDelegate webView:dragDestinationActionMaskForDraggingInfo:]):
     19        * Misc/WebKitVersionChecks.h:
     20        * WebCoreSupport/WebDragClient.h:
     21        * WebCoreSupport/WebDragClient.mm:
     22        (WebDragClient::actionMaskForDrag): Deleted.
     23        * WebView/WebView.mm:
     24        (-[WebView draggingEntered:]):
     25        (-[WebView draggingUpdated:]):
     26
    1272017-03-21  Wenson Hsieh  <wenson_hsieh@apple.com>
    228
  • trunk/Source/WebKit/mac/DefaultDelegates/WebDefaultUIDelegate.mm

    r214402 r214403  
    3535#if !PLATFORM(IOS)
    3636#import "WebJavaScriptTextInputPanel.h"
     37#import "WebKitVersionChecks.h"
    3738#endif
    3839
     
    5354
    5455// Return a object with vanilla implementations of the protocol's methods
    55 // Note this feature relies on our default delegate being stateless.  This
     56// Note this feature relies on our default delegate being stateless. This
    5657// is probably an invalid assumption for the WebUIDelegate.
    5758// If we add any real functionality to this default delegate we probably
     
    5960+ (WebDefaultUIDelegate *)sharedUIDelegate
    6061{
    61     if (!sharedDelegate) {
     62    if (!sharedDelegate)
    6263        sharedDelegate = [[WebDefaultUIDelegate alloc] init];
    63     }
    6464    return sharedDelegate;
    6565}
     
    102102{
    103103#if !PLATFORM(IOS)
    104     if ([[wv window] isKeyWindow] || [[[wv window] attachedSheet] isKeyWindow]) {
     104    if ([[wv window] isKeyWindow] || [[[wv window] attachedSheet] isKeyWindow])
    105105        [NSApp _cycleWindowsReversed:FALSE];
    106     }
    107106#endif
    108107}
     
    197196    [panel showWindow:nil];
    198197    NSString *result;
    199     if ([NSApp runModalForWindow:[panel window]]) {
     198    if ([NSApp runModalForWindow:[panel window]])
    200199        result = [panel text];
    201     } else {
     200    else
    202201        result = nil;
    203     }
    204202    [[panel window] close];
    205203    [panel release];
     
    223221- (NSUInteger)webView:(WebView *)webView dragDestinationActionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
    224222{
    225     return WebDragDestinationActionAny;
     223    if (!linkedOnOrAfter(SDKVersion::FirstWithDropToNavigateDisallowedByDefault))
     224        return WebDragDestinationActionAny;
     225
     226    return WebDragDestinationActionAny & ~WebDragDestinationActionLoad;
    226227}
    227228
  • trunk/Source/WebKit/mac/Misc/WebKitVersionChecks.h

    r212555 r214403  
    8484#if PLATFORM(IOS)
    8585    FirstToExcludeLocalStorageFromBackup = DYLD_IOS_VERSION_11_0,
     86#else
     87    FirstWithDropToNavigateDisallowedByDefault = DYLD_MACOSX_VERSION_10_13
    8688#endif
    8789};
  • trunk/Source/WebKit/mac/WebCoreSupport/WebDragClient.h

    r214111 r214403  
    3838    void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&) override;
    3939    void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&) override;
    40     WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&) override;
    4140    void dragControllerDestroyed() override;
    4241    WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint& windowPoint) override;
  • trunk/Source/WebKit/mac/WebCoreSupport/WebDragClient.mm

    r214111 r214403  
    8888}
    8989
    90 WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(const WebCore::DragData& dragData)
    91 {
    92     return (WebCore::DragDestinationAction)[[m_webView _UIDelegateForwarder] webView:m_webView dragDestinationActionMaskForDraggingInfo:dragData.platformData()];
    93 }
    94 
    9590void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction action, const WebCore::DragData& dragData)
    9691{
     
    195190}
    196191
    197 WebCore::DragDestinationAction WebDragClient::actionMaskForDrag(const WebCore::DragData&)
    198 {
    199     return DragDestinationActionNone;
    200 }
    201 
    202192void WebDragClient::willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&)
    203193{
  • trunk/Source/WebKit/mac/WebView/WebView.mm

    r214284 r214403  
    66206620}
    66216621
     6622- (DragDestinationAction)actionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
     6623{
     6624    return (DragDestinationAction)[[self _UIDelegateForwarder] webView:self dragDestinationActionMaskForDraggingInfo:draggingInfo];
     6625}
     6626
    66226627- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)draggingInfo
    66236628{
    66246629    IntPoint client([draggingInfo draggingLocation]);
    66256630    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
    6626     DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
     6631
     6632    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
    66276633    return core(self)->dragController().dragEntered(dragData);
    66286634}
     
    66366642    IntPoint client([draggingInfo draggingLocation]);
    66376643    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
    6638     DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
     6644
     6645    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
    66396646    return page->dragController().dragUpdated(dragData);
    66406647}
  • trunk/Source/WebKit/mac/WebView/WebViewPrivate.h

    r214284 r214403  
    5656#endif
    5757
    58 #define WEBKIT_DI_BLOCK 1
    59 
    6058@class UIColor;
    6159@class UIImage;
  • trunk/Source/WebKit/win/ChangeLog

    r213846 r214403  
     12017-03-24  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
     4        https://bugs.webkit.org/show_bug.cgi?id=169168
     5        <rdar://problem/30688374>
     6
     7        Reviewed by Tim Horton.
     8
     9        Minor tweak to adjust for a changed interface. See WebKit and WebCore ChangeLogs for more information.
     10
     11        * WebCoreSupport/WebDragClient.cpp:
     12        (WebDragClient::actionMaskForDrag):
     13        * WebCoreSupport/WebDragClient.h:
     14
    1152017-03-13  Per Arne Vollan  <pvollan@apple.com>
    216
  • trunk/Source/WebKit/win/WebCoreSupport/WebDragClient.cpp

    r212407 r214403  
    6363{
    6464    ASSERT(webView);
    65 }
    66 
    67 DragDestinationAction WebDragClient::actionMaskForDrag(const DragData& dragData)
    68 {
    69     COMPtr<IWebUIDelegate> delegateRef = 0;
    70     //Default behaviour (eg. no delegate, or callback not implemented) is to allow
    71     //any action
    72     WebDragDestinationAction mask = WebDragDestinationActionAny;
    73     if (SUCCEEDED(m_webView->uiDelegate(&delegateRef)))
    74         delegateRef->dragDestinationActionMaskForDraggingInfo(m_webView, dragData.platformData(), &mask);
    75 
    76     return (DragDestinationAction)mask;
    7765}
    7866
  • trunk/Source/WebKit/win/WebCoreSupport/WebDragClient.h

    r212390 r214403  
    3636    virtual void dragControllerDestroyed();
    3737
    38     virtual WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&);
    3938    virtual WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint&);
    4039    virtual void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&);
  • trunk/Source/WebKit2/ChangeLog

    r214391 r214403  
     12017-03-24  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [WK2] Add a UI delegate SPI hook to enable or disable navigation on drop
     4        https://bugs.webkit.org/show_bug.cgi?id=169168
     5        <rdar://problem/30688374>
     6
     7        Reviewed by Tim Horton.
     8
     9        Support customizing the set of allowed actions on drop in WebKit2 by introducing a new method to WKUIDelegatePrivate
     10        that returns a WKDragDestinationAction given platform dragging info. These flags are then used to initialize the
     11        DragData sent over to the web process, where they update DragController's view of the allowed destination actions.
     12
     13        Moving forward, the default action mask for WKWebViews will include everything except WKDragDestinationActionLoad,
     14        though for applciations linked on or before 10.12, we will still default to WKDragDestinationActionAny to mitigate
     15        any compatibility risk.
     16
     17        * Shared/API/Cocoa/WKDragDestinationAction.h:
     18
     19        Introduce WK2 client-facing versions of WebCore::DragDestinationAction flags.
     20
     21        * Shared/WebCoreArgumentCoders.cpp:
     22        (IPC::ArgumentCoder<DragData>::encode):
     23        (IPC::ArgumentCoder<DragData>::decode):
     24
     25        Serialize DragData's destination actions when sending DragData over IPC.
     26
     27        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
     28        * UIProcess/API/Cocoa/WKWebView.mm:
     29        (-[WKWebView _web_dragDestinationActionForDraggingInfo:]):
     30
     31        For WKWebView, allow all drag destination actions except for loading (i.e. drop-to-navigate).
     32
     33        * UIProcess/API/mac/WKView.mm:
     34        (-[WKView _web_dragDestinationActionForDraggingInfo:]):
     35
     36        For WKView, allow all types of drag destination actions.
     37
     38        * UIProcess/Cocoa/VersionChecks.h:
     39        * UIProcess/Cocoa/WebViewImpl.h:
     40        * UIProcess/Cocoa/WebViewImpl.mm:
     41        (WebKit::WebViewImpl::draggingEntered):
     42        (WebKit::WebViewImpl::draggingUpdated):
     43        * WebKit2.xcodeproj/project.pbxproj:
     44        * WebProcess/WebCoreSupport/WebDragClient.cpp:
     45        (WebKit::WebDragClient::actionMaskForDrag):
     46        * WebProcess/WebCoreSupport/WebDragClient.h:
     47
    1482017-03-24  Simon Fraser  <simon.fraser@apple.com>
    249
  • trunk/Source/WebKit2/Shared/API/Cocoa/WKDragDestinationAction.h

    r214402 r214403  
    11/*
    2  * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2017 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
     26#import <WebKit/WKFoundation.h>
    2727
    28 #import <wtf/spi/darwin/dyldSPI.h>
     28#if WK_API_ENABLED
    2929
    30 namespace WebKit {
     30#import <Foundation/Foundation.h>
    3131
    32 enum class SDKVersion : uint32_t {
    33 #if PLATFORM(IOS)
    34     FirstWithNetworkCache = DYLD_IOS_VERSION_9_0,
    35     FirstWithMediaTypesRequiringUserActionForPlayback = DYLD_IOS_VERSION_10_0,
    36     FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_IOS_VERSION_11_0,
    37     FirstToExcludeLocalStorageFromBackup = DYLD_IOS_VERSION_11_0,
    38 #elif PLATFORM(MAC)
    39     FirstWithNetworkCache = DYLD_MACOSX_VERSION_10_11,
    40     FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_MACOSX_VERSION_10_13,
     32typedef NS_OPTIONS(NSUInteger, WKDragDestinationAction) {
     33    WKDragDestinationActionNone    = 0,
     34    WKDragDestinationActionDHTML   = 1,
     35    WKDragDestinationActionEdit    = 2,
     36    WKDragDestinationActionLoad    = 4,
     37    WKDragDestinationActionAny     = NSUIntegerMax
     38} WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     39
    4140#endif
    42 };
    43 
    44 bool linkedOnOrAfter(SDKVersion);
    45 
    46 }
  • trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp

    r214231 r214403  
    12241224    encoder << dragData.fileNames();
    12251225#endif
     1226    encoder.encodeEnum(dragData.dragDestinationAction());
    12261227}
    12271228
     
    12551256#endif
    12561257
    1257     dragData = DragData(pasteboardName, clientPosition, globalPosition, draggingSourceOperationMask, applicationFlags);
     1258    DragDestinationAction destinationAction;
     1259    if (!decoder.decodeEnum(destinationAction))
     1260        return false;
     1261
     1262    dragData = DragData(pasteboardName, clientPosition, globalPosition, draggingSourceOperationMask, applicationFlags, destinationAction);
    12581263    dragData.setFileNames(fileNames);
    12591264
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h

    r214264 r214403  
    2828#if WK_API_ENABLED
    2929
     30#import <WebKit/WKDragDestinationAction.h>
    3031#import <WebKit/WKSecurityOrigin.h>
    3132#import <WebKit/WKWebViewPrivate.h>
     
    6667- (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    6768- (void)_webView:(WKWebView *)webView mediaCaptureStateDidChange:(_WKMediaCaptureState)state WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     69- (WKDragDestinationAction)_webView:(WKWebView *)webView dragDestinationActionMaskForDraggingInfo:(id)draggingInfo WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    6870#if TARGET_OS_IPHONE
    6971- (BOOL)_webView:(WKWebView *)webView shouldIncludeAppLinkActionsForElement:(_WKActivatedElementInfo *)element WK_API_AVAILABLE(ios(9.0));
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r214391 r214403  
    4646#import "RemoteObjectRegistryMessages.h"
    4747#import "UIDelegate.h"
     48#import "VersionChecks.h"
    4849#import "ViewGestureController.h"
    4950#import "ViewSnapshotStore.h"
     
    34893490}
    34903491
     3492#if ENABLE(DRAG_SUPPORT) && WK_API_ENABLED
     3493
     3494- (WKDragDestinationAction)_web_dragDestinationActionForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
     3495{
     3496    id <WKUIDelegatePrivate> uiDelegate = (id <WKUIDelegatePrivate>)[self UIDelegate];
     3497    if ([uiDelegate respondsToSelector:@selector(_webView:dragDestinationActionMaskForDraggingInfo:)])
     3498        return [uiDelegate _webView:self dragDestinationActionMaskForDraggingInfo:draggingInfo];
     3499
     3500    if (!linkedOnOrAfter(WebKit::SDKVersion::FirstWithDropToNavigateDisallowedByDefault))
     3501        return WKDragDestinationActionAny;
     3502
     3503    return WKDragDestinationActionAny & ~WKDragDestinationActionLoad;
     3504}
     3505
     3506#endif
     3507
    34913508- (void)_web_dismissContentRelativeChildWindows
    34923509{
  • trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm

    r212810 r214403  
    3333#import "APIPageConfiguration.h"
    3434#import "WKBrowsingContextGroupPrivate.h"
     35#import "WKDragDestinationAction.h"
    3536#import "WKNSData.h"
    3637#import "WKProcessGroupPrivate.h"
     
    10091010}
    10101011
     1012#if ENABLE(DRAG_SUPPORT) && WK_API_ENABLED
     1013
     1014- (WKDragDestinationAction)_web_dragDestinationActionForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
     1015{
     1016    return WKDragDestinationActionAny;
     1017}
     1018
     1019#endif
     1020
    10111021- (void)_web_dismissContentRelativeChildWindows
    10121022{
  • trunk/Source/WebKit2/UIProcess/Cocoa/VersionChecks.h

    r212555 r214403  
    3939    FirstWithNetworkCache = DYLD_MACOSX_VERSION_10_11,
    4040    FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_MACOSX_VERSION_10_13,
     41    FirstWithDropToNavigateDisallowedByDefault = DYLD_MACOSX_VERSION_10_13
    4142#endif
    4243};
  • trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.h

    r212810 r214403  
    3030
    3131#include "PluginComplexTextInputState.h"
     32#include "WKDragDestinationAction.h"
    3233#include "WKLayoutMode.h"
    3334#include "WebPageProxy.h"
     
    9192
    9293- (void)_web_didChangeContentSize:(NSSize)newSize;
     94
     95#if ENABLE(DRAG_SUPPORT) && WK_API_ENABLED
     96- (WKDragDestinationAction)_web_dragDestinationActionForDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
     97#endif
    9398
    9499@optional
  • trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm

    r212810 r214403  
    35783578    WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]);
    35793579    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, m_view.window));
    3580     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view, draggingInfo));
     3580#if WK_API_ENABLED
     3581    auto dragDestinationAction = static_cast<WebCore::DragDestinationAction>([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]);
     3582#else
     3583    auto dragDestinationAction = WebCore::DragDestinationActionAny;
     3584#endif
     3585    WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view, draggingInfo), dragDestinationAction);
    35813586
    35823587    m_page->resetCurrentDragInformation();
     
    35893594    WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]);
    35903595    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, m_view.window));
    3591     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view, draggingInfo));
     3596#if WK_API_ENABLED
     3597    auto dragDestinationAction = static_cast<WebCore::DragDestinationAction>([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]);
     3598#else
     3599    auto dragDestinationAction = WebCore::DragDestinationActionAny;
     3600#endif
     3601    WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view, draggingInfo), dragDestinationAction);
    35923602    m_page->dragUpdated(dragData, draggingInfo.draggingPasteboard.name);
    35933603
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r214266 r214403  
    19971997                EDCA71B7128DDA8C00201B26 /* WKBundlePageOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A22F1001289FCD90085E74F /* WKBundlePageOverlay.cpp */; };
    19981998                F036978815F4BF0500C3A80E /* WebColorPicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F036978715F4BF0500C3A80E /* WebColorPicker.cpp */; };
     1999                F409BA181E6E64BC009DA28E /* WKDragDestinationAction.h in Headers */ = {isa = PBXBuildFile; fileRef = F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */; settings = {ATTRIBUTES = (Private, ); }; };
    19992000                F43370971E4D72ED00052B0E /* _WKTestingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = F43370961E4D6A4400052B0E /* _WKTestingDelegate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    20002001                F6113E25126CE1820057D0A7 /* APIUserContentURLPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = F6113E24126CE1820057D0A7 /* APIUserContentURLPattern.h */; };
     
    43134314                ECBFC1DB1E6A4D66000300C7 /* ExtraPublicSymbolsForTAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtraPublicSymbolsForTAPI.h; sourceTree = "<group>"; };
    43144315                F036978715F4BF0500C3A80E /* WebColorPicker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebColorPicker.cpp; sourceTree = "<group>"; };
     4316                F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDragDestinationAction.h; sourceTree = "<group>"; };
    43154317                F43370961E4D6A4400052B0E /* _WKTestingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKTestingDelegate.h; sourceTree = "<group>"; };
    43164318                F6113E24126CE1820057D0A7 /* APIUserContentURLPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIUserContentURLPattern.h; sourceTree = "<group>"; };
     
    57375739                                37A709A61E3EA0FD00CA5969 /* WKDataDetectorTypes.h */,
    57385740                                37A709A81E3EA40C00CA5969 /* WKDataDetectorTypesInternal.h */,
     5741                                F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */,
    57395742                                37DFA6FF1810BB92001F4A9F /* WKFoundation.h */,
    57405743                                1A9E32991822E1CC00F5D04C /* WKRemoteObject.h */,
     
    81678170                                E1A31732134CEA6C007C9A4F /* AttributedString.h in Headers */,
    81688171                                512F589712A8838800629530 /* AuthenticationChallengeProxy.h in Headers */,
     8172                                F409BA181E6E64BC009DA28E /* WKDragDestinationAction.h in Headers */,
    81698173                                512F589912A8838800629530 /* AuthenticationDecisionListener.h in Headers */,
    81708174                                518E8EF916B2091C00E91429 /* AuthenticationManager.h in Headers */,
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDragClient.cpp

    r212379 r214403  
    4747}
    4848
    49 DragDestinationAction WebDragClient::actionMaskForDrag(const DragData&)
    50 {
    51     return DragDestinationActionAny;
    52 }
    53 
    5449DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint&)
    5550{
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDragClient.h

    r213627 r214403  
    4545    void willPerformDragDestinationAction(WebCore::DragDestinationAction, const WebCore::DragData&) override;
    4646    void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::DataTransfer&) override;
    47     WebCore::DragDestinationAction actionMaskForDrag(const WebCore::DragData&) override;
    4847    WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint& windowPoint) override;
    4948
Note: See TracChangeset for help on using the changeset viewer.