Changeset 262680 in webkit
- Timestamp:
- Jun 6, 2020, 8:17:30 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 54 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r262663 r262680 1 2020-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 1 12 2020-06-05 Ryan Haddad <ryanhaddad@apple.com> 2 13 -
trunk/Source/WTF/wtf/OptionSet.h
r262216 r262680 31 31 #include <wtf/Assertions.h> 32 32 #include <wtf/MathExtras.h> 33 #include <wtf/Optional.h> 33 34 34 35 namespace WTF { … … 166 167 } 167 168 169 constexpr OptionSet(Optional<E> optional) 170 : m_storage(optional ? static_cast<StorageType>(*optional) : 0) 171 { 172 } 173 168 174 constexpr StorageType toRaw() const { return m_storage; } 169 175 -
trunk/Source/WebCore/ChangeLog
r262679 r262680 1 2020-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 1 110 2020-06-06 Zalan Bujtas <zalan@apple.com> 2 111 -
trunk/Source/WebCore/dom/DataTransfer.cpp
r262507 r262680 1 1 /* 2 * Copyright (C) 2006 , 2007, 2008, 2013Apple Inc. All rights reserved.2 * Copyright (C) 2006-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 490 490 } 491 491 492 Ref<DataTransfer> DataTransfer::createForDrop(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)492 Ref<DataTransfer> DataTransfer::createForDrop(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles) 493 493 { 494 494 auto dataTransfer = adoptRef(*new DataTransfer(DataTransfer::StoreMode::Readonly, WTFMove(pasteboard), draggingFiles ? Type::DragAndDropFiles : Type::DragAndDropData)); 495 dataTransfer->setSourceOperation (sourceOperation);495 dataTransfer->setSourceOperationMask(sourceOperationMask); 496 496 dataTransfer->m_originIdentifier = document.originIdentifierForPasteboard(); 497 497 return dataTransfer; 498 498 } 499 499 500 Ref<DataTransfer> DataTransfer::createForUpdatingDropTarget(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)500 Ref<DataTransfer> DataTransfer::createForUpdatingDropTarget(const Document& document, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles) 501 501 { 502 502 auto dataTransfer = adoptRef(*new DataTransfer(DataTransfer::StoreMode::Protected, WTFMove(pasteboard), draggingFiles ? Type::DragAndDropFiles : Type::DragAndDropData)); 503 dataTransfer->setSourceOperation (sourceOperation);503 dataTransfer->setSourceOperationMask(sourceOperationMask); 504 504 dataTransfer->m_originIdentifier = document.originIdentifierForPasteboard(); 505 505 return dataTransfer; … … 597 597 } 598 598 599 static DragOperationdragOpFromIEOp(const String& operation)599 static OptionSet<DragOperation> dragOpFromIEOp(const String& operation) 600 600 { 601 601 if (operation == "uninitialized") 602 return DragOperationEvery;602 return anyDragOperation(); 603 603 if (operation == "none") 604 return DragOperationNone;604 return { }; 605 605 if (operation == "copy") 606 return DragOperationCopy;606 return { DragOperationCopy }; 607 607 if (operation == "link") 608 return DragOperationLink;608 return { DragOperationLink }; 609 609 if (operation == "move") 610 return (DragOperation)(DragOperationGeneric | DragOperationMove);610 return { DragOperationGeneric, DragOperationMove }; 611 611 if (operation == "copyLink") 612 return (DragOperation)(DragOperationCopy | DragOperationLink);612 return { DragOperationCopy, DragOperationLink }; 613 613 if (operation == "copyMove") 614 return (DragOperation)(DragOperationCopy | DragOperationGeneric | DragOperationMove);614 return { DragOperationCopy, DragOperationGeneric, DragOperationMove }; 615 615 if (operation == "linkMove") 616 return (DragOperation)(DragOperationLink | DragOperationGeneric | DragOperationMove);616 return { DragOperationLink, DragOperationGeneric, DragOperationMove }; 617 617 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 622 static 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 })) 627 627 return "all"; 628 if (isGenericMove && (operation &DragOperationCopy))628 if (isGenericMove && operationMask.contains(DragOperationCopy)) 629 629 return "copyMove"; 630 if (isGenericMove && (operation &DragOperationLink))630 if (isGenericMove && operationMask.contains(DragOperationLink)) 631 631 return "linkMove"; 632 if ( (operation & DragOperationCopy) && (operation & DragOperationLink))632 if (operationMask.containsAll({ DragOperationCopy, DragOperationLink })) 633 633 return "copyLink"; 634 634 if (isGenericMove) 635 635 return "move"; 636 if (operation & DragOperationCopy)636 if (operationMask.contains(DragOperationCopy)) 637 637 return "copy"; 638 if (operation & DragOperationLink)638 if (operationMask.contains(DragOperationLink)) 639 639 return "link"; 640 640 return "none"; 641 641 } 642 642 643 DragOperation DataTransfer::sourceOperation() const644 { 645 DragOperation operation= dragOpFromIEOp(m_effectAllowed);646 ASSERT(operation != DragOperationPrivate);647 return operation ;648 } 649 650 DragOperation DataTransfer::destinationOperation() const651 { 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 );643 OptionSet<DragOperation> DataTransfer::sourceOperationMask() const 644 { 645 auto operationMask = dragOpFromIEOp(m_effectAllowed); 646 ASSERT(operationMask != DragOperationPrivate); 647 return operationMask; 648 } 649 650 OptionSet<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 657 void DataTransfer::setSourceOperationMask(OptionSet<DragOperation> operationMask) 658 { 659 ASSERT_ARG(operationMask, operationMask != DragOperationPrivate); 660 m_effectAllowed = IEOpFromDragOp(operationMask); 661 } 662 663 void 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); 667 667 } 668 668 -
trunk/Source/WebCore/dom/DataTransfer.h
r251377 r262680 3 3 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) 4 4 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * Copyright (C) 2003-20 16Apple Inc. All rights reserved.5 * Copyright (C) 2003-2020 Apple Inc. All rights reserved. 6 6 * 7 7 * This library is free software; you can redistribute it and/or … … 89 89 static Ref<DataTransfer> createForDrag(); 90 90 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); 93 93 94 94 bool dropEffectIsUninitialized() const { return m_dropEffect == "uninitialized"; } 95 95 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>); 100 100 101 101 void setDragHasStarted() { m_shouldUpdateDragImage = true; } -
trunk/Source/WebCore/page/DragActions.h
r262395 r262680 61 61 } DragSourceAction; 62 62 63 // Matches NSDragOperation. 64 typedef enum { 65 DragOperationNone = 0, 63 // See NSDragOperation, _UIDragOperation and UIDropOperation. 64 enum DragOperation { 66 65 DragOperationCopy = 1, 67 66 DragOperationLink = 2, … … 70 69 DragOperationMove = 16, 71 70 DragOperationDelete = 32, 72 DragOperationEvery = UINT_MAX 73 } DragOperation; 71 }; 72 73 constexpr OptionSet<DragOperation> anyDragOperation() 74 { 75 return { DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete }; 76 } 74 77 75 78 enum class MayExtendDragSession : bool { No, Yes }; … … 94 97 }; 95 98 99 template<> 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 96 111 template<> struct OptionSetTraits<WebCore::DragDestinationAction> { 97 112 using values = OptionSetValues< … … 103 118 }; 104 119 120 template<> 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 105 132 } // namespace WTF -
trunk/Source/WebCore/page/DragController.cpp
r262507 r262680 209 209 } 210 210 211 DragOperationDragController::dragEntered(const DragData& dragData)211 Optional<DragOperation> DragController::dragEntered(const DragData& dragData) 212 212 { 213 213 return dragEnteredOrUpdated(dragData); … … 225 225 } 226 226 227 DragOperationDragController::dragUpdated(const DragData& dragData)227 Optional<DragOperation> DragController::dragUpdated(const DragData& dragData) 228 228 { 229 229 return dragEnteredOrUpdated(dragData); … … 279 279 clearDragCaret(); 280 280 281 if ( operationForLoad(dragData) == DragOperationNone)281 if (!operationForLoad(dragData)) 282 282 return false; 283 283 … … 305 305 } 306 306 307 DragOperationDragController::dragEnteredOrUpdated(const DragData& dragData)307 Optional<DragOperation> DragController::dragEnteredOrUpdated(const DragData& dragData) 308 308 { 309 309 mouseMovedIntoDocument(m_page.mainFrame().documentAtPoint(dragData.clientPosition())); … … 312 312 if (m_dragDestinationActionMask.isEmpty()) { 313 313 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; 318 318 m_dragHandlingMethod = tryDocumentDrag(dragData, m_dragDestinationActionMask, dragOperation); 319 319 if (m_dragHandlingMethod == DragHandlingMethod::None && (m_dragDestinationActionMask.contains(DragDestinationAction::Load))) { 320 320 dragOperation = operationForLoad(dragData); 321 if (dragOperation != DragOperationNone)321 if (dragOperation) 322 322 m_dragHandlingMethod = DragHandlingMethod::PageLoad; 323 323 } else if (m_dragHandlingMethod == DragHandlingMethod::SetColor) … … 389 389 #endif 390 390 391 DragHandlingMethod DragController::tryDocumentDrag(const DragData& dragData, OptionSet<DragDestinationAction> destinationActionMask, DragOperation& dragOperation)391 DragHandlingMethod DragController::tryDocumentDrag(const DragData& dragData, OptionSet<DragDestinationAction> destinationActionMask, Optional<DragOperation>& dragOperation) 392 392 { 393 393 if (!m_documentUnderMouse) … … 459 459 460 460 if (!m_numberOfItemsToBeAccepted) 461 dragOperation = DragOperationNone;461 dragOperation = WTF::nullopt; 462 462 m_fileInputElementUnderMouse->setCanReceiveDroppedFiles(m_numberOfItemsToBeAccepted); 463 463 } else { … … 490 490 } 491 491 492 DragOperationDragController::operationForLoad(const DragData& dragData)492 Optional<DragOperation> DragController::operationForLoad(const DragData& dragData) 493 493 { 494 494 Document* document = m_page.mainFrame().documentAtPoint(dragData.clientPosition()); … … 505 505 506 506 if (document && (m_didInitiateDrag || (is<PluginDocument>(*document) && !pluginDocumentAcceptsDrags) || document->hasEditableStyle())) 507 return DragOperationNone;507 return WTF::nullopt; 508 508 return dragOperation(dragData); 509 509 } … … 694 694 } 695 695 696 static DragOperation defaultOperationForDrag(DragOperation srcOpMask)696 static Optional<DragOperation> defaultOperationForDrag(OptionSet<DragOperation> sourceOperationMask) 697 697 { 698 698 // This is designed to match IE's operation fallback for the case where 699 699 // the page calls preventDefault() in a drag event but doesn't set dropEffect. 700 if (s rcOpMask == DragOperationEvery)700 if (sourceOperationMask.containsAll({ DragOperationCopy, DragOperationLink, DragOperationGeneric, DragOperationPrivate, DragOperationMove, DragOperationDelete })) 701 701 return DragOperationCopy; 702 if (s rcOpMask == DragOperationNone)703 return DragOperationNone;704 if (s rcOpMask & DragOperationMove)702 if (sourceOperationMask.isEmpty()) 703 return WTF::nullopt; 704 if (sourceOperationMask.contains(DragOperationMove)) 705 705 return DragOperationMove; 706 if (s rcOpMask & DragOperationGeneric)706 if (sourceOperationMask.contains(DragOperationGeneric)) 707 707 return DragController::platformGenericDragOperation(); 708 if (s rcOpMask & DragOperationCopy)708 if (sourceOperationMask.contains(DragOperationCopy)) 709 709 return DragOperationCopy; 710 if (s rcOpMask & DragOperationLink)710 if (sourceOperationMask.contains(DragOperationLink)) 711 711 return DragOperationLink; 712 712 … … 715 715 } 716 716 717 bool DragController::tryDHTMLDrag(const DragData& dragData, DragOperation& operation)717 bool DragController::tryDHTMLDrag(const DragData& dragData, Optional<DragOperation>& operation) 718 718 { 719 719 ASSERT(m_documentUnderMouse); … … 723 723 return false; 724 724 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()); 727 729 if (!targetResponse.accept) 728 730 return false; 729 731 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 source733 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; 734 736 else 735 operation = targetResponse.operation.value();737 operation = defaultOperationForDrag(targetResponse.operationMask.value()); 736 738 737 739 return true; … … 957 959 } 958 960 959 bool DragController::startDrag(Frame& src, const DragState& state, DragOperation srcOp, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData hasData)961 bool DragController::startDrag(Frame& src, const DragState& state, OptionSet<DragOperation> sourceOperationMask, const PlatformMouseEvent& dragEvent, const IntPoint& dragOrigin, HasNonDefaultPasteboardData hasData) 960 962 { 961 963 if (!state.source) … … 973 975 974 976 m_draggingImageURL = URL(); 975 m_sourceDragOperation = srcOp;977 m_sourceDragOperationMask = sourceOperationMask; 976 978 977 979 DragImage dragImage; … … 996 998 // follows from: 997 999 // 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 }); 999 1001 } 1000 1002 -
trunk/Source/WebCore/page/DragController.h
r262469 r262680 60 60 static DragOperation platformGenericDragOperation(); 61 61 62 WEBCORE_EXPORT DragOperationdragEntered(const DragData&);62 WEBCORE_EXPORT Optional<DragOperation> dragEntered(const DragData&); 63 63 WEBCORE_EXPORT void dragExited(const DragData&); 64 WEBCORE_EXPORT DragOperationdragUpdated(const DragData&);64 WEBCORE_EXPORT Optional<DragOperation> dragUpdated(const DragData&); 65 65 WEBCORE_EXPORT bool performDragOperation(const DragData&); 66 66 WEBCORE_EXPORT void dragCancelled(); … … 73 73 void setDidInitiateDrag(bool initiated) { m_didInitiateDrag = initiated; } 74 74 bool didInitiateDrag() const { return m_didInitiateDrag; } 75 DragOperation sourceDragOperation() const { return m_sourceDragOperation; }75 OptionSet<DragOperation> sourceDragOperationMask() const { return m_sourceDragOperationMask; } 76 76 const URL& draggingImageURL() const { return m_draggingImageURL; } 77 77 void setDragOffset(const IntPoint& offset) { m_dragOffset = offset; } … … 96 96 97 97 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); 99 99 static const IntSize& maxDragImageSize(); 100 100 … … 109 109 bool canProcessDrag(const DragData&); 110 110 bool concludeEditDrag(const DragData&); 111 DragOperationdragEnteredOrUpdated(const DragData&);112 DragOperationoperationForLoad(const DragData&);113 DragHandlingMethod tryDocumentDrag(const DragData&, OptionSet<DragDestinationAction>, DragOperation&);114 bool tryDHTMLDrag(const DragData&, DragOperation&);115 DragOperationdragOperation(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&); 116 116 void clearDragCaret(); 117 117 bool dragIsMove(FrameSelection&, const DragData&); … … 157 157 DragSourceAction m_dragSourceAction { DragSourceActionNone }; 158 158 bool m_didInitiateDrag { false }; 159 DragOperation m_sourceDragOperation { DragOperationNone }; // Set in startDrag when a drag starts from a mouse down within WebKit159 OptionSet<DragOperation> m_sourceDragOperationMask; // Set in startDrag when a drag starts from a mouse down within WebKit. 160 160 IntPoint m_dragOffset; 161 161 URL m_draggingImageURL; -
trunk/Source/WebCore/page/EventHandler.cpp
r262507 r262680 2335 2335 } 2336 2336 2337 static DragOperationconvertDropZoneOperationToDragOperation(const String& dragOperation)2337 static Optional<DragOperation> convertDropZoneOperationToDragOperation(const String& dragOperation) 2338 2338 { 2339 2339 if (dragOperation == "copy") … … 2343 2343 if (dragOperation == "link") 2344 2344 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 2348 static 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; 2360 2361 } 2361 2362 … … 2377 2378 SpaceSplitString keywords(element->attributeWithoutSynchronization(webkitdropzoneAttr), true); 2378 2379 bool matched = false; 2379 DragOperation dragOperation = DragOperationNone;2380 Optional<DragOperation> dragOperation; 2380 2381 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; 2385 2385 } else 2386 2386 matched = matched || hasDropZoneType(dataTransfer, keywords[i].string()); 2387 if (matched && dragOperation != DragOperationNone)2387 if (matched && dragOperation) 2388 2388 break; 2389 2389 } … … 2396 2396 } 2397 2397 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); 2398 EventHandler::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); 2402 2401 bool accept = dispatchDragEvent(eventType, target, event, dataTransfer.get()); 2403 2402 if (!accept) … … 2405 2404 dataTransfer->makeInvalidForSecurity(); 2406 2405 if (accept && !dataTransfer->dropEffectIsUninitialized()) 2407 return { true, dataTransfer->destinationOperation () };2406 return { true, dataTransfer->destinationOperationMask() }; 2408 2407 return { accept, WTF::nullopt }; 2409 2408 } 2410 2409 2411 EventHandler::DragTargetResponse EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, const std::function<std::unique_ptr<Pasteboard>()>& makePasteboard, DragOperation sourceOperation, bool draggingFiles)2410 EventHandler::DragTargetResponse EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, const std::function<std::unique_ptr<Pasteboard>()>& makePasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles) 2412 2411 { 2413 2412 Ref<Frame> protectedFrame(m_frame); … … 2439 2438 if (targetIsFrame(newTarget.get(), targetFrame)) { 2440 2439 if (targetFrame) 2441 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation , draggingFiles);2440 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles); 2442 2441 } else if (newTarget) { 2443 2442 // 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. 2444 2443 dispatchEventToDragSourceElement(eventNames().dragEvent, event); 2445 response = dispatchDragEnterOrDragOverEvent(eventNames().dragenterEvent, *newTarget, event, makePasteboard(), sourceOperation , draggingFiles);2444 response = dispatchDragEnterOrDragOverEvent(eventNames().dragenterEvent, *newTarget, event, makePasteboard(), sourceOperationMask, draggingFiles); 2446 2445 } 2447 2446 … … 2449 2448 // FIXME: Recursing again here doesn't make sense if the newTarget and m_dragTarget were in the same frame. 2450 2449 if (targetFrame) 2451 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation , draggingFiles);2450 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles); 2452 2451 } 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); 2454 2453 dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, dataTransfer.get()); 2455 2454 dataTransfer->makeInvalidForSecurity(); … … 2465 2464 if (targetIsFrame(newTarget.get(), targetFrame)) { 2466 2465 if (targetFrame) 2467 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperation , draggingFiles);2466 response = targetFrame->eventHandler().updateDragAndDrop(event, makePasteboard, sourceOperationMask, draggingFiles); 2468 2467 } else if (newTarget) { 2469 2468 // Note, when dealing with sub-frames, we may need to fire only a dragover event as a drag event may have been fired earlier. 2470 2469 if (!m_shouldOnlyFireDragOverEvent) 2471 2470 dispatchEventToDragSourceElement(eventNames().dragEvent, event); 2472 response = dispatchDragEnterOrDragOverEvent(eventNames().dragoverEvent, *newTarget, event, makePasteboard(), sourceOperation , draggingFiles);2471 response = dispatchDragEnterOrDragOverEvent(eventNames().dragoverEvent, *newTarget, event, makePasteboard(), sourceOperationMask, draggingFiles); 2473 2472 m_shouldOnlyFireDragOverEvent = false; 2474 2473 } … … 2478 2477 } 2479 2478 2480 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)2479 void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles) 2481 2480 { 2482 2481 Ref<Frame> protectedFrame(m_frame); … … 2485 2484 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 2486 2485 if (targetFrame) 2487 targetFrame->eventHandler().cancelDragAndDrop(event, WTFMove(pasteboard), sourceOperation , draggingFiles);2486 targetFrame->eventHandler().cancelDragAndDrop(event, WTFMove(pasteboard), sourceOperationMask, draggingFiles); 2488 2487 } else if (m_dragTarget) { 2489 2488 dispatchEventToDragSourceElement(eventNames().dragEvent, event); 2490 2489 2491 auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), WTFMove(pasteboard), sourceOperation , draggingFiles);2490 auto dataTransfer = DataTransfer::createForUpdatingDropTarget(m_dragTarget->document(), WTFMove(pasteboard), sourceOperationMask, draggingFiles); 2492 2491 dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, dataTransfer.get()); 2493 2492 dataTransfer->makeInvalidForSecurity(); … … 2496 2495 } 2497 2496 2498 bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, DragOperation sourceOperation, bool draggingFiles)2497 bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, std::unique_ptr<Pasteboard>&& pasteboard, OptionSet<DragOperation> sourceOperationMask, bool draggingFiles) 2499 2498 { 2500 2499 Ref<Frame> protectedFrame(m_frame); … … 2504 2503 if (targetIsFrame(m_dragTarget.get(), targetFrame)) { 2505 2504 if (targetFrame) 2506 preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, WTFMove(pasteboard), sourceOperation , draggingFiles);2505 preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, WTFMove(pasteboard), sourceOperationMask, draggingFiles); 2507 2506 } 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); 2509 2508 preventedDefault = dispatchDragEvent(eventNames().dropEvent, *m_dragTarget, event, dataTransfer); 2510 2509 dataTransfer->makeInvalidForSecurity(); … … 3730 3729 } 3731 3730 3732 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperation operation, MayExtendDragSession mayExtendDragSession)3731 void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, OptionSet<DragOperation> dragOperationMask, MayExtendDragSession mayExtendDragSession) 3733 3732 { 3734 3733 // Send a hit test request so that RenderLayer gets a chance to update the :hover and :active pseudoclasses. … … 3736 3735 3737 3736 if (shouldDispatchEventsToDragSourceElement()) { 3738 dragState().dataTransfer->setDestinationOperation (operation);3737 dragState().dataTransfer->setDestinationOperationMask(dragOperationMask); 3739 3738 dispatchEventToDragSourceElement(eventNames().dragendEvent, event); 3740 3739 } … … 3866 3865 invalidateClick(); 3867 3866 3868 DragOperation srcOp = DragOperationNone;3867 OptionSet<DragOperation> sourceOperationMask; 3869 3868 3870 3869 // This does work only if we missed a dragEnd. Do it anyway, just to make sure the old dataTransfer gets numbed. … … 3902 3901 if (m_mouseDownMayStartDrag) { 3903 3902 // Gather values from DHTML element, if it set any. 3904 s rcOp = dragState().dataTransfer->sourceOperation();3903 sourceOperationMask = dragState().dataTransfer->sourceOperationMask(); 3905 3904 3906 3905 // Yuck, a draggedImage:moveTo: message can be fired as a result of kicking off the … … 3913 3912 if (m_mouseDownMayStartDrag) { 3914 3913 Page* page = m_frame.page(); 3915 m_didStartDrag = page && page->dragController().startDrag(m_frame, dragState(), s rcOp, event.event(), m_mouseDownContentsPosition, hasNonDefaultPasteboardData);3914 m_didStartDrag = page && page->dragController().startDrag(m_frame, dragState(), sourceOperationMask, event.event(), m_mouseDownContentsPosition, hasNonDefaultPasteboardData); 3916 3915 // In WebKit2 we could re-enter this code and start another drag. 3917 3916 // On OS X this causes problems with the ownership of the pasteboard and the promised types. -
trunk/Source/WebCore/page/EventHandler.h
r261686 r262680 164 164 struct DragTargetResponse { 165 165 bool accept { false }; 166 Optional< DragOperation> operation;166 Optional<OptionSet<DragOperation>> operationMask; 167 167 }; 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); 171 171 void updateDragStateAfterEditDragIfNeeded(Element& rootEditableElement); 172 172 RefPtr<Element> draggedElement() const; … … 269 269 WEBCORE_EXPORT void didStartDrag(); 270 270 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); 272 272 #endif 273 273 … … 417 417 #if ENABLE(DRAG_SUPPORT) 418 418 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); 420 420 void invalidateDataTransfer(); 421 421 -
trunk/Source/WebCore/page/gtk/DragControllerGtk.cpp
r226312 r262680 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 51 51 } 52 52 53 DragOperationDragController::dragOperation(const DragData& dragData)53 Optional<DragOperation> DragController::dragOperation(const DragData& dragData) 54 54 { 55 55 // FIXME: This logic is incomplete … … 57 57 return DragOperationCopy; 58 58 59 return DragOperationNone;59 return WTF::nullopt; 60 60 } 61 61 -
trunk/Source/WebCore/page/mac/DragControllerMac.mm
r261638 r262680 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 65 65 } 66 66 67 DragOperationDragController::dragOperation(const DragData& dragData)67 Optional<DragOperation> DragController::dragOperation(const DragData& dragData) 68 68 { 69 69 if (dragData.flags() & DragApplicationIsModal) 70 return DragOperationNone;70 return WTF::nullopt; 71 71 72 72 bool mayContainURL; … … 77 77 78 78 if (!mayContainURL && !dragData.containsPromise()) 79 return DragOperationNone;79 return WTF::nullopt; 80 80 81 81 if (!m_documentUnderMouse || (!(dragData.flags() & (DragApplicationHasAttachedSheet | DragApplicationIsSource)))) 82 82 return DragOperationCopy; 83 83 84 return DragOperationNone;84 return WTF::nullopt; 85 85 } 86 86 -
trunk/Source/WebCore/page/win/DragControllerWin.cpp
r236583 r262680 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 43 43 const float DragController::DragImageAlpha = 0.75f; 44 44 45 DragOperationDragController::dragOperation(const DragData& dragData)45 Optional<DragOperation> DragController::dragOperation(const DragData& dragData) 46 46 { 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; 52 54 } 53 55 -
trunk/Source/WebCore/platform/DragData.cpp
r262190 r262680 33 33 34 34 #if !PLATFORM(COCOA) 35 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperationsourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)35 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask) 36 36 : m_clientPosition(clientPosition) 37 37 , m_globalPosition(globalPosition) … … 43 43 } 44 44 45 DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperationsourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)45 DragData::DragData(const String&, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask) 46 46 : m_clientPosition(clientPosition) 47 47 , m_globalPosition(globalPosition) -
trunk/Source/WebCore/platform/DragData.h
r262395 r262680 76 76 77 77 // 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()); 80 80 // This constructor should used only by WebKit2 IPC because DragData 81 81 // is initialized by the decoder and not in the constructor. 82 82 DragData() = default; 83 83 #if PLATFORM(WIN) 84 WEBCORE_EXPORT DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperationsourceOperationMask, DragApplicationFlags = DragApplicationNone);84 WEBCORE_EXPORT DragData(const DragDataMap&, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags = DragApplicationNone); 85 85 const DragDataMap& dragDataMap(); 86 86 void getDragFileDescriptorData(int& size, String& pathname); … … 91 91 DragApplicationFlags flags() const { return m_applicationFlags; } 92 92 DragDataRef platformData() const { return m_platformDragData; } 93 DragOperationdraggingSourceOperationMask() const { return m_draggingSourceOperationMask; }93 OptionSet<DragOperation> draggingSourceOperationMask() const { return m_draggingSourceOperationMask; } 94 94 bool containsURL(FilenameConversionPolicy = ConvertFilenames) const; 95 95 bool containsPlainText() const; … … 130 130 IntPoint m_globalPosition; 131 131 DragDataRef m_platformDragData; 132 DragOperationm_draggingSourceOperationMask;132 OptionSet<DragOperation> m_draggingSourceOperationMask; 133 133 DragApplicationFlags m_applicationFlags; 134 134 Vector<String> m_fileNames; -
trunk/Source/WebCore/platform/cocoa/DragDataCocoa.mm
r262190 r262680 117 117 } 118 118 119 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperationsourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)119 DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask) 120 120 : m_clientPosition(clientPosition) 121 121 , m_globalPosition(globalPosition) … … 132 132 } 133 133 134 DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, DragOperationsourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask)134 DragData::DragData(const String& dragStorageName, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags, OptionSet<DragDestinationAction> destinationActionMask) 135 135 : m_clientPosition(clientPosition) 136 136 , m_globalPosition(globalPosition) -
trunk/Source/WebCore/platform/gtk/GtkUtilities.cpp
r262192 r262680 150 150 } 151 151 152 DragOperationgdkDragActionToDragOperation(GdkDragAction gdkAction)152 OptionSet<DragOperation> gdkDragActionToDragOperation(GdkDragAction gdkAction) 153 153 { 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); 160 161 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; 170 163 } 171 164 172 GdkDragAction dragOperationToGdkDragActions( DragOperationcoreAction)165 GdkDragAction dragOperationToGdkDragActions(OptionSet<DragOperation> coreAction) 173 166 { 174 167 unsigned gdkAction = 0; 175 if (coreAction == DragOperationNone)176 return static_cast<GdkDragAction>(gdkAction);177 168 178 if (coreAction & DragOperationCopy)169 if (coreAction.contains(DragOperationCopy)) 179 170 gdkAction |= GDK_ACTION_COPY; 180 if (coreAction & DragOperationMove)171 if (coreAction.contains(DragOperationMove)) 181 172 gdkAction |= GDK_ACTION_MOVE; 182 if (coreAction & DragOperationLink)173 if (coreAction.contains(DragOperationLink)) 183 174 gdkAction |= GDK_ACTION_LINK; 184 175 … … 186 177 } 187 178 188 GdkDragAction dragOperationToSingleGdkDragAction( DragOperationcoreAction)179 GdkDragAction dragOperationToSingleGdkDragAction(OptionSet<DragOperation> coreAction) 189 180 { 190 if (coreAction == DragOperationEvery || coreAction & DragOperationCopy)181 if (coreAction.contains(DragOperationCopy)) 191 182 return GDK_ACTION_COPY; 192 if (coreAction & DragOperationMove)183 if (coreAction.contains(DragOperationMove)) 193 184 return GDK_ACTION_MOVE; 194 if (coreAction & DragOperationLink)185 if (coreAction.contains(DragOperationLink)) 195 186 return GDK_ACTION_LINK; 196 187 return static_cast<GdkDragAction>(0); -
trunk/Source/WebCore/platform/gtk/GtkUtilities.h
r262187 r262680 52 52 WEBCORE_EXPORT unsigned stateModifierForGdkButton(unsigned button); 53 53 54 WEBCORE_EXPORT DragOperationgdkDragActionToDragOperation(GdkDragAction);55 WEBCORE_EXPORT GdkDragAction dragOperationToGdkDragActions( DragOperation);56 WEBCORE_EXPORT GdkDragAction dragOperationToSingleGdkDragAction( DragOperation);54 WEBCORE_EXPORT OptionSet<DragOperation> gdkDragActionToDragOperation(GdkDragAction); 55 WEBCORE_EXPORT GdkDragAction dragOperationToGdkDragActions(OptionSet<DragOperation>); 56 WEBCORE_EXPORT GdkDragAction dragOperationToSingleGdkDragAction(OptionSet<DragOperation>); 57 57 58 58 } // namespace WebCore -
trunk/Source/WebCore/platform/win/DragDataWin.cpp
r242592 r262680 1 1 /* 2 * Copyright (C) 2007 , 2008Apple Inc. All rights reserved.2 * Copyright (C) 2007-2020 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2012 Baidu Inc. All rights reserved. 4 4 * … … 42 42 43 43 DragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, const IntPoint& globalPosition, 44 DragOperationsourceOperationMask, DragApplicationFlags flags)44 OptionSet<DragOperation> sourceOperationMask, DragApplicationFlags flags) 45 45 : m_clientPosition(clientPosition) 46 46 , m_globalPosition(globalPosition) -
trunk/Source/WebKit/ChangeLog
r262673 r262680 1 2020-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 1 103 2020-06-06 Devin Rousso <drousso@apple.com> 2 104 -
trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h
r262283 r262680 1026 1026 WTF_EXTERN_C_END 1027 1027 1028 typedef NS_OPTIONS(NSUInteger, UIDragOperation)1029 {1030 UIDragOperationNone = 0,1031 UIDragOperationEvery = NSUIntegerMax,1032 };1033 1034 1028 @interface UIDragInteraction () 1035 1029 @property (nonatomic, assign, getter=_liftDelay, setter=_setLiftDelay:) NSTimeInterval liftDelay; -
trunk/Source/WebKit/Scripts/webkit/messages.py
r262648 r262680 210 210 'WebCore::DocumentIdentifier', 211 211 'WebCore::DocumentOrWorkerIdentifier', 212 'WebCore::DragOperation', # FIXME: Remove after converting WebCore::DragOperation to enum class. 212 213 'WebCore::FetchIdentifier', 213 214 'WebCore::FrameIdentifier', … … 591 592 'WebKit::DocumentEditingContextRequest': ['"DocumentEditingContext.h"'], 592 593 'WebCore::DragHandlingMethod': ['<WebCore/DragActions.h>'], 594 'WebCore::DragOperation': ['<WebCore/DragActions.h>'], 593 595 'WebCore::ExceptionDetails': ['<WebCore/JSDOMExceptionHandling.h>'], 594 596 'WebCore::FileChooserSettings': ['<WebCore/FileChooser.h>'], -
trunk/Source/WebKit/Shared/API/Cocoa/_WKDragActionsInternal.h
r262395 r262680 41 41 } 42 42 43 #if USE(APPKIT) 44 inline 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 43 63 } // namespace WebKit -
trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp
r262190 r262680 1532 1532 encoder << dragData.clientPosition(); 1533 1533 encoder << dragData.globalPosition(); 1534 encoder .encodeEnum(dragData.draggingSourceOperationMask());1534 encoder << dragData.draggingSourceOperationMask(); 1535 1535 encoder.encodeEnum(dragData.flags()); 1536 1536 #if PLATFORM(COCOA) … … 1551 1551 return false; 1552 1552 1553 DragOperationdraggingSourceOperationMask;1554 if (!decoder.decode Enum(draggingSourceOperationMask))1553 OptionSet<DragOperation> draggingSourceOperationMask; 1554 if (!decoder.decode(draggingSourceOperationMask)) 1555 1555 return false; 1556 1556 -
trunk/Source/WebKit/UIProcess/API/gtk/DragSource.h
r261911 r262680 53 53 ~DragSource(); 54 54 55 void begin(WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&&);55 void begin(WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<ShareableBitmap>&&); 56 56 57 57 private: -
trunk/Source/WebKit/UIProcess/API/gtk/DragSourceGtk3.cpp
r261802 r262680 107 107 } 108 108 109 void DragSource::begin(SelectionData&& selectionData, DragOperation operation, RefPtr<ShareableBitmap>&& image)109 void DragSource::begin(SelectionData&& selectionData, OptionSet<DragOperation> operationMask, RefPtr<ShareableBitmap>&& image) 110 110 { 111 111 if (m_drag) { … … 130 130 gtk_target_list_add(list.get(), gdk_atom_intern_static_string("application/vnd.webkitgtk.smartpaste"), 0, DragTargetType::SmartPaste); 131 131 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); 133 133 if (image) { 134 134 RefPtr<cairo_surface_t> imageSurface(image->createCairoSurface()); -
trunk/Source/WebKit/UIProcess/API/gtk/DragSourceGtk4.cpp
r261911 r262680 45 45 } 46 46 47 void DragSource::begin(SelectionData&& selectionData, DragOperation operation, RefPtr<ShareableBitmap>&& image)47 void DragSource::begin(SelectionData&& selectionData, OptionSet<DragOperation> operationMask, RefPtr<ShareableBitmap>&& image) 48 48 { 49 49 if (m_drag) { … … 90 90 auto* device = gdk_seat_get_pointer(gdk_display_get_default_seat(gtk_widget_get_display(m_webView))); 91 91 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)); 93 93 g_signal_connect(m_drag.get(), "dnd-finished", G_CALLBACK(+[](GdkDrag* gtkDrag, gpointer userData) { 94 94 auto& drag = *static_cast<DragSource*>(userData); -
trunk/Source/WebKit/UIProcess/API/gtk/DropTarget.h
r261911 r262680 81 81 unsigned m_dataRequestCount { 0 }; 82 82 Optional<WebCore::SelectionData> m_selectionData; 83 WebCore::DragOperation m_operation { WebCore::DragOperationNone };83 Optional<WebCore::DragOperation> m_operation; 84 84 #if USE(GTK4) 85 85 GRefPtr<GCancellable> m_cancellable; -
trunk/Source/WebKit/UIProcess/API/gtk/DropTargetGtk3.cpp
r261802 r262680 218 218 219 219 auto operation = page->currentDragOperation(); 220 if ( operation ==m_operation)220 if ((!operation && !m_operation) || *operation == *m_operation) 221 221 return; 222 222 … … 230 230 ASSERT(page); 231 231 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), { }); 233 233 page->dragExited(dragData); 234 234 page->resetCurrentDragInformation(); -
trunk/Source/WebKit/UIProcess/API/gtk/DropTargetGtk4.cpp
r261911 r262680 274 274 275 275 auto operation = page->currentDragOperation(); 276 if ( operation == m_operation)276 if ((!operation && !m_operation) || operation == m_operation) 277 277 return; 278 278 -
trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp
r262415 r262680 321 321 322 322 #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));323 void PageClientImpl::startDrag(SelectionData&& selection, OptionSet<DragOperation> dragOperationMask, RefPtr<ShareableBitmap>&& dragImage) 324 { 325 webkitWebViewBaseStartDrag(WEBKIT_WEB_VIEW_BASE(m_viewWidget), WTFMove(selection), dragOperationMask, WTFMove(dragImage)); 326 326 } 327 327 -
trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.h
r261802 r262680 101 101 RefPtr<ViewSnapshot> takeViewSnapshot(Optional<WebCore::IntRect>&&) override; 102 102 #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; 104 104 void didPerformDragControllerAction() override; 105 105 #endif -
trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp
r262485 r262680 2062 2062 2063 2063 #if ENABLE(DRAG_SUPPORT) 2064 void webkitWebViewBaseStartDrag(WebKitWebViewBase* webViewBase, SelectionData&& selectionData, DragOperation dragOperation, RefPtr<ShareableBitmap>&& image)2064 void webkitWebViewBaseStartDrag(WebKitWebViewBase* webViewBase, SelectionData&& selectionData, OptionSet<DragOperation> dragOperationMask, RefPtr<ShareableBitmap>&& image) 2065 2065 { 2066 2066 WebKitWebViewBasePrivate* priv = webViewBase->priv; … … 2068 2068 priv->dragSource = makeUnique<DragSource>(GTK_WIDGET(webViewBase)); 2069 2069 2070 priv->dragSource->begin(WTFMove(selectionData), dragOperation , WTFMove(image));2070 priv->dragSource->begin(WTFMove(selectionData), dragOperationMask, WTFMove(image)); 2071 2071 2072 2072 #if !USE(GTK4) -
trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h
r262105 r262680 83 83 84 84 #if ENABLE(DRAG_SUPPORT) 85 void webkitWebViewBaseStartDrag(WebKitWebViewBase*, WebCore::SelectionData&&, WebCore::DragOperation, RefPtr<WebKit::ShareableBitmap>&&);85 void webkitWebViewBaseStartDrag(WebKitWebViewBase*, WebCore::SelectionData&&, OptionSet<WebCore::DragOperation>, RefPtr<WebKit::ShareableBitmap>&&); 86 86 void webkitWebViewBaseDidPerformDragControllerAction(WebKitWebViewBase*); 87 87 #endif -
trunk/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
r262395 r262680 3914 3914 } 3915 3915 3916 void WebViewImpl::sendDragEndToPage(CGPoint endPoint, NSDragOperation operation)3916 void WebViewImpl::sendDragEndToPage(CGPoint endPoint, NSDragOperation dragOperationMask) 3917 3917 { 3918 3918 ALLOW_DEPRECATED_DECLARATIONS_BEGIN … … 3924 3924 m_ignoresMouseDraggedEvents = true; 3925 3925 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)); 3927 3927 } 3928 3928 … … 3948 3948 WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window])); 3949 3949 auto dragDestinationActionMask = coreDragDestinationActionMask([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]); 3950 auto dragOperationMask = static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask);3950 auto dragOperationMask = coreDragOperationMask(draggingInfo.draggingSourceOperationMask); 3951 3951 WebCore::DragData dragData(draggingInfo, client, global, dragOperationMask, applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo), dragDestinationActionMask); 3952 3952 … … 3957 3957 } 3958 3958 3959 static 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 3959 3983 NSDragOperation WebViewImpl::draggingUpdated(id <NSDraggingInfo> draggingInfo) 3960 3984 { … … 3962 3986 WebCore::IntPoint global(WebCore::globalPoint(draggingInfo.draggingLocation, [m_view window])); 3963 3987 auto dragDestinationActionMask = coreDragDestinationActionMask([m_view _web_dragDestinationActionForDraggingInfo:draggingInfo]); 3964 auto dragOperationMask = static_cast<WebCore::DragOperation>(draggingInfo.draggingSourceOperationMask);3988 auto dragOperationMask = coreDragOperationMask(draggingInfo.draggingSourceOperationMask); 3965 3989 WebCore::DragData dragData(draggingInfo, client, global, dragOperationMask, applicationFlagsForDrag(m_view.getAutoreleased(), draggingInfo), dragDestinationActionMask); 3966 3990 m_page->dragUpdated(dragData, draggingInfo.draggingPasteboard.name); … … 3968 3992 NSInteger numberOfValidItemsForDrop = m_page->currentDragNumberOfFilesToBeAccepted(); 3969 3993 3970 if ( m_page->currentDragOperation() == WebCore::DragOperationNone)3994 if (!m_page->currentDragOperation()) 3971 3995 numberOfValidItemsForDrop = m_initialNumberOfValidItemsForDrop; 3972 3996 … … 3980 4004 [draggingInfo setDraggingFormation:draggingFormation]; 3981 4005 3982 return m_page->currentDragOperation();4006 return kit(m_page->currentDragOperation()); 3983 4007 } 3984 4008 … … 3987 4011 WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]); 3988 4012 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)); 3990 4014 m_page->dragExited(dragData, draggingInfo.draggingPasteboard.name); 3991 4015 m_page->resetCurrentDragInformation(); … … 4003 4027 WebCore::IntPoint client([m_view convertPoint:draggingInfo.draggingLocation fromView:nil]); 4004 4028 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)); 4006 4030 4007 4031 NSArray *types = draggingInfo.draggingPasteboard.types; -
trunk/Source/WebKit/UIProcess/PageClient.h
r262429 r262680 251 251 #if ENABLE(DRAG_SUPPORT) 252 252 #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; 254 254 #else 255 255 virtual void startDrag(const WebCore::DragItem&, const ShareableBitmap::Handle&) { } -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r262598 r262680 2425 2425 } 2426 2426 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); 2427 void WebPageProxy::didPerformDragControllerAction(Optional<WebCore::DragOperation> dragOperation, WebCore::DragHandlingMethod dragHandlingMethod, bool mouseIsOverFileInput, unsigned numberOfItemsToBeAccepted, const IntRect& insertionRect, const IntRect& editableElementRect) 2428 { 2429 m_currentDragOperation = dragOperation; 2432 2430 m_currentDragHandlingMethod = dragHandlingMethod; 2433 2431 m_currentDragIsOverFileInput = mouseIsOverFileInput; … … 2439 2437 2440 2438 #if PLATFORM(GTK) 2441 void WebPageProxy::startDrag(SelectionData&& selectionData, uint64_t dragOperation, const ShareableBitmap::Handle& dragImageHandle)2439 void WebPageProxy::startDrag(SelectionData&& selectionData, OptionSet<WebCore::DragOperation> dragOperationMask, const ShareableBitmap::Handle& dragImageHandle) 2442 2440 { 2443 2441 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)); 2445 2443 2446 2444 didStartDrag(); … … 2448 2446 #endif 2449 2447 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));2448 void 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)); 2455 2453 setDragCaretRect({ }); 2456 2454 } … … 2483 2481 void WebPageProxy::resetCurrentDragInformation() 2484 2482 { 2485 m_currentDragOperation = W ebCore::DragOperationNone;2483 m_currentDragOperation = WTF::nullopt; 2486 2484 m_currentDragHandlingMethod = DragHandlingMethod::None; 2487 2485 m_currentDragIsOverFileInput = false; -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r262598 r262680 1158 1158 void didPerformDragOperation(bool handled); 1159 1159 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>); 1162 1162 void didStartDrag(); 1163 1163 void dragCancelled(); … … 1169 1169 #endif 1170 1170 #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); 1172 1172 #endif 1173 1173 #endif … … 1228 1228 1229 1229 #if ENABLE(DRAG_SUPPORT) 1230 WebCore::DragOperationcurrentDragOperation() const { return m_currentDragOperation; }1230 Optional<WebCore::DragOperation> currentDragOperation() const { return m_currentDragOperation; } 1231 1231 WebCore::DragHandlingMethod currentDragHandlingMethod() const { return m_currentDragHandlingMethod; } 1232 1232 bool currentDragIsOverFileInput() const { return m_currentDragIsOverFileInput; } … … 2609 2609 // Current drag destination details are delivered as an asynchronous response, 2610 2610 // 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; 2612 2612 WebCore::DragHandlingMethod m_currentDragHandlingMethod { WebCore::DragHandlingMethod::None }; 2613 2613 bool m_currentDragIsOverFileInput { false }; -
trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in
r262598 r262680 311 311 # Drag and drop messages 312 312 #if ENABLE(DRAG_SUPPORT) 313 DidPerformDragControllerAction( uint64_tdragOperation, 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) 314 314 DidEndDragging(); 315 315 #endif … … 319 319 #endif 320 320 #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) 322 322 #endif 323 323 -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r262665 r262680 7290 7290 // A client of the Objective C SPI or UIKit might have prevented the drag from beginning entirely in the UI process, in which case 7291 7291 // we need to balance the `dragstart` event with a `dragend`. 7292 _page->dragEnded(positionForDragEnd, positionForDragEnd, WebCore::DragOperationNone);7292 _page->dragEnded(positionForDragEnd, positionForDragEnd, { }); 7293 7293 } 7294 7294 } … … 7308 7308 } 7309 7309 7310 static UIDropOperation dropOperationForWebCoreDragOperation( WebCore::DragOperationoperation)7311 { 7312 if (operation & WebCore::DragOperationMove)7313 return UIDropOperationMove;7314 7315 if (operation &WebCore::DragOperationCopy)7316 return UIDropOperationCopy;7317 7310 static 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 } 7318 7318 return UIDropOperationCancel; 7319 } 7320 7321 static 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; 7319 7335 } 7320 7336 … … 7325 7341 [self computeClientAndGlobalPointsForDropSession:session outClientPoint:&client outGlobalPoint:&global]; 7326 7342 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); 7328 7346 return { session, WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), dragOperationMask, WebCore::DragApplicationNone, WebKit::coreDragDestinationActionMask(dragDestinationAction) }; 7329 7347 } … … 7429 7447 [self computeClientAndGlobalPointsForDropSession:dropSession outClientPoint:&client outGlobalPoint:&global]; 7430 7448 [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>({ })); 7432 7451 } 7433 7452 … … 8018 8037 // The lift was canceled, so -dropInteraction:sessionDidEnd: will never be invoked. This is the last chance to clean up. 8019 8038 [protectedSelf cleanUpDragSourceSessionState]; 8020 page->dragEnded(positionForDragEnd, positionForDragEnd, WebCore::DragOperationNone);8039 page->dragEnded(positionForDragEnd, positionForDragEnd, { }); 8021 8040 } 8022 8041 #if !RELEASE_LOG_DISABLED … … 8053 8072 8054 8073 [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)); 8056 8075 } 8057 8076 … … 8272 8291 [self computeClientAndGlobalPointsForDropSession:session outClientPoint:&client outGlobalPoint:&global]; 8273 8292 [self cleanUpDragSourceSessionState]; 8274 _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), WebCore::DragOperationNone);8293 _page->dragEnded(WebCore::roundedIntPoint(client), WebCore::roundedIntPoint(global), { }); 8275 8294 } 8276 8295 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/gtk/WebDragClientGtk.cpp
r261802 r262680 76 76 m_page->willStartDrag(); 77 77 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)); 79 79 } 80 80 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r262603 r262680 3946 3946 3947 3947 #if PLATFORM(GTK) 3948 void WebPage::performDragControllerAction(DragControllerAction action, const IntPoint& clientPosition, const IntPoint& globalPosition, uint64_tdraggingSourceOperationMask, SelectionData&& selectionData, uint32_t flags)3948 void WebPage::performDragControllerAction(DragControllerAction action, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet<DragOperation> draggingSourceOperationMask, SelectionData&& selectionData, uint32_t flags) 3949 3949 { 3950 3950 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)); 3956 3956 switch (action) { 3957 3957 case DragControllerAction::Entered: { 3958 DragOperationresolvedDragOperation = m_page->dragController().dragEntered(dragData);3958 auto resolvedDragOperation = m_page->dragController().dragEntered(dragData); 3959 3959 send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), { }, { })); 3960 3960 return; 3961 3961 } 3962 3962 case DragControllerAction::Updated: { 3963 DragOperationresolvedDragOperation = m_page->dragController().dragUpdated(dragData);3963 auto resolvedDragOperation = m_page->dragController().dragUpdated(dragData); 3964 3964 send(Messages::WebPageProxy::DidPerformDragControllerAction(resolvedDragOperation, m_page->dragController().dragHandlingMethod(), m_page->dragController().mouseIsOverFileInput(), m_page->dragController().numberOfItemsToBeAccepted(), { }, { })); 3965 3965 return; … … 3980 3980 { 3981 3981 if (!m_page) { 3982 send(Messages::WebPageProxy::DidPerformDragControllerAction( DragOperationNone, DragHandlingMethod::None, false, 0, { }, { }));3982 send(Messages::WebPageProxy::DidPerformDragControllerAction(WTF::nullopt, DragHandlingMethod::None, false, 0, { }, { })); 3983 3983 return; 3984 3984 } … … 3986 3986 switch (action) { 3987 3987 case DragControllerAction::Entered: { 3988 DragOperationresolvedDragOperation = m_page->dragController().dragEntered(dragData);3988 auto resolvedDragOperation = m_page->dragController().dragEntered(dragData); 3989 3989 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())); 3990 3990 return; 3991 3991 } 3992 3992 case DragControllerAction::Updated: { 3993 DragOperationresolvedDragOperation = m_page->dragController().dragUpdated(dragData);3993 auto resolvedDragOperation = m_page->dragController().dragUpdated(dragData); 3994 3994 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())); 3995 3995 return; … … 3997 3997 case DragControllerAction::Exited: 3998 3998 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, { }, { })); 4000 4000 return; 4001 4001 … … 4024 4024 #endif 4025 4025 4026 void WebPage::dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)4026 void WebPage::dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation> dragOperationMask) 4027 4027 { 4028 4028 IntPoint adjustedClientPosition(clientPosition.x() + m_page->dragController().dragOffset().x(), clientPosition.y() + m_page->dragController().dragOffset().y()); … … 4035 4035 // FIXME: These are fake modifier keys here, but they should be real ones instead. 4036 4036 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); 4038 4038 4039 4039 send(Messages::WebPageProxy::DidEndDragging()); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r262603 r262680 900 900 901 901 #if ENABLE(DRAG_SUPPORT) && PLATFORM(GTK) 902 void performDragControllerAction(DragControllerAction, const WebCore::IntPoint& clientPosition, const WebCore::IntPoint& globalPosition, uint64_tdraggingSourceOperationMask, 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); 903 903 #endif 904 904 … … 908 908 909 909 #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>); 911 911 912 912 void willPerformLoadDragDestinationAction(); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r261966 r262680 310 310 # Drag and drop. 311 311 #if PLATFORM(GTK) && ENABLE(DRAG_SUPPORT) 312 PerformDragControllerAction(enum:uint8_t WebKit::DragControllerAction action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_tdraggingSourceOperationMask, 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) 313 313 #endif 314 314 #if !PLATFORM(GTK) && ENABLE(DRAG_SUPPORT) … … 317 317 #if ENABLE(DRAG_SUPPORT) 318 318 DidStartDrag() 319 DragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)319 DragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, OptionSet<WebCore::DragOperation> dragOperationMask) 320 320 DragCancelled() 321 321 #endif -
trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
r262665 r262680 925 925 PlatformMouseEvent event(clientPosition, globalPosition, LeftButton, PlatformEvent::MouseMoved, 0, false, false, false, false, WallTime::now(), 0, NoTap); 926 926 m_page->dragController().dragEnded(); 927 m_page->mainFrame().eventHandler().dragSourceEndedAt(event, DragOperationNone, MayExtendDragSession::Yes);927 m_page->mainFrame().eventHandler().dragSourceEndedAt(event, { }, MayExtendDragSession::Yes); 928 928 929 929 bool didHandleDrag = m_page->mainFrame().eventHandler().tryToBeginDragAtPoint(clientPosition, globalPosition); -
trunk/Source/WebKitLegacy/mac/ChangeLog
r262676 r262680 1 2020-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 1 43 2020-06-06 Jonathan Bedard <jbedard@apple.com> 2 44 -
trunk/Source/WebKitLegacy/mac/WebView/WebFrame.mm
r261210 r262680 943 943 944 944 #if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) 945 - (void)_dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation) operation945 - (void)_dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)dragOperationMask 946 946 { 947 947 if (!_private->coreFrame) … … 953 953 WebCore::PlatformMouseEvent event(WebCore::IntPoint(windowLoc), WebCore::IntPoint(WebCore::globalPoint(windowLoc, [view->platformWidget() window])), 954 954 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)); 956 956 } 957 957 #endif // ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) -
trunk/Source/WebKitLegacy/mac/WebView/WebHTMLView.mm
r261981 r262680 1 1 /* 2 * Copyright (C) 2005-20 19Apple Inc. All rights reserved.2 * Copyright (C) 2005-2020 Apple Inc. All rights reserved. 3 3 * (C) 2006, 2007 Graham Dennis (graham.dennis@gmail.com) 4 4 * … … 4230 4230 4231 4231 #if ENABLE(DRAG_SUPPORT) && PLATFORM(MAC) 4232 4233 static 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 4232 4251 ALLOW_DEPRECATED_IMPLEMENTATIONS_BEGIN 4233 4252 - (void)dragImage:(NSImage *)dragImage … … 4281 4300 return NSDragOperationNone; 4282 4301 4283 return (NSDragOperation)page->dragController().sourceDragOperation();4302 return kit(page->dragController().sourceDragOperationMask()); 4284 4303 } 4285 4304 … … 4387 4406 return NSDragOperationNone; 4388 4407 4389 return (NSDragOperation)page->dragController().sourceDragOperation();4408 return kit(page->dragController().sourceDragOperationMask()); 4390 4409 } 4391 4410 -
trunk/Source/WebKitLegacy/mac/WebView/WebView.mm
r262456 r262680 590 590 return result; 591 591 } 592 593 #if !USE(APPKIT) 594 // See <UIKit/UIDragging_Private.h>. 595 typedef NS_OPTIONS(NSUInteger, _UIDragOperation) { 596 _UIDragOperationNone = 0, 597 _UIDragOperationCopy = 1, 598 _UIDragOperationMove = 16, 599 }; 600 #endif 601 602 OptionSet<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) 630 static 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 654 static _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) 592 678 #endif // ENABLE(DRAG_SUPPORT) 593 679 … … 1924 2010 - (WebCore::DragData)dragDataForSession:(id <UIDropSession>)session client:(CGPoint)clientPosition global:(CGPoint)globalPosition operation:(uint64_t)operation 1925 2011 { 1926 auto dragOperationMask = static_cast<WebCore::DragOperation>(operation);2012 auto dragOperationMask = coreDragOperationMask(operation); 1927 2013 auto dragDestinationActionMask = coreDragDestinationActionMask([self dragDestinationActionMaskForSession:session]); 1928 2014 return { session, WebCore::roundedIntPoint(clientPosition), WebCore::roundedIntPoint(globalPosition), dragOperationMask, WebCore::DragApplicationNone, dragDestinationActionMask }; … … 1933 2019 WebThreadLock(); 1934 2020 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)); 1936 2022 } 1937 2023 … … 1940 2026 WebThreadLock(); 1941 2027 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)); 1943 2029 } 1944 2030 … … 6749 6835 WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window])); 6750 6836 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)); 6753 6839 } 6754 6840 … … 6762 6848 WebCore::IntPoint global(WebCore::globalPoint([draggingInfo draggingLocation], [self window])); 6763 6849 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)); 6766 6852 } 6767 6853 … … 6774 6860 WebCore::IntPoint client([draggingInfo draggingLocation]); 6775 6861 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]); 6777 6863 page->dragController().dragExited(dragData); 6778 6864 } … … 6787 6873 WebCore::IntPoint client([draggingInfo draggingLocation]); 6788 6874 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]); 6790 6876 6791 6877 NSArray* types = draggingInfo.draggingPasteboard.types; -
trunk/Source/WebKitLegacy/mac/WebView/WebViewInternal.h
r262456 r262680 1 1 /* 2 * Copyright (C) 2005 , 2006, 2007, 2008, 2009Apple Inc. All rights reserved.2 * Copyright (C) 2005-2020 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2010 Igalia S.L 4 4 * … … 37 37 38 38 #import <WebCore/AlternativeTextClient.h> 39 #import <WebCore/DragActions.h> 39 40 #import <WebCore/FindOptions.h> 40 41 #import <WebCore/FloatRect.h> … … 90 91 #ifdef __cplusplus 91 92 92 WebCore::FindOptions coreOptions(WebFindOptions options); 93 #if ENABLE(DRAG_SUPPORT) 94 #if USE(APPKIT) 95 using CocoaDragOperation = NSDragOperation; 96 #else 97 using CocoaDragOperation = uint64_t; 98 #endif 99 100 OptionSet<WebCore::DragOperation> coreDragOperationMask(CocoaDragOperation); 101 #endif // ENABLE(DRAG_SUPPORT) 102 103 WebCore::FindOptions coreOptions(WebFindOptions); 93 104 94 105 OptionSet<WebCore::LayoutMilestone> coreLayoutMilestones(WebLayoutMilestones); -
trunk/Source/WebKitLegacy/win/ChangeLog
r262395 r262680 1 2020-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 1 26 2020-06-01 David Kilzer <ddkilzer@apple.com> 2 27 -
trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDragClient.cpp
r262395 r262680 45 45 using namespace WebCore; 46 46 47 static DWORD draggingSourceOperationMaskToDragCursors( DragOperation op)47 static DWORD draggingSourceOperationMaskToDragCursors(OptionSet<DragOperation> operationMask) 48 48 { 49 49 DWORD result = DROPEFFECT_NONE; 50 if (op == DragOperationEvery)50 if (operationMask == anyDragOperation()) 51 51 return DROPEFFECT_COPY | DROPEFFECT_LINK | DROPEFFECT_MOVE; 52 if (op & DragOperationCopy)52 if (operationMask.contains(DragOperationCopy)) 53 53 result |= DROPEFFECT_COPY; 54 if (op & DragOperationLink)54 if (operationMask.contains(DragOperationLink)) 55 55 result |= DROPEFFECT_LINK; 56 if (op & DragOperationMove)56 if (operationMask.contains(DragOperationMove)) 57 57 result |= DROPEFFECT_MOVE; 58 if (op & DragOperationGeneric)58 if (operationMask.contains(DragOperationGeneric)) 59 59 result |= DROPEFFECT_MOVE; 60 60 return result; … … 153 153 } 154 154 155 DWORD okEffect = draggingSourceOperationMaskToDragCursors(m_webView->page()->dragController().sourceDragOperation ());155 DWORD okEffect = draggingSourceOperationMaskToDragCursors(m_webView->page()->dragController().sourceDragOperationMask()); 156 156 DWORD effect = DROPEFFECT_NONE; 157 157 COMPtr<IWebUIDelegate> ui; … … 165 165 hr = DoDragDrop(dataObject.get(), source.get(), okEffect, &effect); 166 166 167 DragOperation operation = DragOperationNone;167 OptionSet<DragOperation> operation; 168 168 if (hr == DRAGDROP_S_DROP) { 169 169 if (effect & DROPEFFECT_COPY) -
trunk/Source/WebKitLegacy/win/WebView.cpp
r262377 r262680 5843 5843 } 5844 5844 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 5845 static 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 5862 OptionSet<DragOperation> WebView::keyStateToDragOperation(DWORD grfKeyState) const 5859 5863 { 5860 5864 if (!m_page) 5861 return DragOperationNone;5865 return { }; 5862 5866 5863 5867 // Conforms to Microsoft's key combinations as documented for … … 5865 5869 // state of the keyboard modifier keys on the keyboard. See: 5866 5870 // <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(); 5868 5872 5869 5873 if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT)) 5870 operation = DragOperationLink;5874 operationMask = { DragOperationLink }; 5871 5875 else if ((grfKeyState & MK_CONTROL) == MK_CONTROL) 5872 operation = DragOperationCopy;5876 operationMask = { DragOperationCopy }; 5873 5877 else if ((grfKeyState & MK_SHIFT) == MK_SHIFT) 5874 operation = DragOperationGeneric;5875 5876 return operation ;5878 operationMask = { DragOperationGeneric }; 5879 5880 return operationMask; 5877 5881 } 5878 5882 … … 5920 5924 5921 5925 if (m_dragData) { 5922 DragData data(m_dragData.get(), IntPoint(), IntPoint(), 5923 DragOperationNone); 5926 DragData data(m_dragData.get(), IntPoint(), IntPoint(), { }); 5924 5927 m_page->dragController().dragExited(data); 5925 5928 m_dragData = 0; -
trunk/Source/WebKitLegacy/win/WebView.h
r257465 r262680 556 556 void performLayeredWindowUpdate(); 557 557 558 WebCore::DragOperationkeyStateToDragOperation(DWORD grfKeyState) const;558 OptionSet<WebCore::DragOperation> keyStateToDragOperation(DWORD grfKeyState) const; 559 559 560 560 // 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.