Bug 412567, Once dispatched, events cannot be redispatched, r+sr=jst

This commit is contained in:
Olli Pettay 2008-06-04 23:09:48 +03:00
parent 3058a74cd4
commit a1c0d47a56
5 changed files with 6 additions and 16 deletions

View File

@ -85,9 +85,7 @@ nsDOMDataContainerEvent::SetData(const nsAString& aKey, nsIVariant *aData)
NS_ENSURE_ARG(aData);
// Make sure this event isn't already being dispatched.
NS_ENSURE_STATE(!(NS_IS_EVENT_IN_DISPATCH(mEvent) ||
(mEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY)));
NS_ENSURE_STATE(!(NS_IS_EVENT_IN_DISPATCH(mEvent)));
NS_ENSURE_STATE(mData.IsInitialized());
return mData.Put(aKey, aData) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}

View File

@ -601,11 +601,6 @@ nsDOMEvent::InitEvent(const nsAString& aEventTypeArg, PRBool aCanBubbleArg, PRBo
mEvent->target = nsnull;
mEvent->originalTarget = nsnull;
// Unset the NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY bit (which is
// set at the end of event dispatch) so that this event can be
// dispatched.
mEvent->flags &= ~NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY;
return NS_OK;
}

View File

@ -376,11 +376,6 @@ nsEventDispatcher::Dispatch(nsISupports* aTarget,
NS_ASSERTION(aEvent, "Trying to dispatch without nsEvent!");
NS_ENSURE_TRUE(!NS_IS_EVENT_IN_DISPATCH(aEvent),
NS_ERROR_ILLEGAL_VALUE);
// This is strange, but nsEvents are sometimes reused and they don't need
// re-initialization.
NS_ENSURE_TRUE(!(aDOMEvent &&
(aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY)),
NS_ERROR_ILLEGAL_VALUE);
#ifdef DEBUG
if (aDOMEvent) {
@ -532,7 +527,7 @@ nsEventDispatcher::DispatchDOMEvent(nsISupports* aTarget,
nsevent->GetIsTrusted(&trusted);
if (!trusted) {
if (!trusted || (innerEvent->flags & NS_EVENT_DISPATCHED)) {
//Check security state to determine if dispatcher is trusted
privEvt->SetTrusted(nsContentUtils::IsCallerTrustedForWrite());
}

View File

@ -58,6 +58,7 @@ _TEST_FILES = \
test_bug402089.html \
test_bug405632.html \
test_bug409604.html \
test_bug412567.html \
$(NULL)
_CHROME_FILES = \

View File

@ -120,7 +120,8 @@ class nsHashKey;
#define NS_PRIV_EVENT_FLAG_SCRIPT 0x0080
#define NS_EVENT_FLAG_NO_CONTENT_DISPATCH 0x0100
#define NS_EVENT_FLAG_SYSTEM_EVENT 0x0200
#define NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY 0x0400 // @see nsIDOM3Event::stopImmediatePropagation()
// Event has been dispatched at least once
#define NS_EVENT_DISPATCHED 0x0400
#define NS_EVENT_FLAG_DISPATCHING 0x0800
#define NS_PRIV_EVENT_UNTRUSTED_PERMITTED 0x8000
@ -1123,7 +1124,7 @@ enum nsDragDropEventStatus {
NS_ASSERTION(NS_IS_EVENT_IN_DISPATCH(event), \
"Event never got marked for dispatch!"); \
(event)->flags &= ~NS_EVENT_FLAG_DISPATCHING; \
(event)->flags |= NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY;
(event)->flags |= NS_EVENT_DISPATCHED;
/*
* Virtual key bindings for keyboard events.