mirror of
https://github.com/servo/servo.git
synced 2025-08-11 00:15:32 +01:00
Auto merge of #17292 - emilio:better-style-invalidation, r=heycam
style: Implement a more fine-grained invalidation method. <!-- 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/17292) <!-- Reviewable:end -->
This commit is contained in:
commit
07f6e11485
28 changed files with 2171 additions and 1537 deletions
|
@ -9235,31 +9235,106 @@ pub mod root {
|
|||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mClassAttributeChanged(&self) -> bool {
|
||||
let mask = 32usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 5usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mClassAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 32usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 5usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mIdAttributeChanged(&self) -> bool {
|
||||
let mask = 64usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 6usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mIdAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 64usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 6usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mOtherAttributeChanged(&self) -> bool {
|
||||
let mask = 128usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 7usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mOtherAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 128usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 7usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn new_bitfield_1(mIsHTMLElementInHTMLDocument: bool,
|
||||
mIsInChromeDocument: bool,
|
||||
mSupportsLangAttr: bool,
|
||||
mIsTableBorderNonzero: bool,
|
||||
mIsMozBrowserFrame: bool) -> u8 {
|
||||
mIsMozBrowserFrame: bool,
|
||||
mClassAttributeChanged: bool,
|
||||
mIdAttributeChanged: bool,
|
||||
mOtherAttributeChanged: bool) -> u8 {
|
||||
({
|
||||
({
|
||||
({
|
||||
({
|
||||
({ 0 } |
|
||||
((mIsHTMLElementInHTMLDocument as u8
|
||||
as u8) << 0usize) &
|
||||
(1usize as u8))
|
||||
({
|
||||
({
|
||||
({
|
||||
({ 0 } |
|
||||
((mIsHTMLElementInHTMLDocument
|
||||
as u8 as u8) <<
|
||||
0usize) &
|
||||
(1usize as u8))
|
||||
} |
|
||||
((mIsInChromeDocument as u8
|
||||
as u8) << 1usize) &
|
||||
(2usize as u8))
|
||||
} |
|
||||
((mSupportsLangAttr as u8 as u8)
|
||||
<< 2usize) &
|
||||
(4usize as u8))
|
||||
} |
|
||||
((mIsTableBorderNonzero as u8 as u8)
|
||||
<< 3usize) & (8usize as u8))
|
||||
} |
|
||||
((mIsInChromeDocument as u8 as u8) <<
|
||||
1usize) & (2usize as u8))
|
||||
((mIsMozBrowserFrame as u8 as u8) <<
|
||||
4usize) & (16usize as u8))
|
||||
} |
|
||||
((mSupportsLangAttr as u8 as u8) << 2usize) &
|
||||
(4usize as u8))
|
||||
((mClassAttributeChanged as u8 as u8) <<
|
||||
5usize) & (32usize as u8))
|
||||
} |
|
||||
((mIsTableBorderNonzero as u8 as u8) << 3usize) &
|
||||
(8usize as u8))
|
||||
((mIdAttributeChanged as u8 as u8) << 6usize) &
|
||||
(64usize as u8))
|
||||
} |
|
||||
((mIsMozBrowserFrame as u8 as u8) << 4usize) &
|
||||
(16usize as u8))
|
||||
((mOtherAttributeChanged as u8 as u8) << 7usize) &
|
||||
(128usize as u8))
|
||||
}
|
||||
}
|
||||
#[repr(C)]
|
||||
|
|
|
@ -8976,31 +8976,106 @@ pub mod root {
|
|||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mClassAttributeChanged(&self) -> bool {
|
||||
let mask = 32usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 5usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mClassAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 32usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 5usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mIdAttributeChanged(&self) -> bool {
|
||||
let mask = 64usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 6usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mIdAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 64usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 6usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn mOtherAttributeChanged(&self) -> bool {
|
||||
let mask = 128usize as u8;
|
||||
let unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
let val = (unit_field_val & mask) >> 7usize;
|
||||
unsafe { ::std::mem::transmute(val as u8) }
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_mOtherAttributeChanged(&mut self, val: bool) {
|
||||
let mask = 128usize as u8;
|
||||
let val = val as u8 as u8;
|
||||
let mut unit_field_val: u8 =
|
||||
unsafe { ::std::mem::transmute(self._bitfield_1) };
|
||||
unit_field_val &= !mask;
|
||||
unit_field_val |= (val << 7usize) & mask;
|
||||
self._bitfield_1 =
|
||||
unsafe { ::std::mem::transmute(unit_field_val) };
|
||||
}
|
||||
#[inline]
|
||||
pub fn new_bitfield_1(mIsHTMLElementInHTMLDocument: bool,
|
||||
mIsInChromeDocument: bool,
|
||||
mSupportsLangAttr: bool,
|
||||
mIsTableBorderNonzero: bool,
|
||||
mIsMozBrowserFrame: bool) -> u8 {
|
||||
mIsMozBrowserFrame: bool,
|
||||
mClassAttributeChanged: bool,
|
||||
mIdAttributeChanged: bool,
|
||||
mOtherAttributeChanged: bool) -> u8 {
|
||||
({
|
||||
({
|
||||
({
|
||||
({
|
||||
({ 0 } |
|
||||
((mIsHTMLElementInHTMLDocument as u8
|
||||
as u8) << 0usize) &
|
||||
(1usize as u8))
|
||||
({
|
||||
({
|
||||
({
|
||||
({ 0 } |
|
||||
((mIsHTMLElementInHTMLDocument
|
||||
as u8 as u8) <<
|
||||
0usize) &
|
||||
(1usize as u8))
|
||||
} |
|
||||
((mIsInChromeDocument as u8
|
||||
as u8) << 1usize) &
|
||||
(2usize as u8))
|
||||
} |
|
||||
((mSupportsLangAttr as u8 as u8)
|
||||
<< 2usize) &
|
||||
(4usize as u8))
|
||||
} |
|
||||
((mIsTableBorderNonzero as u8 as u8)
|
||||
<< 3usize) & (8usize as u8))
|
||||
} |
|
||||
((mIsInChromeDocument as u8 as u8) <<
|
||||
1usize) & (2usize as u8))
|
||||
((mIsMozBrowserFrame as u8 as u8) <<
|
||||
4usize) & (16usize as u8))
|
||||
} |
|
||||
((mSupportsLangAttr as u8 as u8) << 2usize) &
|
||||
(4usize as u8))
|
||||
((mClassAttributeChanged as u8 as u8) <<
|
||||
5usize) & (32usize as u8))
|
||||
} |
|
||||
((mIsTableBorderNonzero as u8 as u8) << 3usize) &
|
||||
(8usize as u8))
|
||||
((mIdAttributeChanged as u8 as u8) << 6usize) &
|
||||
(64usize as u8))
|
||||
} |
|
||||
((mIsMozBrowserFrame as u8 as u8) << 4usize) &
|
||||
(16usize as u8))
|
||||
((mOtherAttributeChanged as u8 as u8) << 7usize) &
|
||||
(128usize as u8))
|
||||
}
|
||||
}
|
||||
#[repr(C)]
|
||||
|
|
|
@ -13,7 +13,7 @@ use gecko_bindings::bindings;
|
|||
use gecko_bindings::structs::ServoElementSnapshot;
|
||||
use gecko_bindings::structs::ServoElementSnapshotFlags as Flags;
|
||||
use gecko_bindings::structs::ServoElementSnapshotTable;
|
||||
use restyle_hints::ElementSnapshot;
|
||||
use invalidation::element::element_wrapper::ElementSnapshot;
|
||||
use selectors::attr::{AttrSelectorOperation, AttrSelectorOperator, CaseSensitivity, NamespaceConstraint};
|
||||
use string_cache::{Atom, Namespace};
|
||||
|
||||
|
@ -62,6 +62,25 @@ impl GeckoElementSnapshot {
|
|||
self.has_any(Flags::OtherPseudoClassState)
|
||||
}
|
||||
|
||||
/// Returns true if the snapshot recorded an id change.
|
||||
#[inline]
|
||||
pub fn id_changed(&self) -> bool {
|
||||
self.mIdAttributeChanged()
|
||||
}
|
||||
|
||||
/// Returns true if the snapshot recorded a class attribute change.
|
||||
#[inline]
|
||||
pub fn class_changed(&self) -> bool {
|
||||
self.mClassAttributeChanged()
|
||||
}
|
||||
|
||||
/// Returns true if the snapshot recorded an attribute change which isn't a
|
||||
/// class or id change.
|
||||
#[inline]
|
||||
pub fn other_attr_changed(&self) -> bool {
|
||||
self.mOtherAttributeChanged()
|
||||
}
|
||||
|
||||
/// selectors::Element::attr_matches
|
||||
pub fn attr_matches(&self,
|
||||
ns: &NamespaceConstraint<&Namespace>,
|
||||
|
|
|
@ -408,6 +408,24 @@ impl<'le> fmt::Debug for GeckoElement<'le> {
|
|||
if let Some(id) = self.get_id() {
|
||||
try!(write!(f, " id={}", id));
|
||||
}
|
||||
|
||||
let mut first = true;
|
||||
let mut any = false;
|
||||
self.each_class(|c| {
|
||||
if first {
|
||||
first = false;
|
||||
any = true;
|
||||
let _ = f.write_str(" class=\"");
|
||||
} else {
|
||||
let _ = f.write_str(" ");
|
||||
}
|
||||
let _ = write!(f, "{}", c);
|
||||
});
|
||||
|
||||
if any {
|
||||
f.write_str("\"")?;
|
||||
}
|
||||
|
||||
write!(f, "> ({:#x})", self.as_node().opaque().0)
|
||||
}
|
||||
}
|
||||
|
@ -1240,6 +1258,10 @@ impl<'le> PresentationalHintsSynthesizer for GeckoElement<'le> {
|
|||
// Unvisited vs. visited styles are computed up-front based on the
|
||||
// visited mode (not the element's actual state).
|
||||
let declarations = match visited_handling {
|
||||
VisitedHandlingMode::AllLinksVisitedAndUnvisited => {
|
||||
unreachable!("We should never try to selector match with \
|
||||
AllLinksVisitedAndUnvisited");
|
||||
},
|
||||
VisitedHandlingMode::AllLinksUnvisited => unsafe {
|
||||
Gecko_GetUnvisitedLinkAttrDeclarationBlock(self.0)
|
||||
},
|
||||
|
@ -1547,7 +1569,7 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
|
|||
let old_value = context.within_functional_pseudo_class_argument;
|
||||
context.within_functional_pseudo_class_argument = true;
|
||||
let result = sels.iter().any(|s| {
|
||||
matches_complex_selector(s, 0, self, context, flags_setter)
|
||||
matches_complex_selector(s.iter(), self, context, flags_setter)
|
||||
});
|
||||
context.within_functional_pseudo_class_argument = old_value;
|
||||
result
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue