[IPC] Adopt enum class for DragOperation
<https://webkit.org/b/212870>
<rdar://problem/64069940>

Reviewed by Darin Adler.

Source/WebCore:

* dom/DataTransfer.cpp:
(WebCore::dragOpFromIEOp):
(WebCore::IEOpFromDragOp):
(WebCore::DataTransfer::sourceOperationMask const):
(WebCore::DataTransfer::destinationOperationMask const):
(WebCore::DataTransfer::setSourceOperationMask):
(WebCore::DataTransfer::setDestinationOperationMask):
(WebCore::DataTransfer::setEffectAllowed):
* page/DragActions.h:
(WebCore::DragOperation):
- Convert to enum class.
(WebCore::anyDragOperation):
* page/DragController.cpp:
(WebCore::DragController::platformGenericDragOperation):
(WebCore::DragController::dragEnteredOrUpdated):
(WebCore::DragController::tryDocumentDrag):
(WebCore::defaultOperationForDrag):
(WebCore::DragController::startDrag):
* page/EventHandler.cpp:
(WebCore::convertDropZoneOperationToDragOperation):
(WebCore::convertDragOperationToDropZoneOperation):
* page/gtk/DragControllerGtk.cpp:
(WebCore::DragController::dragOperation):
* page/mac/DragControllerMac.mm:
(WebCore::DragController::dragOperation):
(WebCore::DragController::platformGenericDragOperation):
* page/win/DragControllerWin.cpp:
(WebCore::DragController::dragOperation):
* platform/gtk/GtkUtilities.cpp:
(WebCore::gdkDragActionToDragOperation):
(WebCore::dragOperationToGdkDragActions):
(WebCore::dragOperationToSingleGdkDragAction):

Source/WebKit:

* Scripts/webkit/messages.py:
- Remove FIXME now that it's not needed.
* Shared/API/Cocoa/_WKDragActionsInternal.h:
(WebKit::coreDragOperationMask):
* UIProcess/Cocoa/WebViewImpl.mm:
(WebKit::kit):
* UIProcess/ios/WKContentViewInteraction.mm:
(dropOperationForWebCoreDragOperation):
(coreDragOperationForUIDropOperation):
(-[WKContentView dragDataForDropSession:dragDestinationAction:]):

Source/WebKitLegacy/mac:

* WebView/WebHTMLView.mm:
(kit):
* WebView/WebView.mm:
(coreDragOperationMask):
(kit):

Source/WebKitLegacy/win:

* WebCoreSupport/WebDragClient.cpp:
(draggingSourceOperationMaskToDragCursors):
(WebDragClient::startDrag):
* WebView.cpp:
(dragOperationToDragCursor):
(WebView::keyStateToDragOperation const):

Tools:

* Scripts/do-webcore-rename:
- Do DragOperation renames.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@262735 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index d8d0115..a082496 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,44 @@
+2020-06-08  David Kilzer  <ddkilzer@apple.com>
+
+        [IPC] Adopt enum class for DragOperation
+        <https://webkit.org/b/212870>
+        <rdar://problem/64069940>
+
+        Reviewed by Darin Adler.
+
+        * dom/DataTransfer.cpp:
+        (WebCore::dragOpFromIEOp):
+        (WebCore::IEOpFromDragOp):
+        (WebCore::DataTransfer::sourceOperationMask const):
+        (WebCore::DataTransfer::destinationOperationMask const):
+        (WebCore::DataTransfer::setSourceOperationMask):
+        (WebCore::DataTransfer::setDestinationOperationMask):
+        (WebCore::DataTransfer::setEffectAllowed):
+        * page/DragActions.h:
+        (WebCore::DragOperation):
+        - Convert to enum class.
+        (WebCore::anyDragOperation):
+        * page/DragController.cpp:
+        (WebCore::DragController::platformGenericDragOperation):
+        (WebCore::DragController::dragEnteredOrUpdated):
+        (WebCore::DragController::tryDocumentDrag):
+        (WebCore::defaultOperationForDrag):
+        (WebCore::DragController::startDrag):
+        * page/EventHandler.cpp:
+        (WebCore::convertDropZoneOperationToDragOperation):
+        (WebCore::convertDragOperationToDropZoneOperation):
+        * page/gtk/DragControllerGtk.cpp:
+        (WebCore::DragController::dragOperation):
+        * page/mac/DragControllerMac.mm:
+        (WebCore::DragController::dragOperation):
+        (WebCore::DragController::platformGenericDragOperation):
+        * page/win/DragControllerWin.cpp:
+        (WebCore::DragController::dragOperation):
+        * platform/gtk/GtkUtilities.cpp:
+        (WebCore::gdkDragActionToDragOperation):
+        (WebCore::dragOperationToGdkDragActions):
+        (WebCore::dragOperationToSingleGdkDragAction):
+
 2020-06-08  Sam Weinig  <weinig@apple.com>
 
         Extended Color: Unify rounding / clamping conversions between 0-1 float components and 0-255 byte components
diff --git a/Source/WebCore/dom/DataTransfer.cpp b/Source/WebCore/dom/DataTransfer.cpp
index e6eb979..b45a13d 100644
--- a/Source/WebCore/dom/DataTransfer.cpp
+++ b/Source/WebCore/dom/DataTransfer.cpp
@@ -603,39 +603,39 @@
     if (operation == "none")
         return { };
     if (operation == "copy")
-        return { DragOperationCopy };
+        return { DragOperation::Copy };
     if (operation == "link")
-        return { DragOperationLink };
+        return { DragOperation::Link };
     if (operation == "move")
-        return { DragOperationGeneric, DragOperationMove };
+        return { DragOperation::Generic, DragOperation::Move };
     if (operation == "copyLink")
-        return { DragOperationCopy, DragOperationLink };
+        return { DragOperation::Copy, DragOperation::Link };
     if (operation == "copyMove")
-        return { DragOperationCopy, DragOperationGeneric, DragOperationMove };
+        return { DragOperation::Copy, DragOperation::Generic, DragOperation::Move };
     if (operation == "linkMove")
-        return { DragOperationLink, DragOperationGeneric, DragOperationMove };
+        return { DragOperation::Link, DragOperation::Generic, DragOperation::Move };
     if (operation == "all")
         return anyDragOperation();
-    return { DragOperationPrivate }; // Really a marker for "no conversion".
+    return { DragOperation::Private }; // Really a marker for "no conversion".
 }
 
 static const char* IEOpFromDragOp(OptionSet<DragOperation> operationMask)
 {
-    bool isGenericMove = operationMask.containsAny({ DragOperationGeneric, DragOperationMove });
+    bool isGenericMove = operationMask.containsAny({ DragOperation::Generic, DragOperation::Move });
 
-    if ((isGenericMove && operationMask.containsAll({ DragOperationCopy, DragOperationLink })) || operationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }))
+    if ((isGenericMove && operationMask.containsAll({ DragOperation::Copy, DragOperation::Link })) || operationMask.containsAll({ DragOperation::Copy, DragOperation::Link, DragOperation::Generic, DragOperation::Private, DragOperation::Move, DragOperation::Delete }))
         return "all";
-    if (isGenericMove && operationMask.contains(DragOperationCopy))
+    if (isGenericMove && operationMask.contains(DragOperation::Copy))
         return "copyMove";
-    if (isGenericMove && operationMask.contains(DragOperationLink))
+    if (isGenericMove && operationMask.contains(DragOperation::Link))
         return "linkMove";
-    if (operationMask.containsAll({ DragOperationCopy, DragOperationLink }))
+    if (operationMask.containsAll({ DragOperation::Copy, DragOperation::Link }))
         return "copyLink";
     if (isGenericMove)
         return "move";
-    if (operationMask.contains(DragOperationCopy))
+    if (operationMask.contains(DragOperation::Copy))
         return "copy";
-    if (operationMask.contains(DragOperationLink))
+    if (operationMask.contains(DragOperation::Link))
         return "link";
     return "none";
 }
@@ -643,26 +643,26 @@
 OptionSet<DragOperation> DataTransfer::sourceOperationMask() const
 {
     auto operationMask = dragOpFromIEOp(m_effectAllowed);
-    ASSERT(operationMask != DragOperationPrivate);
+    ASSERT(operationMask != DragOperation::Private);
     return operationMask;
 }
 
 OptionSet<DragOperation> DataTransfer::destinationOperationMask() const
 {
     auto operationMask = dragOpFromIEOp(m_dropEffect);
-    ASSERT(operationMask == DragOperationCopy || operationMask.isEmpty() || operationMask == DragOperationLink || operationMask == OptionSet<DragOperation>({ DragOperationGeneric, DragOperationMove }) || operationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }));
+    ASSERT(operationMask == DragOperation::Copy || operationMask.isEmpty() || operationMask == DragOperation::Link || operationMask == OptionSet<DragOperation>({ DragOperation::Generic, DragOperation::Move }) || operationMask.containsAll({ DragOperation::Copy, DragOperation::Link, DragOperation::Generic, DragOperation::Private, DragOperation::Move, DragOperation::Delete }));
     return operationMask;
 }
 
 void DataTransfer::setSourceOperationMask(OptionSet<DragOperation> operationMask)
 {
-    ASSERT_ARG(operationMask, operationMask != DragOperationPrivate);
+    ASSERT_ARG(operationMask, operationMask != DragOperation::Private);
     m_effectAllowed = IEOpFromDragOp(operationMask);
 }
 
 void DataTransfer::setDestinationOperationMask(OptionSet<DragOperation> operationMask)
 {
-    ASSERT_ARG(operationMask, operationMask == DragOperationCopy || operationMask.isEmpty() || operationMask == DragOperationLink || operationMask == DragOperationGeneric || operationMask == DragOperationMove || operationMask == OptionSet<DragOperation>({ DragOperationGeneric, DragOperationMove }));
+    ASSERT_ARG(operationMask, operationMask == DragOperation::Copy || operationMask.isEmpty() || operationMask == DragOperation::Link || operationMask == DragOperation::Generic || operationMask == DragOperation::Move || operationMask == OptionSet<DragOperation>({ DragOperation::Generic, DragOperation::Move }));
     m_dropEffect = IEOpFromDragOp(operationMask);
 }
 
@@ -698,7 +698,7 @@
         return;
 
     // Ignore any attempts to set it to an unknown value.
-    if (dragOpFromIEOp(effect) == DragOperationPrivate)
+    if (dragOpFromIEOp(effect) == DragOperation::Private)
         return;
 
     if (!canWriteData())
diff --git a/Source/WebCore/page/DragActions.h b/Source/WebCore/page/DragActions.h
index f3dd3e5..e745635 100644
--- a/Source/WebCore/page/DragActions.h
+++ b/Source/WebCore/page/DragActions.h
@@ -61,18 +61,18 @@
 } DragSourceAction;
 
 // See NSDragOperation, _UIDragOperation and UIDropOperation.
-enum DragOperation {
-    DragOperationCopy    = 1,
-    DragOperationLink    = 2,
-    DragOperationGeneric = 4,
-    DragOperationPrivate = 8,
-    DragOperationMove    = 16,
-    DragOperationDelete  = 32,
+enum class DragOperation : uint8_t {
+    Copy    = 1,
+    Link    = 2,
+    Generic = 4,
+    Private = 8,
+    Move    = 16,
+    Delete  = 32,
 };
 
 constexpr OptionSet<DragOperation> anyDragOperation()
 {
-    return { DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete };
+    return { DragOperation::Copy, DragOperation::Link, DragOperation::Generic, DragOperation::Private, DragOperation::Move, DragOperation::Delete };
 }
 
 enum class MayExtendDragSession : bool { No, Yes };
@@ -99,12 +99,12 @@
 template<> struct EnumTraits<WebCore::DragOperation> {
     using values = EnumValues<
         WebCore::DragOperation,
-        WebCore::DragOperationCopy,
-        WebCore::DragOperationLink,
-        WebCore::DragOperationGeneric,
-        WebCore::DragOperationPrivate,
-        WebCore::DragOperationMove,
-        WebCore::DragOperationDelete
+        WebCore::DragOperation::Copy,
+        WebCore::DragOperation::Link,
+        WebCore::DragOperation::Generic,
+        WebCore::DragOperation::Private,
+        WebCore::DragOperation::Move,
+        WebCore::DragOperation::Delete
     >;
 };
 
@@ -120,12 +120,12 @@
 template<> struct OptionSetTraits<WebCore::DragOperation> {
     using values = OptionSetValues<
         WebCore::DragOperation,
-        WebCore::DragOperationCopy,
-        WebCore::DragOperationLink,
-        WebCore::DragOperationGeneric,
-        WebCore::DragOperationPrivate,
-        WebCore::DragOperationMove,
-        WebCore::DragOperationDelete
+        WebCore::DragOperation::Copy,
+        WebCore::DragOperation::Link,
+        WebCore::DragOperation::Generic,
+        WebCore::DragOperation::Private,
+        WebCore::DragOperation::Move,
+        WebCore::DragOperation::Delete
     >;
 };
 
diff --git a/Source/WebCore/page/DragController.cpp b/Source/WebCore/page/DragController.cpp
index bfba908..2f30208 100644
--- a/Source/WebCore/page/DragController.cpp
+++ b/Source/WebCore/page/DragController.cpp
@@ -181,7 +181,7 @@
 
 DragOperation DragController::platformGenericDragOperation()
 {
-    return DragOperationMove;
+    return DragOperation::Move;
 }
 
 #endif
@@ -321,7 +321,7 @@
         if (dragOperation)
             m_dragHandlingMethod = DragHandlingMethod::PageLoad;
     } else if (m_dragHandlingMethod == DragHandlingMethod::SetColor)
-        dragOperation = DragOperationCopy;
+        dragOperation = DragOperation::Copy;
 
     updateSupportedTypeIdentifiersForDragHandlingMethod(m_dragHandlingMethod, dragData);
     return dragOperation;
@@ -422,7 +422,7 @@
 
     if (destinationActionMask.contains(DragDestinationAction::Edit) && canProcessDrag(dragData)) {
         if (dragData.containsColor()) {
-            dragOperation = DragOperationGeneric;
+            dragOperation = DragOperation::Generic;
             return DragHandlingMethod::SetColor;
         }
 
@@ -444,7 +444,7 @@
             clearDragCaret();
 
         Frame* innerFrame = element->document().frame();
-        dragOperation = dragIsMove(innerFrame->selection(), dragData) ? DragOperationMove : DragOperationCopy;
+        dragOperation = dragIsMove(innerFrame->selection(), dragData) ? DragOperation::Move : DragOperation::Copy;
 
         unsigned numberOfFiles = dragData.numberOfFiles();
         if (m_fileInputElementUnderMouse) {
@@ -697,21 +697,21 @@
 {
     // This is designed to match IE's operation fallback for the case where
     // the page calls preventDefault() in a drag event but doesn't set dropEffect.
-    if (sourceOperationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }))
-        return DragOperationCopy;
+    if (sourceOperationMask.containsAll({ DragOperation::Copy, DragOperation::Link, DragOperation::Generic, DragOperation::Private, DragOperation::Move, DragOperation::Delete }))
+        return DragOperation::Copy;
     if (sourceOperationMask.isEmpty())
         return WTF::nullopt;
-    if (sourceOperationMask.contains(DragOperationMove))
-        return DragOperationMove;
-    if (sourceOperationMask.contains(DragOperationGeneric))
+    if (sourceOperationMask.contains(DragOperation::Move))
+        return DragOperation::Move;
+    if (sourceOperationMask.contains(DragOperation::Generic))
         return DragController::platformGenericDragOperation();
-    if (sourceOperationMask.contains(DragOperationCopy))
-        return DragOperationCopy;
-    if (sourceOperationMask.contains(DragOperationLink))
-        return DragOperationLink;
+    if (sourceOperationMask.contains(DragOperation::Copy))
+        return DragOperation::Copy;
+    if (sourceOperationMask.contains(DragOperation::Link))
+        return DragOperation::Link;
     
     // FIXME: Does IE really return "generic" even if no operations were allowed by the source?
-    return DragOperationGeneric;
+    return DragOperation::Generic;
 }
 
 bool DragController::tryDHTMLDrag(const DragData& dragData, Optional<DragOperation>& operation)
@@ -997,7 +997,7 @@
         // Selection, image, and link drags receive a default set of allowed drag operations that
         // follows from:
         // http://trac.webkit.org/browser/trunk/WebKit/mac/WebView/WebHTMLView.mm?rev=48526#L3430
-        m_sourceDragOperationMask.add({ DragOperationGeneric, DragOperationCopy });
+        m_sourceDragOperationMask.add({ DragOperation::Generic, DragOperation::Copy });
     }
 
     ASSERT(state.source);
diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp
index 0e01345..14bcc5b 100644
--- a/Source/WebCore/page/EventHandler.cpp
+++ b/Source/WebCore/page/EventHandler.cpp
@@ -2337,11 +2337,11 @@
 static Optional<DragOperation> convertDropZoneOperationToDragOperation(const String& dragOperation)
 {
     if (dragOperation == "copy")
-        return DragOperationCopy;
+        return DragOperation::Copy;
     if (dragOperation == "move")
-        return DragOperationMove;
+        return DragOperation::Move;
     if (dragOperation == "link")
-        return DragOperationLink;
+        return DragOperation::Link;
     return WTF::nullopt;
 }
 
@@ -2349,9 +2349,9 @@
 {
     if (operation) {
         switch (*operation) {
-        case DragOperationMove:
+        case DragOperation::Move:
             return "move"_s;
-        case DragOperationLink:
+        case DragOperation::Link:
             return "link"_s;
         default:
             break;
diff --git a/Source/WebCore/page/gtk/DragControllerGtk.cpp b/Source/WebCore/page/gtk/DragControllerGtk.cpp
index d71ab1d..660ba95 100644
--- a/Source/WebCore/page/gtk/DragControllerGtk.cpp
+++ b/Source/WebCore/page/gtk/DragControllerGtk.cpp
@@ -54,7 +54,7 @@
 {
     // FIXME: This logic is incomplete
     if (dragData.containsURL())
-        return DragOperationCopy;
+        return DragOperation::Copy;
 
     return WTF::nullopt;
 }
diff --git a/Source/WebCore/page/mac/DragControllerMac.mm b/Source/WebCore/page/mac/DragControllerMac.mm
index c603fbd..bd98507 100644
--- a/Source/WebCore/page/mac/DragControllerMac.mm
+++ b/Source/WebCore/page/mac/DragControllerMac.mm
@@ -79,7 +79,7 @@
         return WTF::nullopt;
 
     if (!m_documentUnderMouse || (!(dragData.flags() & (DragApplicationHasAttachedSheet | DragApplicationIsSource))))
-        return DragOperationCopy;
+        return DragOperation::Copy;
 
     return WTF::nullopt;
 }
@@ -111,7 +111,7 @@
 {
     // On iOS, UIKit skips the -performDrop invocation altogether if MOVE is forbidden.
     // Thus, if MOVE is not allowed in the drag source operation mask, fall back to only other allowable action, COPY.
-    return DragOperationCopy;
+    return DragOperation::Copy;
 }
 
 void DragController::updateSupportedTypeIdentifiersForDragHandlingMethod(DragHandlingMethod dragHandlingMethod, const DragData& dragData) const
diff --git a/Source/WebCore/page/win/DragControllerWin.cpp b/Source/WebCore/page/win/DragControllerWin.cpp
index 8db8c9d..32f5b3ae 100644
--- a/Source/WebCore/page/win/DragControllerWin.cpp
+++ b/Source/WebCore/page/win/DragControllerWin.cpp
@@ -49,7 +49,7 @@
     // If this can be determined from within WebCore operationForDrag can be pulled into
     // WebCore itself.
     if (dragData.containsURL() && !m_didInitiateDrag)
-        return DragOperationCopy;
+        return DragOperation::Copy;
     return WTF::nullopt;
 }
 
diff --git a/Source/WebCore/platform/gtk/GtkUtilities.cpp b/Source/WebCore/platform/gtk/GtkUtilities.cpp
index 5e7f2f3..8160f63 100644
--- a/Source/WebCore/platform/gtk/GtkUtilities.cpp
+++ b/Source/WebCore/platform/gtk/GtkUtilities.cpp
@@ -153,11 +153,11 @@
 {
     OptionSet<DragOperation> action;
     if (gdkAction & GDK_ACTION_COPY)
-        action.add(DragOperationCopy);
+        action.add(DragOperation::Copy);
     if (gdkAction & GDK_ACTION_MOVE)
-        action.add(DragOperationMove);
+        action.add(DragOperation::Move);
     if (gdkAction & GDK_ACTION_LINK)
-        action.add(DragOperationLink);
+        action.add(DragOperation::Link);
 
     return action;
 }
@@ -166,11 +166,11 @@
 {
     unsigned gdkAction = 0;
 
-    if (coreAction.contains(DragOperationCopy))
+    if (coreAction.contains(DragOperation::Copy))
         gdkAction |= GDK_ACTION_COPY;
-    if (coreAction.contains(DragOperationMove))
+    if (coreAction.contains(DragOperation::Move))
         gdkAction |= GDK_ACTION_MOVE;
-    if (coreAction.contains(DragOperationLink))
+    if (coreAction.contains(DragOperation::Link))
         gdkAction |= GDK_ACTION_LINK;
 
     return static_cast<GdkDragAction>(gdkAction);
@@ -178,11 +178,11 @@
 
 GdkDragAction dragOperationToSingleGdkDragAction(OptionSet<DragOperation> coreAction)
 {
-    if (coreAction.contains(DragOperationCopy))
+    if (coreAction.contains(DragOperation::Copy))
         return GDK_ACTION_COPY;
-    if (coreAction.contains(DragOperationMove))
+    if (coreAction.contains(DragOperation::Move))
         return GDK_ACTION_MOVE;
-    if (coreAction.contains(DragOperationLink))
+    if (coreAction.contains(DragOperation::Link))
         return GDK_ACTION_LINK;
     return static_cast<GdkDragAction>(0);
 }
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 01cf390..54e2d7c 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,22 @@
+2020-06-08  David Kilzer  <ddkilzer@apple.com>
+
+        [IPC] Adopt enum class for DragOperation
+        <https://webkit.org/b/212870>
+        <rdar://problem/64069940>
+
+        Reviewed by Darin Adler.
+
+        * Scripts/webkit/messages.py:
+        - Remove FIXME now that it's not needed.
+        * Shared/API/Cocoa/_WKDragActionsInternal.h:
+        (WebKit::coreDragOperationMask):
+        * UIProcess/Cocoa/WebViewImpl.mm:
+        (WebKit::kit):
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (dropOperationForWebCoreDragOperation):
+        (coreDragOperationForUIDropOperation):
+        (-[WKContentView dragDataForDropSession:dragDestinationAction:]):
+
 2020-06-08  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, reverting r262685.
diff --git a/Source/WebKit/Scripts/webkit/messages.py b/Source/WebKit/Scripts/webkit/messages.py
index f87bbff..1bfd282 100644
--- a/Source/WebKit/Scripts/webkit/messages.py
+++ b/Source/WebKit/Scripts/webkit/messages.py
@@ -209,7 +209,6 @@
         'WebCore::DictationContext',
         'WebCore::DocumentIdentifier',
         'WebCore::DocumentOrWorkerIdentifier',
-        'WebCore::DragOperation',  # FIXME: Remove after converting WebCore::DragOperation to enum class.
         'WebCore::FetchIdentifier',
         'WebCore::FrameIdentifier',
         'WebCore::LibWebRTCSocketIdentifier',
diff --git a/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h b/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h
index 89789f3..d6d1a3b 100644
--- a/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h
+++ b/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h
@@ -45,17 +45,17 @@
 {
     OptionSet<WebCore::DragOperation> result;
     if (operation & NSDragOperationCopy)
-        result.add(WebCore::DragOperationCopy);
+        result.add(WebCore::DragOperation::Copy);
     if (operation & NSDragOperationLink)
-        result.add(WebCore::DragOperationLink);
+        result.add(WebCore::DragOperation::Link);
     if (operation & NSDragOperationGeneric)
-        result.add(WebCore::DragOperationGeneric);
+        result.add(WebCore::DragOperation::Generic);
     if (operation & NSDragOperationPrivate)
-        result.add(WebCore::DragOperationPrivate);
+        result.add(WebCore::DragOperation::Private);
     if (operation & NSDragOperationMove)
-        result.add(WebCore::DragOperationMove);
+        result.add(WebCore::DragOperation::Move);
     if (operation & NSDragOperationDelete)
-        result.add(WebCore::DragOperationDelete);
+        result.add(WebCore::DragOperation::Delete);
     return result;
 }
 #endif // USE(APPKIT)
diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
index 69b62de..1145bd4 100644
--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
@@ -3962,17 +3962,17 @@
         return NSDragOperationNone;
 
     switch (*dragOperation) {
-    case WebCore::DragOperationCopy:
+    case WebCore::DragOperation::Copy:
         return NSDragOperationCopy;
-    case WebCore::DragOperationLink:
+    case WebCore::DragOperation::Link:
         return NSDragOperationLink;
-    case WebCore::DragOperationGeneric:
+    case WebCore::DragOperation::Generic:
         return NSDragOperationGeneric;
-    case WebCore::DragOperationPrivate:
+    case WebCore::DragOperation::Private:
         return NSDragOperationPrivate;
-    case WebCore::DragOperationMove:
+    case WebCore::DragOperation::Move:
         return NSDragOperationMove;
-    case WebCore::DragOperationDelete:
+    case WebCore::DragOperation::Delete:
         return NSDragOperationDelete;
     }
 
diff --git a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
index 292761c..d2b4f73 100644
--- a/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
+++ b/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
@@ -7310,9 +7310,9 @@
 static UIDropOperation dropOperationForWebCoreDragOperation(Optional<WebCore::DragOperation> operation)
 {
     if (operation) {
-        if (*operation == WebCore::DragOperationMove)
+        if (*operation == WebCore::DragOperation::Move)
             return UIDropOperationMove;
-        if (*operation == WebCore::DragOperationCopy)
+        if (*operation == WebCore::DragOperation::Copy)
             return UIDropOperationCopy;
     }
     return UIDropOperationCancel;
@@ -7324,11 +7324,11 @@
     case UIDropOperationCancel:
         return WTF::nullopt;
     case UIDropOperationForbidden:
-        return WebCore::DragOperationPrivate;
+        return WebCore::DragOperation::Private;
     case UIDropOperationCopy:
-        return WebCore::DragOperationCopy;
+        return WebCore::DragOperation::Copy;
     case UIDropOperationMove:
-        return WebCore::DragOperationMove;
+        return WebCore::DragOperation::Move;
     }
     ASSERT_NOT_REACHED();
     return WTF::nullopt;
@@ -7342,7 +7342,7 @@
 
     auto dragOperationMask = WebCore::anyDragOperation();
     if (!session.allowsMoveOperation)
-        dragOperationMask.remove(WebCore::DragOperationMove);
+        dragOperationMask.remove(WebCore::DragOperation::Move);
     return { session, WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), dragOperationMask, WebCore::DragApplicationNone, WebKit::coreDragDestinationActionMask(dragDestinationAction) };
 }
 
diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog
index 8913b89..9bd7d3c 100644
--- a/Source/WebKitLegacy/mac/ChangeLog
+++ b/Source/WebKitLegacy/mac/ChangeLog
@@ -1,3 +1,17 @@
+2020-06-08  David Kilzer  <ddkilzer@apple.com>
+
+        [IPC] Adopt enum class for DragOperation
+        <https://webkit.org/b/212870>
+        <rdar://problem/64069940>
+
+        Reviewed by Darin Adler.
+
+        * WebView/WebHTMLView.mm:
+        (kit):
+        * WebView/WebView.mm:
+        (coreDragOperationMask):
+        (kit):
+
 2020-06-07  Philippe Normand  <pnormand@igalia.com>
 
         Remove ENABLE_VIDEO_TRACK ifdef guards
diff --git a/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm b/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm
index 38e7909..854c04f 100644
--- a/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm
+++ b/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm
@@ -4233,17 +4233,17 @@
 static NSDragOperation kit(OptionSet<WebCore::DragOperation> operationMask)
 {
     NSDragOperation result = NSDragOperationNone;
-    if (operationMask.contains(WebCore::DragOperationCopy))
+    if (operationMask.contains(WebCore::DragOperation::Copy))
         result |= NSDragOperationCopy;
-    if (operationMask.contains(WebCore::DragOperationLink))
+    if (operationMask.contains(WebCore::DragOperation::Link))
         result |= NSDragOperationLink;
-    if (operationMask.contains(WebCore::DragOperationGeneric))
+    if (operationMask.contains(WebCore::DragOperation::Generic))
         result |= NSDragOperationGeneric;
-    if (operationMask.contains(WebCore::DragOperationPrivate))
+    if (operationMask.contains(WebCore::DragOperation::Private))
         result |= NSDragOperationPrivate;
-    if (operationMask.contains(WebCore::DragOperationMove))
+    if (operationMask.contains(WebCore::DragOperation::Move))
         result |= NSDragOperationMove;
-    if (operationMask.contains(WebCore::DragOperationDelete))
+    if (operationMask.contains(WebCore::DragOperation::Delete))
         result |= NSDragOperationDelete;
     return result;
 }
diff --git a/Source/WebKitLegacy/mac/WebView/WebView.mm b/Source/WebKitLegacy/mac/WebView/WebView.mm
index f8db8c8..db903e8 100644
--- a/Source/WebKitLegacy/mac/WebView/WebView.mm
+++ b/Source/WebKitLegacy/mac/WebView/WebView.mm
@@ -605,22 +605,22 @@
 
 #if USE(APPKIT)
     if (operation & NSDragOperationCopy)
-        result.add(WebCore::DragOperationCopy);
+        result.add(WebCore::DragOperation::Copy);
     if (operation & NSDragOperationLink)
-        result.add(WebCore::DragOperationLink);
+        result.add(WebCore::DragOperation::Link);
     if (operation & NSDragOperationGeneric)
-        result.add(WebCore::DragOperationGeneric);
+        result.add(WebCore::DragOperation::Generic);
     if (operation & NSDragOperationPrivate)
-        result.add(WebCore::DragOperationPrivate);
+        result.add(WebCore::DragOperation::Private);
     if (operation & NSDragOperationMove)
-        result.add(WebCore::DragOperationMove);
+        result.add(WebCore::DragOperation::Move);
     if (operation & NSDragOperationDelete)
-        result.add(WebCore::DragOperationDelete);
+        result.add(WebCore::DragOperation::Delete);
 #else
     if (operation & _UIDragOperationCopy)
-        result.add(WebCore::DragOperationCopy);
+        result.add(WebCore::DragOperation::Copy);
     if (operation & _UIDragOperationMove)
-        result.add(WebCore::DragOperationMove);
+        result.add(WebCore::DragOperation::Move);
 #endif // USE(APPKIT)
 
     return result;
@@ -633,17 +633,17 @@
         return NSDragOperationNone;
 
     switch (*dragOperation) {
-    case WebCore::DragOperationCopy:
+    case WebCore::DragOperation::Copy:
         return NSDragOperationCopy;
-    case WebCore::DragOperationLink:
+    case WebCore::DragOperation::Link:
         return NSDragOperationLink;
-    case WebCore::DragOperationGeneric:
+    case WebCore::DragOperation::Generic:
         return NSDragOperationGeneric;
-    case WebCore::DragOperationPrivate:
+    case WebCore::DragOperation::Private:
         return NSDragOperationPrivate;
-    case WebCore::DragOperationMove:
+    case WebCore::DragOperation::Move:
         return NSDragOperationMove;
-    case WebCore::DragOperationDelete:
+    case WebCore::DragOperation::Delete:
         return NSDragOperationDelete;
     }
 
@@ -657,17 +657,17 @@
         return _UIDragOperationNone;
 
     switch (*dragOperation) {
-    case WebCore::DragOperationCopy:
+    case WebCore::DragOperation::Copy:
         return _UIDragOperationCopy;
-    case WebCore::DragOperationLink:
+    case WebCore::DragOperation::Link:
         return _UIDragOperationNone;
-    case WebCore::DragOperationGeneric:
+    case WebCore::DragOperation::Generic:
         return _UIDragOperationMove;
-    case WebCore::DragOperationPrivate:
+    case WebCore::DragOperation::Private:
         return _UIDragOperationNone;
-    case WebCore::DragOperationMove:
+    case WebCore::DragOperation::Move:
         return _UIDragOperationMove;
-    case WebCore::DragOperationDelete:
+    case WebCore::DragOperation::Delete:
         return _UIDragOperationNone;
     }
 
diff --git a/Source/WebKitLegacy/win/ChangeLog b/Source/WebKitLegacy/win/ChangeLog
index f7ba1a5..3d0abfb 100644
--- a/Source/WebKitLegacy/win/ChangeLog
+++ b/Source/WebKitLegacy/win/ChangeLog
@@ -1,3 +1,18 @@
+2020-06-08  David Kilzer  <ddkilzer@apple.com>
+
+        [IPC] Adopt enum class for DragOperation
+        <https://webkit.org/b/212870>
+        <rdar://problem/64069940>
+
+        Reviewed by Darin Adler.
+
+        * WebCoreSupport/WebDragClient.cpp:
+        (draggingSourceOperationMaskToDragCursors):
+        (WebDragClient::startDrag):
+        * WebView.cpp:
+        (dragOperationToDragCursor):
+        (WebView::keyStateToDragOperation const):
+
 2020-06-07  Philippe Normand  <pnormand@igalia.com>
 
         Remove ENABLE_VIDEO_TRACK ifdef guards
diff --git a/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp b/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp
index e9b65fa..5b193a7 100644
--- a/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp
+++ b/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp
@@ -47,13 +47,13 @@
 static DWORD draggingSourceOperationMaskToDragCursors(OptionSet<DragOperation> operationMask)
 {
     DWORD result = DROPEFFECT_NONE;
-    if (operationMask.contains(DragOperationCopy))
+    if (operationMask.contains(DragOperation::Copy))
         result |= DROPEFFECT_COPY; 
-    if (operationMask.contains(DragOperationLink))
+    if (operationMask.contains(DragOperation::Link))
         result |= DROPEFFECT_LINK; 
-    if (operationMask.contains(DragOperationMove))
+    if (operationMask.contains(DragOperation::Move))
         result |= DROPEFFECT_MOVE;
-    if (operationMask.contains(DragOperationGeneric))
+    if (operationMask.contains(DragOperation::Generic))
         result |= DROPEFFECT_MOVE;
     return result;
 }
@@ -165,11 +165,11 @@
         OptionSet<DragOperation> operation;
         if (hr == DRAGDROP_S_DROP) {
             if (effect & DROPEFFECT_COPY)
-                operation = DragOperationCopy;
+                operation = DragOperation::Copy;
             else if (effect & DROPEFFECT_LINK)
-                operation = DragOperationLink;
+                operation = DragOperation::Link;
             else if (effect & DROPEFFECT_MOVE)
-                operation = DragOperationMove;
+                operation = DragOperation::Move;
         }
         frame.eventHandler().dragSourceEndedAt(generateMouseEvent(m_webView, false), operation);
     }
diff --git a/Source/WebKitLegacy/win/WebView.cpp b/Source/WebKitLegacy/win/WebView.cpp
index 33be657..74435bb 100644
--- a/Source/WebKitLegacy/win/WebView.cpp
+++ b/Source/WebKitLegacy/win/WebView.cpp
@@ -5848,13 +5848,13 @@
         return DROPEFFECT_NONE;
 
     DWORD result = DROPEFFECT_NONE;
-    if (*operation == DragOperationCopy)
+    if (*operation == DragOperation::Copy)
         result = DROPEFFECT_COPY;
-    else if (*operation == DragOperationLink)
+    else if (*operation == DragOperation::Link)
         result = DROPEFFECT_LINK;
-    else if (*operation == DragOperationMove)
+    else if (*operation == DragOperation::Move)
         result = DROPEFFECT_MOVE;
-    else if (*operation == DragOperationGeneric)
+    else if (*operation == DragOperation::Generic)
         result = DROPEFFECT_MOVE; // This appears to be the Firefox behaviour.
     return result;
 }
@@ -5871,11 +5871,11 @@
     auto operationMask = m_page->dragController().sourceDragOperationMask();
 
     if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT))
-        operationMask = { DragOperationLink };
+        operationMask = { DragOperation::Link };
     else if ((grfKeyState & MK_CONTROL) == MK_CONTROL)
-        operationMask = { DragOperationCopy };
+        operationMask = { DragOperation::Copy };
     else if ((grfKeyState & MK_SHIFT) == MK_SHIFT)
-        operationMask = { DragOperationGeneric };
+        operationMask = { DragOperation::Generic };
 
     return operationMask;
 }
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 4886c00..b14f336 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,14 @@
+2020-06-08  David Kilzer  <ddkilzer@apple.com>
+
+        [IPC] Adopt enum class for DragOperation
+        <https://webkit.org/b/212870>
+        <rdar://problem/64069940>
+
+        Reviewed by Darin Adler.
+
+        * Scripts/do-webcore-rename:
+        - Do DragOperation renames.
+
 2020-06-08  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, reverting r262685.
diff --git a/Tools/Scripts/do-webcore-rename b/Tools/Scripts/do-webcore-rename
index 0ccdda2..2a91e57 100755
--- a/Tools/Scripts/do-webcore-rename
+++ b/Tools/Scripts/do-webcore-rename
@@ -1,6 +1,6 @@
 #!/usr/bin/env perl
 
-# Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+# Copyright (C) 2006-2020 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -102,7 +102,12 @@
 my $isDOMTypeRename = 0;
 my %renames = (
     # Renames go here in the form of:
-    "flagIsAtomic" => "flagIsAtom",
+    "DragOperationCopy" => "DragOperation::Copy",
+    "DragOperationLink" => "DragOperation::Link",
+    "DragOperationGeneric" => "DragOperation::Generic",
+    "DragOperationPrivate" => "DragOperation::Private",
+    "DragOperationMove" => "DragOperation::Move",
+    "DragOperationDelete" => "DragOperation::Delete",
 );
 
 my %renamesContemplatedForTheFuture = (