mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Move EventState to rust-selectors.
This commit is contained in:
parent
f7f27a8146
commit
79ac365a68
20 changed files with 114 additions and 169 deletions
|
@ -1180,11 +1180,11 @@ impl LayoutTask {
|
|||
}
|
||||
}
|
||||
|
||||
let event_state_changes = document.drain_event_state_changes();
|
||||
let state_changes = document.drain_element_state_changes();
|
||||
if !needs_dirtying {
|
||||
for &(el, state) in event_state_changes.iter() {
|
||||
for &(el, state) in state_changes.iter() {
|
||||
assert!(!state.is_empty());
|
||||
el.note_event_state_change();
|
||||
el.note_state_change();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ extern crate net_traits;
|
|||
extern crate rustc_serialize;
|
||||
extern crate script;
|
||||
extern crate script_traits;
|
||||
extern crate selectors;
|
||||
#[macro_use(state_pseudo_classes)] extern crate selectors;
|
||||
extern crate serde;
|
||||
extern crate serde_json;
|
||||
extern crate smallvec;
|
||||
|
|
|
@ -43,8 +43,7 @@ use script::dom::bindings::conversions::Castable;
|
|||
use script::dom::bindings::js::LayoutJS;
|
||||
use script::dom::characterdata::LayoutCharacterDataHelpers;
|
||||
use script::dom::document::{Document, LayoutDocumentHelpers};
|
||||
use script::dom::element;
|
||||
use script::dom::element::{Element, EventState, LayoutElementHelpers, RawLayoutElementHelpers};
|
||||
use script::dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers};
|
||||
use script::dom::htmlcanvaselement::{LayoutHTMLCanvasElementHelpers, HTMLCanvasData};
|
||||
use script::dom::htmliframeelement::HTMLIFrameElement;
|
||||
use script::dom::htmlimageelement::LayoutHTMLImageElementHelpers;
|
||||
|
@ -56,6 +55,7 @@ use script::dom::text::Text;
|
|||
use script::layout_interface::TrustedNodeAddress;
|
||||
use selectors::matching::DeclarationBlock;
|
||||
use selectors::parser::{AttrSelector, NamespaceConstraint};
|
||||
use selectors::states::*;
|
||||
use smallvec::VecLike;
|
||||
use std::borrow::ToOwned;
|
||||
use std::cell::{Ref, RefMut};
|
||||
|
@ -375,9 +375,9 @@ impl<'le> LayoutDocument<'le> {
|
|||
self.as_node().children().find(LayoutNode::is_element)
|
||||
}
|
||||
|
||||
pub fn drain_event_state_changes(&self) -> Vec<(LayoutElement, EventState)> {
|
||||
pub fn drain_element_state_changes(&self) -> Vec<(LayoutElement, ElementState)> {
|
||||
unsafe {
|
||||
let changes = self.document.drain_event_state_changes();
|
||||
let changes = self.document.drain_element_state_changes();
|
||||
Vec::from_iter(changes.iter().map(|&(el, state)|
|
||||
(LayoutElement {
|
||||
element: el,
|
||||
|
@ -408,11 +408,11 @@ impl<'le> LayoutElement<'le> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Properly marks nodes as dirty in response to event state changes.
|
||||
/// Properly marks nodes as dirty in response to state changes.
|
||||
///
|
||||
/// Currently this implementation is very conservative, and basically mirrors node::dirty_impl.
|
||||
/// With restyle hints, we can do less work here.
|
||||
pub fn note_event_state_change(&self) {
|
||||
pub fn note_state_change(&self) {
|
||||
let node = self.as_node();
|
||||
|
||||
// Bail out if we're already dirty. This won't be valid when we start doing more targeted
|
||||
|
@ -453,6 +453,15 @@ fn as_element<'le>(node: LayoutJS<Node>) -> Option<LayoutElement<'le>> {
|
|||
})
|
||||
}
|
||||
|
||||
macro_rules! state_getter {
|
||||
($(
|
||||
$(#[$Flag_attr: meta])*
|
||||
state $css: expr => $variant: ident / $method: ident /
|
||||
$flag: ident = $value: expr,
|
||||
)+) => {
|
||||
$( fn $method(&self) -> bool { self.element.get_state_for_layout().contains($flag) } )+
|
||||
}
|
||||
}
|
||||
|
||||
impl<'le> ::selectors::Element for LayoutElement<'le> {
|
||||
fn parent_element(&self) -> Option<LayoutElement<'le>> {
|
||||
|
@ -544,20 +553,7 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
|
|||
false
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_hover_state(&self) -> bool {
|
||||
self.element.get_event_state_for_layout().contains(element::IN_HOVER_STATE)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_focus_state(&self) -> bool {
|
||||
self.element.get_event_state_for_layout().contains(element::IN_FOCUS_STATE)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_active_state(&self) -> bool {
|
||||
self.element.get_event_state_for_layout().contains(element::IN_ACTIVE_STATE)
|
||||
}
|
||||
state_pseudo_classes!(state_getter);
|
||||
|
||||
#[inline]
|
||||
fn get_id(&self) -> Option<Atom> {
|
||||
|
@ -566,26 +562,6 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_disabled_state(&self) -> bool {
|
||||
self.element.get_event_state_for_layout().contains(element::IN_DISABLED_STATE)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_enabled_state(&self) -> bool {
|
||||
self.element.get_event_state_for_layout().contains(element::IN_ENABLED_STATE)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_checked_state(&self) -> bool {
|
||||
self.element.get_checked_state_for_layout()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_indeterminate_state(&self) -> bool {
|
||||
self.element.get_indeterminate_state_for_layout()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn has_class(&self, name: &Atom) -> bool {
|
||||
unsafe {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue