| Index: Source/core/page/EventHandler.cpp
|
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
|
| index 670605d4c5a1648140a9e21d5867a56398450386..c9fa6caa560deed444e2773afef5bf0aca05198e 100644
|
| --- a/Source/core/page/EventHandler.cpp
|
| +++ b/Source/core/page/EventHandler.cpp
|
| @@ -3206,8 +3206,26 @@ void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperat
|
| prepareMouseEvent(request, event);
|
|
|
| if (dragState().m_dragSrc) {
|
| + // If an embedder tries to end a drag operation, but the page
|
| + // has initiated another from other input events received,
|
| + // we're in a tight corner. While Blink doesn't pretend to
|
| + // support concurrent drag operations on a page, it should try
|
| + // to gracefully handle any such overlapping drag operation
|
| + // attempts, whatever their cause/source.
|
| + //
|
| + // Hence, if the drag state here has a source, but not yet
|
| + // any drag data, this represents a drag operation just
|
| + // getting under way. The embedder is thus likely signalling
|
| + // the end of another, earlier drag operation here, which it
|
| + // is preferable to silently ignore.
|
| + // (cf. http://crbug.com/445308)
|
| + if (!dragState().m_dragDataTransfer)
|
| + return;
|
| +
|
| dragState().m_dragDataTransfer->setDestinationOperation(operation);
|
| - // for now we don't care if event handler cancels default behavior, since there is none
|
| +
|
| + // For now we don't care if the event handler cancels the default
|
| + // behavior, as there is none.
|
| dispatchDragSrcEvent(EventTypeNames::dragend, event);
|
| }
|
| clearDragDataTransfer();
|
|
|