Bug 1327185 - Refine EventStateManager::FireDragEnterOrExit

Tag #1375
This commit is contained in:
Matt A. Tobin 2020-04-17 07:33:51 -04:00 • committed by Roy Tam
commit 6154d842b0

View file

@ -3484,6 +3484,12 @@ EventStateManager::PostHandleEvent(nsPresContext* aPresContext,
// make sure to fire the enter and exit_synth events after the // make sure to fire the enter and exit_synth events after the
// eDragExit event, otherwise we'll clean up too early // eDragExit event, otherwise we'll clean up too early
GenerateDragDropEnterExit(presContext, aEvent->AsDragEvent()); GenerateDragDropEnterExit(presContext, aEvent->AsDragEvent());
if (ContentChild* child = ContentChild::GetSingleton()) {
// SendUpdateDropEffect to prevent nsIDragService from waiting for
// response of forwarded dragexit event.
child->SendUpdateDropEffect(nsIDragService::DRAGDROP_ACTION_NONE,
nsIDragService::DRAGDROP_ACTION_NONE);
}
break; break;
case eBeforeKeyUp: case eBeforeKeyUp:
@ -4446,6 +4452,19 @@ EventStateManager::GenerateDragDropEnterExit(nsPresContext* aPresContext,
FireDragEnterOrExit(sLastDragOverFrame->PresContext(), FireDragEnterOrExit(sLastDragOverFrame->PresContext(),
aDragEvent, eDragExit, aDragEvent, eDragExit,
targetContent, lastContent, sLastDragOverFrame); targetContent, lastContent, sLastDragOverFrame);
nsIContent* target = sLastDragOverFrame ? sLastDragOverFrame.GetFrame()->GetContent() : nullptr;
if (IsRemoteTarget(target)) {
// Dragging something and moving from web content to chrome only
// fires dragexit and dragleave to xul:browser. We have to forward
// dragexit to sLastDragOverFrame when its content is a remote
// target. We don't forward dragleave since it's generated from
// dragexit.
WidgetDragEvent remoteEvent(aDragEvent->IsTrusted(), eDragExit,
aDragEvent->mWidget);
remoteEvent.AssignDragEventData(*aDragEvent, true);
nsEventStatus remoteStatus = nsEventStatus_eIgnore;
HandleCrossProcessEvent(&remoteEvent, &remoteStatus);
}
} }
FireDragEnterOrExit(aPresContext, aDragEvent, eDragEnter, FireDragEnterOrExit(aPresContext, aDragEvent, eDragEnter,
@ -4502,14 +4521,11 @@ EventStateManager::FireDragEnterOrExit(nsPresContext* aPresContext,
nsIContent* aTargetContent, nsIContent* aTargetContent,
nsWeakFrame& aTargetFrame) nsWeakFrame& aTargetFrame)
{ {
MOZ_ASSERT(aMessage == eDragLeave || aMessage == eDragExit ||
aMessage == eDragEnter);
nsEventStatus status = nsEventStatus_eIgnore; nsEventStatus status = nsEventStatus_eIgnore;
WidgetDragEvent event(aDragEvent->IsTrusted(), aMessage, aDragEvent->mWidget); WidgetDragEvent event(aDragEvent->IsTrusted(), aMessage, aDragEvent->mWidget);
event.mRefPoint = aDragEvent->mRefPoint; event.AssignDragEventData(*aDragEvent, true);
event.mModifiers = aDragEvent->mModifiers;
event.buttons = aDragEvent->buttons;
event.relatedTarget = aRelatedTarget;
event.inputSource = aDragEvent->inputSource;
mCurrentTargetContent = aTargetContent; mCurrentTargetContent = aTargetContent;
if (aTargetContent != aRelatedTarget) { if (aTargetContent != aRelatedTarget) {
@ -4527,10 +4543,7 @@ EventStateManager::FireDragEnterOrExit(nsPresContext* aPresContext,
// collect any changes to moz cursor settings stored in the event's // collect any changes to moz cursor settings stored in the event's
// data transfer. // data transfer.
if (aMessage == eDragLeave || aMessage == eDragExit || UpdateDragDataTransfer(&event);
aMessage == eDragEnter) {
UpdateDragDataTransfer(&event);
}
} }
// Finally dispatch the event to the frame // Finally dispatch the event to the frame