mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 412567, Once dispatched, events cannot be redispatched, r+sr=jst
This commit is contained in:
parent
3058a74cd4
commit
a1c0d47a56
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ _TEST_FILES = \
|
||||
test_bug402089.html \
|
||||
test_bug405632.html \
|
||||
test_bug409604.html \
|
||||
test_bug412567.html \
|
||||
$(NULL)
|
||||
|
||||
_CHROME_FILES = \
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user