diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-02-24 01:05:37 +0100 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-02-27 17:41:22 +0100 |
commit | e70b520c1ffd76db02f045ce3390df3ea7f6fae1 (patch) | |
tree | ba352b00d2e6aa787a5b2c470c3b17110f1037ba /components/script | |
parent | 0455b0b30163e913abdd63bb92f28d49b72ce0de (diff) | |
download | servo-e70b520c1ffd76db02f045ce3390df3ea7f6fae1.tar.gz servo-e70b520c1ffd76db02f045ce3390df3ea7f6fae1.zip |
Fix the "get the parent" loop when dispatching event (fixes #6733)
The DOM specification says:
A document's get the parent algorithm, given an event, returns null
if event's type attribute value is "load" or document does not have
a browsing context, and the document's associated Window object
otherwise.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/eventdispatcher.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 28a269b7429..f80a217658b 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -10,6 +10,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::reflector::Reflectable; use dom::bindings::trace::RootedVec; +use dom::document::Document; use dom::event::{Event, EventPhase}; use dom::eventtarget::{CompiledEventListener, EventTarget, ListenerPhase}; use dom::node::Node; @@ -153,6 +154,13 @@ pub fn dispatch_event(target: &EventTarget, pseudo_target: Option<&EventTarget>, for ancestor in target_node.ancestors() { chain.push(JS::from_ref(ancestor.upcast())); } + let top_most_ancestor_or_target = + Root::from_ref(chain.r().last().cloned().unwrap_or(target)); + if let Some(document) = Root::downcast::<Document>(top_most_ancestor_or_target) { + if event.type_() != atom!("load") && document.browsing_context().is_some() { + chain.push(JS::from_ref(document.window().upcast())); + } + } } dispatch_to_listeners(event, target, chain.r()); |