Changeset 48229 in webkit


Ignore:
Timestamp:
Sep 9, 2009 3:19:22 PM (15 years ago)
Author:
eric@webkit.org
Message:

2009-09-09 Jens Alfke <snej@chromium.org>

Reviewed by Eric Seidel.

Initialize DataTransfer's effectAllowed and dropEffect properties correctly
according to HTML5 spec (sec. 7.9.2-7.9.3).
https://bugs.webkit.org/show_bug.cgi?id=26700

  • fast/events/drag-dropeffect-expected.txt: Added.
  • fast/events/drag-dropeffect.html: Added.

2009-09-09 Jens Alfke <snej@chromium.org>

Reviewed by Eric Seidel.

Initialize DataTransfer's effectAllowed and dropEffect properties correctly
according to HTML5 spec (sec. 7.9.2-7.9.3).
https://bugs.webkit.org/show_bug.cgi?id=26700

  • At the start of a drag operation, the value of effectAllowed should be the string "uninitialized".
  • At end of dragstart handler, if effectAllowed hasn't been set yet, it should be set to "copy".
  • on dragenter and dragover event, dropEffect should be initialized to a default value based on the value of effectAllowed.
  • at end of dragenter and dragover the dropEffect should be set to "none" if the value set by the handler doesn't match the effectAllowed.
  • on dragleave event, dropEffect should be "none".
  • on drop event, dropEffect should be the previously negotiated value.

Test: fast/events/drag-dropeffect.html

  • WebCore.base.exp:

Added a parameter to EventHandler::dragSourceMovedTo.

  • dom/Clipboard.cpp: (WebCore::Clipboard::Clipboard):

Initialize m_effectAllowed to "uninitialized".

(WebCore::Clipboard::sourceOperation):

Treat "uninitialized" as meaning no value has been set.

  • page/DragController.cpp: (WebCore::DragController::DragController):

Initialize new member m_destinationDragOperation.

(WebCore::DragController::dragExited):

Set m_destinationDragOperation to none on dragExit.

(WebCore::DragController::performDrag):

Set m_destinationDragOperation to current dropEffect.

(WebCore::DragController::dragEnteredOrUpdated):

Make sure to clear the operation if drag source doesn't allow it.

(WebCore::DragController::tryDHTMLDrag):

Set a default value for the dst drag op before sending dragEnter/Over.

(WebCore::DragController::startDrag):

Clear m_destinationDragOperation at start of drag.

  • page/DragController.h: (WebCore::DragController::destinationDragOperation):

Added new member m_destinationDragOperation, and its public getter.

  • page/EventHandler.cpp: (WebCore::EventHandler::updateDragAndDrop):

dropEffect should be 'none' during dropleave handler, per spec.

(WebCore::EventHandler::dragSourceMovedTo):

Added DragOperation parameter, so the handler sees the current dropEffect.

(WebCore::EventHandler::handleDrag):

Assume DragOperationEvery for non-DHTML drags.

  • page/EventHandler.h:

Added DragOperation parameter to dragSourceMovedTo().

2009-09-09 Jens Alfke <snej@chromium.org>

Reviewed by Eric Seidel.

Initialize DataTransfer's effectAllowed and dropEffect properties correctly
according to HTML5 spec (sec. 7.9.2-7.9.3).
https://bugs.webkit.org/show_bug.cgi?id=26700

  • WebView/WebFrame.mm: (-[WebFrame _dragSourceMovedTo:]):

Pass current drag operation (if known) to EventHandler::dragSourceMovedTo().

Location:
trunk
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r48228 r48229  
     12009-09-09  Jens Alfke  <snej@chromium.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Initialize DataTransfer's effectAllowed and dropEffect properties correctly
     6        according to HTML5 spec (sec. 7.9.2-7.9.3).
     7        https://bugs.webkit.org/show_bug.cgi?id=26700
     8
     9        * fast/events/drag-dropeffect-expected.txt: Added.
     10        * fast/events/drag-dropeffect.html: Added.
     11
    1122009-09-09  Zan Dobersek  <zandobersek@gmail.com>
    213
  • trunk/WebCore/ChangeLog

    r48227 r48229  
     12009-09-09  Jens Alfke  <snej@chromium.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Initialize DataTransfer's effectAllowed and dropEffect properties correctly
     6        according to HTML5 spec (sec. 7.9.2-7.9.3).
     7        https://bugs.webkit.org/show_bug.cgi?id=26700
     8        - At the start of a drag operation, the value of effectAllowed should be
     9          the string "uninitialized".
     10        - At end of dragstart handler, if effectAllowed hasn't been set yet, it
     11          should be set to "copy".
     12        - on dragenter and dragover event, dropEffect should be initialized to a
     13          default value based on the value of effectAllowed.
     14        - at end of dragenter and dragover the dropEffect should be set to "none"
     15          if the value set by the handler doesn't match the effectAllowed.
     16        - on dragleave event, dropEffect should be "none".
     17        - on drop event, dropEffect should be the previously negotiated value.
     18
     19        Test: fast/events/drag-dropeffect.html
     20
     21        * WebCore.base.exp:
     22            Added a parameter to EventHandler::dragSourceMovedTo.
     23        * dom/Clipboard.cpp:
     24        (WebCore::Clipboard::Clipboard):
     25            Initialize m_effectAllowed to "uninitialized".
     26        (WebCore::Clipboard::sourceOperation):
     27            Treat "uninitialized" as meaning no value has been set.
     28        * page/DragController.cpp:
     29        (WebCore::DragController::DragController):
     30            Initialize new member m_destinationDragOperation.
     31        (WebCore::DragController::dragExited):
     32            Set m_destinationDragOperation to none on dragExit.
     33        (WebCore::DragController::performDrag):
     34            Set m_destinationDragOperation to current dropEffect.
     35        (WebCore::DragController::dragEnteredOrUpdated):
     36            Make sure to clear the operation if drag source doesn't allow it.
     37        (WebCore::DragController::tryDHTMLDrag):
     38            Set a default value for the dst drag op before sending dragEnter/Over.
     39        (WebCore::DragController::startDrag):
     40            Clear m_destinationDragOperation at start of drag.
     41        * page/DragController.h:
     42        (WebCore::DragController::destinationDragOperation):
     43            Added new member m_destinationDragOperation, and its public getter.
     44        * page/EventHandler.cpp:
     45        (WebCore::EventHandler::updateDragAndDrop):
     46            dropEffect should be 'none' during dropleave handler, per spec.
     47        (WebCore::EventHandler::dragSourceMovedTo):
     48            Added DragOperation parameter, so the handler sees the current dropEffect.
     49        (WebCore::EventHandler::handleDrag):
     50            Assume DragOperationEvery for non-DHTML drags.
     51        * page/EventHandler.h:
     52            Added DragOperation parameter to dragSourceMovedTo().
     53
    1542009-09-09  Dumitru Daniliuc  <dumi@chromium.org>
    255
  • trunk/WebCore/WebCore.base.exp

    r48222 r48229  
    225225__ZN7WebCore12EventHandler15sendScrollEventEv
    226226__ZN7WebCore12EventHandler17dragSourceEndedAtERKNS_18PlatformMouseEventENS_13DragOperationE
    227 __ZN7WebCore12EventHandler17dragSourceMovedToERKNS_18PlatformMouseEventE
     227__ZN7WebCore12EventHandler17dragSourceMovedToERKNS_18PlatformMouseEventENS_13DragOperationE
    228228__ZN7WebCore12EventHandler17eventMayStartDragEP7NSEvent
    229229__ZN7WebCore12EventHandler20handleTextInputEventERKNS_6StringEPNS_5EventEbb
  • trunk/WebCore/dom/Clipboard.cpp

    r41525 r48229  
    4141    , m_dragImage(0)
    4242{
     43    if (isForDragging) {
     44        // per HTML5 spec, sec. 7.9.2
     45        m_effectAllowed = "uninitialized";
     46    }
    4347}
    4448   
     
    99103bool Clipboard::sourceOperation(DragOperation& op) const
    100104{
    101     if (m_effectAllowed.isNull())
     105    if (m_effectAllowed.isNull() || m_effectAllowed == "uninitialized")
    102106        return false;
    103107    op = dragOpFromIEOp(m_effectAllowed);
  • trunk/WebCore/page/DragController.cpp

    r47688 r48229  
    8484    , m_isHandlingDrag(false)
    8585    , m_sourceDragOperation(DragOperationNone)
     86    , m_destinationDragOperation(DragOperationNone)
    8687{
    8788}
     
    159160        RefPtr<Clipboard> clipboard = dragData->createClipboard(policy);
    160161        clipboard->setSourceOperation(dragData->draggingSourceOperationMask());
     162        clipboard->setDestinationOperation(DragOperationNone);  // HTML5 spec, sec. 7.9.3
    161163        mainFrame->eventHandler()->cancelDragAndDrop(createMouseEvent(dragData), clipboard.get());
    162164        clipboard->setAccessPolicy(ClipboardNumb);    // invalidate clipboard here for security
     
    182184            RefPtr<Clipboard> clipboard = dragData->createClipboard(ClipboardReadable);
    183185            clipboard->setSourceOperation(dragData->draggingSourceOperationMask());
     186            clipboard->setDestinationOperation(m_destinationDragOperation);  // HTML5 spec, sec. 7.9.3
    184187            mainFrame->eventHandler()->performDragAndDrop(createMouseEvent(dragData), clipboard.get());
    185188            clipboard->setAccessPolicy(ClipboardNumb);    // invalidate clipboard here for security
     
    230233    bool handledByDocument = tryDocumentDrag(dragData, m_dragDestinationAction, operation);
    231234    if (!handledByDocument && (m_dragDestinationAction & DragDestinationActionLoad))
    232         return operationForLoad(dragData);
     235        operation = operationForLoad(dragData);
     236   
     237    // Restrict the operation to what the drag source allows:
     238    if ((operation & dragData->draggingSourceOperationMask()) != operation)
     239        operation = DragOperationNone;
     240    m_destinationDragOperation = operation;
    233241    return operation;
    234242}
     
    492500    DragOperation srcOpMask = dragData->draggingSourceOperationMask();
    493501    clipboard->setSourceOperation(srcOpMask);
     502    m_destinationDragOperation = defaultOperationForDrag(srcOpMask);    // HTML5 spec, sec. 7.9.3
     503    clipboard->setDestinationOperation(m_destinationDragOperation);
    494504
    495505    PlatformMouseEvent event = createMouseEvent(dragData);
     
    624634    m_draggingImageURL = KURL();
    625635    m_sourceDragOperation = srcOp;
     636    m_destinationDragOperation = DragOperationNone;
    626637
    627638    DragImageRef dragImage = 0;
  • trunk/WebCore/page/DragController.h

    r45064 r48229  
    6666        bool isHandlingDrag() const { return m_isHandlingDrag; }
    6767        DragOperation sourceDragOperation() const { return m_sourceDragOperation; }
     68        DragOperation destinationDragOperation() const { return m_destinationDragOperation; }
    6869        void setDraggingImageURL(const KURL& url) { m_draggingImageURL = url; }
    6970        const KURL& draggingImageURL() const { return m_draggingImageURL; }
     
    123124        bool m_isHandlingDrag;
    124125        DragOperation m_sourceDragOperation; // Set in startDrag when a drag starts from a mouse down within WebKit
     126        DragOperation m_destinationDragOperation; // Last operation set by event handler
    125127        IntPoint m_dragOffset;
    126128        KURL m_draggingImageURL;
  • trunk/WebCore/page/EventHandler.cpp

    r48106 r48229  
    15071507            if (frame)
    15081508                accept = frame->eventHandler()->updateDragAndDrop(event, clipboard);
    1509             else
     1509            else {
     1510                // Temporarily set dropEffect to 'none' while calling dropleave handler (as per HTML5 spec)
     1511                DragOperation saveOp = DragOperationNone;
     1512                clipboard->destinationOperation(saveOp);
     1513                clipboard->setDestinationOperation(DragOperationNone);
    15101514                dispatchDragEvent(eventNames().dragleaveEvent, m_dragTarget.get(), event, clipboard);
     1515                clipboard->setDestinationOperation(saveOp);
     1516            }
    15111517        }
    15121518    } else {
     
    21322138}
    21332139   
    2134 void EventHandler::dragSourceMovedTo(const PlatformMouseEvent& event)
    2135 {
    2136     if (dragState().m_dragSrc && dragState().m_dragSrcMayBeDHTML)
     2140void EventHandler::dragSourceMovedTo(const PlatformMouseEvent& event, DragOperation operation)
     2141{
     2142    if (dragState().m_dragSrc && dragState().m_dragSrcMayBeDHTML) {
     2143        dragState().m_dragClipboard->setDestinationOperation(operation);
    21372144        // for now we don't care if event handler cancels default behavior, since there is none
    21382145        dispatchDragSrcEvent(eventNames().dragEvent, event);
     2146    }
    21392147}
    21402148   
     
    22302238    invalidateClick();
    22312239   
    2232     DragOperation srcOp = DragOperationNone;     
     2240    DragOperation srcOp = DragOperationEvery;     
    22332241   
    22342242    freeClipboard();    // would only happen if we missed a dragEnd.  Do it anyway, just
     
    22532261        }
    22542262       
     2263        dragState().m_dragClipboard->setDestinationOperation(DragOperationNone); // HTML5 spec
    22552264        m_mouseDownMayStartDrag = dispatchDragSrcEvent(eventNames().dragstartEvent, m_mouseDown)
    22562265            && !m_frame->selection()->isInPasswordField();
  • trunk/WebCore/page/EventHandler.h

    r47594 r48229  
    147147    bool eventMayStartDrag(const PlatformMouseEvent&) const;
    148148   
    149     void dragSourceMovedTo(const PlatformMouseEvent&);
     149    void dragSourceMovedTo(const PlatformMouseEvent&, DragOperation = DragOperationNone);
    150150    void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation);
    151151
  • trunk/WebKit/mac/ChangeLog

    r48222 r48229  
     12009-09-09  Jens Alfke  <snej@chromium.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Initialize DataTransfer's effectAllowed and dropEffect properties correctly
     6        according to HTML5 spec (sec. 7.9.2-7.9.3).
     7        https://bugs.webkit.org/show_bug.cgi?id=26700
     8
     9        * WebView/WebFrame.mm:
     10        (-[WebFrame _dragSourceMovedTo:]):
     11            Pass current drag operation (if known) to EventHandler::dragSourceMovedTo().
     12
    1132009-09-09  Dave Hyatt  <hyatt@apple.com>
    214
  • trunk/WebKit/mac/WebView/WebFrame.mm

    r46647 r48229  
    6060#import <WebCore/DocLoader.h>
    6161#import <WebCore/DocumentFragment.h>
     62#import <WebCore/DragController.h>
    6263#import <WebCore/EventHandler.h>
    6364#import <WebCore/EventNames.h>
     
    933934    PlatformMouseEvent event(IntPoint(windowLoc), globalPoint(windowLoc, [view->platformWidget() window]),
    934935        LeftButton, MouseEventMoved, 0, false, false, false, false, currentTime());
    935     _private->coreFrame->eventHandler()->dragSourceMovedTo(event);
     936   
     937    // Get the current destination drag operation, if this is an intra-page drag:
     938    DragOperation operation = DragOperationNone;
     939    if (Page* page = _private->coreFrame->page())
     940        operation = page->dragController()->destinationDragOperation();
     941
     942    _private->coreFrame->eventHandler()->dragSourceMovedTo(event, operation);
    936943}
    937944
Note: See TracChangeset for help on using the changeset viewer.