aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUtsav Oza <utsavoza96@gmail.com>2020-07-30 16:31:36 +0530
committerUtsav Oza <utsavoza96@gmail.com>2020-07-30 16:34:30 +0530
commit962e6205293b3466df173889cd56ba435cdaa233 (patch)
tree4517a8b7df3409a7d5b7ce530496992331391f67
parentda45522085363480009f7e12cce2c00a94ec931e (diff)
downloadservo-962e6205293b3466df173889cd56ba435cdaa233.tar.gz
servo-962e6205293b3466df173889cd56ba435cdaa233.zip
Do not panic on navigating across documents
-rw-r--r--components/script/dom/document.rs13
-rw-r--r--components/script/dom/node.rs6
-rw-r--r--components/script/dom/range.rs1
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::<Node>()
- .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<Node> {
+ ) -> Option<DomRoot<Node>> {
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<Node> {
self.EndContainer()
.common_ancestor(&self.StartContainer(), ShadowIncluding::No)
+ .expect("Couldn't find common ancestor container")
}
// https://dom.spec.whatwg.org/#dom-range-setstart