From 40f787c3a53a226a9983011d8b3cd8c2c3bcb586 Mon Sep 17 00:00:00 2001 From: Jim Mathies Date: Tue, 6 Oct 2009 21:51:02 -0500 Subject: [PATCH] Bug 483776 - Update original data transfer mozCursor state during drags. r=bz. --- content/events/src/nsEventStateManager.cpp | 43 +++++++++++++++++++++++++++++- content/events/src/nsEventStateManager.h | 6 +++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/content/events/src/nsEventStateManager.cpp b/content/events/src/nsEventStateManager.cpp index 110c955cf4..0b227d8478 100644 --- a/content/events/src/nsEventStateManager.cpp +++ b/content/events/src/nsEventStateManager.cpp @@ -3051,6 +3051,12 @@ nsEventStateManager::PostHandleEvent(nsPresContext* aPresContext, nsCOMPtr initialDataTransferNS = do_QueryInterface(initialDataTransfer); + nsDragEvent *dragEvent = (nsDragEvent*)aEvent; + + // collect any changes to moz cursor settings stored in the event's + // data transfer. + UpdateDragDataTransfer(dragEvent); + // cancelling a dragenter or dragover event means that a drop should be // allowed, so update the dropEffect and the canDrop state to indicate // that a drag is allowed. If the event isn't cancelled, a drop won't be @@ -3063,7 +3069,6 @@ nsEventStateManager::PostHandleEvent(nsPresContext* aPresContext, PRUint32 dropEffect = nsIDragService::DRAGDROP_ACTION_NONE; if (nsEventStatus_eConsumeNoDefault == *aStatus) { // if the event has a dataTransfer set, use it. - nsDragEvent *dragEvent = (nsDragEvent*)aEvent; if (dragEvent->dataTransfer) { // get the dataTransfer and the dropEffect that was set on it dataTransfer = do_QueryInterface(dragEvent->dataTransfer); @@ -3852,6 +3857,12 @@ nsEventStateManager::FireDragEnterOrExit(nsPresContext* aPresContext, if (status == nsEventStatus_eConsumeNoDefault || aMsg == NS_DRAGDROP_EXIT) SetContentState((aMsg == NS_DRAGDROP_ENTER) ? aTargetContent : nsnull, NS_EVENT_STATE_DRAGOVER); + + // collect any changes to moz cursor settings stored in the event's + // data transfer. + if (aMsg == NS_DRAGDROP_LEAVE_SYNTH || aMsg == NS_DRAGDROP_EXIT_SYNTH || + aMsg == NS_DRAGDROP_ENTER) + UpdateDragDataTransfer(&event); } // Finally dispatch the event to the frame @@ -3859,6 +3870,36 @@ nsEventStateManager::FireDragEnterOrExit(nsPresContext* aPresContext, aTargetFrame->HandleEvent(aPresContext, &event, &status); } +void +nsEventStateManager::UpdateDragDataTransfer(nsDragEvent* dragEvent) +{ + NS_ASSERTION(dragEvent, "drag event is null in UpdateDragDataTransfer!"); + if (!dragEvent->dataTransfer) + return; + + nsCOMPtr dragSession = nsContentUtils::GetDragSession(); + + if (dragSession) { + // the initial dataTransfer is the one from the dragstart event that + // was set on the dragSession when the drag began. + nsCOMPtr initialDataTransfer; + dragSession->GetDataTransfer(getter_AddRefs(initialDataTransfer)); + + // grab the interface that has GetMozCursor. + nsCOMPtr initialDataTransferNS = + do_QueryInterface(initialDataTransfer); + nsCOMPtr eventTransferNS = + do_QueryInterface(dragEvent->dataTransfer); + + if (initialDataTransferNS && eventTransferNS) { + // retrieve the current moz cursor setting and save it. + nsAutoString mozCursor; + eventTransferNS->GetMozCursor(mozCursor); + initialDataTransferNS->SetMozCursor(mozCursor); + } + } +} + nsresult nsEventStateManager::SetClickCount(nsPresContext* aPresContext, nsMouseEvent *aEvent, diff --git a/content/events/src/nsEventStateManager.h b/content/events/src/nsEventStateManager.h index 50ecf6ea98..3918552e9d 100644 --- a/content/events/src/nsEventStateManager.h +++ b/content/events/src/nsEventStateManager.h @@ -199,6 +199,12 @@ protected: nsIContent* aRelatedTarget, nsIContent* aTargetContent, nsWeakFrame& aTargetFrame); + /** + * Update the initial drag session data transfer with any changes that occur + * on cloned data transfer objects used for events. + */ + void UpdateDragDataTransfer(nsDragEvent* dragEvent); + nsresult SetClickCount(nsPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus); nsresult CheckForAndDispatchClick(nsPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus); void EnsureDocument(nsPresContext* aPresContext); -- 2.11.4.GIT