Bug 665632: Remove Add/RemoveEventListenerByIID from satchel. r=dolske

This commit is contained in:
Jonas Sicking
2011-06-27 16:34:56 -07:00
parent 89733c1da1
commit 968ae3cae1
2 changed files with 82 additions and 377 deletions

View File

@@ -54,7 +54,6 @@
#include "nsIDOMEventTarget.h"
#include "nsIDOMKeyEvent.h"
#include "nsIPrivateDOMEvent.h"
#include "nsIDOMCompositionListener.h"
#include "nsIDOMDocument.h"
#include "nsIDOMElement.h"
#include "nsIFormControl.h"
@@ -73,23 +72,12 @@
#include "nsIDOMNSEvent.h"
#include "mozilla/dom/Element.h"
NS_INTERFACE_MAP_BEGIN(nsFormFillController)
NS_INTERFACE_MAP_ENTRY(nsIFormFillController)
NS_INTERFACE_MAP_ENTRY(nsIAutoCompleteInput)
NS_INTERFACE_MAP_ENTRY(nsIAutoCompleteSearch)
NS_INTERFACE_MAP_ENTRY(nsIDOMFocusListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMKeyListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMFormListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMMouseListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMCompositionListener)
NS_INTERFACE_MAP_ENTRY(nsIDOMContextMenuListener)
NS_INTERFACE_MAP_ENTRY(nsIMutationObserver)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIFormFillController)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsIDOMEventListener, nsIDOMFocusListener)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(nsFormFillController)
NS_IMPL_RELEASE(nsFormFillController)
NS_IMPL_ISUPPORTS5(nsFormFillController,
nsIFormFillController,
nsIAutoCompleteInput,
nsIAutoCompleteSearch,
nsIDOMEventListener,
nsIMutationObserver)
nsFormFillController::nsFormFillController() :
mTimeout(50),
@@ -683,13 +671,44 @@ nsFormFillController::StopSearch()
NS_IMETHODIMP
nsFormFillController::HandleEvent(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
nsAutoString type;
aEvent->GetType(type);
if (type.EqualsLiteral("focus")) {
return Focus(aEvent);
}
if (type.EqualsLiteral("mousedown")) {
return MouseDown(aEvent);
}
if (type.EqualsLiteral("keypress")) {
return KeyPress(aEvent);
}
if (type.EqualsLiteral("input")) {
return (!mSuppressOnInput && mController && mFocusedInput) ?
mController->HandleText() : NS_OK;
}
if (type.EqualsLiteral("blur")) {
if (mFocusedInput)
StopControllingInput();
return NS_OK;
}
if (type.EqualsLiteral("compositionstart")) {
NS_ASSERTION(mController, "should have a controller!");
if (mController && mFocusedInput)
mController->HandleStartComposition();
return NS_OK;
}
if (type.EqualsLiteral("compositionend")) {
NS_ASSERTION(mController, "should have a controller!");
if (mController && mFocusedInput)
mController->HandleEndComposition();
return NS_OK;
}
if (type.EqualsLiteral("contextmenu")) {
if (mFocusedPopup)
mFocusedPopup->ClosePopup();
return NS_OK;
}
if (type.EqualsLiteral("pagehide")) {
nsCOMPtr<nsIDOMEventTarget> target;
aEvent->GetTarget(getter_AddRefs(target));
@@ -727,17 +746,9 @@ nsFormFillController::RemoveForDOMDocumentEnumerator(nsISupports* aKey,
return PL_DHASH_NEXT;
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMFocusListener
NS_IMETHODIMP
nsresult
nsFormFillController::Focus(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
nsCOMPtr<nsIDOMEventTarget> target;
aEvent->GetTarget(getter_AddRefs(target));
@@ -790,49 +801,9 @@ nsFormFillController::IsInputAutoCompleteOff()
return autoCompleteOff;
}
NS_IMETHODIMP
nsFormFillController::Blur(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
if (mFocusedInput)
StopControllingInput();
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMKeyListener
NS_IMETHODIMP
nsFormFillController::KeyDown(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::KeyUp(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsresult
nsFormFillController::KeyPress(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
NS_ASSERTION(mController, "should have a controller!");
if (!mFocusedInput || !mController)
return NS_OK;
@@ -903,117 +874,15 @@ nsFormFillController::KeyPress(nsIDOMEvent* aEvent)
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMCompositionListener
NS_IMETHODIMP
nsFormFillController::HandleStartComposition(nsIDOMEvent* aCompositionEvent)
nsresult
nsFormFillController::MouseDown(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aCompositionEvent))
return NS_OK;
NS_ASSERTION(mController, "should have a controller!");
if (mController && mFocusedInput)
mController->HandleStartComposition();
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::HandleEndComposition(nsIDOMEvent* aCompositionEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aCompositionEvent))
return NS_OK;
NS_ASSERTION(mController, "should have a controller!");
if (mController && mFocusedInput)
mController->HandleEndComposition();
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMFormListener
NS_IMETHODIMP
nsFormFillController::Submit(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
if (mFocusedInput)
StopControllingInput();
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::Reset(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::Change(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::Select(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::Input(nsIDOMEvent* aEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aEvent))
return NS_OK;
if (mSuppressOnInput || !mController || !mFocusedInput)
return NS_OK;
return mController->HandleText();
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMMouseListener
NS_IMETHODIMP
nsFormFillController::MouseDown(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
if (!mFocusedInput)
return NS_OK;
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aMouseEvent));
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aEvent));
if (!mouseEvent)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMEventTarget> target;
aMouseEvent->GetTarget(getter_AddRefs(target));
aEvent->GetTarget(getter_AddRefs(target));
nsCOMPtr<nsIDOMHTMLInputElement> targetInput = do_QueryInterface(target);
if (!targetInput)
return NS_OK;
@@ -1049,70 +918,6 @@ nsFormFillController::MouseDown(nsIDOMEvent* aMouseEvent)
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::MouseUp(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::MouseClick(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::MouseDblClick(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::MouseOver(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsFormFillController::MouseOut(nsIDOMEvent* aMouseEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aMouseEvent))
return NS_OK;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
//// nsIDOMContextMenuListener
NS_IMETHODIMP
nsFormFillController::ContextMenu(nsIDOMEvent* aContextMenuEvent)
{
// Drop untrusted events from content
if (!IsEventTrusted(aContextMenuEvent))
return NS_OK;
if (mFocusedPopup)
mFocusedPopup->ClosePopup();
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
//// nsFormFillController
@@ -1130,41 +935,22 @@ nsFormFillController::AddWindowListeners(nsIDOMWindow *aWindow)
if (!target)
return;
target->AddEventListener(NS_LITERAL_STRING("focus"),
static_cast<nsIDOMFocusListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("blur"),
static_cast<nsIDOMFocusListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("pagehide"),
static_cast<nsIDOMFocusListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("mousedown"),
static_cast<nsIDOMMouseListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("click"),
static_cast<nsIDOMMouseListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("input"),
static_cast<nsIDOMFormListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("compositionstart"),
static_cast<nsIDOMCompositionListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("compositionend"),
static_cast<nsIDOMCompositionListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("contextmenu"),
static_cast<nsIDOMContextMenuListener *>(this),
PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("focus"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("blur"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("pagehide"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("mousedown"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("input"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("compositionstart"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("compositionend"), this,
PR_TRUE, PR_FALSE);
target->AddEventListener(NS_LITERAL_STRING("contextmenu"), this,
PR_TRUE, PR_FALSE);
// Note that any additional listeners added should ensure that they ignore
// untrusted events, which might be sent by content that's up to no good.
@@ -1190,41 +976,16 @@ nsFormFillController::RemoveWindowListeners(nsIDOMWindow *aWindow)
if (!target)
return;
target->RemoveEventListener(NS_LITERAL_STRING("focus"),
static_cast<nsIDOMFocusListener *>(this),
target->RemoveEventListener(NS_LITERAL_STRING("focus"), this, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("blur"), this, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("pagehide"), this, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("mousedown"), this, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("input"), this, PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("compositionstart"), this,
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("blur"),
static_cast<nsIDOMFocusListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("pagehide"),
static_cast<nsIDOMFocusListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("mousedown"),
static_cast<nsIDOMMouseListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("click"),
static_cast<nsIDOMMouseListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("input"),
static_cast<nsIDOMFormListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("compositionstart"),
static_cast<nsIDOMCompositionListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("compositionend"),
static_cast<nsIDOMCompositionListener *>(this),
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("contextmenu"),
static_cast<nsIDOMContextMenuListener *>(this),
target->RemoveEventListener(NS_LITERAL_STRING("compositionend"), this,
PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("contextmenu"), this, PR_TRUE);
}
void
@@ -1233,12 +994,11 @@ nsFormFillController::AddKeyListener(nsIDOMHTMLInputElement *aInput)
if (!aInput)
return;
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(aInput);
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(aInput);
target->AddEventListener(NS_LITERAL_STRING("keypress"),
static_cast<nsIDOMKeyListener *>(this),
PR_TRUE);
}
target->AddEventListener(NS_LITERAL_STRING("keypress"), this,
PR_TRUE, PR_FALSE);
}
void
nsFormFillController::RemoveKeyListener()
@@ -1246,11 +1006,8 @@ nsFormFillController::RemoveKeyListener()
if (!mFocusedInput)
return;
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(mFocusedInput);
target->RemoveEventListener(NS_LITERAL_STRING("keypress"),
static_cast<nsIDOMKeyListener *>(this),
PR_TRUE);
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(mFocusedInput);
target->RemoveEventListener(NS_LITERAL_STRING("keypress"), this, PR_TRUE);
}
void
@@ -1357,21 +1114,6 @@ nsFormFillController::GetIndexOfDocShell(nsIDocShell *aDocShell)
return -1;
}
PRBool
nsFormFillController::IsEventTrusted(nsIDOMEvent *aEvent)
{
nsresult rv;
nsCOMPtr<nsIDOMNSEvent> nsevent = do_QueryInterface(aEvent);
if (!nsevent)
return PR_FALSE;
PRBool isTrusted;
rv = nsevent->GetIsTrusted(&isTrusted);
NS_ENSURE_SUCCESS(rv, PR_FALSE);
return isTrusted;
}
NS_GENERIC_FACTORY_CONSTRUCTOR(nsFormFillController)
NS_DEFINE_NAMED_CID(NS_FORMFILLCONTROLLER_CID);