aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-02-27 23:03:25 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2016-02-27 23:03:25 +0530
commitd5ce8f308faca3dda0728a2fd92b7d875a955d15 (patch)
treec78c6476a71e278f5c54b819163b2fca40eb391b /components/script/dom
parent4a7d234510d5a5f6b2b960a84f70a7260e1fc0a9 (diff)
parente70b520c1ffd76db02f045ce3390df3ea7f6fae1 (diff)
downloadservo-d5ce8f308faca3dda0728a2fd92b7d875a955d15.tar.gz
servo-d5ce8f308faca3dda0728a2fd92b7d875a955d15.zip
Auto merge of #9734 - nox:finish-event-dispatch, r=Ms2ger
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. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9734) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/eventdispatcher.rs8
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());