mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
Bug 292464 - event listeners added using addEventListener() listen only trusted events. r=jst, sr=peterv, a=chofmann
This commit is contained in:
parent
25c533cf24
commit
ed4e61c491
@ -3975,7 +3975,14 @@ nsDocument::AddEventListener(const nsAString& aType,
|
||||
nsIDOMEventListener* aListener,
|
||||
PRBool aUseCapture)
|
||||
{
|
||||
return AddGroupedEventListener(aType, aListener, aUseCapture, nsnull);
|
||||
PRBool permitUntrustedEvents = PR_FALSE;
|
||||
if (mDocumentURI) {
|
||||
PRBool isChrome = PR_TRUE;
|
||||
nsresult rv = mDocumentURI->SchemeIs("chrome", &isChrome);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
permitUntrustedEvents = !isChrome;
|
||||
}
|
||||
return AddEventListener(aType, aListener, aUseCapture, permitUntrustedEvents);
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -627,15 +627,21 @@ nsDOMEventRTTearoff::GetSystemEventGroup(nsIDOMEventGroup **aGroup)
|
||||
|
||||
// nsIDOMEventTarget
|
||||
NS_IMETHODIMP
|
||||
nsDOMEventRTTearoff::AddEventListener(const nsAString& type,
|
||||
nsIDOMEventListener *listener,
|
||||
nsDOMEventRTTearoff::AddEventListener(const nsAString& aType,
|
||||
nsIDOMEventListener *aListener,
|
||||
PRBool useCapture)
|
||||
{
|
||||
nsCOMPtr<nsIDOMEventReceiver> event_receiver;
|
||||
nsresult rv = GetEventReceiver(getter_AddRefs(event_receiver));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
PRBool permitUntrustedEvents = PR_FALSE;
|
||||
nsIDocument *ownerDoc = mContent->GetOwnerDoc();
|
||||
nsIURI *docUri;
|
||||
if (ownerDoc && (docUri = ownerDoc->GetDocumentURI())) {
|
||||
PRBool isChrome = PR_TRUE;
|
||||
nsresult rv = docUri->SchemeIs("chrome", &isChrome);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
permitUntrustedEvents = !isChrome;
|
||||
}
|
||||
|
||||
return event_receiver->AddEventListener(type, listener, useCapture);
|
||||
return AddEventListener(aType, aListener, useCapture, permitUntrustedEvents);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -758,7 +758,8 @@ nsEventListenerManager::RemoveEventListener(nsIDOMEventListener *aListener,
|
||||
|
||||
for (PRInt32 i=0; i<listeners->Count(); i++) {
|
||||
ls = (nsListenerStruct*)listeners->ElementAt(i);
|
||||
if (ls->mListener == aListener && ls->mFlags == aFlags) {
|
||||
if (ls->mListener == aListener &&
|
||||
(ls->mFlags & ~NS_PRIV_EVENT_UNTRUSTED_PERMITTED) == aFlags) {
|
||||
ls->mSubType &= ~aSubType;
|
||||
if (ls->mSubType == NS_EVENT_BITS_NONE) {
|
||||
NS_RELEASE(ls->mListener);
|
||||
|
@ -51,11 +51,11 @@ class nsIAtom;
|
||||
|
||||
typedef struct {
|
||||
nsIDOMEventListener* mListener;
|
||||
PRUint8 mFlags;
|
||||
PRUint8 mSubType;
|
||||
PRUint8 mHandlerIsString;
|
||||
PRUint8 mSubTypeCapture;
|
||||
PRUint16 mFlags;
|
||||
PRUint16 mGroupFlags;
|
||||
PRUint8 mSubType;
|
||||
PRUint8 mHandlerIsString;
|
||||
PRUint8 mSubTypeCapture;
|
||||
} nsListenerStruct;
|
||||
|
||||
//These define the internal type of the EventListenerManager
|
||||
|
@ -4074,7 +4074,16 @@ nsGlobalWindow::AddEventListener(const nsAString& aType,
|
||||
nsIDOMEventListener* aListener,
|
||||
PRBool aUseCapture)
|
||||
{
|
||||
return AddGroupedEventListener(aType, aListener, aUseCapture, nsnull);
|
||||
PRBool permitUntrustedEvents = PR_FALSE;
|
||||
nsCOMPtr<nsIDocument> doc(do_QueryInterface(mDocument));
|
||||
nsIURI *docUri;
|
||||
if (doc && (docUri = doc->GetDocumentURI())) {
|
||||
PRBool isChrome = PR_TRUE;
|
||||
nsresult rv = docUri->SchemeIs("chrome", &isChrome);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
permitUntrustedEvents = !isChrome;
|
||||
}
|
||||
return AddEventListener(aType, aListener, aUseCapture, permitUntrustedEvents);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
Loading…
Reference in New Issue
Block a user