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:
bors-servo 2017-06-13 04:56:09 -07:00 committed by GitHub
commit 07f6e11485
28 changed files with 2171 additions and 1537 deletions

View file

@ -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)]

View file

@ -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)]

View file

@ -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>,

View file

@ -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