Diff
Modified: trunk/Source/WebCore/ChangeLog (150353 => 150354)
--- trunk/Source/WebCore/ChangeLog 2013-05-19 20:38:28 UTC (rev 150353)
+++ trunk/Source/WebCore/ChangeLog 2013-05-19 21:51:21 UTC (rev 150354)
@@ -1,3 +1,56 @@
+2013-05-19 Darin Adler <[email protected]>
+
+ Use Element instead of Node in DragState, also redo DragState struct
+ https://bugs.webkit.org/show_bug.cgi?id=116411
+
+ Reviewed by Sam Weinig.
+
+ The drag source is an element, so use RefPtr<Element> instead of RefPtr<Node>.
+
+ Also, the entire drag state is about dragging, so no need for the word "drag" in the
+ name of its members. Also, it's a struct, so the members don't need m_ prefixes.
+
+ * page/DragController.cpp: Removed unneeded include of Node.h since it's included by
+ Element.h, which is also included.
+ (WebCore::DragController::draggableElement): Renamed from Node to Element and changed
+ the types and names of arguments accordingly. Also made this function handle a
+ startElement of 0 so callers don't need to. Also updated for changes to DragState members.
+ (WebCore::DragController::startDrag): Updated for changes to DragState members.
+ Since dragSource can only be an element, was able to get rid of isElementNode checks.
+
+ * page/DragController.h: Fixed style of forward declarations of structs. Updated for
+ change of draggableNode to draggableElement. Also removed declarations of nonexistent
+ selectionDraggingRect and doDrag functions.
+
+ * page/DragState.h: Rewrote practically this whole header. Added an include of Element
+ instead of Node since that's what we use now. Removed includes that are redundant.
+ There's no problem copying a DragState, so removed WTF_MAKE_NONCOPYABLE. There's no need
+ to allocate a DragState on the heap, so removed WTF_MAKE_FAST_ALLOCATED. The event dispatch
+ boolean is never set to a constant, so there's no need for a policy enum; it can just be
+ a boolean. Removed the "m_" prefixes from the struct members, since this is a struct with
+ public members and we don't use the prefix in those cases. Removed the word "drag" from the
+ struct member names since this entire struct is about dragging and has drag in its name.
+ Left the comments mostly intact, even though I'm not certain of their value.
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::handleMousePressEvent): Updated for changes to DragState.
+ (WebCore::EventHandler::eventMayStartDrag):
+ Use innerElement instead of innerNode to call draggableElement instead of draggableNode.
+ (WebCore::EventHandler::updateDragAndDrop): Updated for changes to DragState.
+ (WebCore::EventHandler::cancelDragAndDrop): Ditto.
+ (WebCore::EventHandler::handleWheelEvent): Added FIXME.
+ (WebCore::EventHandler::dragHysteresisExceeded): Updated for changes to DragState.
+ (WebCore::EventHandler::freeClipboard): Updated for changes to DragState. Also re-added
+ code to release the clipboard object, which is needed here to avoid keeping it around in
+ memory until the next drag.
+ (WebCore::EventHandler::dragSourceEndedAt): Updated for changes to DragState.
+ (WebCore::EventHandler::updateDragStateAfterEditDragIfNeeded): Ditto.
+ (WebCore::EventHandler::dispatchDragSrcEvent): Ditto.
+ (WebCore::EventHandler::handleDrag): Updated for changes to DragState. Use innerElement
+ instead of innerNode to call draggableElement instead of draggableNode. No longer need to
+ null check innerElement because draggableElement does that. Removed unneeded else that was
+ setting m_dragSrc to zero since it's guaranteed to already be zero.
+
2013-05-19 Anders Carlsson <[email protected]>
Remove ChromeClient::webView()
Modified: trunk/Source/WebCore/page/DragController.cpp (150353 => 150354)
--- trunk/Source/WebCore/page/DragController.cpp 2013-05-19 20:38:28 UTC (rev 150353)
+++ trunk/Source/WebCore/page/DragController.cpp 2013-05-19 21:51:21 UTC (rev 150354)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2009, 2010, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -59,7 +59,6 @@
#include "Image.h"
#include "ImageOrientation.h"
#include "MoveSelectionCommand.h"
-#include "Node.h"
#include "Page.h"
#include "PlatformKeyboardEvent.h"
#include "PluginDocument.h"
@@ -635,17 +634,19 @@
return true;
}
-Node* DragController::draggableNode(const Frame* src, Node* startNode, const IntPoint& dragOrigin, DragState& state) const
+Element* DragController::draggableElement(const Frame* sourceFrame, Element* startElement, const IntPoint& dragOrigin, DragState& state) const
{
- state.m_dragType = (src->selection()->contains(dragOrigin)) ? DragSourceActionSelection : DragSourceActionNone;
+ state.type = (sourceFrame->selection()->contains(dragOrigin)) ? DragSourceActionSelection : DragSourceActionNone;
+ if (!startElement)
+ return 0;
- for (const RenderObject* renderer = startNode->renderer(); renderer; renderer = renderer->parent()) {
+ for (const RenderObject* renderer = startElement->renderer(); renderer; renderer = renderer->parent()) {
Node* node = renderer->nonPseudoNode();
if (!node)
// Anonymous render blocks don't correspond to actual DOM nodes, so we skip over them
// for the purposes of finding a draggable node.
continue;
- if (!(state.m_dragType & DragSourceActionSelection) && node->isTextNode() && node->canStartSelection())
+ if (!(state.type & DragSourceActionSelection) && node->isTextNode() && node->canStartSelection())
// In this case we have a click in the unselected portion of text. If this text is
// selectable, we want to start the selection process instead of looking for a parent
// to try to drag.
@@ -653,29 +654,29 @@
if (node->isElementNode()) {
EUserDrag dragMode = renderer->style()->userDrag();
if ((m_dragSourceAction & DragSourceActionDHTML) && dragMode == DRAG_ELEMENT) {
- state.m_dragType = static_cast<DragSourceAction>(state.m_dragType | DragSourceActionDHTML);
- return node;
+ state.type = static_cast<DragSourceAction>(state.type | DragSourceActionDHTML);
+ return toElement(node);
}
if (dragMode == DRAG_AUTO) {
if ((m_dragSourceAction & DragSourceActionImage)
&& node->hasTagName(HTMLNames::imgTag)
- && src->settings()
- && src->settings()->loadsImagesAutomatically()) {
- state.m_dragType = static_cast<DragSourceAction>(state.m_dragType | DragSourceActionImage);
- return node;
+ && sourceFrame->settings()
+ && sourceFrame->settings()->loadsImagesAutomatically()) {
+ state.type = static_cast<DragSourceAction>(state.type | DragSourceActionImage);
+ return toElement(node);
}
if ((m_dragSourceAction & DragSourceActionLink)
&& node->hasTagName(HTMLNames::aTag)
&& static_cast<HTMLAnchorElement*>(node)->isLiveLink()) {
- state.m_dragType = static_cast<DragSourceAction>(state.m_dragType | DragSourceActionLink);
- return node;
+ state.type = static_cast<DragSourceAction>(state.type | DragSourceActionLink);
+ return toElement(node);
}
}
}
}
// We either have nothing to drag or we have a selection and we're not over a draggable element.
- return (state.m_dragType & DragSourceActionSelection) ? startNode : 0;
+ return (state.type & DragSourceActionSelection) ? startElement : 0;
}
static CachedImage* getCachedImage(Element* element)
@@ -748,7 +749,7 @@
return false;
HitTestResult hitTestResult = src->eventHandler()->hitTestResultAtPoint(dragOrigin, HitTestRequest::ReadOnly | HitTestRequest::Active);
- if (!state.m_dragSrc->contains(hitTestResult.innerNode()))
+ if (!state.source->contains(hitTestResult.innerNode()))
// The original node being dragged isn't under the drag origin anymore... maybe it was
// hidden or moved out from under the cursor. Regardless, we don't want to start a drag on
// something that's not actually under the drag origin.
@@ -765,10 +766,10 @@
IntPoint dragLoc(0, 0);
IntPoint dragImageOffset(0, 0);
- Clipboard* clipboard = state.m_dragClipboard.get();
- if (state.m_dragType == DragSourceActionDHTML)
+ Clipboard* clipboard = state.clipboard.get();
+ if (state.type == DragSourceActionDHTML)
dragImage = clipboard->createDragImage(dragImageOffset);
- if (state.m_dragType == DragSourceActionSelection || !imageURL.isEmpty() || !linkURL.isEmpty())
+ if (state.type == DragSourceActionSelection || !imageURL.isEmpty() || !linkURL.isEmpty())
// Selection, image, and link drags receive a default set of allowed drag operations that
// follows from:
// http://trac.webkit.org/browser/trunk/WebKit/mac/WebView/WebHTMLView.mm?rev=48526#L3430
@@ -783,10 +784,10 @@
bool startedDrag = true; // optimism - we almost always manage to start the drag
- Node* node = state.m_dragSrc.get();
+ Element* element = state.source.get();
- Image* image = node->isElementNode() ? getImage(toElement(node)) : 0;
- if (state.m_dragType == DragSourceActionSelection) {
+ Image* image = getImage(element);
+ if (state.type == DragSourceActionSelection) {
if (!clipboard->hasData()) {
if (enclosingTextFormControl(src->selection()->start()))
clipboard->writePlainText(src->editor().selectedTextForClipboard());
@@ -804,12 +805,11 @@
m_dragOffset = IntPoint(dragOrigin.x() - dragLoc.x(), dragOrigin.y() - dragLoc.y());
}
doSystemDrag(dragImage, dragLoc, dragOrigin, clipboard, src, false);
- } else if (!imageURL.isEmpty() && node && node->isElementNode() && image && !image->isNull()
+ } else if (!imageURL.isEmpty() && element && image && !image->isNull()
&& (m_dragSourceAction & DragSourceActionImage)) {
// We shouldn't be starting a drag for an image that can't provide an extension.
// This is an early detection for problems encountered later upon drop.
ASSERT(!image->filenameExtension().isEmpty());
- Element* element = toElement(node);
if (!clipboard->hasData()) {
m_draggingImageURL = imageURL;
prepareClipboardForImageDrag(src, clipboard, element, linkURL, imageURL, hitTestResult.altDisplayString());
@@ -849,12 +849,12 @@
dragLoc = IntPoint(mouseDraggedPoint.x() + m_dragOffset.x(), mouseDraggedPoint.y() + m_dragOffset.y());
}
doSystemDrag(dragImage, dragLoc, mouseDraggedPoint, clipboard, src, true);
- } else if (state.m_dragType == DragSourceActionDHTML) {
+ } else if (state.type == DragSourceActionDHTML) {
ASSERT(m_dragSourceAction & DragSourceActionDHTML);
m_client->willPerformDragSourceAction(DragSourceActionDHTML, dragOrigin, clipboard);
doSystemDrag(dragImage, dragLoc, dragOrigin, clipboard, src, false);
} else {
- // draggableNode() determined an image or link node was draggable, but it turns out the
+ // draggableElement() determined an image or link node was draggable, but it turns out the
// image or link had no URL, so there is nothing to drag.
startedDrag = false;
}
Modified: trunk/Source/WebCore/page/DragController.h (150353 => 150354)
--- trunk/Source/WebCore/page/DragController.h 2013-05-19 20:38:28 UTC (rev 150353)
+++ trunk/Source/WebCore/page/DragController.h 2013-05-19 21:51:21 UTC (rev 150354)
@@ -37,8 +37,6 @@
class Document;
class DragClient;
class DragData;
- struct DragSession;
- struct DragState;
class Element;
class Frame;
class FrameSelection;
@@ -49,7 +47,10 @@
class Page;
class PlatformMouseEvent;
class Range;
-
+
+ struct DragSession;
+ struct DragState;
+
class DragController {
WTF_MAKE_NONCOPYABLE(DragController); WTF_MAKE_FAST_ALLOCATED;
public:
@@ -78,7 +79,7 @@
DragDestinationAction dragDestinationAction() const { return m_dragDestinationAction; }
DragSourceAction delegateDragSourceAction(const IntPoint& rootViewPoint);
- Node* draggableNode(const Frame*, Node*, const IntPoint&, DragState&) const;
+ Element* draggableElement(const Frame*, Element* start, const IntPoint&, DragState&) const;
void dragEnded();
void placeDragCaret(const IntPoint&);
@@ -109,8 +110,6 @@
void mouseMovedIntoDocument(Document*);
- IntRect selectionDraggingRect(Frame*);
- bool doDrag(Frame* src, Clipboard* clipboard, DragImageRef dragImage, const KURL& linkURL, const KURL& imageURL, Node* node, IntPoint& dragLoc, IntPoint& dragImageOffset);
void doImageDrag(Element*, const IntPoint&, const IntRect&, Clipboard*, Frame*, IntPoint&);
void doSystemDrag(DragImageRef, const IntPoint&, const IntPoint&, Clipboard*, Frame*, bool forLink);
void cleanupAfterSystemDrag();
Modified: trunk/Source/WebCore/page/DragState.h (150353 => 150354)
--- trunk/Source/WebCore/page/DragState.h 2013-05-19 20:38:28 UTC (rev 150353)
+++ trunk/Source/WebCore/page/DragState.h 2013-05-19 21:51:21 UTC (rev 150354)
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,30 +29,15 @@
#include "Clipboard.h"
#include "DragActions.h"
-#include "Node.h"
-#include <wtf/Forward.h>
-#include <wtf/Noncopyable.h>
-#include <wtf/RefPtr.h>
+#include "Element.h"
namespace WebCore {
-class Clipboard;
-class Node;
-
struct DragState {
- WTF_MAKE_NONCOPYABLE(DragState);
- WTF_MAKE_FAST_ALLOCATED;
-public:
- enum EventDispatchPolicy {
- DoNotDispatchEvents,
- DispatchEvents,
- };
- DragState() { }
- bool shouldDispatchEvents() const { return m_eventDispatchPolicy == DispatchEvents; }
- RefPtr<Node> m_dragSrc; // element that may be a drag source, for the current mouse gesture
- EventDispatchPolicy m_eventDispatchPolicy;
- DragSourceAction m_dragType;
- RefPtr<Clipboard> m_dragClipboard; // used on only the source side of dragging
+ RefPtr<Element> source; // Element that may be a drag source, for the current mouse gesture.
+ bool shouldDispatchEvents;
+ DragSourceAction type;
+ RefPtr<Clipboard> clipboard; // Used on only the source side of dragging.
};
} // namespace WebCore
Modified: trunk/Source/WebCore/page/EventHandler.cpp (150353 => 150354)
--- trunk/Source/WebCore/page/EventHandler.cpp 2013-05-19 20:38:28 UTC (rev 150353)
+++ trunk/Source/WebCore/page/EventHandler.cpp 2013-05-19 21:51:21 UTC (rev 150354)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2013 Apple Inc. All rights reserved.
* Copyright (C) 2006 Alexey Proskuryakov ([email protected])
* Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
*
@@ -650,7 +650,7 @@
{
#if ENABLE(DRAG_SUPPORT)
// Reset drag state.
- dragState().m_dragSrc = 0;
+ dragState().source = 0;
#endif
cancelFakeMouseMoveEvent();
@@ -791,7 +791,7 @@
HitTestResult result(view->windowToContents(event.position()));
m_frame->contentRenderer()->hitTest(request, result);
DragState state;
- return result.innerNode() && page->dragController()->draggableNode(m_frame, result.innerNode(), result.roundedPointInInnerNodeFrame(), state);
+ return result.innerElement() && page->dragController()->draggableElement(m_frame, result.innerElement(), result.roundedPointInInnerNodeFrame(), state);
}
void EventHandler::updateSelectionForMouseDrag()
@@ -2082,7 +2082,7 @@
accept = targetFrame->eventHandler()->updateDragAndDrop(event, clipboard);
} else if (newTarget) {
// 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.
- if (dragState().m_dragSrc && dragState().shouldDispatchEvents()) {
+ if (dragState().source && dragState().shouldDispatchEvents) {
// for now we don't care if event handler cancels default behavior, since there is none
dispatchDragSrcEvent(eventNames().dragEvent, event);
}
@@ -2109,7 +2109,7 @@
accept = targetFrame->eventHandler()->updateDragAndDrop(event, clipboard);
} else if (newTarget) {
// Note, when dealing with sub-frames, we may need to fire only a dragover event as a drag event may have been fired earlier.
- if (!m_shouldOnlyFireDragOverEvent && dragState().m_dragSrc && dragState().shouldDispatchEvents()) {
+ if (!m_shouldOnlyFireDragOverEvent && dragState().source && dragState().shouldDispatchEvents) {
// for now we don't care if event handler cancels default behavior, since there is none
dispatchDragSrcEvent(eventNames().dragEvent, event);
}
@@ -2131,7 +2131,7 @@
if (targetFrame)
targetFrame->eventHandler()->cancelDragAndDrop(event, clipboard);
} else if (m_dragTarget.get()) {
- if (dragState().m_dragSrc && dragState().shouldDispatchEvents())
+ if (dragState().source && dragState().shouldDispatchEvents)
dispatchDragSrcEvent(eventNames().dragEvent, event);
dispatchDragEvent(eventNames().dragleaveEvent, m_dragTarget.get(), event, clipboard);
}
@@ -2413,6 +2413,7 @@
bool useLatchedWheelEventNode = e.useLatchedEventNode();
+ // FIXME: Is the following code different from just calling innerElement?
Node* node = result.innerNode();
// Wheel events should not dispatch to text nodes.
if (node && node->isTextNode())
@@ -3394,7 +3395,7 @@
IntSize delta = dragLocation - m_mouseDownPos;
int threshold = GeneralDragHysteresis;
- switch (dragState().m_dragType) {
+ switch (dragState().type) {
case DragSourceActionSelection:
threshold = TextDragHysteresis;
break;
@@ -3416,8 +3417,10 @@
void EventHandler::freeClipboard()
{
- if (dragState().m_dragClipboard)
- dragState().m_dragClipboard->setAccessPolicy(ClipboardNumb);
+ if (!dragState().clipboard)
+ return;
+ dragState().clipboard->setAccessPolicy(ClipboardNumb);
+ dragState().clipboard = 0;
}
void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperation operation)
@@ -3426,13 +3429,13 @@
HitTestRequest request(HitTestRequest::Release | HitTestRequest::DisallowShadowContent);
prepareMouseEvent(request, event);
- if (dragState().m_dragSrc && dragState().shouldDispatchEvents()) {
- dragState().m_dragClipboard->setDestinationOperation(operation);
- // for now we don't care if event handler cancels default behavior, since there is none
+ if (dragState().source && dragState().shouldDispatchEvents) {
+ dragState().clipboard->setDestinationOperation(operation);
+ // For now we don't care if event handler cancels default behavior, since there is no default behavior.
dispatchDragSrcEvent(eventNames().dragendEvent, event);
}
freeClipboard();
- dragState().m_dragSrc = 0;
+ dragState().source = 0;
// In case the drag was ended due to an escape key press we need to ensure
// that consecutive mousemove events don't reinitiate the drag and drop.
m_mouseDownMayStartDrag = false;
@@ -3440,15 +3443,15 @@
void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableElement)
{
- // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element.
- if (dragState().m_dragSrc && !dragState().m_dragSrc->inDocument())
- dragState().m_dragSrc = rootEditableElement;
+ // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editable element.
+ if (dragState().source && !dragState().source->inDocument())
+ dragState().source = rootEditableElement;
}
-// returns if we should continue "default processing", i.e., whether eventhandler canceled
+// Return value indicates if we should continue "default processing", i.e., whether event handler canceled.
bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent& event)
{
- return !dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, dragState().m_dragClipboard.get());
+ return !dispatchDragEvent(eventType, dragState().source.get(), event, dragState().clipboard.get());
}
static bool ExactlyOneBitSet(DragSourceAction n)
@@ -3472,48 +3475,42 @@
// Careful that the drag starting logic stays in sync with eventMayStartDrag()
- if (m_mouseDownMayStartDrag && !dragState().m_dragSrc) {
- dragState().m_eventDispatchPolicy = (updateDragSourceActionsAllowed() & DragSourceActionDHTML) ? DragState::DispatchEvents: DragState::DoNotDispatchEvents;
+ if (m_mouseDownMayStartDrag && !dragState().source) {
+ dragState().shouldDispatchEvents = (updateDragSourceActionsAllowed() & DragSourceActionDHTML);
// try to find an element that wants to be dragged
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowShadowContent);
HitTestResult result(m_mouseDownPos);
m_frame->contentRenderer()->hitTest(request, result);
- Node* node = result.innerNode();
- if (node && m_frame->page())
- dragState().m_dragSrc = m_frame->page()->dragController()->draggableNode(m_frame, node, m_mouseDownPos, dragState());
- else
- dragState().m_dragSrc = 0;
+ if (m_frame->page())
+ dragState().source = m_frame->page()->dragController()->draggableElement(m_frame, result.innerElement(), m_mouseDownPos, dragState());
- if (!dragState().m_dragSrc)
+ if (!dragState().source)
m_mouseDownMayStartDrag = false; // no element is draggable
else
- m_dragMayStartSelectionInstead = (dragState().m_dragType & DragSourceActionSelection);
+ m_dragMayStartSelectionInstead = (dragState().type & DragSourceActionSelection);
}
// For drags starting in the selection, the user must wait between the mousedown and mousedrag,
// or else we bail on the dragging stuff and allow selection to occur
- if (m_mouseDownMayStartDrag && m_dragMayStartSelectionInstead && (dragState().m_dragType & DragSourceActionSelection) && event.event().timestamp() - m_mouseDownTimestamp < TextDragDelay) {
+ if (m_mouseDownMayStartDrag && m_dragMayStartSelectionInstead && (dragState().type & DragSourceActionSelection) && event.event().timestamp() - m_mouseDownTimestamp < TextDragDelay) {
ASSERT(event.event().type() == PlatformEvent::MouseMoved);
- if ((dragState().m_dragType & DragSourceActionImage)) {
+ if ((dragState().type & DragSourceActionImage)) {
// ... unless the mouse is over an image, then we start dragging just the image
- dragState().m_dragType = DragSourceActionImage;
- } else if (!(dragState().m_dragType & (DragSourceActionDHTML | DragSourceActionLink))) {
+ dragState().type = DragSourceActionImage;
+ } else if (!(dragState().type & (DragSourceActionDHTML | DragSourceActionLink))) {
// ... but only bail if we're not over an unselectable element.
m_mouseDownMayStartDrag = false;
- dragState().m_dragSrc = 0;
+ dragState().source = 0;
// ... but if this was the first click in the window, we don't even want to start selection
if (eventActivatedView(event.event()))
m_mouseDownMayStartSelect = false;
} else {
// Prevent the following case from occuring:
// 1. User starts a drag immediately after mouse down over an unselectable element.
- // 2. We enter this block and decided that since we're over an unselectable element,
- // don't cancel the drag.
- // 3. The drag gets resolved as a potential selection drag below /but/ we haven't
- // exceeded the drag hysteresis yet.
- // 4. We enter this block again, and since it's now marked as a selection drag, we
- // cancel the drag.
+ // 2. We enter this block and decided that since we're over an unselectable element, don't cancel the drag.
+ // 3. The drag gets resolved as a potential selection drag below /but/ we haven't exceeded the drag hysteresis yet.
+ // 4. We enter this block again, and since it's now marked as a selection drag, we cancel the drag.
m_dragMayStartSelectionInstead = false;
}
}
@@ -3521,12 +3518,12 @@
if (!m_mouseDownMayStartDrag)
return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
- if (!ExactlyOneBitSet(dragState().m_dragType)) {
- ASSERT((dragState().m_dragType & DragSourceActionSelection));
- ASSERT((dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionDHTML
- || (dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionImage
- || (dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionLink);
- dragState().m_dragType = DragSourceActionSelection;
+ if (!ExactlyOneBitSet(dragState().type)) {
+ ASSERT((dragState().type & DragSourceActionSelection));
+ ASSERT((dragState().type & ~DragSourceActionSelection) == DragSourceActionDHTML
+ || (dragState().type & ~DragSourceActionSelection) == DragSourceActionImage
+ || (dragState().type & ~DragSourceActionSelection) == DragSourceActionLink);
+ dragState().type = DragSourceActionSelection;
}
// We are starting a text/image/url drag, so the cursor should be an arrow
@@ -3543,19 +3540,19 @@
DragOperation srcOp = DragOperationNone;
- freeClipboard(); // would only happen if we missed a dragEnd. Do it anyway, just
- // to make sure it gets numbified
- dragState().m_dragClipboard = createDraggingClipboard();
+ // This does work only if we missed a dragEnd. Do it anyway, just to make sure the old clipboard gets numbed.
+ freeClipboard();
+
+ dragState().clipboard = createDraggingClipboard();
- if (dragState().shouldDispatchEvents()) {
- // Check to see if the is a DOM based drag, if it is get the DOM specified drag
- // image and offset
- if (dragState().m_dragType == DragSourceActionDHTML) {
- if (RenderObject* renderer = dragState().m_dragSrc->renderer()) {
+ if (dragState().shouldDispatchEvents) {
+ // Check to see if the is a DOM based drag. If it is, get the DOM specified drag image and offset.
+ if (dragState().type == DragSourceActionDHTML) {
+ if (RenderObject* renderer = dragState().source->renderer()) {
// FIXME: This doesn't work correctly with transforms.
FloatPoint absPos = renderer->localToAbsolute();
IntSize delta = m_mouseDownPos - roundedIntPoint(absPos);
- dragState().m_dragClipboard->setDragImageElement(dragState().m_dragSrc.get(), IntPoint(delta));
+ dragState().clipboard->setDragImageElement(dragState().source.get(), IntPoint(delta));
} else {
// The renderer has disappeared, this can happen if the onStartDrag handler has hidden
// the element in some way. In this case we just kill the drag.
@@ -3569,17 +3566,16 @@
// Invalidate clipboard here against anymore pasteboard writing for security. The drag
// image can still be changed as we drag, but not the pasteboard data.
- dragState().m_dragClipboard->setAccessPolicy(ClipboardImageWritable);
+ dragState().clipboard->setAccessPolicy(ClipboardImageWritable);
if (m_mouseDownMayStartDrag) {
- // gather values from DHTML element, if it set any
- srcOp = dragState().m_dragClipboard->sourceOperation();
+ // Gather values from DHTML element, if it set any.
+ srcOp = dragState().clipboard->sourceOperation();
// Yuck, a draggedImage:moveTo: message can be fired as a result of kicking off the
- // drag with dragImage! Because of that dumb reentrancy, we may think we've not
- // started the drag when that happens. So we have to assume it's started before we
- // kick it off.
- dragState().m_dragClipboard->setDragHasStarted();
+ // drag with dragImage! Because of that dumb reentrancy, we may think we've not
+ // started the drag when that happens. So we have to assume it's started before we kick it off.
+ dragState().clipboard->setDragHasStarted();
}
}
@@ -3587,15 +3583,14 @@
Page* page = m_frame->page();
DragController* dragController = page ? page->dragController() : 0;
m_didStartDrag = dragController && dragController->startDrag(m_frame, dragState(), srcOp, event.event(), m_mouseDownPos);
- // In WebKit2 we could reenter this code and start another drag.
- // On OS X this causes problems with the ownership of the pasteboard
- // and the promised types.
+ // In WebKit2 we could re-enter this code and start another drag.
+ // On OS X this causes problems with the ownership of the pasteboard and the promised types.
if (m_didStartDrag) {
m_mouseDownMayStartDrag = false;
return true;
}
- if (dragState().m_dragSrc && dragState().shouldDispatchEvents()) {
- // Drag was canned at the last minute - we owe m_dragSrc a DRAGEND event
+ if (dragState().source && dragState().shouldDispatchEvents) {
+ // Drag was canned at the last minute. We owe dragSource a dragend event.
dispatchDragSrcEvent(eventNames().dragendEvent, event.event());
m_mouseDownMayStartDrag = false;
}
@@ -3603,9 +3598,9 @@
cleanupDrag:
if (!m_mouseDownMayStartDrag) {
- // something failed to start the drag, cleanup
+ // Something failed to start the drag, clean up.
freeClipboard();
- dragState().m_dragSrc = 0;
+ dragState().source = 0;
}
// No more default handling (like selection), whether we're past the hysteresis bounds or not
@@ -3945,9 +3940,10 @@
continue;
} else
continue;
+
+ // FIXME: Is the following code different from just calling innerElement?
Node* node = result.innerNode();
ASSERT(node);
-
// Touch events should not go to text nodes
if (node->isTextNode())
node = EventPathWalker::parent(node);