aboutsummaryrefslogtreecommitdiffstats
path: root/components/style/rule_tree/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/style/rule_tree/mod.rs')
-rw-r--r--components/style/rule_tree/mod.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/components/style/rule_tree/mod.rs b/components/style/rule_tree/mod.rs
index fa859d79f06..1dbc17eaf34 100644
--- a/components/style/rule_tree/mod.rs
+++ b/components/style/rule_tree/mod.rs
@@ -136,6 +136,27 @@ impl StyleSource {
let _ = write!(writer, " -> {:?}", self.read(guard).declarations());
}
+ // This is totally unsafe, should be removed when we figure out the cause of
+ // bug 1607553.
+ unsafe fn dump_unchecked<W: Write>(&self, writer: &mut W) {
+ if let Some(ref rule) = self.0.as_first() {
+ let rule = rule.read_unchecked();
+ let _ = write!(writer, "{:?}", rule.selectors);
+ }
+ let _ = write!(writer, " -> {:?}", self.read_unchecked().declarations());
+ }
+
+ // This is totally unsafe, should be removed when we figure out the cause of
+ // bug 1607553.
+ #[inline]
+ unsafe fn read_unchecked(&self) -> &PropertyDeclarationBlock {
+ let block: &Locked<PropertyDeclarationBlock> = match self.0.borrow() {
+ ArcUnionBorrow::First(ref rule) => &rule.get().read_unchecked().block,
+ ArcUnionBorrow::Second(ref block) => block.get(),
+ };
+ block.read_unchecked()
+ }
+
/// Read the style source guard, and obtain thus read access to the
/// underlying property declaration block.
#[inline]
@@ -1720,7 +1741,23 @@ impl Drop for StrongRuleNode {
}
if cfg!(debug_assertions) || crate::gecko_bindings::structs::GECKO_IS_NIGHTLY {
- assert!(node.children.read().is_empty());
+ let children = node.children.read();
+ if !children.is_empty() {
+ let mut crash_str = vec![];
+ unsafe {
+ // Try to unsafely collect some information of this before
+ // crashing the process.
+ if let Some(ref s) = node.source {
+ s.dump_unchecked(&mut crash_str);
+ crash_str.push(b'\n');
+ }
+ children.each(|child| {
+ (*child.ptr()).source.as_ref().unwrap().dump_unchecked(&mut crash_str);
+ crash_str.push(b'\n');
+ });
+ }
+ panic!("Children left in the rule tree on drop: {}", String::from_utf8_lossy(&crash_str).trim());
+ }
}
if node.parent.is_none() {