diff options
-rw-r--r-- | components/layout/layout_task.rs | 6 | ||||
-rw-r--r-- | components/layout/lib.rs | 2 | ||||
-rw-r--r-- | components/layout/wrapper.rs | 56 | ||||
-rw-r--r-- | components/script/dom/bindings/trace.rs | 2 | ||||
-rw-r--r-- | components/script/dom/document.rs | 23 | ||||
-rw-r--r-- | components/script/dom/element.rs | 115 | ||||
-rw-r--r-- | components/script/dom/htmlbuttonelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmlelement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmlfieldsetelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmlinputelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmloptgroupelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmloptionelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmlselectelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmltextareaelement.rs | 3 | ||||
-rw-r--r-- | components/script/lib.rs | 2 | ||||
-rw-r--r-- | components/servo/Cargo.lock | 16 | ||||
-rw-r--r-- | components/util/mem.rs | 3 | ||||
-rw-r--r-- | ports/cef/Cargo.lock | 14 | ||||
-rw-r--r-- | ports/gonk/Cargo.lock | 14 | ||||
-rw-r--r-- | tests/unit/style/stylesheets.rs | 2 |
20 files changed, 114 insertions, 169 deletions
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index 5f9c732d87c..4ebe8363fbc 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -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(); } } diff --git a/components/layout/lib.rs b/components/layout/lib.rs index f12335d9c04..fa8e939839c 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -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; diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index c9a809dc07a..46a2caed506 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -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> { @@ -567,26 +563,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 { self.element.has_class_for_layout(name) diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index c78429f8368..f18719073fc 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -62,6 +62,7 @@ use profile_traits::time::ProfilerChan as TimeProfilerChan; use script_task::ScriptChan; use script_traits::{TimerEventChan, TimerEventId, TimerSource, UntrustedNodeAddress}; use selectors::parser::PseudoElement; +use selectors::states::*; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use std::boxed::FnBox; @@ -308,6 +309,7 @@ no_jsmanaged_fields!(TimeProfilerChan); no_jsmanaged_fields!(MemProfilerChan); no_jsmanaged_fields!(PseudoElement); no_jsmanaged_fields!(Length); +no_jsmanaged_fields!(ElementState); impl JSTraceable for Box<ScriptChan + Send> { #[inline] diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2ad0a12262f..0a94f9f5504 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -32,7 +32,7 @@ use dom::customevent::CustomEvent; use dom::documentfragment::DocumentFragment; use dom::documenttype::DocumentType; use dom::domimplementation::DOMImplementation; -use dom::element::{Element, ElementCreator, EventState}; +use dom::element::{Element, ElementCreator}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::{EventTarget}; use dom::htmlanchorelement::HTMLAnchorElement; @@ -85,6 +85,7 @@ use net_traits::{AsyncResponseTarget, PendingAsyncLoad}; use num::ToPrimitive; use script_task::{MainThreadScriptMsg, Runnable}; use script_traits::{MouseButton, UntrustedNodeAddress}; +use selectors::states::*; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::boxed::FnBox; @@ -174,8 +175,8 @@ pub struct Document { /// This field is set to the document itself for inert documents. /// https://html.spec.whatwg.org/multipage/#appropriate-template-contents-owner-document appropriate_template_contents_owner_document: MutNullableHeap<JS<Document>>, - // The collection of EventStates that have been changed since the last restyle. - event_state_changes: DOMRefCell<HashMap<JS<Element>, EventState>>, + // The collection of ElementStates that have been changed since the last restyle. + element_state_changes: DOMRefCell<HashMap<JS<Element>, ElementState>>, } impl PartialEq for Document { @@ -305,7 +306,7 @@ impl Document { pub fn needs_reflow(&self) -> bool { self.GetDocumentElement().is_some() && - (self.upcast::<Node>().get_has_dirty_descendants() || !self.event_state_changes.borrow().is_empty()) + (self.upcast::<Node>().get_has_dirty_descendants() || !self.element_state_changes.borrow().is_empty()) } /// Returns the first `base` element in the DOM that has an `href` attribute. @@ -1185,7 +1186,7 @@ pub enum DocumentSource { #[allow(unsafe_code)] pub trait LayoutDocumentHelpers { unsafe fn is_html_document_for_layout(&self) -> bool; - unsafe fn drain_event_state_changes(&self) -> Vec<(LayoutJS<Element>, EventState)>; + unsafe fn drain_element_state_changes(&self) -> Vec<(LayoutJS<Element>, ElementState)>; } #[allow(unsafe_code)] @@ -1197,8 +1198,8 @@ impl LayoutDocumentHelpers for LayoutJS<Document> { #[inline] #[allow(unrooted_must_root)] - unsafe fn drain_event_state_changes(&self) -> Vec<(LayoutJS<Element>, EventState)> { - let mut changes = (*self.unsafe_get()).event_state_changes.borrow_mut_for_layout(); + unsafe fn drain_element_state_changes(&self) -> Vec<(LayoutJS<Element>, ElementState)> { + let mut changes = (*self.unsafe_get()).element_state_changes.borrow_mut_for_layout(); let drain = changes.drain(); let layout_drain = drain.map(|(k, v)| (k.to_layout(), v)); Vec::from_iter(layout_drain) @@ -1268,7 +1269,7 @@ impl Document { reflow_timeout: Cell::new(None), base_element: Default::default(), appropriate_template_contents_owner_document: Default::default(), - event_state_changes: DOMRefCell::new(HashMap::new()), + element_state_changes: DOMRefCell::new(HashMap::new()), } } @@ -1334,12 +1335,12 @@ impl Document { self.idmap.borrow().get(&id).map(|ref elements| (*elements)[0].root()) } - pub fn record_event_state_change(&self, el: &Element, which: EventState) { - let mut map = self.event_state_changes.borrow_mut(); + pub fn record_element_state_change(&self, el: &Element, which: ElementState) { + let mut map = self.element_state_changes.borrow_mut(); let empty; { let states = map.entry(JS::from_ref(el)) - .or_insert(EventState::empty()); + .or_insert(ElementState::empty()); states.toggle(which); empty = states.is_empty(); } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 50f571452b6..46628935bb1 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -26,6 +26,7 @@ use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap}; use dom::bindings::js::{Root, RootedReference}; +use dom::bindings::trace::JSTraceable; use dom::bindings::utils::XMLName::InvalidXMLName; use dom::bindings::utils::{namespace_from_domstring, validate_and_extract, xml_name_type}; use dom::characterdata::CharacterData; @@ -63,8 +64,8 @@ use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode}; use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks}; use selectors::matching::{DeclarationBlock, matches}; -use selectors::parser::parse_author_origin_selector_list_from_str; -use selectors::parser::{AttrSelector, NamespaceConstraint}; +use selectors::parser::{AttrSelector, NamespaceConstraint, parse_author_origin_selector_list_from_str}; +use selectors::states::*; use smallvec::VecLike; use std::ascii::AsciiExt; use std::borrow::{Cow, ToOwned}; @@ -80,35 +81,12 @@ use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, parse_sty use style::values::CSSFloat; use style::values::specified::{self, CSSColor, CSSRGBA}; use url::UrlParser; +use util::mem::HeapSizeOf; use util::str::{DOMString, LengthOrPercentageOrAuto}; -bitflags! { - #[doc = "Element Event States."] - #[derive(JSTraceable, HeapSizeOf)] - flags EventState: u16 { - #[doc = "The mouse is down on this element. \ - (https://html.spec.whatwg.org/multipage/#selector-active). \ - FIXME(#7333): set/unset this when appropriate"] - const IN_ACTIVE_STATE = 0x01, - #[doc = "This element has focus. - https://html.spec.whatwg.org/multipage/scripting.html#selector-focus"] - const IN_FOCUS_STATE = 0x02, - #[doc = "The mouse is hovering over this element. \ - https://html.spec.whatwg.org/multipage/scripting.html#selector-hover"] - const IN_HOVER_STATE = 0x04, - #[doc = "Content is enabled (and can be disabled). \ - http://www.whatwg.org/html/#selector-enabled"] - const IN_ENABLED_STATE = 0x08, - #[doc = "Content is disabled. \ - http://www.whatwg.org/html/#selector-disabled"] - const IN_DISABLED_STATE = 0x10, - #[doc = "Content is checked. \ - https://html.spec.whatwg.org/multipage/scripting.html#selector-checked"] - const IN_CHECKED_STATE = 0x20, - #[doc = "https://html.spec.whatwg.org/multipage/scripting.html#selector-indeterminate"] - const IN_INDETERMINATE_STATE = 0x40, - } -} +// TODO: Update focus state when the top-level browsing context gains or loses system focus, +// and when the element enters or leaves a browsing context container. +// https://html.spec.whatwg.org/multipage/#selector-focus #[dom_struct] pub struct Element { @@ -121,7 +99,7 @@ pub struct Element { style_attribute: DOMRefCell<Option<PropertyDeclarationBlock>>, attr_list: MutNullableHeap<JS<NamedNodeMap>>, class_list: MutNullableHeap<JS<DOMTokenList>>, - event_state: Cell<EventState>, + state: Cell<ElementState>, } impl PartialEq for Element { @@ -150,11 +128,11 @@ impl Element { pub fn new_inherited(local_name: DOMString, namespace: Namespace, prefix: Option<DOMString>, document: &Document) -> Element { - Element::new_inherited_with_state(EventState::empty(), local_name, + Element::new_inherited_with_state(ElementState::empty(), local_name, namespace, prefix, document) } - pub fn new_inherited_with_state(state: EventState, local_name: DOMString, + pub fn new_inherited_with_state(state: ElementState, local_name: DOMString, namespace: Namespace, prefix: Option<DOMString>, document: &Document) -> Element { @@ -168,7 +146,7 @@ impl Element { style_attribute: DOMRefCell::new(None), attr_list: Default::default(), class_list: Default::default(), - event_state: Cell::new(state), + state: Cell::new(state), } } @@ -261,7 +239,7 @@ pub trait LayoutElementHelpers { fn get_checked_state_for_layout(&self) -> bool; fn get_indeterminate_state_for_layout(&self) -> bool; - fn get_event_state_for_layout(&self) -> EventState; + fn get_state_for_layout(&self) -> ElementState; } impl LayoutElementHelpers for LayoutJS<Element> { @@ -614,9 +592,9 @@ impl LayoutElementHelpers for LayoutJS<Element> { #[inline] #[allow(unsafe_code)] - fn get_event_state_for_layout(&self) -> EventState { + fn get_state_for_layout(&self) -> ElementState { unsafe { - (*self.unsafe_get()).event_state.get() + (*self.unsafe_get()).state.get() } } } @@ -1592,6 +1570,16 @@ impl VirtualMethods for Element { } } +macro_rules! state_getter { + ($( + $(#[$Flag_attr: meta])* + state $css: expr => $variant: ident / $method: ident / + $flag: ident = $value: expr, + )+) => { + $( fn $method(&self) -> bool { Element::get_state(self).contains($flag) } )+ + } +} + impl<'a> ::selectors::Element for Root<Element> { fn parent_element(&self) -> Option<Root<Element>> { self.upcast::<Node>().GetParentElement() @@ -1658,42 +1646,11 @@ impl<'a> ::selectors::Element for Root<Element> { self.namespace() } - fn get_hover_state(&self) -> bool { - Element::get_hover_state(self) - } - - fn get_active_state(&self) -> bool { - Element::get_active_state(self) - } - - fn get_focus_state(&self) -> bool { - // TODO: Also check whether the top-level browsing context has the system focus, - // and whether this element is a browsing context container. - // https://html.spec.whatwg.org/multipage/#selector-focus - Element::get_focus_state(self) - } + state_pseudo_classes!(state_getter); fn get_id(&self) -> Option<Atom> { self.id_attribute.borrow().clone() } - fn get_disabled_state(&self) -> bool { - Element::get_disabled_state(self) - } - fn get_enabled_state(&self) -> bool { - Element::get_enabled_state(self) - } - fn get_checked_state(&self) -> bool { - match self.downcast::<HTMLInputElement>() { - Some(input) => input.Checked(), - None => false, - } - } - fn get_indeterminate_state(&self) -> bool { - match self.downcast::<HTMLInputElement>() { - Some(input) => input.get_indeterminate_state(), - None => false, - } - } fn has_class(&self, name: &Atom) -> bool { Element::has_class(&**self, name) } @@ -1843,12 +1800,12 @@ impl Element { self.set_click_in_progress(false); } - pub fn get_state(&self) -> EventState { - self.event_state.get() + pub fn get_state(&self) -> ElementState { + self.state.get() } - pub fn set_state(&self, which: EventState, value: bool) { - let mut state = self.event_state.get(); + pub fn set_state(&self, which: ElementState, value: bool) { + let mut state = self.state.get(); if state.contains(which) == value { return } @@ -1856,14 +1813,14 @@ impl Element { true => state.insert(which), false => state.remove(which), }; - self.event_state.set(state); + self.state.set(state); let node = self.upcast::<Node>(); - node.owner_doc().record_event_state_change(self, which); + node.owner_doc().record_element_state_change(self, which); } pub fn get_active_state(&self) -> bool { - self.event_state.get().contains(IN_ACTIVE_STATE) + self.state.get().contains(IN_ACTIVE_STATE) } pub fn set_active_state(&self, value: bool) { @@ -1871,7 +1828,7 @@ impl Element { } pub fn get_focus_state(&self) -> bool { - self.event_state.get().contains(IN_FOCUS_STATE) + self.state.get().contains(IN_FOCUS_STATE) } pub fn set_focus_state(&self, value: bool) { @@ -1879,7 +1836,7 @@ impl Element { } pub fn get_hover_state(&self) -> bool { - self.event_state.get().contains(IN_HOVER_STATE) + self.state.get().contains(IN_HOVER_STATE) } pub fn set_hover_state(&self, value: bool) { @@ -1887,7 +1844,7 @@ impl Element { } pub fn get_enabled_state(&self) -> bool { - self.event_state.get().contains(IN_ENABLED_STATE) + self.state.get().contains(IN_ENABLED_STATE) } pub fn set_enabled_state(&self, value: bool) { @@ -1895,7 +1852,7 @@ impl Element { } pub fn get_disabled_state(&self) -> bool { - self.event_state.get().contains(IN_DISABLED_STATE) + self.state.get().contains(IN_DISABLED_STATE) } pub fn set_disabled_state(&self, value: bool) { diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 5146c7e4888..203f04c0009 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElemen use dom::bindings::conversions::Castable; use dom::bindings::js::Root; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE}; +use dom::element::{AttributeMutation, Element}; use dom::event::Event; use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; @@ -19,6 +19,7 @@ use dom::htmlformelement::{SubmittedFrom, HTMLFormElement}; use dom::node::{Node, document_from_node, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; +use selectors::states::*; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cell::Cell; diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index ba2bcdacc16..bb52cbc2402 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -17,7 +17,7 @@ use dom::bindings::utils::Reflectable; use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration}; use dom::document::Document; use dom::domstringmap::DOMStringMap; -use dom::element::{AttributeMutation, Element, EventState}; +use dom::element::{AttributeMutation, Element}; use dom::eventtarget::EventTarget; use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlframesetelement::HTMLFrameSetElement; @@ -27,6 +27,7 @@ use dom::node::{Node, SEQUENTIALLY_FOCUSABLE}; use dom::node::{document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::FocusType; +use selectors::states::*; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::default::Default; @@ -51,10 +52,10 @@ impl PartialEq for HTMLElement { impl HTMLElement { pub fn new_inherited(tag_name: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLElement { - HTMLElement::new_inherited_with_state(EventState::empty(), tag_name, prefix, document) + HTMLElement::new_inherited_with_state(ElementState::empty(), tag_name, prefix, document) } - pub fn new_inherited_with_state(state: EventState, tag_name: DOMString, + pub fn new_inherited_with_state(state: ElementState, tag_name: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLElement { HTMLElement { diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index 63c614d308f..98c6b86b5f7 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, Nod use dom::bindings::conversions::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE}; +use dom::element::{AttributeMutation, Element}; use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::HTMLElement; use dom::htmlformelement::{FormControl, HTMLFormElement}; @@ -17,6 +17,7 @@ use dom::htmllegendelement::HTMLLegendElement; use dom::node::{Node, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; +use selectors::states::*; use util::str::{DOMString, StaticStringVec}; #[dom_struct] diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index baaa2db012d..1adfc56b304 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -15,7 +15,7 @@ use dom::bindings::conversions::Castable; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, LayoutJS, Root, RootedReference}; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_CHECKED_STATE, IN_ENABLED_STATE, IN_INDETERMINATE_STATE, RawLayoutElementHelpers}; +use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; @@ -27,6 +27,7 @@ use dom::node::{Node, NodeDamage}; use dom::node::{document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; +use selectors::states::*; use std::borrow::ToOwned; use std::cell::Cell; use string_cache::Atom; diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index 4d9ec9b6ca9..cb97991b52b 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -8,11 +8,12 @@ use dom::bindings::codegen::Bindings::HTMLOptGroupElementBinding::HTMLOptGroupEl use dom::bindings::conversions::Castable; use dom::bindings::js::Root; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE}; +use dom::element::{AttributeMutation, Element}; use dom::htmlelement::HTMLElement; use dom::htmloptionelement::HTMLOptionElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; +use selectors::states::*; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 8c7dea8ac1e..b06406c4df5 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -11,13 +11,14 @@ use dom::bindings::conversions::Castable; use dom::bindings::js::Root; use dom::characterdata::CharacterData; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE}; +use dom::element::{AttributeMutation, Element}; use dom::htmlelement::HTMLElement; use dom::htmlscriptelement::HTMLScriptElement; use dom::htmlselectelement::HTMLSelectElement; use dom::node::Node; use dom::text::Text; use dom::virtualmethods::VirtualMethods; +use selectors::states::*; use std::cell::Cell; use util::str::{DOMString, split_html_space_chars, str_join}; diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index d20a6451543..c6e90e12c84 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -11,7 +11,7 @@ use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; use dom::bindings::conversions::Castable; use dom::bindings::js::Root; use dom::document::Document; -use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE}; +use dom::element::{AttributeMutation, Element}; use dom::htmlelement::HTMLElement; use dom::htmlfieldsetelement::HTMLFieldSetElement; use dom::htmlformelement::{FormControl, HTMLFormElement}; @@ -19,6 +19,7 @@ use dom::htmloptionelement::HTMLOptionElement; use dom::node::{Node, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; +use selectors::states::*; use std::borrow::ToOwned; use string_cache::Atom; use util::str::DOMString; diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 5bbde574e19..b057204245f 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -13,7 +13,7 @@ use dom::bindings::global::GlobalRef; use dom::bindings::js::{LayoutJS, Root}; use dom::bindings::refcounted::Trusted; use dom::document::Document; -use dom::element::{AttributeMutation, IN_ENABLED_STATE, Element}; +use dom::element::{AttributeMutation, Element}; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; @@ -26,6 +26,7 @@ use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; use script_task::ScriptTaskEventCategory::InputEvent; use script_task::{CommonScriptMsg, Runnable}; +use selectors::states::*; use std::borrow::ToOwned; use std::cell::Cell; use string_cache::Atom; diff --git a/components/script/lib.rs b/components/script/lib.rs index b442a3b2d31..e4481fb7d49 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -70,7 +70,7 @@ extern crate rand; extern crate rustc_serialize; extern crate rustc_unicode; extern crate script_traits; -extern crate selectors; +#[macro_use(state_pseudo_classes)] extern crate selectors; extern crate serde; extern crate smallvec; extern crate string_cache; diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 2edee037257..5c4478bfb36 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -1039,7 +1039,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script 0.0.1", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1548,7 +1548,7 @@ dependencies = [ "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1593,8 +1593,8 @@ dependencies = [ [[package]] name = "selectors" -version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#1e1e44c2f4090e8beb95a8d27f184aefcf91a362" +version = "0.2.0" +source = "git+https://github.com/servo/rust-selectors#d3bd9b7c665c838f703ef0bbc7fd67b89847550d" dependencies = [ "bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1751,7 +1751,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1769,7 +1769,7 @@ dependencies = [ "app_units 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", @@ -1789,7 +1789,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1934,7 +1934,7 @@ dependencies = [ "plugins 0.0.1", "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/util/mem.rs b/components/util/mem.rs index 1577ff39dc2..bcd8de3250d 100644 --- a/components/util/mem.rs +++ b/components/util/mem.rs @@ -27,6 +27,7 @@ use logical_geometry::WritingMode; use rand::OsRng; use range::Range; use selectors::parser::{Combinator, CompoundSelector, PseudoElement, Selector, SimpleSelector}; +use selectors::states::ElementState; use std::cell::{Cell, RefCell}; use std::collections::{HashMap, LinkedList, hash_state}; use std::hash::Hash; @@ -417,4 +418,4 @@ known_heap_size!(0, Au, WritingMode, CSSParserColor, Color, RGBA, Cursor, Matrix known_heap_size!(0, JSVal, PagePx, ViewportPx, DevicePixel, QuirksMode, OsRng, RawStatus); known_heap_size!(0, TokenSerializationType, LengthOrPercentageOrAuto); -known_heap_size!(0, PseudoElement, Combinator, str); +known_heap_size!(0, ElementState, Combinator, PseudoElement, str); diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 2b966346713..051695a4b02 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -989,7 +989,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script 0.0.1", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1480,7 +1480,7 @@ dependencies = [ "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1517,8 +1517,8 @@ dependencies = [ [[package]] name = "selectors" -version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#1e1e44c2f4090e8beb95a8d27f184aefcf91a362" +version = "0.2.0" +source = "git+https://github.com/servo/rust-selectors#d3bd9b7c665c838f703ef0bbc7fd67b89847550d" dependencies = [ "bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1708,7 +1708,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1730,7 +1730,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1875,7 +1875,7 @@ dependencies = [ "plugins 0.0.1", "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index e98e9e35c90..07d85f98b20 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -938,7 +938,7 @@ dependencies = [ "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script 0.0.1", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1429,7 +1429,7 @@ dependencies = [ "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "script_traits 0.0.1", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1466,8 +1466,8 @@ dependencies = [ [[package]] name = "selectors" -version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#1e1e44c2f4090e8beb95a8d27f184aefcf91a362" +version = "0.2.0" +source = "git+https://github.com/servo/rust-selectors#d3bd9b7c665c838f703ef0bbc7fd67b89847550d" dependencies = [ "bitflags 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1655,7 +1655,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1677,7 +1677,7 @@ dependencies = [ "num 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1822,7 +1822,7 @@ dependencies = [ "plugins 0.0.1", "rand 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", + "selectors 0.2.0 (git+https://github.com/servo/rust-selectors)", "serde 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_macros 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/tests/unit/style/stylesheets.rs b/tests/unit/style/stylesheets.rs index 8d133e8820e..6eb9cde4402 100644 --- a/tests/unit/style/stylesheets.rs +++ b/tests/unit/style/stylesheets.rs @@ -103,7 +103,7 @@ fn test_parse_stylesheet() { simple_selectors: vec![ SimpleSelector::Class(Atom::from_slice("ok")), ], - next: Some((Box::new(CompoundSelector { + next: Some((Arc::new(CompoundSelector { simple_selectors: vec![ SimpleSelector::ID(Atom::from_slice("d1")), ], |