mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
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:
commit
16c2960c3a
1 changed files with 16 additions and 2 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue