From 962e6205293b3466df173889cd56ba435cdaa233 Mon Sep 17 00:00:00 2001 From: Utsav Oza Date: Thu, 30 Jul 2020 16:31:36 +0530 Subject: [PATCH] Do not panic on navigating across documents --- components/script/dom/document.rs | 13 ++++++++----- components/script/dom/node.rs | 6 +++--- components/script/dom/range.rs | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2ca8825808b..fef552b326b 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -560,7 +560,8 @@ impl Document { let new_dirty_root = element .upcast::() - .common_ancestor(dirty_root.upcast(), ShadowIncluding::Yes); + .common_ancestor(dirty_root.upcast(), ShadowIncluding::Yes) + .expect("Couldn't find common ancestor"); let mut has_dirty_descendants = true; for ancestor in dirty_root @@ -1515,10 +1516,12 @@ impl Document { FireMouseEventType::Enter | FireMouseEventType::Leave )); - let common_ancestor = related_target.as_ref().map_or_else( - || DomRoot::from_ref(&*event_target), - |related_target| event_target.common_ancestor(related_target, ShadowIncluding::No), - ); + let common_ancestor = match related_target.as_ref() { + Some(related_target) => event_target + .common_ancestor(related_target, ShadowIncluding::No) + .unwrap_or_else(|| DomRoot::from_ref(&*event_target)), + None => DomRoot::from_ref(&*event_target), + }; // We need to create a target chain in case the event target shares // its boundaries with its ancestors. diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 9bfe91e3470..8883b5b33d7 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -708,16 +708,16 @@ impl Node { &self, other: &Node, shadow_including: ShadowIncluding, - ) -> DomRoot { + ) -> Option> { for ancestor in self.inclusive_ancestors(shadow_including) { if other .inclusive_ancestors(shadow_including) .any(|node| node == ancestor) { - return ancestor; + return Some(ancestor); } } - unreachable!(); + None } pub fn is_inclusive_ancestor_of(&self, parent: &Node) -> bool { diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index e9b3a2e34cb..b48e186bc3f 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -298,6 +298,7 @@ impl RangeMethods for Range { fn CommonAncestorContainer(&self) -> DomRoot { self.EndContainer() .common_ancestor(&self.StartContainer(), ShadowIncluding::No) + .expect("Couldn't find common ancestor container") } // https://dom.spec.whatwg.org/#dom-range-setstart