Auto merge of #14461 - heycam:bloom-no-common-ancestor, r=emilio

allow the style bloom filter to recover from switch to a node with no common ancestor with the old node

<!-- Please describe your changes on the following line: -->

Since https://bugzilla.mozilla.org/show_bug.cgi?id=1321284, we can have multiple disjoint subtrees of elements to style in a document, due to document level native anonymous content not inheriting from the document's element.  This patch tweaks the style Bloom filter to allow switching to a new node that has no common ancestor with the old node.

r? @emilio

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [ ] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [ ] These changes fix #__ (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because _____

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

… common ancestor with the old node.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14461)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-12-05 03:01:12 -08:00 committed by GitHub
commit 16c2960c3a

View file

@ -214,11 +214,25 @@ impl StyleBloom {
//
// Not-so-happy case: Parent's don't match, so we need to keep going up
// until we find a common ancestor.
//
// Gecko currently models native anonymous content that conceptually hangs
// off the document (such as scrollbars) as a separate subtree from the
// document root. Thus it's possible with Gecko that we do not find any
// common ancestor.
while *self.elements.last().unwrap() != common_parent.as_node().to_unsafe() {
parents_to_insert.push(common_parent);
common_parent =
common_parent.parent_element().expect("We were lied again?");
self.pop::<E>().unwrap();
common_parent = match common_parent.parent_element() {
Some(parent) => parent,
None => {
debug_assert!(self.elements.is_empty());
if cfg!(feature = "gecko") {
break;
} else {
panic!("should have found a common ancestor");
}
}
}
}
// Now the parents match, so insert the stack of elements we have been