Bug 459323 - Drag and Drop in input controls is broken. r=smaug, sr=sicking.

This commit is contained in:
Asaf Romano
2008-10-17 22:04:55 +02:00
parent f00595b852
commit a5f2274daa
11 changed files with 144 additions and 246 deletions

View File

@@ -418,7 +418,7 @@
<handlers>
<handler event="focus" phase="capturing" action="this._hideURLTooltip();"/>
<handler event="dragover" phase="capturing" action="nsDragAndDrop.dragOver(event, this);"/>
<handler event="dragdrop" phase="capturing" action="nsDragAndDrop.drop(event, this);"/>
<handler event="drop" phase="capturing" action="nsDragAndDrop.drop(event, this);"/>
<handler event="select"><![CDATA[
if (!Cc["@mozilla.org/widget/clipboard;1"]
.getService(Ci.nsIClipboard)

View File

@@ -845,7 +845,7 @@ FeedWriter.prototype = {
// nsIDomEventListener
handleEvent: function(event) {
// see comments in the write method
// see comments in init()
event = new XPCNativeWrapper(event);
if (event.target.ownerDocument != this._document) {
LOG("FeedWriter.handleEvent: Someone passed the feed writer as a listener to the events of another document!");
@@ -1331,8 +1331,11 @@ FeedWriter.prototype = {
// nsIObserver
observe: function FW_observe(subject, topic, data) {
// see init()
subject = new XPCNativeWrapper(subject);
if (!this._window) {
// this._window is null unless this.write was called with a trusted
// this._window is null unless this.init was called with a trusted
// window object.
return;
}
@@ -1397,6 +1400,9 @@ FeedWriter.prototype = {
// nsINavHistoryService
onPageChanged: function FW_onPageChanged(aURI, aWhat, aValue) {
// see init()
aURI = new XPCNativeWrapper(aURI);
if (aWhat == Ci.nsINavHistoryObserver.ATTRIBUTE_FAVICON) {
// Go through the readers menu and look for the corresponding
// reader menu-item for the page if any.

View File

@@ -777,7 +777,7 @@
action="return this.openSearch();"/>
#endif
<handler event="dragdrop" phase="capturing">
<handler event="drop" phase="capturing">
nsDragAndDrop.drop(event, this.searchbarDNDObserver);
</handler>

View File

@@ -112,9 +112,8 @@ NS_IMPL_ADDREF(nsContentAreaDragDrop)
NS_IMPL_RELEASE(nsContentAreaDragDrop)
NS_INTERFACE_MAP_BEGIN(nsContentAreaDragDrop)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMDragListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsIDOMEventListener, nsIDOMDragListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMDragListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMEventListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMEventListener)
NS_INTERFACE_MAP_ENTRY(nsIDragDropHandler)
NS_INTERFACE_MAP_END
@@ -180,7 +179,7 @@ private:
// nsContentAreaDragDrop ctor
//
nsContentAreaDragDrop::nsContentAreaDragDrop()
: mListenerInstalled(PR_FALSE), mNavigator(nsnull)
: mNavigator(nsnull)
{
} // ctor
@@ -200,9 +199,7 @@ nsContentAreaDragDrop::HookupTo(nsIDOMEventTarget *inAttachPoint,
nsIWebNavigation* inNavigator)
{
NS_ASSERTION(inAttachPoint, "Can't hookup Drag Listeners to NULL receiver");
mEventTarget = do_QueryInterface(inAttachPoint);
NS_ASSERTION(mEventTarget,
"Target doesn't implement nsPIDOMEventTarget as needed");
mEventTarget = inAttachPoint;
mNavigator = inNavigator;
return AddDragListener();
@@ -224,17 +221,16 @@ nsContentAreaDragDrop::Detach()
nsresult
nsContentAreaDragDrop::AddDragListener()
{
nsresult rv = NS_ERROR_FAILURE;
if (mEventTarget) {
nsIDOMDragListener *pListener = static_cast<nsIDOMDragListener *>(this);
rv = mEventTarget->AddEventListenerByIID(pListener,
NS_GET_IID(nsIDOMDragListener));
if (NS_SUCCEEDED(rv))
mListenerInstalled = PR_TRUE;
nsresult rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("dragover"),
this, PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("drop"), this,
PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
return NS_OK;
}
@@ -246,33 +242,17 @@ nsContentAreaDragDrop::AddDragListener()
nsresult
nsContentAreaDragDrop::RemoveDragListener()
{
nsresult rv = NS_ERROR_FAILURE;
if (mEventTarget) {
nsIDOMDragListener *pListener = static_cast<nsIDOMDragListener *>(this);
rv =
mEventTarget->RemoveEventListenerByIID(pListener,
NS_GET_IID(nsIDOMDragListener));
if (NS_SUCCEEDED(rv))
mListenerInstalled = PR_FALSE;
nsresult rv =
mEventTarget->RemoveEventListener(NS_LITERAL_STRING("dragover"), this,
PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
rv = mEventTarget->RemoveEventListener(NS_LITERAL_STRING("drop"), this,
PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
mEventTarget = nsnull;
}
return rv;
}
//
// DragEnter
//
// Called when an OS drag is in process and the mouse enters a gecko
// window. We don't care so much about dragEnters.
//
NS_IMETHODIMP
nsContentAreaDragDrop::DragEnter(nsIDOMEvent* aMouseEvent)
{
// nothing really to do here.
return NS_OK;
}
@@ -287,8 +267,8 @@ nsContentAreaDragDrop::DragEnter(nsIDOMEvent* aMouseEvent)
// does is show feedback, it doesn't actually cancel the drop; that
// comes later.
//
NS_IMETHODIMP
nsContentAreaDragDrop::DragOver(nsIDOMEvent* inEvent)
nsresult
nsContentAreaDragDrop::DragOver(nsIDOMDragEvent* inEvent)
{
// first check that someone hasn't already handled this event
PRBool preventDefault = PR_TRUE;
@@ -353,36 +333,6 @@ nsContentAreaDragDrop::DragOver(nsIDOMEvent* inEvent)
}
//
// DragExit
//
// Called when an OS drag is in process and the mouse is over a gecko
// window. We don't care so much about dragExits.
//
NS_IMETHODIMP
nsContentAreaDragDrop::DragExit(nsIDOMEvent* aMouseEvent)
{
// nothing really to do here.
return NS_OK;
}
NS_IMETHODIMP
nsContentAreaDragDrop::Drag(nsIDOMEvent* aMouseEvent)
{
// nothing really to do here.
return NS_OK;
}
NS_IMETHODIMP
nsContentAreaDragDrop::DragEnd(nsIDOMEvent* aMouseEvent)
{
// nothing really to do here.
return NS_OK;
}
//
// ExtractURLFromData
//
@@ -440,14 +390,14 @@ nsContentAreaDragDrop::ExtractURLFromData(const nsACString & inFlavor,
//
// DragDrop
// drop
//
// Called when an OS drag is in process and the mouse is released a
// gecko window. Extract the data from the OS and do something with
// it.
//
NS_IMETHODIMP
nsContentAreaDragDrop::DragDrop(nsIDOMEvent* inMouseEvent)
nsresult
nsContentAreaDragDrop::Drop(nsIDOMDragEvent* inDragEvent)
{
// if we don't have a nsIWebNavigation object to do anything with,
// just bail. The client will have to have another way to deal with it
@@ -457,7 +407,7 @@ nsContentAreaDragDrop::DragDrop(nsIDOMEvent* inMouseEvent)
// check that someone hasn't already handled this event
PRBool preventDefault = PR_TRUE;
nsCOMPtr<nsIDOMNSUIEvent> nsuiEvent(do_QueryInterface(inMouseEvent));
nsCOMPtr<nsIDOMNSUIEvent> nsuiEvent(do_QueryInterface(inDragEvent));
if (nsuiEvent) {
nsuiEvent->GetPreventDefault(&preventDefault);
}
@@ -522,7 +472,7 @@ nsContentAreaDragDrop::DragDrop(nsIDOMEvent* inMouseEvent)
if (NS_FAILED(rv)) {
// Security check failed, stop event propagation right here
// and return the error.
inMouseEvent->StopPropagation();
inDragEvent->StopPropagation();
return rv;
}
@@ -599,14 +549,6 @@ nsContentAreaDragDrop::GetEventDocument(nsIDOMEvent* inEvent,
}
}
//
// DragGesture
//
NS_IMETHODIMP
nsContentAreaDragDrop::DragGesture(nsIDOMEvent* inMouseEvent)
{
return NS_OK;
}
nsresult
nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
@@ -631,8 +573,18 @@ nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
NS_IMETHODIMP
nsContentAreaDragDrop::HandleEvent(nsIDOMEvent *event)
{
return NS_OK;
// make sure it's a drag event
nsCOMPtr<nsIDOMDragEvent> dragEvent = do_QueryInterface(event);
if (dragEvent) {
nsAutoString eventType;
event->GetType(eventType);
if (eventType.EqualsLiteral("dragover"))
return DragOver(dragEvent);
if (eventType.EqualsLiteral("drop"))
return Drop(dragEvent);
}
return NS_OK;
}
#if 0

View File

@@ -43,18 +43,20 @@
#include "nsCOMPtr.h"
#include "nsIDragDropHandler.h"
#include "nsIDOMDragListener.h"
#include "nsPIDOMEventTarget.h"
#include "nsIDOMEventTarget.h"
#include "nsIDOMEventListener.h"
#include "nsITransferable.h"
class nsIDOMNode;
class nsIDOMWindow;
class nsIDOMDocument;
class nsIDOMDragEvent;
class nsISelection;
class nsITransferable;
class nsIImage;
class nsIPresShell;
class nsPresContext;
class nsIContent;
class nsIDocument;
class nsIURI;
class nsIFile;
class nsISimpleEnumerator;
@@ -76,8 +78,8 @@ class nsDOMDataTransfer;
// AddChromeListeners() and removes itself with
// RemoveChromeListeners().
//
class nsContentAreaDragDrop : public nsIDOMDragListener,
public nsIDragDropHandler
class nsContentAreaDragDrop : public nsIDragDropHandler,
public nsIDOMEventListener
{
public:
NS_DECL_ISUPPORTS
@@ -86,14 +88,6 @@ public:
nsContentAreaDragDrop();
virtual ~nsContentAreaDragDrop();
// nsIDOMDragListener
NS_IMETHOD DragEnter(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragOver(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragExit(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragDrop(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragGesture(nsIDOMEvent* aMouseEvent);
NS_IMETHOD Drag(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragEnd(nsIDOMEvent* aMouseEvent);
NS_IMETHOD HandleEvent(nsIDOMEvent *event);
/**
@@ -129,6 +123,9 @@ private:
nsresult AddDragListener();
nsresult RemoveDragListener();
nsresult DragOver(nsIDOMDragEvent* aDragEvent);
nsresult Drop(nsIDOMDragEvent* aDragEvent);
// utility routines
static void NormalizeSelection(nsIDOMNode* inBaseNode,
nsISelection* inSelection);
@@ -139,9 +136,7 @@ private:
nsISupports* inDataWrapper, PRUint32 inDataLen,
nsAString & outURL);
PRPackedBool mListenerInstalled;
nsCOMPtr<nsPIDOMEventTarget> mEventTarget;
nsCOMPtr<nsIDOMEventTarget> mEventTarget;
// weak ref, this is probably my owning webshell
// FIXME: we set this and never null it out. That's bad! See bug 332187.

View File

@@ -104,6 +104,7 @@
#include "JoinElementTxn.h"
#include "nsStyleSheetTxns.h"
#include "IMETextTxn.h"
#include "nsString.h"
#include "nsEditor.h"
#include "nsEditorUtils.h"
@@ -319,8 +320,14 @@ nsEditor::InstallEventListeners()
rv |= piTarget->AddEventListenerByIID(mCompositionListenerP,
NS_GET_IID(nsIDOMCompositionListener));
rv |= piTarget->AddEventListenerByIID(mDragListenerP,
NS_GET_IID(nsIDOMDragListener));
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(piTarget));
if (target) {
rv |= target->AddEventListener(NS_LITERAL_STRING("dragstart"), mDragListenerP, PR_FALSE);
rv |= target->AddEventListener(NS_LITERAL_STRING("dragenter"), mDragListenerP, PR_FALSE);
rv |= target->AddEventListener(NS_LITERAL_STRING("dragover"), mDragListenerP, PR_FALSE);
rv |= target->AddEventListener(NS_LITERAL_STRING("dragleave"), mDragListenerP, PR_FALSE);
rv |= target->AddEventListener(NS_LITERAL_STRING("drop"), mDragListenerP, PR_FALSE);
}
if (NS_FAILED(rv))
{
@@ -388,8 +395,14 @@ nsEditor::RemoveEventListeners()
if (mDragListenerP)
{
piTarget->RemoveEventListenerByIID(mDragListenerP,
NS_GET_IID(nsIDOMDragListener));
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(piTarget));
if (target) {
target->RemoveEventListener(NS_LITERAL_STRING("dragstart"), mDragListenerP, PR_FALSE);
target->RemoveEventListener(NS_LITERAL_STRING("dragenter"), mDragListenerP, PR_FALSE);
target->RemoveEventListener(NS_LITERAL_STRING("dragover"), mDragListenerP, PR_FALSE);
target->RemoveEventListener(NS_LITERAL_STRING("dragleave"), mDragListenerP, PR_FALSE);
target->RemoveEventListener(NS_LITERAL_STRING("drop"), mDragListenerP, PR_FALSE);
}
}
}
}

View File

@@ -69,6 +69,7 @@
#include "nsIDOMEventTarget.h"
#include "nsIEventStateManager.h"
#include "nsISelectionPrivate.h"
#include "nsIDOMDragEvent.h"
//#define DEBUG_IME
@@ -495,17 +496,33 @@ nsTextEditorDragListener::~nsTextEditorDragListener()
{
}
NS_IMPL_ISUPPORTS2(nsTextEditorDragListener, nsIDOMEventListener, nsIDOMDragListener)
NS_IMPL_ISUPPORTS1(nsTextEditorDragListener, nsIDOMEventListener)
nsresult
nsTextEditorDragListener::HandleEvent(nsIDOMEvent* aEvent)
{
// make sure it's a drag event
nsCOMPtr<nsIDOMDragEvent> dragEvent = do_QueryInterface(aEvent);
if (dragEvent) {
nsAutoString eventType;
aEvent->GetType(eventType);
if (eventType.EqualsLiteral("dragstart"))
return DragStart(dragEvent);
if (eventType.EqualsLiteral("dragenter"))
return DragStart(dragEvent);
if (eventType.EqualsLiteral("dragover"))
return DragOver(dragEvent);
if (eventType.EqualsLiteral("dragleave"))
return DragStart(dragEvent);
if (eventType.EqualsLiteral("drop"))
return Drop(dragEvent);
}
return NS_OK;
}
nsresult
nsTextEditorDragListener::DragGesture(nsIDOMEvent* aDragEvent)
nsTextEditorDragListener::DragStart(nsIDOMDragEvent* aDragEvent)
{
if ( !mEditor )
return NS_ERROR_NULL_POINTER;
@@ -521,7 +538,7 @@ nsTextEditorDragListener::DragGesture(nsIDOMEvent* aDragEvent)
nsresult
nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
nsTextEditorDragListener::DragEnter(nsIDOMDragEvent* aDragEvent)
{
nsCOMPtr<nsIPresShell> presShell = do_QueryReferent(mPresShell);
if (!presShell)
@@ -545,7 +562,7 @@ nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
nsresult
nsTextEditorDragListener::DragOver(nsIDOMEvent* aDragEvent)
nsTextEditorDragListener::DragOver(nsIDOMDragEvent* aDragEvent)
{
// XXX cache this between drag events?
nsresult rv;
@@ -607,7 +624,7 @@ nsTextEditorDragListener::DragOver(nsIDOMEvent* aDragEvent)
nsresult
nsTextEditorDragListener::DragExit(nsIDOMEvent* aDragEvent)
nsTextEditorDragListener::DragLeave(nsIDOMDragEvent* aDragEvent)
{
if (mCaret && mCaretDrawn)
{
@@ -625,7 +642,7 @@ nsTextEditorDragListener::DragExit(nsIDOMEvent* aDragEvent)
nsresult
nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
nsTextEditorDragListener::Drop(nsIDOMDragEvent* aMouseEvent)
{
if (mCaret)
{
@@ -684,20 +701,10 @@ nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
return mEditor->InsertFromDrop(aMouseEvent);
}
nsresult
nsTextEditorDragListener::Drag(nsIDOMEvent* aDragEvent)
{
return NS_OK;
}
nsresult
nsTextEditorDragListener::DragEnd(nsIDOMEvent* aDragEvent)
{
return NS_OK;
}
PRBool
nsTextEditorDragListener::CanDrop(nsIDOMEvent* aEvent)
nsTextEditorDragListener::CanDrop(nsIDOMDragEvent* aEvent)
{
// if the target doc is read-only, we can't drop
PRUint32 flags;

View File

@@ -40,12 +40,10 @@
#include "nsCOMPtr.h"
#include "nsIDOMEvent.h"
#include "nsIDOMKeyListener.h"
#include "nsIDOMMouseListener.h"
#include "nsIDOMTextListener.h"
#include "nsIDOMDragListener.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMFocusListener.h"
@@ -56,6 +54,8 @@
#include "nsWeakPtr.h"
#include "nsIWeakReferenceUtils.h"
class nsIDOMDragEvent;
/** The nsTextEditorKeyListener public nsIDOMKeyListener
* This class will delegate events to its editor according to the translation
* it is responsible for. i.e. 'c' becomes a keydown, but 'ESC' becomes nothing.
@@ -193,7 +193,7 @@ protected:
/** editor Implementation of the DragListener interface
*/
class nsTextEditorDragListener : public nsIDOMDragListener
class nsTextEditorDragListener : public nsIDOMEventListener
{
public:
/** default constructor
@@ -214,23 +214,18 @@ public:
/*interfaces for addref and release and queryinterface*/
NS_DECL_ISUPPORTS
/*BEGIN implementations of dragevent handler interface*/
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
NS_IMETHOD DragEnter(nsIDOMEvent* aDragEvent);
NS_IMETHOD DragOver(nsIDOMEvent* aDragEvent);
NS_IMETHOD DragExit(nsIDOMEvent* aDragEvent);
NS_IMETHOD DragDrop(nsIDOMEvent* aDragEvent);
NS_IMETHOD DragGesture(nsIDOMEvent* aDragEvent);
NS_IMETHOD Drag(nsIDOMEvent* aDragEvent);
NS_IMETHOD DragEnd(nsIDOMEvent* aDragEvent);
/*END implementations of dragevent handler interface*/
protected:
PRBool CanDrop(nsIDOMEvent* aEvent);
protected:
PRBool CanDrop(nsIDOMDragEvent* aEvent);
nsresult DragEnter(nsIDOMDragEvent* aDragEvent);
nsresult DragOver(nsIDOMDragEvent* aDragEvent);
nsresult DragLeave(nsIDOMDragEvent* aDragEvent);
nsresult Drop(nsIDOMDragEvent* aDragEvent);
nsresult DragStart(nsIDOMDragEvent* aDragEvent);
protected:
nsIEditor* mEditor;
nsWeakPtr mPresShell;

View File

@@ -54,6 +54,7 @@
#include "nsIView.h"
#include "nsIViewManager.h"
#include "nsIDOMKeyListener.h"
#include "nsIDOMDragEvent.h"
#ifdef MOZ_X11
#ifdef MOZ_WIDGET_QT
#include <QWidget>
@@ -96,7 +97,6 @@
#include "nsIDOMMouseMotionListener.h"
#include "nsIDOMFocusListener.h"
#include "nsIDOMContextMenuListener.h"
#include "nsIDOMDragListener.h"
#include "nsIDOMEventTarget.h"
#include "nsIDOMNSEvent.h"
#include "nsIPrivateDOMEvent.h"
@@ -237,8 +237,7 @@ class nsPluginInstanceOwner : public nsIPluginInstanceOwner,
public nsIDOMMouseMotionListener,
public nsIDOMKeyListener,
public nsIDOMFocusListener,
public nsIScrollPositionListener,
public nsIDOMDragListener
public nsIScrollPositionListener
{
public:
@@ -349,16 +348,6 @@ public:
NS_IMETHOD Focus(nsIDOMEvent * aFocusEvent);
NS_IMETHOD Blur(nsIDOMEvent * aFocusEvent);
// nsIDOMDragListener interfaces
NS_IMETHOD DragEnter(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragOver(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragExit(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragDrop(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragGesture(nsIDOMEvent* aMouseEvent);
NS_IMETHOD Drag(nsIDOMEvent* aMouseEvent);
NS_IMETHOD DragEnd(nsIDOMEvent* aMouseEvent);
nsresult Destroy();
void PrepareToStop(PRBool aDelayedStop);
@@ -2234,7 +2223,6 @@ NS_INTERFACE_MAP_BEGIN(nsPluginInstanceOwner)
NS_INTERFACE_MAP_ENTRY(nsIDOMKeyListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMFocusListener)
NS_INTERFACE_MAP_ENTRY(nsIScrollPositionListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMDragListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsIDOMEventListener, nsIDOMMouseListener)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPluginInstanceOwner)
NS_INTERFACE_MAP_END
@@ -3303,85 +3291,6 @@ nsresult nsPluginInstanceOwner::DispatchFocusToPlugin(nsIDOMEvent* aFocusEvent)
return NS_OK;
}
/*=============== nsIDOMDragListener ======================*/
nsresult nsPluginInstanceOwner::DragEnter(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::DragOver(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::DragExit(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::DragDrop(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::DragGesture(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::Drag(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
nsresult nsPluginInstanceOwner::DragEnd(nsIDOMEvent* aMouseEvent)
{
if (mInstance) {
// Let the plugin handle drag events.
aMouseEvent->PreventDefault();
aMouseEvent->StopPropagation();
}
return NS_OK;
}
/*=============== nsIKeyListener ======================*/
nsresult nsPluginInstanceOwner::KeyDown(nsIDOMEvent* aKeyEvent)
@@ -3591,6 +3500,17 @@ nsresult nsPluginInstanceOwner::DispatchMouseToPlugin(nsIDOMEvent* aMouseEvent)
nsresult
nsPluginInstanceOwner::HandleEvent(nsIDOMEvent* aEvent)
{
nsAutoString eventType;
aEvent->GetType(eventType);
if (mInstance) {
nsCOMPtr<nsIDOMDragEvent> dragEvent = do_QueryInterface(aEvent);
if (dragEvent) {
// Let the plugin handle drag events.
aEvent->PreventDefault();
aEvent->StopPropagation();
}
}
return NS_OK;
}
@@ -3914,11 +3834,16 @@ nsPluginInstanceOwner::Destroy()
target->RemoveEventListener(NS_LITERAL_STRING("keyup"), listener, PR_TRUE);
// Unregister drag event listener;
target->RemoveEventListener(NS_LITERAL_STRING("drop"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragdrop"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("drag"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragenter"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragover"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragexit"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragenter"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragleave"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragstart"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("draggesture"), listener, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("dragend"), listener, PR_TRUE);
}
if (mWidget) {
@@ -4408,11 +4333,16 @@ nsresult nsPluginInstanceOwner::Init(nsPresContext* aPresContext,
target->AddEventListener(NS_LITERAL_STRING("keyup"), listener, PR_TRUE);
// Register drag listener
target->AddEventListener(NS_LITERAL_STRING("drop"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragdrop"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragover"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragexit"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("drag"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragenter"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragover"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragleave"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragexit"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragstart"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("draggesture"), listener, PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("dragend"), listener, PR_TRUE);
}
// Register scroll position listener

View File

@@ -57,10 +57,10 @@ function InitWithToolbox(aToolbox)
gToolbox = aToolbox;
gToolboxDocument = gToolbox.ownerDocument;
gToolbox.addEventListener("draggesture", onToolbarDragGesture, false);
gToolbox.addEventListener("dragstart", onToolbarDragStart, false);
gToolbox.addEventListener("dragover", onToolbarDragOver, false);
gToolbox.addEventListener("dragexit", onToolbarDragExit, false);
gToolbox.addEventListener("dragdrop", onToolbarDragDrop, false);
gToolbox.addEventListener("dragleave", onToolbarDragLeave, false);
gToolbox.addEventListener("drop", onToolbarDrop, false);
initDialog();
}
@@ -109,10 +109,10 @@ function repositionDialog()
function removeToolboxListeners()
{
gToolbox.removeEventListener("draggesture", onToolbarDragGesture, false);
gToolbox.removeEventListener("dragstart", onToolbarDragStart, false);
gToolbox.removeEventListener("dragover", onToolbarDragOver, false);
gToolbox.removeEventListener("dragexit", onToolbarDragExit, false);
gToolbox.removeEventListener("dragdrop", onToolbarDragDrop, false);
gToolbox.removeEventListener("dragleave", onToolbarDragLeave, false);
gToolbox.removeEventListener("drop", onToolbarDrop, false);
}
/**
@@ -741,7 +741,7 @@ function isToolbarItem(aElt)
///////////////////////////////////////////////////////////////////////////
//// Drag and Drop observers
function onToolbarDragGesture(aEvent)
function onToolbarDragStart(aEvent)
{
nsDragAndDrop.startDrag(aEvent, dragStartObserver);
}
@@ -751,12 +751,12 @@ function onToolbarDragOver(aEvent)
nsDragAndDrop.dragOver(aEvent, toolbarDNDObserver);
}
function onToolbarDragDrop(aEvent)
function onToolbarDrop(aEvent)
{
nsDragAndDrop.drop(aEvent, toolbarDNDObserver);
}
function onToolbarDragExit(aEvent)
function onToolbarDragLeave(aEvent)
{
if (gCurrentDragOverItem)
setDragActive(gCurrentDragOverItem, false);

View File

@@ -198,7 +198,7 @@
findbar._setFindCloseTimeout();
]]></handler>
<handler event="dragdrop" phase="capturing"><![CDATA[
<handler event="drop" phase="capturing"><![CDATA[
nsDragAndDrop.drop(event, this);
]]></handler>
</handlers>