mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Auto merge of #9722 - mbrubeck:slow-selector, r=nox
Dirty elements whose selectors are affected by sibling changes This fixes incremental layout of nodes that match pseudo-class selectors such as :first-child, :nth-child, :last-child, :first-of-type, etc. Fixes #8191 and other intermittent layout bugs. This code is based on the following flags from Gecko: https://hg.mozilla.org/mozilla-central/file/e1cf617a1f28/dom/base/nsINode.h#l134 Depends on servo/rust-selectors#71. r? @SimonSapin There are a couple of TODO items in this commit, but I'd appreciate feedback on the general approach before I finish it up. (Also, if someone who knows more than I do could give some advice about atomic orderings...) <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9722) <!-- Reviewable:end -->
This commit is contained in:
commit
438b3a444b
14 changed files with 145 additions and 47 deletions
|
@ -70,7 +70,7 @@ heapsize_plugin = "0.1.2"
|
|||
libc = "0.2"
|
||||
log = "0.3"
|
||||
rustc-serialize = "0.3"
|
||||
selectors = {version = "0.5", features = ["heap_size"]}
|
||||
selectors = {version = "0.5.1", features = ["heap_size"]}
|
||||
serde = "0.6"
|
||||
serde_json = "0.6"
|
||||
serde_macros = "0.6"
|
||||
|
|
|
@ -53,7 +53,7 @@ use script::dom::node::{CAN_BE_FRAGMENTED, HAS_CHANGED, HAS_DIRTY_DESCENDANTS, I
|
|||
use script::dom::node::{LayoutNodeHelpers, Node, OpaqueStyleAndLayoutData};
|
||||
use script::dom::text::Text;
|
||||
use script::layout_interface::TrustedNodeAddress;
|
||||
use selectors::matching::DeclarationBlock;
|
||||
use selectors::matching::{DeclarationBlock, ElementFlags};
|
||||
use selectors::parser::{AttrSelector, NamespaceConstraint};
|
||||
use smallvec::VecLike;
|
||||
use std::borrow::ToOwned;
|
||||
|
@ -604,6 +604,10 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
|||
self.element.html_element_in_html_document_for_layout()
|
||||
}
|
||||
}
|
||||
|
||||
fn insert_flags(&self, flags: ElementFlags) {
|
||||
self.element.insert_atomic_flags(flags);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, PartialEq, Clone)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue