Changeset 262680 in webkit


Ignore:
Timestamp:
Jun 6, 2020, 8:17:30 AM (5 years ago)
Author:
ddkilzer@apple.com
Message:

Use OptionSet<DragOperation> for mask values
<https://webkit.org/b/212605>

Reviewed by Darin Adler.

Source/WebCore:

In broad strokes:

  • Replace use of DragOperation with OptionSet<DragOperation> or Optional<DragOperation>.
  • Rename function parameters and local variables to denote use of mask values.
  • Remove DragOperationNone enum value.
  • Replace DragOperationEvery enum value with anyDragOperation().
  • dom/DataTransfer.cpp:

(WebCore::DataTransfer::createForDrop):
(WebCore::DataTransfer::createForUpdatingDropTarget):
(WebCore::dragOpFromIEOp):
(WebCore::IEOpFromDragOp):
(WebCore::DataTransfer::sourceOperation const): Rename.
(WebCore::DataTransfer::sourceOperationMask const):
(WebCore::DataTransfer::destinationOperation const): Rename.
(WebCore::DataTransfer::destinationOperationMask const):
(WebCore::DataTransfer::setSourceOperation): Rename.
(WebCore::DataTransfer::setSourceOperationMask):
(WebCore::DataTransfer::setDestinationOperation): Rename.
(WebCore::DataTransfer::setDestinationOperationMask):

  • dom/DataTransfer.h:

(WebCore::DataTransfer::createForDrop):
(WebCore::DataTransfer::createForUpdatingDropTarget):
(WebCore::DataTransfer::sourceOperation const): Rename.
(WebCore::DataTransfer::sourceOperationMask const):
(WebCore::DataTransfer::destinationOperation const): Rename.
(WebCore::DataTransfer::destinationOperationMask const):
(WebCore::DataTransfer::setSourceOperation): Rename.
(WebCore::DataTransfer::setSourceOperationMask):
(WebCore::DataTransfer::setDestinationOperation): Rename.
(WebCore::DataTransfer::setDestinationOperationMask):

  • page/DragActions.h:

(WebCore::anyDragOperation): Add.
(WTF::EnumTraits<WebCore::DragOperation>): Add.
(WTF::OptionSet<WebCore::DragOperation>): Add.

  • page/DragController.cpp:

(WebCore::DragController::dragEntered):
(WebCore::DragController::dragUpdated):
(WebCore::DragController::performDragOperation):
(WebCore::DragController::dragEnteredOrUpdated):
(WebCore::DragController::tryDocumentDrag):
(WebCore::DragController::operationForLoad):
(WebCore::defaultOperationForDrag):
(WebCore::DragController::tryDHTMLDrag):

  • Change logic to call defaultOperationForDrag() to convert targetResponse.operationMask to a single operation when targetResponse.operationMask but doesn't contain with any bit values set in sourceOperationMask.

(WebCore::DragController::startDrag):

  • page/DragController.h:

(WebCore::DragController::dragEntered):
(WebCore::DragController::dragUpdated):
(WebCore::DragController::sourceDragOperation const): Rename.
(WebCore::DragController::sourceDragOperationMask const):
(WebCore::DragController::startDrag):
(WebCore::DragController::dragEnteredOrUpdated):
(WebCore::DragController::operationForLoad):
(WebCore::DragController::tryDocumentDrag):
(WebCore::DragController::tryDHTMLDrag):
(WebCore::DragController::dragOperation):

  • page/EventHandler.cpp:

(WebCore::convertDropZoneOperationToDragOperation):
(WebCore::convertDragOperationToDropZoneOperation):
(WebCore::findDropZone):
(WebCore::EventHandler::dispatchDragEnterOrDragOverEvent):
(WebCore::EventHandler::updateDragAndDrop):
(WebCore::EventHandler::cancelDragAndDrop):
(WebCore::EventHandler::performDragAndDrop):
(WebCore::EventHandler::dragSourceEndedAt):
(WebCore::EventHandler::handleDrag):

  • page/EventHandler.h:

(WebCore::EventHandler::updateDragAndDrop):
(WebCore::EventHandler::cancelDragAndDrop):
(WebCore::EventHandler::performDragAndDrop):
(WebCore::EventHandler::dragSourceEndedAt):
(WebCore::EventHandler::dispatchDragEnterOrDragOverEvent):

  • page/gtk/DragControllerGtk.cpp:

(WebCore::DragController::dragOperation):

  • page/mac/DragControllerMac.mm:

(WebCore::DragController::dragOperation):

  • page/win/DragControllerWin.cpp:

(WebCore::DragController::dragOperation):

  • Clean up comment.
  • platform/DragData.cpp:

(WebCore::DragData::DragData):

  • platform/DragData.h:

(WebCore::DragData::DragData):
(WebCore::DragData::draggingSourceOperationMask const):

  • platform/cocoa/DragDataCocoa.mm:

(WebCore::DragData::DragData):

  • platform/gtk/GtkUtilities.cpp:

(WebCore::gdkDragActionToDragOperation):
(WebCore::dragOperationToGdkDragActions):
(WebCore::dragOperationToSingleGdkDragAction):

  • platform/gtk/GtkUtilities.h:

(WebCore::gdkDragActionToDragOperation):
(WebCore::dragOperationToGdkDragActions):
(WebCore::dragOperationToSingleGdkDragAction):

  • platform/win/DragDataWin.cpp:

(WebCore::DragData::DragData):

Source/WebKit:

In broad strokes:

  • Replace use of DragOperation with OptionSet<DragOperation> or Optional<DragOperation>.
  • Rename function parameters and local variables to denote use of mask values.
  • Remove DragOperationNone enum value.
  • Replace DragOperationEvery enum value with anyDragOperation().
  • Platform/spi/ios/UIKitSPI.h:

(UIDragOperation):

  • Remove unused (and misnamed) UIDragOperation enum typedef.
  • Scripts/webkit/messages.py:

(types_that_cannot_be_forward_declared):
(headers_for_type):

  • Add support for WebCore::DragOperation enum.
  • Shared/API/Cocoa/_WKDragActionsInternal.h:

(WebKit::coreDragOperationMask): Add conversion function.

  • Shared/WebCoreArgumentCoders.cpp:

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

  • Update to encode/decode OptionSet<DragOperation>.
  • UIProcess/API/gtk/DragSource.h:

(WebKit::DragSource::begin):

  • UIProcess/API/gtk/DragSourceGtk3.cpp:

(WebKit::DragSource::begin):

  • UIProcess/API/gtk/DragSourceGtk4.cpp:

(WebKit::DragSource::begin):

  • UIProcess/API/gtk/DropTarget.h:
  • UIProcess/API/gtk/DropTargetGtk3.cpp:

(WebKit::DropTarget::didPerformAction):
(WebKit::DropTarget::leaveTimerFired):

  • UIProcess/API/gtk/DropTargetGtk4.cpp:

(WebKit::DropTarget::DropTarget):
(WebKit::DropTarget::didPerformAction):

  • UIProcess/API/gtk/PageClientImpl.cpp:

(WebKit::PageClientImpl::startDrag):

  • UIProcess/API/gtk/PageClientImpl.h:

(WebKit::PageClientImpl::startDrag):

  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseStartDrag):

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:

(webkitWebViewBaseStartDrag):

  • UIProcess/Cocoa/WebViewImpl.mm:

(WebKit::WebViewImpl::sendDragEndToPage):
(WebKit::WebViewImpl::draggingEntered):
(WebKit::kit): Add conversion function.
(WebKit::WebViewImpl::draggingUpdated):
(WebKit::WebViewImpl::draggingExited):
(WebKit::WebViewImpl::performDragOperation):

  • Make use of coreDragOperationMask() conversion function.
  • UIProcess/PageClient.h:

(WebKit::WebViewImpl::startDrag):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didPerformDragControllerAction):

  • Remove MESSAGE_CHECK now that we're using the actual type.

(WebKit::WebPageProxy::startDrag):
(WebKit::WebPageProxy::dragEnded):
(WebKit::WebPageProxy::resetCurrentDragInformation):

  • UIProcess/WebPageProxy.h:

(WebKit::WebPageProxy::didPerformDragControllerAction):
(WebKit::WebPageProxy::dragEnded):
(WebKit::WebPageProxy::startDrag):
(WebKit::WebPageProxy::currentDragOperation const):

  • UIProcess/WebPageProxy.messages.in:

(WebPageProxy::DidPerformDragControllerAction):
(WebPageProxy::StartDrag):

  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView _didHandleDragStartRequest:]):
(dropOperationForWebCoreDragOperation):
(coreDragOperationForUIDropOperation): Add conversion function.

  • Note that this was not being converted from UIDropOperation to WebCore::DragOperation previously, and UIDropOperationMove (0x3) was not being properly converted to DragOperationMove (0x16).

(-[WKContentView dragDataForDropSession:dragDestinationAction:]):
(-[WKContentView _didPerformDragOperation:]):
(-[WKContentView dragInteraction:willAnimateLiftWithAnimator:session:]):
(-[WKContentView dragInteraction:session:didEndWithOperation:]):
(-[WKContentView dropInteraction:sessionDidEnd:]):

  • WebProcess/WebCoreSupport/gtk/WebDragClientGtk.cpp:

(WebKit::WebDragClient::startDrag):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::performDragControllerAction):
(WebKit::WebPage::dragEnded):

  • WebProcess/WebPage/WebPage.h:

(WebKit::WebPage::performDragControllerAction):
(WebKit::WebPage::dragEnded):

  • WebProcess/WebPage/WebPage.messages.in:

(WebPage::PerformDragControllerAction):
(WebPage::DragEnded):

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::requestAdditionalItemsForDragSession):

Source/WebKitLegacy/mac:

In broad strokes:

  • Replace use of DragOperation with OptionSet<DragOperation> or Optional<DragOperation>.
  • Rename function parameters and local variables to denote use of mask values.
  • Remove DragOperationNone enum value.
  • Replace DragOperationEvery enum value with anyDragOperation().
  • WebView/WebFrame.mm:

(-[WebFrame _dragSourceEndedAt:operation:]):

  • WebView/WebHTMLView.mm:

(kit): Add conversion function.
(-[WebHTMLView draggingSourceOperationMaskForLocal:]):
(-[WebHTMLView draggingSession:sourceOperationMaskForDraggingContext:]):

  • WebView/WebView.mm:

(coreDragOperationMask): Add conversion function.
(kit): Ditto.

  • Map WebCore::DragOperationGeneric to _UIDragOperationMove based on logic in WebCore. All other WebCore::DragOperation enum values map to _UIDragOperationNone.

(-[WebView dragDataForSession:client:global:operation:]):
(-[WebView _enteredDataInteraction:client:global:operation:]):
(-[WebView _updatedDataInteraction:client:global:operation:]):
(-[WebView draggingEntered:]):
(-[WebView draggingUpdated:]):
(-[WebView draggingExited:]):
(-[WebView performDragOperation:]):

  • WebView/WebViewInternal.h:

(CocoaDragOperation):

  • Add typedef so coreDragOperationMask() may be shared across platforms.

(coreDragOperationMask): Add declaration.
(coreOptions):

  • Remove redundant parameter name.

Source/WebKitLegacy/win:

In broad strokes:

  • Replace use of DragOperation with OptionSet<DragOperation> or Optional<DragOperation>.
  • Rename function parameters and local variables to denote use of mask values.
  • Remove DragOperationNone enum value.
  • Replace DragOperationEvery enum value with anyDragOperation().
  • WebCoreSupport/WebDragClient.cpp:

(draggingSourceOperationMaskToDragCursors):
(WebDragClient::startDrag):

  • WebView.cpp:

(dragOperationToDragCursor):
(WebView::keyStateToDragOperation const):
(WebView::DragLeave):

  • WebView.h:

(WebView::keyStateToDragOperation const):

Source/WTF:

  • wtf/OptionSet.h:

(WTF::OptionSet::OptionSet):

  • Add constructor for OptionSet(Optional).
Location:
trunk/Source
Files:
54 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r262663 r262680  
     12020-06-06  David Kilzer  <ddkilzer@apple.com>
     2
     3        Use OptionSet<DragOperation> for mask values
     4        <https://webkit.org/b/212605>
     5
     6        Reviewed by Darin Adler.
     7
     8        * wtf/OptionSet.h:
     9        (WTF::OptionSet::OptionSet):
     10        - Add constructor for OptionSet(Optional).
     11
    1122020-06-05  Ryan Haddad  <ryanhaddad@apple.com>
    213
  • trunk/Source/WTF/wtf/OptionSet.h

    r262216 r262680  
    3131#include <wtf/Assertions.h>
    3232#include <wtf/MathExtras.h>
     33#include <wtf/Optional.h>
    3334
    3435namespace WTF {
     
    166167    }
    167168
     169    constexpr OptionSet(Optional<E> optional)
     170        : m_storage(optional ? static_cast<StorageType>(*optional) : 0)
     171    {
     172    }
     173
    168174    constexpr StorageType toRaw() const { return m_storage; }
    169175
  • trunk/Source/WebCore/ChangeLog

    r262679 r262680  
     12020-06-06  David Kilzer  <ddkilzer@apple.com>
     2
     3        Use OptionSet<DragOperation> for mask values
     4        <https://webkit.org/b/212605>
     5
     6        Reviewed by Darin Adler.
     7
     8        In broad strokes:
     9        - Replace use of DragOperation with OptionSet<DragOperation> or
     10          Optional<DragOperation>.
     11        - Rename function parameters and local variables to denote use
     12          of mask values.
     13        - Remove DragOperationNone enum value.
     14        - Replace DragOperationEvery enum value with anyDragOperation().
     15
     16        * dom/DataTransfer.cpp:
     17        (WebCore::DataTransfer::createForDrop):
     18        (WebCore::DataTransfer::createForUpdatingDropTarget):
     19        (WebCore::dragOpFromIEOp):
     20        (WebCore::IEOpFromDragOp):
     21        (WebCore::DataTransfer::sourceOperation const): Rename.
     22        (WebCore::DataTransfer::sourceOperationMask const):
     23        (WebCore::DataTransfer::destinationOperation const): Rename.
     24        (WebCore::DataTransfer::destinationOperationMask const):
     25        (WebCore::DataTransfer::setSourceOperation): Rename.
     26        (WebCore::DataTransfer::setSourceOperationMask):
     27        (WebCore::DataTransfer::setDestinationOperation): Rename.
     28        (WebCore::DataTransfer::setDestinationOperationMask):
     29        * dom/DataTransfer.h:
     30        (WebCore::DataTransfer::createForDrop):
     31        (WebCore::DataTransfer::createForUpdatingDropTarget):
     32        (WebCore::DataTransfer::sourceOperation const): Rename.
     33        (WebCore::DataTransfer::sourceOperationMask const):
     34        (WebCore::DataTransfer::destinationOperation const): Rename.
     35        (WebCore::DataTransfer::destinationOperationMask const):
     36        (WebCore::DataTransfer::setSourceOperation): Rename.
     37        (WebCore::DataTransfer::setSourceOperationMask):
     38        (WebCore::DataTransfer::setDestinationOperation): Rename.
     39        (WebCore::DataTransfer::setDestinationOperationMask):
     40        * page/DragActions.h:
     41        (WebCore::anyDragOperation): Add.
     42        (WTF::EnumTraits<WebCore::DragOperation>): Add.
     43        (WTF::OptionSet<WebCore::DragOperation>): Add.
     44        * page/DragController.cpp:
     45        (WebCore::DragController::dragEntered):
     46        (WebCore::DragController::dragUpdated):
     47        (WebCore::DragController::performDragOperation):
     48        (WebCore::DragController::dragEnteredOrUpdated):
     49        (WebCore::DragController::tryDocumentDrag):
     50        (WebCore::DragController::operationForLoad):
     51        (WebCore::defaultOperationForDrag):
     52        (WebCore::DragController::tryDHTMLDrag):
     53        - Change logic to call defaultOperationForDrag() to convert
     54          targetResponse.operationMask to a single operation when
     55          targetResponse.operationMask but doesn't contain with any
     56          bit values set in sourceOperationMask.
     57        (WebCore::DragController::startDrag):
     58        * page/DragController.h:
     59        (WebCore::DragController::dragEntered):
     60        (WebCore::DragController::dragUpdated):
     61        (WebCore::DragController::sourceDragOperation const): Rename.
     62        (WebCore::DragController::sourceDragOperationMask const):
     63        (WebCore::DragController::startDrag):
     64        (WebCore::DragController::dragEnteredOrUpdated):
     65        (WebCore::DragController::operationForLoad):
     66        (WebCore::DragController::tryDocumentDrag):
     67        (WebCore::DragController::tryDHTMLDrag):
     68        (WebCore::DragController::dragOperation):
     69        * page/EventHandler.cpp:
     70        (WebCore::convertDropZoneOperationToDragOperation):
     71        (WebCore::convertDragOperationToDropZoneOperation):
     72        (WebCore::findDropZone):
     73        (WebCore::EventHandler::dispatchDragEnterOrDragOverEvent):
     74        (WebCore::EventHandler::updateDragAndDrop):
     75        (WebCore::EventHandler::cancelDragAndDrop):
     76        (WebCore::EventHandler::performDragAndDrop):
     77        (WebCore::EventHandler::dragSourceEndedAt):
     78        (WebCore::EventHandler::handleDrag):
     79        * page/EventHandler.h:
     80        (WebCore::EventHandler::updateDragAndDrop):
     81        (WebCore::EventHandler::cancelDragAndDrop):
     82        (WebCore::EventHandler::performDragAndDrop):
     83        (WebCore::EventHandler::dragSourceEndedAt):
     84        (WebCore::EventHandler::dispatchDragEnterOrDragOverEvent):
     85        * page/gtk/DragControllerGtk.cpp:
     86        (WebCore::DragController::dragOperation):
     87        * page/mac/DragControllerMac.mm:
     88        (WebCore::DragController::dragOperation):
     89        * page/win/DragControllerWin.cpp:
     90        (WebCore::DragController::dragOperation):
     91        - Clean up comment.
     92        * platform/DragData.cpp:
     93        (WebCore::DragData::DragData):
     94        * platform/DragData.h:
     95        (WebCore::DragData::DragData):
     96        (WebCore::DragData::draggingSourceOperationMask const):
     97        * platform/cocoa/DragDataCocoa.mm:
     98        (WebCore::DragData::DragData):
     99        * platform/gtk/GtkUtilities.cpp:
     100        (WebCore::gdkDragActionToDragOperation):
     101        (WebCore::dragOperationToGdkDragActions):
     102        (WebCore::dragOperationToSingleGdkDragAction):
     103        * platform/gtk/GtkUtilities.h:
     104        (WebCore::gdkDragActionToDragOperation):
     105        (WebCore::dragOperationToGdkDragActions):
     106        (WebCore::dragOperationToSingleGdkDragAction):
     107        * platform/win/DragDataWin.cpp:
     108        (WebCore::DragData::DragData):
     109
    11102020-06-06  Zalan Bujtas  <zalan@apple.com>
    2111
  • trunk/Source/WebCore/dom/DataTransfer.cpp

    r262507 r262680  
    11/*
    2  * Copyright (C) 2006, 2007, 2008, 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2006-2020 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    490490}
    491491
    492 Ref<DataTransfer> DataTransfer::createForDrop(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)
     492Ref<DataTransfer> DataTransfer::createForDrop(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
    493493{
    494494    auto dataTransfer = adoptRef(*new DataTransfer(DataTransfer::StoreMode::Readonly, WTFMove(pasteboard), draggingFiles ? Type::DragAndDropFiles : Type::DragAndDropData));
    495     dataTransfer->setSourceOperation(sourceOperation);
     495    dataTransfer->setSourceOperationMask(sourceOperationMask);
    496496    dataTransfer->m_originIdentifier = document.originIdentifierForPasteboard();
    497497    return dataTransfer;
    498498}
    499499
    500 Ref<DataTransfer> DataTransfer::createForUpdatingDropTarget(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)
     500Ref<DataTransfer> DataTransfer::createForUpdatingDropTarget(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
    501501{
    502502    auto dataTransfer = adoptRef(*new DataTransfer(DataTransfer::StoreMode::Protected, WTFMove(pasteboard), draggingFiles ? Type::DragAndDropFiles : Type::DragAndDropData));
    503     dataTransfer->setSourceOperation(sourceOperation);
     503    dataTransfer->setSourceOperationMask(sourceOperationMask);
    504504    dataTransfer->m_originIdentifier = document.originIdentifierForPasteboard();
    505505    return dataTransfer;
     
    597597}
    598598
    599 static DragOperation dragOpFromIEOp(const String& operation)
     599static OptionSet<DragOperation> dragOpFromIEOp(const String& operation)
    600600{
    601601    if (operation == "uninitialized")
    602         return DragOperationEvery;
     602        return anyDragOperation();
    603603    if (operation == "none")
    604         return DragOperationNone;
     604        return { };
    605605    if (operation == "copy")
    606         return DragOperationCopy;
     606        return { DragOperationCopy };
    607607    if (operation == "link")
    608         return DragOperationLink;
     608        return { DragOperationLink };
    609609    if (operation == "move")
    610         return (DragOperation)(DragOperationGeneric | DragOperationMove);
     610        return { DragOperationGeneric, DragOperationMove };
    611611    if (operation == "copyLink")
    612         return (DragOperation)(DragOperationCopy | DragOperationLink);
     612        return { DragOperationCopy, DragOperationLink };
    613613    if (operation == "copyMove")
    614         return (DragOperation)(DragOperationCopy | DragOperationGeneric | DragOperationMove);
     614        return { DragOperationCopy, DragOperationGeneric, DragOperationMove };
    615615    if (operation == "linkMove")
    616         return (DragOperation)(DragOperationLink | DragOperationGeneric | DragOperationMove);
     616        return { DragOperationLink, DragOperationGeneric, DragOperationMove };
    617617    if (operation == "all")
    618         return DragOperationEvery;
    619     return DragOperationPrivate; // really a marker for "no conversion"
    620 }
    621 
    622 static const char* IEOpFromDragOp(DragOperation operation)
    623 {
    624     bool isGenericMove = operation & (DragOperationGeneric | DragOperationMove);
    625 
    626     if ((isGenericMove && (operation & DragOperationCopy) && (operation & DragOperationLink)) || operation == DragOperationEvery)
     618        return anyDragOperation();
     619    return { DragOperationPrivate }; // Really a marker for "no conversion".
     620}
     621
     622static const char* IEOpFromDragOp(OptionSet<DragOperation> operationMask)
     623{
     624    bool isGenericMove = operationMask.containsAny({ DragOperationGeneric, DragOperationMove });
     625
     626    if ((isGenericMove && operationMask.containsAll({ DragOperationCopy, DragOperationLink })) || operationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }))
    627627        return "all";
    628     if (isGenericMove && (operation & DragOperationCopy))
     628    if (isGenericMove && operationMask.contains(DragOperationCopy))
    629629        return "copyMove";
    630     if (isGenericMove && (operation & DragOperationLink))
     630    if (isGenericMove && operationMask.contains(DragOperationLink))
    631631        return "linkMove";
    632     if ((operation & DragOperationCopy) && (operation & DragOperationLink))
     632    if (operationMask.containsAll({ DragOperationCopy, DragOperationLink }))
    633633        return "copyLink";
    634634    if (isGenericMove)
    635635        return "move";
    636     if (operation & DragOperationCopy)
     636    if (operationMask.contains(DragOperationCopy))
    637637        return "copy";
    638     if (operation & DragOperationLink)
     638    if (operationMask.contains(DragOperationLink))
    639639        return "link";
    640640    return "none";
    641641}
    642642
    643 DragOperation DataTransfer::sourceOperation() const
    644 {
    645     DragOperation operation = dragOpFromIEOp(m_effectAllowed);
    646     ASSERT(operation != DragOperationPrivate);
    647     return operation;
    648 }
    649 
    650 DragOperation DataTransfer::destinationOperation() const
    651 {
    652     DragOperation operation = dragOpFromIEOp(m_dropEffect);
    653     ASSERT(operation == DragOperationCopy || operation == DragOperationNone || operation == DragOperationLink || operation == (DragOperation)(DragOperationGeneric | DragOperationMove) || operation == DragOperationEvery);
    654     return operation;
    655 }
    656 
    657 void DataTransfer::setSourceOperation(DragOperation operation)
    658 {
    659     ASSERT_ARG(operation, operation != DragOperationPrivate);
    660     m_effectAllowed = IEOpFromDragOp(operation);
    661 }
    662 
    663 void DataTransfer::setDestinationOperation(DragOperation operation)
    664 {
    665     ASSERT_ARG(operation, operation == DragOperationCopy || operation == DragOperationNone || operation == DragOperationLink || operation == DragOperationGeneric || operation == DragOperationMove || operation == (DragOperation)(DragOperationGeneric | DragOperationMove));
    666     m_dropEffect = IEOpFromDragOp(operation);
     643OptionSet<DragOperation> DataTransfer::sourceOperationMask() const
     644{
     645    auto operationMask = dragOpFromIEOp(m_effectAllowed);
     646    ASSERT(operationMask != DragOperationPrivate);
     647    return operationMask;
     648}
     649
     650OptionSet<DragOperation> DataTransfer::destinationOperationMask() const
     651{
     652    auto operationMask = dragOpFromIEOp(m_dropEffect);
     653    ASSERT(operationMask == DragOperationCopy || operationMask.isEmpty() || operationMask == DragOperationLink || operationMask == OptionSet<DragOperation>({ DragOperationGeneric, DragOperationMove }) || operationMask == anyDragOperation());
     654    return operationMask;
     655}
     656
     657void DataTransfer::setSourceOperationMask(OptionSet<DragOperation> operationMask)
     658{
     659    ASSERT_ARG(operationMask, operationMask != DragOperationPrivate);
     660    m_effectAllowed = IEOpFromDragOp(operationMask);
     661}
     662
     663void DataTransfer::setDestinationOperationMask(OptionSet<DragOperation> operationMask)
     664{
     665    ASSERT_ARG(operationMask, operationMask == DragOperationCopy || operationMask.isEmpty() || operationMask == DragOperationLink || operationMask == DragOperationGeneric || operationMask == DragOperationMove || operationMask == OptionSet<DragOperation>({ DragOperationGeneric, DragOperationMove }));
     666    m_dropEffect = IEOpFromDragOp(operationMask);
    667667}
    668668
  • trunk/Source/WebCore/dom/DataTransfer.h

    r251377 r262680  
    33 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
    44 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
    5  * Copyright (C) 2003-2016 Apple Inc. All rights reserved.
     5 * Copyright (C) 2003-2020 Apple Inc. All rights reserved.
    66 *
    77 * This library is free software; you can redistribute it and/or
     
    8989    static Ref<DataTransfer> createForDrag();
    9090    static Ref<DataTransfer> createForDragStartEvent(const Document&);
    91     static Ref<DataTransfer> createForDrop(const Document&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles);
    92     static Ref<DataTransfer> createForUpdatingDropTarget(const Document&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles);
     91    static Ref<DataTransfer> createForDrop(const Document&, std::unique_ptr<Pasteboard>&&, OptionSet<DragOperation>, bool draggingFiles);
     92    static Ref<DataTransfer> createForUpdatingDropTarget(const Document&, std::unique_ptr<Pasteboard>&&, OptionSet<DragOperation>, bool draggingFiles);
    9393
    9494    bool dropEffectIsUninitialized() const { return m_dropEffect == "uninitialized"; }
    9595
    96     DragOperation sourceOperation() const;
    97     DragOperation destinationOperation() const;
    98     void setSourceOperation(DragOperation);
    99     void setDestinationOperation(DragOperation);
     96    OptionSet<DragOperation> sourceOperationMask() const;
     97    OptionSet<DragOperation> destinationOperationMask() const;
     98    void setSourceOperationMask(OptionSet<DragOperation>);
     99    void setDestinationOperationMask(OptionSet<DragOperation>);
    100100
    101101    void setDragHasStarted() { m_shouldUpdateDragImage = true; }
  • trunk/Source/WebCore/page/DragActions.h

    r262395 r262680  
    6161} DragSourceAction;
    6262
    63 // Matches NSDragOperation.
    64 typedef enum {
    65     DragOperationNone    = 0,
     63// See NSDragOperation, _UIDragOperation and UIDropOperation.
     64enum DragOperation {
    6665    DragOperationCopy    = 1,
    6766    DragOperationLink    = 2,
     
    7069    DragOperationMove    = 16,
    7170    DragOperationDelete  = 32,
    72     DragOperationEvery   = UINT_MAX
    73 } DragOperation;
     71};
     72
     73constexpr OptionSet<DragOperation> anyDragOperation()
     74{
     75    return { DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete };
     76}
    7477
    7578enum class MayExtendDragSession : bool { No, Yes };
     
    9497};
    9598
     99template<> struct EnumTraits<WebCore::DragOperation> {
     100    using values = EnumValues<
     101        WebCore::DragOperation,
     102        WebCore::DragOperationCopy,
     103        WebCore::DragOperationLink,
     104        WebCore::DragOperationGeneric,
     105        WebCore::DragOperationPrivate,
     106        WebCore::DragOperationMove,
     107        WebCore::DragOperationDelete
     108    >;
     109};
     110
    96111template<> struct OptionSetTraits<WebCore::DragDestinationAction> {
    97112    using values = OptionSetValues<
     
    103118};
    104119
     120template<> struct OptionSetTraits<WebCore::DragOperation> {
     121    using values = OptionSetValues<
     122        WebCore::DragOperation,
     123        WebCore::DragOperationCopy,
     124        WebCore::DragOperationLink,
     125        WebCore::DragOperationGeneric,
     126        WebCore::DragOperationPrivate,
     127        WebCore::DragOperationMove,
     128        WebCore::DragOperationDelete
     129    >;
     130};
     131
    105132} // namespace WTF
  • trunk/Source/WebCore/page/DragController.cpp

    r262507 r262680  
    209209}
    210210
    211 DragOperation DragController::dragEntered(const DragData& dragData)
     211Optional<DragOperation> DragController::dragEntered(const DragData& dragData)
    212212{
    213213    return dragEnteredOrUpdated(dragData);
     
    225225}
    226226
    227 DragOperation DragController::dragUpdated(const DragData& dragData)
     227Optional<DragOperation> DragController::dragUpdated(const DragData& dragData)
    228228{
    229229    return dragEnteredOrUpdated(dragData);
     
    279279    clearDragCaret();
    280280
    281     if (operationForLoad(dragData) == DragOperationNone)
     281    if (!operationForLoad(dragData))
    282282        return false;
    283283
     
    305305}
    306306
    307 DragOperation DragController::dragEnteredOrUpdated(const DragData& dragData)
     307Optional<DragOperation> DragController::dragEnteredOrUpdated(const DragData& dragData)
    308308{
    309309    mouseMovedIntoDocument(m_page.mainFrame().documentAtPoint(dragData.clientPosition()));
     
    312312    if (m_dragDestinationActionMask.isEmpty()) {
    313313        clearDragCaret(); // FIXME: Why not call mouseMovedIntoDocument(nullptr)?
    314         return DragOperationNone;
    315     }
    316 
    317     DragOperation dragOperation = DragOperationNone;
     314        return WTF::nullopt;
     315    }
     316
     317    Optional<DragOperation> dragOperation;
    318318    m_dragHandlingMethod = tryDocumentDrag(dragData, m_dragDestinationActionMask, dragOperation);
    319319    if (m_dragHandlingMethod == DragHandlingMethod::None && (m_dragDestinationActionMask.contains(DragDestinationAction::Load))) {
    320320        dragOperation = operationForLoad(dragData);
    321         if (dragOperation != DragOperationNone)
     321        if (dragOperation)
    322322            m_dragHandlingMethod = DragHandlingMethod::PageLoad;
    323323    } else if (m_dragHandlingMethod == DragHandlingMethod::SetColor)
     
    389389#endif
    390390
    391 DragHandlingMethod DragController::tryDocumentDrag(const DragData& dragData, OptionSet<DragDestinationAction> destinationActionMask, DragOperation& dragOperation)
     391DragHandlingMethod DragController::tryDocumentDrag(const DragData& dragData, OptionSet<DragDestinationAction> destinationActionMask, Optional<DragOperation>& dragOperation)
    392392{
    393393    if (!m_documentUnderMouse)
     
    459459           
    460460            if (!m_numberOfItemsToBeAccepted)
    461                 dragOperation = DragOperationNone;
     461                dragOperation = WTF::nullopt;
    462462            m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(m_numberOfItemsToBeAccepted);
    463463        } else {
     
    490490}
    491491
    492 DragOperation DragController::operationForLoad(const DragData& dragData)
     492Optional<DragOperation> DragController::operationForLoad(const DragData& dragData)
    493493{
    494494    Document* document = m_page.mainFrame().documentAtPoint(dragData.clientPosition());
     
    505505
    506506    if (document && (m_didInitiateDrag || (is<PluginDocument>(*document) && !pluginDocumentAcceptsDrags) || document->hasEditableStyle()))
    507         return DragOperationNone;
     507        return WTF::nullopt;
    508508    return dragOperation(dragData);
    509509}
     
    694694}
    695695
    696 static DragOperation defaultOperationForDrag(DragOperation srcOpMask)
     696static Optional<DragOperation> defaultOperationForDrag(OptionSet<DragOperation> sourceOperationMask)
    697697{
    698698    // This is designed to match IE's operation fallback for the case where
    699699    // the page calls preventDefault() in a drag event but doesn't set dropEffect.
    700     if (srcOpMask == DragOperationEvery)
     700    if (sourceOperationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }))
    701701        return DragOperationCopy;
    702     if (srcOpMask == DragOperationNone)
    703         return DragOperationNone;
    704     if (srcOpMask & DragOperationMove)
     702    if (sourceOperationMask.isEmpty())
     703        return WTF::nullopt;
     704    if (sourceOperationMask.contains(DragOperationMove))
    705705        return DragOperationMove;
    706     if (srcOpMask & DragOperationGeneric)
     706    if (sourceOperationMask.contains(DragOperationGeneric))
    707707        return DragController::platformGenericDragOperation();
    708     if (srcOpMask & DragOperationCopy)
     708    if (sourceOperationMask.contains(DragOperationCopy))
    709709        return DragOperationCopy;
    710     if (srcOpMask & DragOperationLink)
     710    if (sourceOperationMask.contains(DragOperationLink))
    711711        return DragOperationLink;
    712712   
     
    715715}
    716716
    717 bool DragController::tryDHTMLDrag(const DragData& dragData, DragOperation& operation)
     717bool DragController::tryDHTMLDrag(const DragData& dragData, Optional<DragOperation>& operation)
    718718{
    719719    ASSERT(m_documentUnderMouse);
     
    723723        return false;
    724724
    725     DragOperation sourceOperation = dragData.draggingSourceOperationMask();
    726     auto targetResponse = mainFrame->eventHandler().updateDragAndDrop(createMouseEvent(dragData), [&dragData]() { return Pasteboard::createForDragAndDrop(dragData); }, sourceOperation, dragData.containsFiles());
     725    auto sourceOperationMask = dragData.draggingSourceOperationMask();
     726    auto targetResponse = mainFrame->eventHandler().updateDragAndDrop(createMouseEvent(dragData), [&dragData]() {
     727        return Pasteboard::createForDragAndDrop(dragData);
     728    }, sourceOperationMask, dragData.containsFiles());
    727729    if (!targetResponse.accept)
    728730        return false;
    729731
    730     if (!targetResponse.operation)
    731         operation = defaultOperationForDrag(sourceOperation);
    732     else if (!(sourceOperation & targetResponse.operation.value())) // The element picked an operation which is not supported by the source
    733         operation = DragOperationNone;
     732    if (!targetResponse.operationMask)
     733        operation = defaultOperationForDrag(sourceOperationMask);
     734    else if (!sourceOperationMask.containsAny(targetResponse.operationMask.value())) // The element picked an operation which is not supported by the source.
     735        operation = WTF::nullopt;
    734736    else
    735         operation = targetResponse.operation.value();
     737        operation = defaultOperationForDrag(targetResponse.operationMask.value());
    736738
    737739    return true;
     
    957959}
    958960
    959 bool DragController::startDrag(Frame& src, const DragState& state, DragOperation srcOp, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData hasData)
     961bool DragController::startDrag(Frame& src, const DragState& state, OptionSet<DragOperation> sourceOperationMask, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData hasData)
    960962{
    961963    if (!state.source)
     
    973975
    974976    m_draggingImageURL = URL();
    975     m_sourceDragOperation = srcOp;
     977    m_sourceDragOperationMask = sourceOperationMask;
    976978
    977979    DragImage dragImage;
     
    996998        // follows from:
    997999        // http://trac.webkit.org/browser/trunk/WebKit/mac/WebView/WebHTMLView.mm?rev=48526#L3430
    998         m_sourceDragOperation = static_cast<DragOperation>(m_sourceDragOperation | DragOperationGeneric | DragOperationCopy);
     1000        m_sourceDragOperationMask.add({ DragOperationGeneric, DragOperationCopy });
    9991001    }
    10001002
  • trunk/Source/WebCore/page/DragController.h

    r262469 r262680  
    6060    static DragOperation platformGenericDragOperation();
    6161
    62     WEBCORE_EXPORT DragOperation dragEntered(const DragData&);
     62    WEBCORE_EXPORT Optional<DragOperation> dragEntered(const DragData&);
    6363    WEBCORE_EXPORT void dragExited(const DragData&);
    64     WEBCORE_EXPORT DragOperation dragUpdated(const DragData&);
     64    WEBCORE_EXPORT Optional<DragOperation> dragUpdated(const DragData&);
    6565    WEBCORE_EXPORT bool performDragOperation(const DragData&);
    6666    WEBCORE_EXPORT void dragCancelled();
     
    7373    void setDidInitiateDrag(bool initiated) { m_didInitiateDrag = initiated; }
    7474    bool didInitiateDrag() const { return m_didInitiateDrag; }
    75     DragOperation sourceDragOperation() const { return m_sourceDragOperation; }
     75    OptionSet<DragOperation> sourceDragOperationMask() const { return m_sourceDragOperationMask; }
    7676    const URL& draggingImageURL() const { return m_draggingImageURL; }
    7777    void setDragOffset(const IntPoint& offset) { m_dragOffset = offset; }
     
    9696
    9797    void prepareForDragStart(Frame& sourceFrame, DragSourceAction, Element& sourceElement, DataTransfer&, const IntPoint& dragOrigin) const;
    98     bool startDrag(Frame& src, const DragState&, DragOperation srcOp, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData);
     98    bool startDrag(Frame& src, const DragState&, OptionSet<DragOperation>, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData);
    9999    static const IntSize& maxDragImageSize();
    100100
     
    109109    bool canProcessDrag(const DragData&);
    110110    bool concludeEditDrag(const DragData&);
    111     DragOperation dragEnteredOrUpdated(const DragData&);
    112     DragOperation operationForLoad(const DragData&);
    113     DragHandlingMethod tryDocumentDrag(const DragData&, OptionSet<DragDestinationAction>, DragOperation&);
    114     bool tryDHTMLDrag(const DragData&, DragOperation&);
    115     DragOperation dragOperation(const DragData&);
     111    Optional<DragOperation> dragEnteredOrUpdated(const DragData&);
     112    Optional<DragOperation> operationForLoad(const DragData&);
     113    DragHandlingMethod tryDocumentDrag(const DragData&, OptionSet<DragDestinationAction>, Optional<DragOperation>&);
     114    bool tryDHTMLDrag(const DragData&, Optional<DragOperation>&);
     115    Optional<DragOperation> dragOperation(const DragData&);
    116116    void clearDragCaret();
    117117    bool dragIsMove(FrameSelection&, const DragData&);
     
    157157    DragSourceAction m_dragSourceAction { DragSourceActionNone };
    158158    bool m_didInitiateDrag { false };
    159     DragOperation m_sourceDragOperation { DragOperationNone }; // Set in startDrag when a drag starts from a mouse down within WebKit
     159    OptionSet<DragOperation> m_sourceDragOperationMask; // Set in startDrag when a drag starts from a mouse down within WebKit.
    160160    IntPoint m_dragOffset;
    161161    URL m_draggingImageURL;
  • trunk/Source/WebCore/page/EventHandler.cpp

    r262507 r262680  
    23352335}
    23362336
    2337 static DragOperation convertDropZoneOperationToDragOperation(const String& dragOperation)
     2337static Optional<DragOperation> convertDropZoneOperationToDragOperation(const String& dragOperation)
    23382338{
    23392339    if (dragOperation == "copy")
     
    23432343    if (dragOperation == "link")
    23442344        return DragOperationLink;
    2345     return DragOperationNone;
    2346 }
    2347 
    2348 static String convertDragOperationToDropZoneOperation(DragOperation operation)
    2349 {
    2350     switch (operation) {
    2351     case DragOperationCopy:
    2352         return "copy"_s;
    2353     case DragOperationMove:
    2354         return "move"_s;
    2355     case DragOperationLink:
    2356         return "link"_s;
    2357     default:
    2358         return "copy"_s;
    2359     }
     2345    return WTF::nullopt;
     2346}
     2347
     2348static String convertDragOperationToDropZoneOperation(Optional<DragOperation> operation)
     2349{
     2350    if (operation) {
     2351        switch (*operation) {
     2352        case DragOperationMove:
     2353            return "move"_s;
     2354        case DragOperationLink:
     2355            return "link"_s;
     2356        default:
     2357            break;
     2358        }
     2359    }
     2360    return "copy"_s;
    23602361}
    23612362
     
    23772378        SpaceSplitString keywords(element->attributeWithoutSynchronization(webkitdropzoneAttr), true);
    23782379        bool matched = false;
    2379         DragOperation dragOperation = DragOperationNone;
     2380        Optional<DragOperation> dragOperation;
    23802381        for (unsigned i = 0, size = keywords.size(); i < size; ++i) {
    2381             DragOperation op = convertDropZoneOperationToDragOperation(keywords[i]);
    2382             if (op != DragOperationNone) {
    2383                 if (dragOperation == DragOperationNone)
    2384                     dragOperation = op;
     2382            if (auto operationFromKeyword = convertDropZoneOperationToDragOperation(keywords[i])) {
     2383                if (!dragOperation)
     2384                    dragOperation = operationFromKeyword;
    23852385            } else
    23862386                matched = matched || hasDropZoneType(dataTransfer, keywords[i].string());
    2387             if (matched && dragOperation != DragOperationNone)
     2387            if (matched && dragOperation)
    23882388                break;
    23892389        }
     
    23962396}
    23972397
    2398 EventHandler::DragTargetResponse EventHandler::dispatchDragEnterOrDragOverEvent(const AtomString& eventType, Element& target, const PlatformMouseEvent& event,
    2399     std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)
    2400 {
    2401     auto dataTransfer = DataTransfer::createForUpdatingDropTarget(target.document(), WTFMove(pasteboard), sourceOperation, draggingFiles);
     2398EventHandler::DragTargetResponse EventHandler::dispatchDragEnterOrDragOverEvent(const AtomString& eventType, Element& target, const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
     2399{
     2400    auto dataTransfer = DataTransfer::createForUpdatingDropTarget(target.document(), WTFMove(pasteboard), sourceOperationMask, draggingFiles);
    24022401    bool accept = dispatchDragEvent(eventType, target, event, dataTransfer.get());
    24032402    if (!accept)
     
    24052404    dataTransfer->makeInvalidForSecurity();
    24062405    if (accept && !dataTransfer->dropEffectIsUninitialized())
    2407         return { true, dataTransfer->destinationOperation() };
     2406        return { true, dataTransfer->destinationOperationMask() };
    24082407    return { accept, WTF::nullopt };
    24092408}
    24102409
    2411 EventHandler::DragTargetResponse EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, const std::function<std::unique_ptr<Pasteboard>()>& makePasteboard, DragOperation sourceOperation, bool draggingFiles)
     2410EventHandler::DragTargetResponse EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, const std::function<std::unique_ptr<Pasteboard>()>& makePasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
    24122411{
    24132412    Ref<Frame> protectedFrame(m_frame);
     
    24392438        if (targetIsFrame(newTarget.get(), targetFrame)) {
    24402439            if (targetFrame)
    2441                 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation, draggingFiles);
     2440                response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles);
    24422441        } else if (newTarget) {
    24432442            // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag event before firing a dragenter, dragleave, or dragover event.
    24442443            dispatchEventToDragSourceElement(eventNames().dragEvent, event);
    2445             response = dispatchDragEnterOrDragOverEvent(eventNames().dragenterEvent, *newTarget, event, makePasteboard(), sourceOperation, draggingFiles);
     2444            response = dispatchDragEnterOrDragOverEvent(eventNames().dragenterEvent, *newTarget, event, makePasteboard(), sourceOperationMask, draggingFiles);
    24462445        }
    24472446
     
    24492448            // FIXME: Recursing again here doesn't make sense if the newTarget and m_dragTarget were in the same frame.
    24502449            if (targetFrame)
    2451                 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation, draggingFiles);
     2450                response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles);
    24522451        } else if (m_dragTarget) {
    2453             auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), makePasteboard(), sourceOperation, draggingFiles);
     2452            auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), makePasteboard(), sourceOperationMask, draggingFiles);
    24542453            dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, dataTransfer.get());
    24552454            dataTransfer->makeInvalidForSecurity();
     
    24652464        if (targetIsFrame(newTarget.get(), targetFrame)) {
    24662465            if (targetFrame)
    2467                 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation, draggingFiles);
     2466                response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles);
    24682467        } else if (newTarget) {
    24692468            // Note, when dealing with sub-frames, we may need to fire only a dragover event as a drag event may have been fired earlier.
    24702469            if (!m_shouldOnlyFireDragOverEvent)
    24712470                dispatchEventToDragSourceElement(eventNames().dragEvent, event);
    2472             response = dispatchDragEnterOrDragOverEvent(eventNames().dragoverEvent, *newTarget, event, makePasteboard(), sourceOperation, draggingFiles);
     2471            response = dispatchDragEnterOrDragOverEvent(eventNames().dragoverEvent, *newTarget, event, makePasteboard(), sourceOperationMask, draggingFiles);
    24732472            m_shouldOnlyFireDragOverEvent = false;
    24742473        }
     
    24782477}
    24792478
    2480 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)
     2479void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
    24812480{
    24822481    Ref<Frame> protectedFrame(m_frame);
     
    24852484    if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
    24862485        if (targetFrame)
    2487             targetFrame->eventHandler().cancelDragAndDrop(event, WTFMove(pasteboard), sourceOperation, draggingFiles);
     2486            targetFrame->eventHandler().cancelDragAndDrop(event, WTFMove(pasteboard), sourceOperationMask, draggingFiles);
    24882487    } else if (m_dragTarget) {
    24892488        dispatchEventToDragSourceElement(eventNames().dragEvent, event);
    24902489
    2491         auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), WTFMove(pasteboard), sourceOperation, draggingFiles);
     2490        auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), WTFMove(pasteboard), sourceOperationMask, draggingFiles);
    24922491        dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, dataTransfer.get());
    24932492        dataTransfer->makeInvalidForSecurity();
     
    24962495}
    24972496
    2498 bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)
     2497bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles)
    24992498{
    25002499    Ref<Frame> protectedFrame(m_frame);
     
    25042503    if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
    25052504        if (targetFrame)
    2506             preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, WTFMove(pasteboard), sourceOperation, draggingFiles);
     2505            preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, WTFMove(pasteboard), sourceOperationMask, draggingFiles);
    25072506    } else if (m_dragTarget) {
    2508         auto dataTransfer = DataTransfer::createForDrop(m_dragTarget->document(), WTFMove(pasteboard), sourceOperation, draggingFiles);
     2507        auto dataTransfer = DataTransfer::createForDrop(m_dragTarget->document(), WTFMove(pasteboard), sourceOperationMask, draggingFiles);
    25092508        preventedDefault = dispatchDragEvent(eventNames().dropEvent, *m_dragTarget, event, dataTransfer);
    25102509        dataTransfer->makeInvalidForSecurity();
     
    37303729}
    37313730
    3732 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperation operation, MayExtendDragSession mayExtendDragSession)
     3731void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, OptionSet<DragOperation> dragOperationMask, MayExtendDragSession mayExtendDragSession)
    37333732{
    37343733    // Send a hit test request so that RenderLayer gets a chance to update the :hover and :active pseudoclasses.
     
    37363735
    37373736    if (shouldDispatchEventsToDragSourceElement()) {
    3738         dragState().dataTransfer->setDestinationOperation(operation);
     3737        dragState().dataTransfer->setDestinationOperationMask(dragOperationMask);
    37393738        dispatchEventToDragSourceElement(eventNames().dragendEvent, event);
    37403739    }
     
    38663865    invalidateClick();
    38673866   
    3868     DragOperation srcOp = DragOperationNone;     
     3867    OptionSet<DragOperation> sourceOperationMask;
    38693868   
    38703869    // This does work only if we missed a dragEnd. Do it anyway, just to make sure the old dataTransfer gets numbed.
     
    39023901        if (m_mouseDownMayStartDrag) {
    39033902            // Gather values from DHTML element, if it set any.
    3904             srcOp = dragState().dataTransfer->sourceOperation();
     3903            sourceOperationMask = dragState().dataTransfer->sourceOperationMask();
    39053904           
    39063905            // Yuck, a draggedImage:moveTo: message can be fired as a result of kicking off the
     
    39133912    if (m_mouseDownMayStartDrag) {
    39143913        Page* page = m_frame.page();
    3915         m_didStartDrag = page && page->dragController().startDrag(m_frame, dragState(), srcOp, event.event(), m_mouseDownContentsPosition, hasNonDefaultPasteboardData);
     3914        m_didStartDrag = page && page->dragController().startDrag(m_frame, dragState(), sourceOperationMask, event.event(), m_mouseDownContentsPosition, hasNonDefaultPasteboardData);
    39163915        // In WebKit2 we could re-enter this code and start another drag.
    39173916        // On OS X this causes problems with the ownership of the pasteboard and the promised types.
  • trunk/Source/WebCore/page/EventHandler.h

    r261686 r262680  
    164164    struct DragTargetResponse {
    165165        bool accept { false };
    166         Optional<DragOperation> operation;
     166        Optional<OptionSet<DragOperation>> operationMask;
    167167    };
    168     DragTargetResponse updateDragAndDrop(const PlatformMouseEvent&, const std::function<std::unique_ptr<Pasteboard>()>&, DragOperation sourceOperation, bool draggingFiles);
    169     void cancelDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles);
    170     bool performDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles);
     168    DragTargetResponse updateDragAndDrop(const PlatformMouseEvent&, const std::function<std::unique_ptr<Pasteboard>()>&, OptionSet<DragOperation>, bool draggingFiles);
     169    void cancelDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, OptionSet<DragOperation>, bool draggingFiles);
     170    bool performDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, OptionSet<DragOperation>, bool draggingFiles);
    171171    void updateDragStateAfterEditDragIfNeeded(Element& rootEditableElement);
    172172    RefPtr<Element> draggedElement() const;
     
    269269    WEBCORE_EXPORT void didStartDrag();
    270270    WEBCORE_EXPORT void dragCancelled();
    271     WEBCORE_EXPORT void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation, MayExtendDragSession = MayExtendDragSession::No);
     271    WEBCORE_EXPORT void dragSourceEndedAt(const PlatformMouseEvent&, OptionSet<DragOperation>, MayExtendDragSession = MayExtendDragSession::No);
    272272#endif
    273273
     
    417417#if ENABLE(DRAG_SUPPORT)
    418418    bool dispatchDragEvent(const AtomString& eventType, Element& target, const PlatformMouseEvent&, DataTransfer&);
    419     DragTargetResponse dispatchDragEnterOrDragOverEvent(const AtomString& eventType, Element& target, const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&& , DragOperation, bool draggingFiles);
     419    DragTargetResponse dispatchDragEnterOrDragOverEvent(const AtomString& eventType, Element& target, const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&& , OptionSet<DragOperation>, bool draggingFiles);
    420420    void invalidateDataTransfer();
    421421
  • trunk/Source/WebCore/page/gtk/DragControllerGtk.cpp

    r226312 r262680  
    11/*
    2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2007-2020 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5151}
    5252
    53 DragOperation DragController::dragOperation(const DragData& dragData)
     53Optional<DragOperation> DragController::dragOperation(const DragData& dragData)
    5454{
    5555    // FIXME: This logic is incomplete
     
    5757        return DragOperationCopy;
    5858
    59     return DragOperationNone;
     59    return WTF::nullopt;
    6060}
    6161
  • trunk/Source/WebCore/page/mac/DragControllerMac.mm

    r261638 r262680  
    11/*
    2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2007-2020 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    6565}
    6666   
    67 DragOperation DragController::dragOperation(const DragData& dragData)
     67Optional<DragOperation> DragController::dragOperation(const DragData& dragData)
    6868{
    6969    if (dragData.flags() & DragApplicationIsModal)
    70         return DragOperationNone;
     70        return WTF::nullopt;
    7171
    7272    bool mayContainURL;
     
    7777
    7878    if (!mayContainURL && !dragData.containsPromise())
    79         return DragOperationNone;
     79        return WTF::nullopt;
    8080
    8181    if (!m_documentUnderMouse || (!(dragData.flags() & (DragApplicationHasAttachedSheet | DragApplicationIsSource))))
    8282        return DragOperationCopy;
    8383
    84     return DragOperationNone;
     84    return WTF::nullopt;
    8585}
    8686
  • trunk/Source/WebCore/page/win/DragControllerWin.cpp

    r236583 r262680  
    11/*
    2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
     2 * Copyright (C) 2007-2020 Apple Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4343const float DragController::DragImageAlpha = 0.75f;
    4444
    45 DragOperation DragController::dragOperation(const DragData& dragData)
     45Optional<DragOperation> DragController::dragOperation(const DragData& dragData)
    4646{
    47     //FIXME: to match the macos behaviour we should return DragOperationNone
    48     //if we are a modal window, we are the drag source, or the window is an attached sheet
    49     //If this can be determined from within WebCore operationForDrag can be pulled into
    50     //WebCore itself
    51     return dragData.containsURL() && !m_didInitiateDrag ? DragOperationCopy : DragOperationNone;
     47    // FIXME: To match the macOS behaviour we should return WTF::nullopt.
     48    // If we are a modal window, we are the drag source, or the window is an attached sheet.
     49    // If this can be determined from within WebCore operationForDrag can be pulled into
     50    // WebCore itself.
     51    if (dragData.containsURL() && !m_didInitiateDrag)
     52        return DragOperationCopy;
     53    return WTF::nullopt;
    5254}
    5355
  • trunk/Source/WebCore/platform/DragData.cpp

    r262190 r262680  
    3333
    3434#if !PLATFORM(COCOA)
    35 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
     35DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
    3636    : m_clientPosition(clientPosition)
    3737    , m_globalPosition(globalPosition)
     
    4343}
    4444
    45 DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
     45DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
    4646    : m_clientPosition(clientPosition)
    4747    , m_globalPosition(globalPosition)
  • trunk/Source/WebCore/platform/DragData.h

    r262395 r262680  
    7676
    7777    // clientPosition is taken to be the position of the drag event within the target window, with (0,0) at the top left
    78     WEBCORE_EXPORT DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone, OptionSet<DragDestinationAction> = anyDragDestinationAction());
    79     WEBCORE_EXPORT DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation, DragApplicationFlags = DragApplicationNone, OptionSet<DragDestinationAction> = anyDragDestinationAction());
     78    WEBCORE_EXPORT DragData(DragDataRef, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation>, DragApplicationFlags = DragApplicationNone, OptionSet<DragDestinationAction> = anyDragDestinationAction());
     79    WEBCORE_EXPORT DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation>, DragApplicationFlags = DragApplicationNone, OptionSet<DragDestinationAction> = anyDragDestinationAction());
    8080    // This constructor should used only by WebKit2 IPC because DragData
    8181    // is initialized by the decoder and not in the constructor.
    8282    DragData() = default;
    8383#if PLATFORM(WIN)
    84     WEBCORE_EXPORT DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags = DragApplicationNone);
     84    WEBCORE_EXPORT DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags = DragApplicationNone);
    8585    const DragDataMap& dragDataMap();
    8686    void getDragFileDescriptorData(int& size, String& pathname);
     
    9191    DragApplicationFlags flags() const { return m_applicationFlags; }
    9292    DragDataRef platformData() const { return m_platformDragData; }
    93     DragOperation draggingSourceOperationMask() const { return m_draggingSourceOperationMask; }
     93    OptionSet<DragOperation> draggingSourceOperationMask() const { return m_draggingSourceOperationMask; }
    9494    bool containsURL(FilenameConversionPolicy = ConvertFilenames) const;
    9595    bool containsPlainText() const;
     
    130130    IntPoint m_globalPosition;
    131131    DragDataRef m_platformDragData;
    132     DragOperation m_draggingSourceOperationMask;
     132    OptionSet<DragOperation> m_draggingSourceOperationMask;
    133133    DragApplicationFlags m_applicationFlags;
    134134    Vector<String> m_fileNames;
  • trunk/Source/WebCore/platform/cocoa/DragDataCocoa.mm

    r262190 r262680  
    117117}
    118118
    119 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
     119DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
    120120    : m_clientPosition(clientPosition)
    121121    , m_globalPosition(globalPosition)
     
    132132}
    133133
    134 DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperation sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
     134DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)
    135135    : m_clientPosition(clientPosition)
    136136    , m_globalPosition(globalPosition)
  • trunk/Source/WebCore/platform/gtk/GtkUtilities.cpp

    r262192 r262680  
    150150}
    151151
    152 DragOperation gdkDragActionToDragOperation(GdkDragAction gdkAction)
     152OptionSet<DragOperation> gdkDragActionToDragOperation(GdkDragAction gdkAction)
    153153{
    154     // We have no good way to detect DragOperationEvery other than
    155     // to use it when all applicable flags are on.
    156     if (gdkAction & GDK_ACTION_COPY
    157         && gdkAction & GDK_ACTION_MOVE
    158         && gdkAction & GDK_ACTION_LINK)
    159         return DragOperationEvery;
     154    OptionSet<DragOperation> action;
     155    if (gdkAction & GDK_ACTION_COPY)
     156        action.add(DragOperationCopy);
     157    if (gdkAction & GDK_ACTION_MOVE)
     158        action.add(DragOperationMove);
     159    if (gdkAction & GDK_ACTION_LINK)
     160        action.add(DragOperationLink);
    160161
    161     unsigned action = DragOperationNone;
    162     if (gdkAction & GDK_ACTION_COPY)
    163         action |= DragOperationCopy;
    164     if (gdkAction & GDK_ACTION_MOVE)
    165         action |= DragOperationMove;
    166     if (gdkAction & GDK_ACTION_LINK)
    167         action |= DragOperationLink;
    168 
    169     return static_cast<DragOperation>(action);
     162    return action;
    170163}
    171164
    172 GdkDragAction dragOperationToGdkDragActions(DragOperation coreAction)
     165GdkDragAction dragOperationToGdkDragActions(OptionSet<DragOperation> coreAction)
    173166{
    174167    unsigned gdkAction = 0;
    175     if (coreAction == DragOperationNone)
    176         return static_cast<GdkDragAction>(gdkAction);
    177168
    178     if (coreAction & DragOperationCopy)
     169    if (coreAction.contains(DragOperationCopy))
    179170        gdkAction |= GDK_ACTION_COPY;
    180     if (coreAction & DragOperationMove)
     171    if (coreAction.contains(DragOperationMove))
    181172        gdkAction |= GDK_ACTION_MOVE;
    182     if (coreAction & DragOperationLink)
     173    if (coreAction.contains(DragOperationLink))
    183174        gdkAction |= GDK_ACTION_LINK;
    184175
     
    186177}
    187178
    188 GdkDragAction dragOperationToSingleGdkDragAction(DragOperation coreAction)
     179GdkDragAction dragOperationToSingleGdkDragAction(OptionSet<DragOperation> coreAction)
    189180{
    190     if (coreAction == DragOperationEvery || coreAction & DragOperationCopy)
     181    if (coreAction.contains(DragOperationCopy))
    191182        return GDK_ACTION_COPY;
    192     if (coreAction & DragOperationMove)
     183    if (coreAction.contains(DragOperationMove))
    193184        return GDK_ACTION_MOVE;
    194     if (coreAction & DragOperationLink)
     185    if (coreAction.contains(DragOperationLink))
    195186        return GDK_ACTION_LINK;
    196187    return static_cast<GdkDragAction>(0);
  • trunk/Source/WebCore/platform/gtk/GtkUtilities.h

    r262187 r262680  
    5252WEBCORE_EXPORT unsigned stateModifierForGdkButton(unsigned button);
    5353
    54 WEBCORE_EXPORT DragOperation gdkDragActionToDragOperation(GdkDragAction);
    55 WEBCORE_EXPORT GdkDragAction dragOperationToGdkDragActions(DragOperation);
    56 WEBCORE_EXPORT GdkDragAction dragOperationToSingleGdkDragAction(DragOperation);
     54WEBCORE_EXPORT OptionSet<DragOperation> gdkDragActionToDragOperation(GdkDragAction);
     55WEBCORE_EXPORT GdkDragAction dragOperationToGdkDragActions(OptionSet<DragOperation>);
     56WEBCORE_EXPORT GdkDragAction dragOperationToSingleGdkDragAction(OptionSet<DragOperation>);
    5757
    5858} // namespace WebCore
  • trunk/Source/WebCore/platform/win/DragDataWin.cpp

    r242592 r262680  
    11/*
    2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007-2020 Apple Inc. All rights reserved.
    33 * Copyright (C) 2012 Baidu Inc. All rights reserved.
    44 *
     
    4242
    4343DragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, const IntPoint& globalPosition,
    44     DragOperation sourceOperationMask, DragApplicationFlags flags)
     44    OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags)
    4545    : m_clientPosition(clientPosition)
    4646    , m_globalPosition(globalPosition)
  • trunk/Source/WebKit/ChangeLog

    r262673 r262680  
     12020-06-06  David Kilzer  <ddkilzer@apple.com>
     2
     3        Use OptionSet<DragOperation> for mask values
     4        <https://webkit.org/b/212605>
     5
     6        Reviewed by Darin Adler.
     7
     8        In broad strokes:
     9        - Replace use of DragOperation with OptionSet<DragOperation> or
     10          Optional<DragOperation>.
     11        - Rename function parameters and local variables to denote use
     12          of mask values.
     13        - Remove DragOperationNone enum value.
     14        - Replace DragOperationEvery enum value with anyDragOperation().
     15
     16        * Platform/spi/ios/UIKitSPI.h:
     17        (UIDragOperation):
     18        - Remove unused (and misnamed) UIDragOperation enum typedef.
     19        * Scripts/webkit/messages.py:
     20        (types_that_cannot_be_forward_declared):
     21        (headers_for_type):
     22        - Add support for WebCore::DragOperation enum.
     23        * Shared/API/Cocoa/_WKDragActionsInternal.h:
     24        (WebKit::coreDragOperationMask): Add conversion function.
     25        * Shared/WebCoreArgumentCoders.cpp:
     26        (IPC::ArgumentCoder<DragData>::encode):
     27        (IPC::ArgumentCoder<DragData>::decode):
     28        - Update to encode/decode OptionSet<DragOperation>.
     29
     30        * UIProcess/API/gtk/DragSource.h:
     31        (WebKit::DragSource::begin):
     32        * UIProcess/API/gtk/DragSourceGtk3.cpp:
     33        (WebKit::DragSource::begin):
     34        * UIProcess/API/gtk/DragSourceGtk4.cpp:
     35        (WebKit::DragSource::begin):
     36        * UIProcess/API/gtk/DropTarget.h:
     37        * UIProcess/API/gtk/DropTargetGtk3.cpp:
     38        (WebKit::DropTarget::didPerformAction):
     39        (WebKit::DropTarget::leaveTimerFired):
     40        * UIProcess/API/gtk/DropTargetGtk4.cpp:
     41        (WebKit::DropTarget::DropTarget):
     42        (WebKit::DropTarget::didPerformAction):
     43        * UIProcess/API/gtk/PageClientImpl.cpp:
     44        (WebKit::PageClientImpl::startDrag):
     45        * UIProcess/API/gtk/PageClientImpl.h:
     46        (WebKit::PageClientImpl::startDrag):
     47        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     48        (webkitWebViewBaseStartDrag):
     49        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     50        (webkitWebViewBaseStartDrag):
     51
     52        * UIProcess/Cocoa/WebViewImpl.mm:
     53        (WebKit::WebViewImpl::sendDragEndToPage):
     54        (WebKit::WebViewImpl::draggingEntered):
     55        (WebKit::kit): Add conversion function.
     56        (WebKit::WebViewImpl::draggingUpdated):
     57        (WebKit::WebViewImpl::draggingExited):
     58        (WebKit::WebViewImpl::performDragOperation):
     59        - Make use of coreDragOperationMask() conversion function.
     60        * UIProcess/PageClient.h:
     61        (WebKit::WebViewImpl::startDrag):
     62        * UIProcess/WebPageProxy.cpp:
     63        (WebKit::WebPageProxy::didPerformDragControllerAction):
     64        - Remove MESSAGE_CHECK now that we're using the actual type.
     65        (WebKit::WebPageProxy::startDrag):
     66        (WebKit::WebPageProxy::dragEnded):
     67        (WebKit::WebPageProxy::resetCurrentDragInformation):
     68        * UIProcess/WebPageProxy.h:
     69        (WebKit::WebPageProxy::didPerformDragControllerAction):
     70        (WebKit::WebPageProxy::dragEnded):
     71        (WebKit::WebPageProxy::startDrag):
     72        (WebKit::WebPageProxy::currentDragOperation const):
     73        * UIProcess/WebPageProxy.messages.in:
     74        (WebPageProxy::DidPerformDragControllerAction):
     75        (WebPageProxy::StartDrag):
     76        * UIProcess/ios/WKContentViewInteraction.mm:
     77        (-[WKContentView _didHandleDragStartRequest:]):
     78        (dropOperationForWebCoreDragOperation):
     79        (coreDragOperationForUIDropOperation): Add conversion function.
     80        - Note that this was not being converted from UIDropOperation to
     81          WebCore::DragOperation previously, and UIDropOperationMove
     82          (0x3) was not being properly converted to DragOperationMove
     83          (0x16).
     84        (-[WKContentView dragDataForDropSession:dragDestinationAction:]):
     85        (-[WKContentView _didPerformDragOperation:]):
     86        (-[WKContentView dragInteraction:willAnimateLiftWithAnimator:session:]):
     87        (-[WKContentView dragInteraction:session:didEndWithOperation:]):
     88        (-[WKContentView dropInteraction:sessionDidEnd:]):
     89        * WebProcess/WebCoreSupport/gtk/WebDragClientGtk.cpp:
     90        (WebKit::WebDragClient::startDrag):
     91        * WebProcess/WebPage/WebPage.cpp:
     92        (WebKit::WebPage::performDragControllerAction):
     93        (WebKit::WebPage::dragEnded):
     94        * WebProcess/WebPage/WebPage.h:
     95        (WebKit::WebPage::performDragControllerAction):
     96        (WebKit::WebPage::dragEnded):
     97        * WebProcess/WebPage/WebPage.messages.in:
     98        (WebPage::PerformDragControllerAction):
     99        (WebPage::DragEnded):
     100        * WebProcess/WebPage/ios/WebPageIOS.mm:
     101        (WebKit::WebPage::requestAdditionalItemsForDragSession):
     102
    11032020-06-06  Devin Rousso  <drousso@apple.com>
    2104
  • trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h

    r262283 r262680  
    10261026WTF_EXTERN_C_END
    10271027
    1028 typedef NS_OPTIONS(NSUInteger, UIDragOperation)
    1029 {
    1030     UIDragOperationNone = 0,
    1031     UIDragOperationEvery = NSUIntegerMax,
    1032 };
    1033 
    10341028@interface UIDragInteraction ()
    10351029@property (nonatomic, assign, getter=_liftDelay, setter=_setLiftDelay:) NSTimeInterval liftDelay;
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r262648 r262680  
    210210        'WebCore::DocumentIdentifier',
    211211        'WebCore::DocumentOrWorkerIdentifier',
     212        'WebCore::DragOperation',  # FIXME: Remove after converting WebCore::DragOperation to enum class.
    212213        'WebCore::FetchIdentifier',
    213214        'WebCore::FrameIdentifier',
     
    591592        'WebKit::DocumentEditingContextRequest': ['"DocumentEditingContext.h"'],
    592593        'WebCore::DragHandlingMethod': ['<WebCore/DragActions.h>'],
     594        'WebCore::DragOperation': ['<WebCore/DragActions.h>'],
    593595        'WebCore::ExceptionDetails': ['<WebCore/JSDOMExceptionHandling.h>'],
    594596        'WebCore::FileChooserSettings': ['<WebCore/FileChooser.h>'],
  • trunk/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h

    r262395 r262680  
    4141}
    4242
     43#if USE(APPKIT)
     44inline OptionSet<WebCore::DragOperation> coreDragOperationMask(NSDragOperation operation)
     45{
     46    OptionSet<WebCore::DragOperation> result;
     47    if (operation & NSDragOperationCopy)
     48        result.add(WebCore::DragOperationCopy);
     49    if (operation & NSDragOperationLink)
     50        result.add(WebCore::DragOperationLink);
     51    if (operation & NSDragOperationGeneric)
     52        result.add(WebCore::DragOperationGeneric);
     53    if (operation & NSDragOperationPrivate)
     54        result.add(WebCore::DragOperationPrivate);
     55    if (operation & NSDragOperationMove)
     56        result.add(WebCore::DragOperationMove);
     57    if (operation & NSDragOperationDelete)
     58        result.add(WebCore::DragOperationDelete);
     59    return result;
     60}
     61#endif // USE(APPKIT)
     62
    4363} // namespace WebKit
  • trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp

    r262190 r262680  
    15321532    encoder << dragData.clientPosition();
    15331533    encoder << dragData.globalPosition();
    1534     encoder.encodeEnum(dragData.draggingSourceOperationMask());
     1534    encoder << dragData.draggingSourceOperationMask();
    15351535    encoder.encodeEnum(dragData.flags());
    15361536#if PLATFORM(COCOA)
     
    15511551        return false;
    15521552
    1553     DragOperation draggingSourceOperationMask;
    1554     if (!decoder.decodeEnum(draggingSourceOperationMask))
     1553    OptionSet<DragOperation> draggingSourceOperationMask;
     1554    if (!decoder.decode(draggingSourceOperationMask))
    15551555        return false;
    15561556
  • trunk/Source/WebKit/UIProcess/API/gtk/DragSource.h

    r261911 r262680  
    5353    ~DragSource();
    5454
    55     void begin(WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&&);
     55    void begin(WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<ShareableBitmap>&&);
    5656
    5757private:
  • trunk/Source/WebKit/UIProcess/API/gtk/DragSourceGtk3.cpp

    r261802 r262680  
    107107}
    108108
    109 void DragSource::begin(SelectionData&& selectionData, DragOperation operation, RefPtr<ShareableBitmap>&& image)
     109void DragSource::begin(SelectionData&& selectionData, OptionSet<DragOperation> operationMask, RefPtr<ShareableBitmap>&& image)
    110110{
    111111    if (m_drag) {
     
    130130        gtk_target_list_add(list.get(), gdk_atom_intern_static_string("application/vnd.webkitgtk.smartpaste"), 0, DragTargetType::SmartPaste);
    131131
    132     m_drag = gtk_drag_begin_with_coordinates(m_webView, list.get(), dragOperationToGdkDragActions(operation), GDK_BUTTON_PRIMARY, nullptr, -1, -1);
     132    m_drag = gtk_drag_begin_with_coordinates(m_webView, list.get(), dragOperationToGdkDragActions(operationMask), GDK_BUTTON_PRIMARY, nullptr, -1, -1);
    133133    if (image) {
    134134        RefPtr<cairo_surface_t> imageSurface(image->createCairoSurface());
  • trunk/Source/WebKit/UIProcess/API/gtk/DragSourceGtk4.cpp

    r261911 r262680  
    4545}
    4646
    47 void DragSource::begin(SelectionData&& selectionData, DragOperation operation, RefPtr<ShareableBitmap>&& image)
     47void DragSource::begin(SelectionData&& selectionData, OptionSet<DragOperation> operationMask, RefPtr<ShareableBitmap>&& image)
    4848{
    4949    if (m_drag) {
     
    9090    auto* device = gdk_seat_get_pointer(gdk_display_get_default_seat(gtk_widget_get_display(m_webView)));
    9191    GRefPtr<GdkContentProvider> provider = adoptGRef(gdk_content_provider_new_union(providers.data(), providers.size()));
    92     m_drag = adoptGRef(gdk_drag_begin(surface, device, provider.get(), dragOperationToGdkDragActions(operation), 0, 0));
     92    m_drag = adoptGRef(gdk_drag_begin(surface, device, provider.get(), dragOperationToGdkDragActions(operationMask), 0, 0));
    9393    g_signal_connect(m_drag.get(), "dnd-finished", G_CALLBACK(+[](GdkDrag* gtkDrag, gpointer userData) {
    9494        auto& drag = *static_cast<DragSource*>(userData);
  • trunk/Source/WebKit/UIProcess/API/gtk/DropTarget.h

    r261911 r262680  
    8181    unsigned m_dataRequestCount { 0 };
    8282    Optional<WebCore::SelectionData> m_selectionData;
    83     WebCore::DragOperation m_operation { WebCore::DragOperationNone };
     83    Optional<WebCore::DragOperation> m_operation;
    8484#if USE(GTK4)
    8585    GRefPtr<GCancellable> m_cancellable;
  • trunk/Source/WebKit/UIProcess/API/gtk/DropTargetGtk3.cpp

    r261802 r262680  
    218218
    219219    auto operation = page->currentDragOperation();
    220     if (operation == m_operation)
     220    if ((!operation && !m_operation) || *operation == *m_operation)
    221221        return;
    222222
     
    230230    ASSERT(page);
    231231
    232     DragData dragData(&m_selectionData.value(), *m_position, convertWidgetPointToScreenPoint(m_webView, *m_position), DragOperationNone);
     232    DragData dragData(&m_selectionData.value(), *m_position, convertWidgetPointToScreenPoint(m_webView, *m_position), { });
    233233    page->dragExited(dragData);
    234234    page->resetCurrentDragInformation();
  • trunk/Source/WebKit/UIProcess/API/gtk/DropTargetGtk4.cpp

    r261911 r262680  
    274274
    275275    auto operation = page->currentDragOperation();
    276     if (operation == m_operation)
     276    if ((!operation && !m_operation) || operation == m_operation)
    277277        return;
    278278
  • trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp

    r262415 r262680  
    321321
    322322#if ENABLE(DRAG_SUPPORT)
    323 void PageClientImpl::startDrag(SelectionData&& selection, DragOperation dragOperation, RefPtr<ShareableBitmap>&& dragImage)
    324 {
    325     webkitWebViewBaseStartDrag(WEBKIT_WEB_VIEW_BASE(m_viewWidget), WTFMove(selection), dragOperation, WTFMove(dragImage));
     323void PageClientImpl::startDrag(SelectionData&& selection, OptionSet<DragOperation> dragOperationMask, RefPtr<ShareableBitmap>&& dragImage)
     324{
     325    webkitWebViewBaseStartDrag(WEBKIT_WEB_VIEW_BASE(m_viewWidget), WTFMove(selection), dragOperationMask, WTFMove(dragImage));
    326326}
    327327
  • trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h

    r261802 r262680  
    101101    RefPtr<ViewSnapshot> takeViewSnapshot(Optional<WebCore::IntRect>&&) override;
    102102#if ENABLE(DRAG_SUPPORT)
    103     void startDrag(WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&& dragImage) override;
     103    void startDrag(WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<ShareableBitmap>&& dragImage) override;
    104104    void didPerformDragControllerAction() override;
    105105#endif
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r262485 r262680  
    20622062
    20632063#if ENABLE(DRAG_SUPPORT)
    2064 void webkitWebViewBaseStartDrag(WebKitWebViewBase* webViewBase, SelectionData&& selectionData, DragOperation dragOperation, RefPtr<ShareableBitmap>&& image)
     2064void webkitWebViewBaseStartDrag(WebKitWebViewBase* webViewBase, SelectionData&& selectionData, OptionSet<DragOperation> dragOperationMask, RefPtr<ShareableBitmap>&& image)
    20652065{
    20662066    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     
    20682068        priv->dragSource = makeUnique<DragSource>(GTK_WIDGET(webViewBase));
    20692069
    2070     priv->dragSource->begin(WTFMove(selectionData), dragOperation, WTFMove(image));
     2070    priv->dragSource->begin(WTFMove(selectionData), dragOperationMask, WTFMove(image));
    20712071
    20722072#if !USE(GTK4)
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r262105 r262680  
    8383
    8484#if ENABLE(DRAG_SUPPORT)
    85 void webkitWebViewBaseStartDrag(WebKitWebViewBase*, WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<WebKit::ShareableBitmap>&&);
     85void webkitWebViewBaseStartDrag(WebKitWebViewBase*, WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<WebKit::ShareableBitmap>&&);
    8686void webkitWebViewBaseDidPerformDragControllerAction(WebKitWebViewBase*);
    8787#endif
  • trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm

    r262395 r262680  
    39143914}
    39153915
    3916 void WebViewImpl::sendDragEndToPage(CGPoint endPoint, NSDragOperation operation)
     3916void WebViewImpl::sendDragEndToPage(CGPoint endPoint, NSDragOperation dragOperationMask)
    39173917{
    39183918    ALLOW_DEPRECATED_DECLARATIONS_BEGIN
     
    39243924    m_ignoresMouseDraggedEvents = true;
    39253925
    3926     m_page->dragEnded(WebCore::IntPoint(windowMouseLoc), WebCore::IntPoint(WebCore::globalPoint(windowMouseLoc, [m_view window])), operation);
     3926    m_page->dragEnded(WebCore::IntPoint(windowMouseLoc), WebCore::IntPoint(WebCore::globalPoint(windowMouseLoc, [m_view window])), coreDragOperationMask(dragOperationMask));
    39273927}
    39283928
     
    39483948    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window]));
    39493949    auto dragDestinationActionMask = coreDragDestinationActionMask([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]);
    3950     auto dragOperationMask = static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask);
     3950    auto dragOperationMask = coreDragOperationMask(draggingInfo.draggingSourceOperationMask);
    39513951    WebCore::DragData dragData(draggingInfo, client, global, dragOperationMask, applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo), dragDestinationActionMask);
    39523952
     
    39573957}
    39583958
     3959static NSDragOperation kit(Optional<WebCore::DragOperation> dragOperation)
     3960{
     3961    if (!dragOperation)
     3962        return NSDragOperationNone;
     3963
     3964    switch (*dragOperation) {
     3965    case WebCore::DragOperationCopy:
     3966        return NSDragOperationCopy;
     3967    case WebCore::DragOperationLink:
     3968        return NSDragOperationLink;
     3969    case WebCore::DragOperationGeneric:
     3970        return NSDragOperationGeneric;
     3971    case WebCore::DragOperationPrivate:
     3972        return NSDragOperationPrivate;
     3973    case WebCore::DragOperationMove:
     3974        return NSDragOperationMove;
     3975    case WebCore::DragOperationDelete:
     3976        return NSDragOperationDelete;
     3977    }
     3978
     3979    ASSERT_NOT_REACHED();
     3980    return NSDragOperationNone;
     3981}
     3982
    39593983NSDragOperation WebViewImpl::draggingUpdated(id <NSDraggingInfo> draggingInfo)
    39603984{
     
    39623986    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window]));
    39633987    auto dragDestinationActionMask = coreDragDestinationActionMask([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]);
    3964     auto dragOperationMask = static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask);
     3988    auto dragOperationMask = coreDragOperationMask(draggingInfo.draggingSourceOperationMask);
    39653989    WebCore::DragData dragData(draggingInfo, client, global, dragOperationMask, applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo), dragDestinationActionMask);
    39663990    m_page->dragUpdated(dragData, draggingInfo.draggingPasteboard.name);
     
    39683992    NSInteger numberOfValidItemsForDrop = m_page->currentDragNumberOfFilesToBeAccepted();
    39693993
    3970     if (m_page->currentDragOperation() == WebCore::DragOperationNone)
     3994    if (!m_page->currentDragOperation())
    39713995        numberOfValidItemsForDrop = m_initialNumberOfValidItemsForDrop;
    39723996
     
    39804004        [draggingInfo setDraggingFormation:draggingFormation];
    39814005
    3982     return m_page->currentDragOperation();
     4006    return kit(m_page->currentDragOperation());
    39834007}
    39844008
     
    39874011    WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]);
    39884012    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window]));
    3989     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo));
     4013    WebCore::DragData dragData(draggingInfo, client, global, coreDragOperationMask(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo));
    39904014    m_page->dragExited(dragData, draggingInfo.draggingPasteboard.name);
    39914015    m_page->resetCurrentDragInformation();
     
    40034027    WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]);
    40044028    WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window]));
    4005     WebCore::DragData *dragData = new WebCore::DragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo));
     4029    WebCore::DragData *dragData = new WebCore::DragData(draggingInfo, client, global, coreDragOperationMask(draggingInfo.draggingSourceOperationMask), applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo));
    40064030
    40074031    NSArray *types = draggingInfo.draggingPasteboard.types;
  • trunk/Source/WebKit/UIProcess/PageClient.h

    r262429 r262680  
    251251#if ENABLE(DRAG_SUPPORT)
    252252#if PLATFORM(GTK)
    253     virtual void startDrag(WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&& dragImage) = 0;
     253    virtual void startDrag(WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<ShareableBitmap>&& dragImage) = 0;
    254254#else
    255255    virtual void startDrag(const WebCore::DragItem&, const ShareableBitmap::Handle&) { }
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r262598 r262680  
    24252425}
    24262426
    2427 void WebPageProxy::didPerformDragControllerAction(uint64_t dragOperation, WebCore::DragHandlingMethod dragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, const IntRect& insertionRect, const IntRect& editableElementRect)
    2428 {
    2429     MESSAGE_CHECK(m_process, dragOperation <= DragOperationDelete);
    2430 
    2431     m_currentDragOperation = static_cast<DragOperation>(dragOperation);
     2427void WebPageProxy::didPerformDragControllerAction(Optional<WebCore::DragOperation> dragOperation, WebCore::DragHandlingMethod dragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, const IntRect& insertionRect, const IntRect& editableElementRect)
     2428{
     2429    m_currentDragOperation = dragOperation;
    24322430    m_currentDragHandlingMethod = dragHandlingMethod;
    24332431    m_currentDragIsOverFileInput = mouseIsOverFileInput;
     
    24392437
    24402438#if PLATFORM(GTK)
    2441 void WebPageProxy::startDrag(SelectionData&& selectionData, uint64_t dragOperation, const ShareableBitmap::Handle& dragImageHandle)
     2439void WebPageProxy::startDrag(SelectionData&& selectionData, OptionSet<WebCore::DragOperation> dragOperationMask, const ShareableBitmap::Handle& dragImageHandle)
    24422440{
    24432441    RefPtr<ShareableBitmap> dragImage = !dragImageHandle.isNull() ? ShareableBitmap::create(dragImageHandle) : nullptr;
    2444     pageClient().startDrag(WTFMove(selectionData), static_cast<WebCore::DragOperation>(dragOperation), WTFMove(dragImage));
     2442    pageClient().startDrag(WTFMove(selectionData), dragOperationMask, WTFMove(dragImage));
    24452443
    24462444    didStartDrag();
     
    24482446#endif
    24492447
    2450 void WebPageProxy::dragEnded(const IntPoint& clientPosition, const IntPoint& globalPosition, uint64_t operation)
    2451 {
    2452     if (!hasRunningProcess())
    2453         return;
    2454     send(Messages::WebPage::DragEnded(clientPosition, globalPosition, operation));
     2448void WebPageProxy::dragEnded(const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<WebCore::DragOperation> dragOperationMask)
     2449{
     2450    if (!hasRunningProcess())
     2451        return;
     2452    send(Messages::WebPage::DragEnded(clientPosition, globalPosition, dragOperationMask));
    24552453    setDragCaretRect({ });
    24562454}
     
    24832481void WebPageProxy::resetCurrentDragInformation()
    24842482{
    2485     m_currentDragOperation = WebCore::DragOperationNone;
     2483    m_currentDragOperation = WTF::nullopt;
    24862484    m_currentDragHandlingMethod = DragHandlingMethod::None;
    24872485    m_currentDragIsOverFileInput = false;
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r262598 r262680  
    11581158    void didPerformDragOperation(bool handled);
    11591159
    1160     void didPerformDragControllerAction(uint64_t dragOperation, WebCore::DragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, const WebCore::IntRect& insertionRect, const WebCore::IntRect& editableElementRect);
    1161     void dragEnded(const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_t operation);
     1160    void didPerformDragControllerAction(Optional<WebCore::DragOperation>, WebCore::DragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, const WebCore::IntRect& insertionRect, const WebCore::IntRect& editableElementRect);
     1161    void dragEnded(const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, OptionSet<WebCore::DragOperation>);
    11621162    void didStartDrag();
    11631163    void dragCancelled();
     
    11691169#endif
    11701170#if PLATFORM(GTK)
    1171     void startDrag(WebCore::SelectionData&&, uint64_t dragOperation, const ShareableBitmap::Handle& dragImage);
     1171    void startDrag(WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, const ShareableBitmap::Handle& dragImage);
    11721172#endif
    11731173#endif
     
    12281228
    12291229#if ENABLE(DRAG_SUPPORT)
    1230     WebCore::DragOperation currentDragOperation() const { return m_currentDragOperation; }
     1230    Optional<WebCore::DragOperation> currentDragOperation() const { return m_currentDragOperation; }
    12311231    WebCore::DragHandlingMethod currentDragHandlingMethod() const { return m_currentDragHandlingMethod; }
    12321232    bool currentDragIsOverFileInput() const { return m_currentDragIsOverFileInput; }
     
    26092609    // Current drag destination details are delivered as an asynchronous response,
    26102610    // so we preserve them to be used when the next dragging delegate call is made.
    2611     WebCore::DragOperation m_currentDragOperation { WebCore::DragOperationNone };
     2611    Optional<WebCore::DragOperation> m_currentDragOperation;
    26122612    WebCore::DragHandlingMethod m_currentDragHandlingMethod { WebCore::DragHandlingMethod::None };
    26132613    bool m_currentDragIsOverFileInput { false };
  • trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in

    r262598 r262680  
    311311    # Drag and drop messages
    312312#if ENABLE(DRAG_SUPPORT)
    313     DidPerformDragControllerAction(uint64_t dragOperation, enum:uint8_t WebCore::DragHandlingMethod dragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, WebCore::IntRect insertionRect, WebCore::IntRect editableElementRect)
     313    DidPerformDragControllerAction(Optional<WebCore::DragOperation> dragOperation, enum:uint8_t WebCore::DragHandlingMethod dragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, WebCore::IntRect insertionRect, WebCore::IntRect editableElementRect)
    314314    DidEndDragging();
    315315#endif
     
    319319#endif
    320320#if PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
    321     StartDrag(WebCore::SelectionData selectionData, uint64_t dragOperation, WebKit::ShareableBitmap::Handle dragImage)
     321    StartDrag(WebCore::SelectionData selectionData, OptionSet<WebCore::DragOperation> dragOperationMask, WebKit::ShareableBitmap::Handle dragImage)
    322322#endif
    323323
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r262665 r262680  
    72907290            // A client of the Objective C SPI or UIKit might have prevented the drag from beginning entirely in the UI process, in which case
    72917291            // we need to balance the `dragstart` event with a `dragend`.
    7292             _page->dragEnded(positionForDragEnd, positionForDragEnd, WebCore::DragOperationNone);
     7292            _page->dragEnded(positionForDragEnd, positionForDragEnd, { });
    72937293        }
    72947294    }
     
    73087308}
    73097309
    7310 static UIDropOperation dropOperationForWebCoreDragOperation(WebCore::DragOperation operation)
    7311 {
    7312     if (operation & WebCore::DragOperationMove)
    7313         return UIDropOperationMove;
    7314 
    7315     if (operation & WebCore::DragOperationCopy)
    7316         return UIDropOperationCopy;
    7317 
     7310static UIDropOperation dropOperationForWebCoreDragOperation(Optional<WebCore::DragOperation> operation)
     7311{
     7312    if (operation) {
     7313        if (*operation == WebCore::DragOperationMove)
     7314            return UIDropOperationMove;
     7315        if (*operation == WebCore::DragOperationCopy)
     7316            return UIDropOperationCopy;
     7317    }
    73187318    return UIDropOperationCancel;
     7319}
     7320
     7321static Optional<WebCore::DragOperation> coreDragOperationForUIDropOperation(UIDropOperation dropOperation)
     7322{
     7323    switch (dropOperation) {
     7324    case UIDropOperationCancel:
     7325        return WTF::nullopt;
     7326    case UIDropOperationForbidden:
     7327        return WebCore::DragOperationPrivate;
     7328    case UIDropOperationCopy:
     7329        return WebCore::DragOperationCopy;
     7330    case UIDropOperationMove:
     7331        return WebCore::DragOperationMove;
     7332    }
     7333    ASSERT_NOT_REACHED();
     7334    return WTF::nullopt;
    73197335}
    73207336
     
    73257341    [self computeClientAndGlobalPointsForDropSession:session outClientPoint:&client outGlobalPoint:&global];
    73267342
    7327     WebCore::DragOperation dragOperationMask = static_cast<WebCore::DragOperation>(session.allowsMoveOperation ? WebCore::DragOperationEvery : (WebCore::DragOperationEvery & ~WebCore::DragOperationMove));
     7343    auto dragOperationMask = WebCore::anyDragOperation();
     7344    if (!session.allowsMoveOperation)
     7345        dragOperationMask.remove(WebCore::DragOperationMove);
    73287346    return { session, WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), dragOperationMask, WebCore::DragApplicationNone, WebKit::coreDragDestinationActionMask(dragDestinationAction) };
    73297347}
     
    74297447    [self computeClientAndGlobalPointsForDropSession:dropSession outClientPoint:&client outGlobalPoint:&global];
    74307448    [self cleanUpDragSourceSessionState];
    7431     _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), _page->currentDragOperation());
     7449    auto currentDragOperation = _page->currentDragOperation();
     7450    _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), currentDragOperation ? *currentDragOperation : OptionSet<WebCore::DragOperation>({ }));
    74327451}
    74337452
     
    80188037            // The lift was canceled, so -dropInteraction:sessionDidEnd: will never be invoked. This is the last chance to clean up.
    80198038            [protectedSelf cleanUpDragSourceSessionState];
    8020             page->dragEnded(positionForDragEnd, positionForDragEnd, WebCore::DragOperationNone);
     8039            page->dragEnded(positionForDragEnd, positionForDragEnd, { });
    80218040        }
    80228041#if !RELEASE_LOG_DISABLED
     
    80538072
    80548073    [self cleanUpDragSourceSessionState];
    8055     _page->dragEnded(WebCore::roundedIntPoint(_dragDropInteractionState.adjustedPositionForDragEnd()), WebCore::roundedIntPoint(_dragDropInteractionState.adjustedPositionForDragEnd()), operation);
     8074    _page->dragEnded(WebCore::roundedIntPoint(_dragDropInteractionState.adjustedPositionForDragEnd()), WebCore::roundedIntPoint(_dragDropInteractionState.adjustedPositionForDragEnd()), coreDragOperationForUIDropOperation(operation));
    80568075}
    80578076
     
    82728291    [self computeClientAndGlobalPointsForDropSession:session outClientPoint:&client outGlobalPoint:&global];
    82738292    [self cleanUpDragSourceSessionState];
    8274     _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), WebCore::DragOperationNone);
     8293    _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), { });
    82758294}
    82768295
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/gtk/WebDragClientGtk.cpp

    r261802 r262680  
    7676    m_page->willStartDrag();
    7777
    78     m_page->send(Messages::WebPageProxy::StartDrag(dataTransfer.pasteboard().selectionData(), dataTransfer.sourceOperation(), handle));
     78    m_page->send(Messages::WebPageProxy::StartDrag(dataTransfer.pasteboard().selectionData(), dataTransfer.sourceOperationMask(), handle));
    7979}
    8080
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r262603 r262680  
    39463946
    39473947#if PLATFORM(GTK)
    3948 void WebPage::performDragControllerAction(DragControllerAction action, const IntPoint& clientPosition, const IntPoint& globalPosition, uint64_t draggingSourceOperationMask, SelectionData&& selectionData, uint32_t flags)
     3948void WebPage::performDragControllerAction(DragControllerAction action, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> draggingSourceOperationMask, SelectionData&& selectionData, uint32_t flags)
    39493949{
    39503950    if (!m_page) {
    3951         send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone, DragHandlingMethod::None, false, 0, { }, { }));
    3952         return;
    3953     }
    3954 
    3955     DragData dragData(&selectionData, clientPosition, globalPosition, static_cast<DragOperation>(draggingSourceOperationMask), static_cast<DragApplicationFlags>(flags));
     3951        send(Messages::WebPageProxy::DidPerformDragControllerAction(WTF::nullopt, DragHandlingMethod::None, false, 0, { }, { }));
     3952        return;
     3953    }
     3954
     3955    DragData dragData(&selectionData, clientPosition, globalPosition, draggingSourceOperationMask, static_cast<DragApplicationFlags>(flags));
    39563956    switch (action) {
    39573957    case DragControllerAction::Entered: {
    3958         DragOperation resolvedDragOperation = m_page->dragController().dragEntered(dragData);
     3958        auto resolvedDragOperation = m_page->dragController().dragEntered(dragData);
    39593959        send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), { }, { }));
    39603960        return;
    39613961    }
    39623962    case DragControllerAction::Updated: {
    3963         DragOperation resolvedDragOperation = m_page->dragController().dragUpdated(dragData);
     3963        auto resolvedDragOperation = m_page->dragController().dragUpdated(dragData);
    39643964        send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), { }, { }));
    39653965        return;
     
    39803980{
    39813981    if (!m_page) {
    3982         send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone, DragHandlingMethod::None, false, 0, { }, { }));
     3982        send(Messages::WebPageProxy::DidPerformDragControllerAction(WTF::nullopt, DragHandlingMethod::None, false, 0, { }, { }));
    39833983        return;
    39843984    }
     
    39863986    switch (action) {
    39873987    case DragControllerAction::Entered: {
    3988         DragOperation resolvedDragOperation = m_page->dragController().dragEntered(dragData);
     3988        auto resolvedDragOperation = m_page->dragController().dragEntered(dragData);
    39893989        send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), m_page->dragCaretController().caretRectInRootViewCoordinates(), m_page->dragCaretController().editableElementRectInRootViewCoordinates()));
    39903990        return;
    39913991    }
    39923992    case DragControllerAction::Updated: {
    3993         DragOperation resolvedDragOperation = m_page->dragController().dragUpdated(dragData);
     3993        auto resolvedDragOperation = m_page->dragController().dragUpdated(dragData);
    39943994        send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), m_page->dragCaretController().caretRectInRootViewCoordinates(), m_page->dragCaretController().editableElementRectInRootViewCoordinates()));
    39953995        return;
     
    39973997    case DragControllerAction::Exited:
    39983998        m_page->dragController().dragExited(dragData);
    3999         send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone, DragHandlingMethod::None, false, 0, { }, { }));
     3999        send(Messages::WebPageProxy::DidPerformDragControllerAction(WTF::nullopt, DragHandlingMethod::None, false, 0, { }, { }));
    40004000        return;
    40014001       
     
    40244024#endif
    40254025
    4026 void WebPage::dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)
     4026void WebPage::dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation> dragOperationMask)
    40274027{
    40284028    IntPoint adjustedClientPosition(clientPosition.x() + m_page->dragController().dragOffset().x(), clientPosition.y() + m_page->dragController().dragOffset().y());
     
    40354035    // FIXME: These are fake modifier keys here, but they should be real ones instead.
    40364036    PlatformMouseEvent event(adjustedClientPosition, adjustedGlobalPosition, LeftButton, PlatformEvent::MouseMoved, 0, false, false, false, false, WallTime::now(), 0, WebCore::NoTap);
    4037     m_page->mainFrame().eventHandler().dragSourceEndedAt(event, (DragOperation)operation);
     4037    m_page->mainFrame().eventHandler().dragSourceEndedAt(event, dragOperationMask);
    40384038
    40394039    send(Messages::WebPageProxy::DidEndDragging());
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r262603 r262680  
    900900
    901901#if ENABLE(DRAG_SUPPORT) && PLATFORM(GTK)
    902     void performDragControllerAction(DragControllerAction, const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_t draggingSourceOperationMask, WebCore::SelectionData&&, uint32_t flags);
     902    void performDragControllerAction(DragControllerAction, const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, OptionSet<WebCore::DragOperation> draggingSourceOperationMask, WebCore::SelectionData&&, uint32_t flags);
    903903#endif
    904904
     
    908908
    909909#if ENABLE(DRAG_SUPPORT)
    910     void dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation);
     910    void dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation>);
    911911
    912912    void willPerformLoadDragDestinationAction();
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r261966 r262680  
    310310    # Drag and drop.
    311311#if PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
    312     PerformDragControllerAction(enum:uint8_t WebKit::DragControllerAction action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, WebCore::SelectionData selection, uint32_t flags)
     312    PerformDragControllerAction(enum:uint8_t WebKit::DragControllerAction action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation> draggingSourceOperationMask, WebCore::SelectionData selection, uint32_t flags)
    313313#endif
    314314#if !PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
     
    317317#if ENABLE(DRAG_SUPPORT)
    318318    DidStartDrag()
    319     DragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)
     319    DragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation> dragOperationMask)
    320320    DragCancelled()
    321321#endif
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r262665 r262680  
    925925    PlatformMouseEvent event(clientPosition, globalPosition, LeftButton, PlatformEvent::MouseMoved, 0, false, false, false, false, WallTime::now(), 0, NoTap);
    926926    m_page->dragController().dragEnded();
    927     m_page->mainFrame().eventHandler().dragSourceEndedAt(event, DragOperationNone, MayExtendDragSession::Yes);
     927    m_page->mainFrame().eventHandler().dragSourceEndedAt(event, { }, MayExtendDragSession::Yes);
    928928
    929929    bool didHandleDrag = m_page->mainFrame().eventHandler().tryToBeginDragAtPoint(clientPosition, globalPosition);
  • trunk/Source/WebKitLegacy/mac/ChangeLog

    r262676 r262680  
     12020-06-06  David Kilzer  <ddkilzer@apple.com>
     2
     3        Use OptionSet<DragOperation> for mask values
     4        <https://webkit.org/b/212605>
     5
     6        Reviewed by Darin Adler.
     7
     8        In broad strokes:
     9        - Replace use of DragOperation with OptionSet<DragOperation> or
     10          Optional<DragOperation>.
     11        - Rename function parameters and local variables to denote use
     12          of mask values.
     13        - Remove DragOperationNone enum value.
     14        - Replace DragOperationEvery enum value with anyDragOperation().
     15
     16        * WebView/WebFrame.mm:
     17        (-[WebFrame _dragSourceEndedAt:operation:]):
     18        * WebView/WebHTMLView.mm:
     19        (kit): Add conversion function.
     20        (-[WebHTMLView draggingSourceOperationMaskForLocal:]):
     21        (-[WebHTMLView draggingSession:sourceOperationMaskForDraggingContext:]):
     22        * WebView/WebView.mm:
     23        (coreDragOperationMask): Add conversion function.
     24        (kit): Ditto.
     25        - Map WebCore::DragOperationGeneric to _UIDragOperationMove
     26          based on logic in WebCore.  All other WebCore::DragOperation
     27          enum values map to _UIDragOperationNone.
     28        (-[WebView dragDataForSession:client:global:operation:]):
     29        (-[WebView _enteredDataInteraction:client:global:operation:]):
     30        (-[WebView _updatedDataInteraction:client:global:operation:]):
     31        (-[WebView draggingEntered:]):
     32        (-[WebView draggingUpdated:]):
     33        (-[WebView draggingExited:]):
     34        (-[WebView performDragOperation:]):
     35        * WebView/WebViewInternal.h:
     36        (CocoaDragOperation):
     37        - Add typedef so coreDragOperationMask() may be shared across
     38          platforms.
     39        (coreDragOperationMask): Add declaration.
     40        (coreOptions):
     41        - Remove redundant parameter name.
     42
    1432020-06-06  Jonathan Bedard  <jbedard@apple.com>
    244
  • trunk/Source/WebKitLegacy/mac/WebView/WebFrame.mm

    r261210 r262680  
    943943
    944944#if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC)
    945 - (void)_dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)operation
     945- (void)_dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)dragOperationMask
    946946{
    947947    if (!_private->coreFrame)
     
    953953    WebCore::PlatformMouseEvent event(WebCore::IntPoint(windowLoc), WebCore::IntPoint(WebCore::globalPoint(windowLoc, [view->platformWidget() window])),
    954954        WebCore::LeftButton, WebCore::PlatformEvent::MouseMoved, 0, false, false, false, false, WallTime::now(), WebCore::ForceAtClick, WebCore::NoTap);
    955     _private->coreFrame->eventHandler().dragSourceEndedAt(event, (WebCore::DragOperation)operation);
     955    _private->coreFrame->eventHandler().dragSourceEndedAt(event, coreDragOperationMask(dragOperationMask));
    956956}
    957957#endif // ENABLE(DRAG_SUPPORT) && PLATFORM(MAC)
  • trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm

    r261981 r262680  
    11/*
    2  * Copyright (C) 2005-2019 Apple Inc. All rights reserved.
     2 * Copyright (C) 2005-2020 Apple Inc. All rights reserved.
    33 *           (C) 2006, 2007 Graham Dennis (graham.dennis@gmail.com)
    44 *
     
    42304230
    42314231#if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC)
     4232
     4233static NSDragOperation kit(OptionSet<WebCore::DragOperation> operationMask)
     4234{
     4235    NSDragOperation result = NSDragOperationNone;
     4236    if (operationMask.contains(WebCore::DragOperationCopy))
     4237        result |= NSDragOperationCopy;
     4238    if (operationMask.contains(WebCore::DragOperationLink))
     4239        result |= NSDragOperationLink;
     4240    if (operationMask.contains(WebCore::DragOperationGeneric))
     4241        result |= NSDragOperationGeneric;
     4242    if (operationMask.contains(WebCore::DragOperationPrivate))
     4243        result |= NSDragOperationPrivate;
     4244    if (operationMask.contains(WebCore::DragOperationMove))
     4245        result |= NSDragOperationMove;
     4246    if (operationMask.contains(WebCore::DragOperationDelete))
     4247        result |= NSDragOperationDelete;
     4248    return result;
     4249}
     4250
    42324251ALLOW_DEPRECATED_IMPLEMENTATIONS_BEGIN
    42334252- (void)dragImage:(NSImage *)dragImage
     
    42814300        return NSDragOperationNone;
    42824301
    4283     return (NSDragOperation)page->dragController().sourceDragOperation();
     4302    return kit(page->dragController().sourceDragOperationMask());
    42844303}
    42854304
     
    43874406        return NSDragOperationNone;
    43884407
    4389     return (NSDragOperation)page->dragController().sourceDragOperation();
     4408    return kit(page->dragController().sourceDragOperationMask());
    43904409}
    43914410
  • trunk/Source/WebKitLegacy/mac/WebView/WebView.mm

    r262456 r262680  
    590590    return result;
    591591}
     592
     593#if !USE(APPKIT)
     594// See <UIKit/UIDragging_Private.h>.
     595typedef NS_OPTIONS(NSUInteger, _UIDragOperation) {
     596    _UIDragOperationNone = 0,
     597    _UIDragOperationCopy = 1,
     598    _UIDragOperationMove = 16,
     599};
     600#endif
     601
     602OptionSet<WebCore::DragOperation> coreDragOperationMask(CocoaDragOperation operation)
     603{
     604    OptionSet<WebCore::DragOperation> result;
     605
     606#if USE(APPKIT)
     607    if (operation & NSDragOperationCopy)
     608        result.add(WebCore::DragOperationCopy);
     609    if (operation & NSDragOperationLink)
     610        result.add(WebCore::DragOperationLink);
     611    if (operation & NSDragOperationGeneric)
     612        result.add(WebCore::DragOperationGeneric);
     613    if (operation & NSDragOperationPrivate)
     614        result.add(WebCore::DragOperationPrivate);
     615    if (operation & NSDragOperationMove)
     616        result.add(WebCore::DragOperationMove);
     617    if (operation & NSDragOperationDelete)
     618        result.add(WebCore::DragOperationDelete);
     619#else
     620    if (operation & _UIDragOperationCopy)
     621        result.add(WebCore::DragOperationCopy);
     622    if (operation & _UIDragOperationMove)
     623        result.add(WebCore::DragOperationMove);
     624#endif // USE(APPKIT)
     625
     626    return result;
     627}
     628
     629#if USE(APPKIT)
     630static NSDragOperation kit(Optional<WebCore::DragOperation> dragOperation)
     631{
     632    if (!dragOperation)
     633        return NSDragOperationNone;
     634
     635    switch (*dragOperation) {
     636    case WebCore::DragOperationCopy:
     637        return NSDragOperationCopy;
     638    case WebCore::DragOperationLink:
     639        return NSDragOperationLink;
     640    case WebCore::DragOperationGeneric:
     641        return NSDragOperationGeneric;
     642    case WebCore::DragOperationPrivate:
     643        return NSDragOperationPrivate;
     644    case WebCore::DragOperationMove:
     645        return NSDragOperationMove;
     646    case WebCore::DragOperationDelete:
     647        return NSDragOperationDelete;
     648    }
     649
     650    ASSERT_NOT_REACHED();
     651    return NSDragOperationNone;
     652}
     653#else
     654static _UIDragOperation kit(Optional<WebCore::DragOperation> dragOperation)
     655{
     656    if (!dragOperation)
     657        return _UIDragOperationNone;
     658
     659    switch (*dragOperation) {
     660    case WebCore::DragOperationCopy:
     661        return _UIDragOperationCopy;
     662    case WebCore::DragOperationLink:
     663        return _UIDragOperationNone;
     664    case WebCore::DragOperationGeneric:
     665        return _UIDragOperationMove;
     666    case WebCore::DragOperationPrivate:
     667        return _UIDragOperationNone;
     668    case WebCore::DragOperationMove:
     669        return _UIDragOperationMove;
     670    case WebCore::DragOperationDelete:
     671        return _UIDragOperationNone;
     672    }
     673
     674    ASSERT_NOT_REACHED();
     675    return _UIDragOperationNone;
     676}
     677#endif // USE(APPKIT)
    592678#endif // ENABLE(DRAG_SUPPORT)
    593679
     
    19242010- (WebCore::DragData)dragDataForSession:(id <UIDropSession>)session client:(CGPoint)clientPosition global:(CGPoint)globalPosition operation:(uint64_t)operation
    19252011{
    1926     auto dragOperationMask = static_cast<WebCore::DragOperation>(operation);
     2012    auto dragOperationMask = coreDragOperationMask(operation);
    19272013    auto dragDestinationActionMask = coreDragDestinationActionMask([self dragDestinationActionMaskForSession:session]);
    19282014    return { session, WebCore::roundedIntPoint(clientPosition), WebCore::roundedIntPoint(globalPosition), dragOperationMask, WebCore::DragApplicationNone, dragDestinationActionMask };
     
    19332019    WebThreadLock();
    19342020    auto dragData = [self dragDataForSession:session client:clientPosition global:globalPosition operation:operation];
    1935     return _private->page->dragController().dragEntered(dragData);
     2021    return kit(_private->page->dragController().dragEntered(dragData));
    19362022}
    19372023
     
    19402026    WebThreadLock();
    19412027    auto dragData = [self dragDataForSession:session client:clientPosition global:globalPosition operation:operation];
    1942     return _private->page->dragController().dragUpdated(dragData);
     2028    return kit(_private->page->dragController().dragUpdated(dragData));
    19432029}
    19442030
     
    67496835    WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window]));
    67506836
    6751     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
    6752     return core(self)->dragController().dragEntered(dragData);
     6837    WebCore::DragData dragData(draggingInfo, client, global, coreDragOperationMask([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
     6838    return kit(core(self)->dragController().dragEntered(dragData));
    67536839}
    67546840
     
    67626848    WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window]));
    67636849
    6764     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
    6765     return page->dragController().dragUpdated(dragData);
     6850    WebCore::DragData dragData(draggingInfo, client, global, coreDragOperationMask([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo], [self actionMaskForDraggingInfo:draggingInfo]);
     6851    return kit(page->dragController().dragUpdated(dragData));
    67666852}
    67676853
     
    67746860    WebCore::IntPoint client([draggingInfo draggingLocation]);
    67756861    WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window]));
    6776     WebCore::DragData dragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
     6862    WebCore::DragData dragData(draggingInfo, client, global, coreDragOperationMask([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
    67776863    page->dragController().dragExited(dragData);
    67786864}
     
    67876873    WebCore::IntPoint client([draggingInfo draggingLocation]);
    67886874    WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window]));
    6789     auto* dragData = new WebCore::DragData(draggingInfo, client, global, static_cast<WebCore::DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
     6875    auto* dragData = new WebCore::DragData(draggingInfo, client, global, coreDragOperationMask([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
    67906876
    67916877    NSArray* types = draggingInfo.draggingPasteboard.types;
  • trunk/Source/WebKitLegacy/mac/WebView/WebViewInternal.h

    r262456 r262680  
    11/*
    2  * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
     2 * Copyright (C) 2005-2020 Apple Inc. All rights reserved.
    33 * Copyright (C) 2010 Igalia S.L
    44 *
     
    3737
    3838#import <WebCore/AlternativeTextClient.h>
     39#import <WebCore/DragActions.h>
    3940#import <WebCore/FindOptions.h>
    4041#import <WebCore/FloatRect.h>
     
    9091#ifdef __cplusplus
    9192
    92 WebCore::FindOptions coreOptions(WebFindOptions options);
     93#if ENABLE(DRAG_SUPPORT)
     94#if USE(APPKIT)
     95using CocoaDragOperation = NSDragOperation;
     96#else
     97using CocoaDragOperation = uint64_t;
     98#endif
     99
     100OptionSet<WebCore::DragOperation> coreDragOperationMask(CocoaDragOperation);
     101#endif // ENABLE(DRAG_SUPPORT)
     102
     103WebCore::FindOptions coreOptions(WebFindOptions);
    93104
    94105OptionSet<WebCore::LayoutMilestone> coreLayoutMilestones(WebLayoutMilestones);
  • trunk/Source/WebKitLegacy/win/ChangeLog

    r262395 r262680  
     12020-06-06  David Kilzer  <ddkilzer@apple.com>
     2
     3        Use OptionSet<DragOperation> for mask values
     4        <https://webkit.org/b/212605>
     5
     6        Reviewed by Darin Adler.
     7
     8        In broad strokes:
     9        - Replace use of DragOperation with OptionSet<DragOperation> or
     10          Optional<DragOperation>.
     11        - Rename function parameters and local variables to denote use
     12          of mask values.
     13        - Remove DragOperationNone enum value.
     14        - Replace DragOperationEvery enum value with anyDragOperation().
     15
     16        * WebCoreSupport/WebDragClient.cpp:
     17        (draggingSourceOperationMaskToDragCursors):
     18        (WebDragClient::startDrag):
     19        * WebView.cpp:
     20        (dragOperationToDragCursor):
     21        (WebView::keyStateToDragOperation const):
     22        (WebView::DragLeave):
     23        * WebView.h:
     24        (WebView::keyStateToDragOperation const):
     25
    1262020-06-01  David Kilzer  <ddkilzer@apple.com>
    227
  • trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp

    r262395 r262680  
    4545using namespace WebCore;
    4646
    47 static DWORD draggingSourceOperationMaskToDragCursors(DragOperation op)
     47static DWORD draggingSourceOperationMaskToDragCursors(OptionSet<DragOperation> operationMask)
    4848{
    4949    DWORD result = DROPEFFECT_NONE;
    50     if (op == DragOperationEvery)
     50    if (operationMask == anyDragOperation())
    5151        return DROPEFFECT_COPY | DROPEFFECT_LINK | DROPEFFECT_MOVE;
    52     if (op & DragOperationCopy)
     52    if (operationMask.contains(DragOperationCopy))
    5353        result |= DROPEFFECT_COPY;
    54     if (op & DragOperationLink)
     54    if (operationMask.contains(DragOperationLink))
    5555        result |= DROPEFFECT_LINK;
    56     if (op & DragOperationMove)
     56    if (operationMask.contains(DragOperationMove))
    5757        result |= DROPEFFECT_MOVE;
    58     if (op & DragOperationGeneric)
     58    if (operationMask.contains(DragOperationGeneric))
    5959        result |= DROPEFFECT_MOVE;
    6060    return result;
     
    153153        }
    154154
    155         DWORD okEffect = draggingSourceOperationMaskToDragCursors(m_webView->page()->dragController().sourceDragOperation());
     155        DWORD okEffect = draggingSourceOperationMaskToDragCursors(m_webView->page()->dragController().sourceDragOperationMask());
    156156        DWORD effect = DROPEFFECT_NONE;
    157157        COMPtr<IWebUIDelegate> ui;
     
    165165            hr = DoDragDrop(dataObject.get(), source.get(), okEffect, &effect);
    166166
    167         DragOperation operation = DragOperationNone;
     167        OptionSet<DragOperation> operation;
    168168        if (hr == DRAGDROP_S_DROP) {
    169169            if (effect & DROPEFFECT_COPY)
  • trunk/Source/WebKitLegacy/win/WebView.cpp

    r262377 r262680  
    58435843}
    58445844
    5845 static DWORD dragOperationToDragCursor(DragOperation op) {
    5846     DWORD res = DROPEFFECT_NONE;
    5847     if (op & DragOperationCopy)
    5848         res = DROPEFFECT_COPY;
    5849     else if (op & DragOperationLink)
    5850         res = DROPEFFECT_LINK;
    5851     else if (op & DragOperationMove)
    5852         res = DROPEFFECT_MOVE;
    5853     else if (op & DragOperationGeneric)
    5854         res = DROPEFFECT_MOVE; //This appears to be the Firefox behaviour
    5855     return res;
    5856 }
    5857 
    5858 DragOperation WebView::keyStateToDragOperation(DWORD grfKeyState) const
     5845static DWORD dragOperationToDragCursor(Optional<DragOperation> operation)
     5846{
     5847    if (!operation)
     5848        return DROPEFFECT_NONE;
     5849
     5850    DWORD result = DROPEFFECT_NONE;
     5851    if (*operation == DragOperationCopy)
     5852        result = DROPEFFECT_COPY;
     5853    else if (*operation == DragOperationLink)
     5854        result = DROPEFFECT_LINK;
     5855    else if (*operation == DragOperationMove)
     5856        result = DROPEFFECT_MOVE;
     5857    else if (*operation == DragOperationGeneric)
     5858        result = DROPEFFECT_MOVE; // This appears to be the Firefox behaviour.
     5859    return result;
     5860}
     5861
     5862OptionSet<DragOperation> WebView::keyStateToDragOperation(DWORD grfKeyState) const
    58595863{
    58605864    if (!m_page)
    5861         return DragOperationNone;
     5865        return { };
    58625866
    58635867    // Conforms to Microsoft's key combinations as documented for
     
    58655869    // state of the keyboard modifier keys on the keyboard. See:
    58665870    // <http://msdn.microsoft.com/en-us/library/ms680129(VS.85).aspx>.
    5867     DragOperation operation = m_page->dragController().sourceDragOperation();
     5871    auto operationMask = m_page->dragController().sourceDragOperationMask();
    58685872
    58695873    if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT))
    5870         operation = DragOperationLink;
     5874        operationMask = { DragOperationLink };
    58715875    else if ((grfKeyState & MK_CONTROL) == MK_CONTROL)
    5872         operation = DragOperationCopy;
     5876        operationMask = { DragOperationCopy };
    58735877    else if ((grfKeyState & MK_SHIFT) == MK_SHIFT)
    5874         operation = DragOperationGeneric;
    5875 
    5876     return operation;
     5878        operationMask = { DragOperationGeneric };
     5879
     5880    return operationMask;
    58775881}
    58785882
     
    59205924
    59215925    if (m_dragData) {
    5922         DragData data(m_dragData.get(), IntPoint(), IntPoint(),
    5923             DragOperationNone);
     5926        DragData data(m_dragData.get(), IntPoint(), IntPoint(), { });
    59245927        m_page->dragController().dragExited(data);
    59255928        m_dragData = 0;
  • trunk/Source/WebKitLegacy/win/WebView.h

    r257465 r262680  
    556556    void performLayeredWindowUpdate();
    557557
    558     WebCore::DragOperation keyStateToDragOperation(DWORD grfKeyState) const;
     558    OptionSet<WebCore::DragOperation> keyStateToDragOperation(DWORD grfKeyState) const;
    559559
    560560    // FIXME: This variable is part of a workaround. The drop effect (pdwEffect) passed to Drop is incorrect.
Note: See TracChangeset for help on using the changeset viewer.