diff options
-rw-r--r-- | components/layout/wrapper.rs | 7 | ||||
-rw-r--r-- | components/script/dom/element.rs | 19 | ||||
-rw-r--r-- | components/script/dom/htmlinputelement.rs | 10 | ||||
-rw-r--r-- | components/style/node.rs | 1 | ||||
-rw-r--r-- | components/style/selector_matching.rs | 6 | ||||
-rw-r--r-- | components/style/selectors.rs | 4 | ||||
-rw-r--r-- | resources/servo.css | 4 |
7 files changed, 47 insertions, 4 deletions
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 14c18bf1e17..9b1d923c763 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -553,6 +553,13 @@ impl<'le> TElement<'le> for LayoutElement<'le> { } #[inline] + fn get_checked_state(self) -> bool { + unsafe { + self.element.get_checked_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/element.rs b/components/script/dom/element.rs index 51a3d095007..5b5c7176430 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -13,6 +13,7 @@ use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; use dom::bindings::codegen::Bindings::ElementBinding; use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; +use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::codegen::InheritTypes::{ElementDerived, HTMLInputElementDerived, HTMLTableCellElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLInputElementCast, NodeCast, EventTargetCast, ElementCast}; @@ -198,6 +199,7 @@ pub trait RawLayoutElementHelpers { -> LengthOrPercentageOrAuto; unsafe fn get_integer_attribute_for_layout(&self, integer_attribute: IntegerAttribute) -> Option<i32>; + unsafe fn get_checked_state_for_layout(&self) -> bool; fn local_name<'a>(&'a self) -> &'a Atom; fn namespace<'a>(&'a self) -> &'a Namespace; fn style_attribute<'a>(&'a self) -> &'a DOMRefCell<Option<style::PropertyDeclarationBlock>>; @@ -313,6 +315,17 @@ impl RawLayoutElementHelpers for Element { } } + #[inline] + #[allow(unrooted_must_root)] + unsafe fn get_checked_state_for_layout(&self) -> bool { + // TODO option and menuitem can also have a checked state. + if !self.is_htmlinputelement() { + return false + } + let this: &HTMLInputElement = mem::transmute(self); + this.get_checked_state_for_layout() + } + // Getters used in components/layout/wrapper.rs fn local_name<'a>(&'a self) -> &'a Atom { @@ -1156,6 +1169,12 @@ impl<'a> style::TElement<'a> for JSRef<'a, Element> { let node: JSRef<Node> = NodeCast::from_ref(self); node.get_enabled_state() } + fn get_checked_state(self) -> bool { + match HTMLInputElementCast::to_ref(self) { + Some(input) => input.Checked(), + None => false, + } + } fn has_class(self, name: &Atom) -> bool { // FIXME(zwarich): Remove this when UFCS lands and there is a better way // of disambiguating methods. diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index a736a7a8f3d..1fee2c82627 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -125,6 +125,7 @@ pub trait LayoutHTMLInputElementHelpers { } pub trait RawLayoutHTMLInputElementHelpers { + unsafe fn get_checked_state_for_layout(&self) -> bool; unsafe fn get_size_for_layout(&self) -> u32; } @@ -163,6 +164,11 @@ impl LayoutHTMLInputElementHelpers for JS<HTMLInputElement> { impl RawLayoutHTMLInputElementHelpers for HTMLInputElement { #[allow(unrooted_must_root)] + unsafe fn get_checked_state_for_layout(&self) -> bool { + self.checked.get() + } + + #[allow(unrooted_must_root)] unsafe fn get_size_for_layout(&self) -> u32 { self.size.get() } @@ -181,7 +187,9 @@ impl<'a> HTMLInputElementMethods for JSRef<'a, HTMLInputElement> { } // https://html.spec.whatwg.org/multipage/forms.html#dom-input-checked - make_bool_setter!(SetChecked, "checked") + fn SetChecked(self, checked: bool) { + self.update_checked_state(checked); + } // https://html.spec.whatwg.org/multipage/forms.html#dom-input-readonly make_bool_getter!(ReadOnly) diff --git a/components/style/node.rs b/components/style/node.rs index cebac4bd6f8..5a765f2798d 100644 --- a/components/style/node.rs +++ b/components/style/node.rs @@ -45,6 +45,7 @@ pub trait TElement<'a> : Copy { fn get_id(self) -> Option<Atom>; fn get_disabled_state(self) -> bool; fn get_enabled_state(self) -> bool; + fn get_checked_state(self) -> bool; fn has_class(self, name: &Atom) -> bool; // Ordinarily I wouldn't use callbacks like this, but the alternative is diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index b1c41819303..51850e08a27 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -997,6 +997,12 @@ pub fn matches_simple_selector<'a,E,N>(selector: &SimpleSelector, let elem = element.as_element(); elem.get_enabled_state() }, + // https://html.spec.whatwg.org/multipage/scripting.html#selector-checked + Checked => { + *shareable = false; + let elem = element.as_element(); + elem.get_checked_state() + } FirstChild => { *shareable = false; matches_first_child(element) diff --git a/components/style/selectors.rs b/components/style/selectors.rs index 61ed5b7e0d2..da0e2b7b638 100644 --- a/components/style/selectors.rs +++ b/components/style/selectors.rs @@ -68,6 +68,7 @@ pub enum SimpleSelector { Hover, Disabled, Enabled, + Checked, FirstChild, LastChild, OnlyChild, // Empty, Root, @@ -226,7 +227,7 @@ fn compute_specificity(mut selector: &CompoundSelector, | &AttrExists(..) | &AttrEqual(..) | &AttrIncludes(..) | &AttrDashMatch(..) | &AttrPrefixMatch(..) | &AttrSubstringMatch(..) | &AttrSuffixMatch(..) | &AnyLink | &Link | &Visited | &Hover | &Disabled | &Enabled - | &FirstChild | &LastChild | &OnlyChild | &Root + | &FirstChild | &LastChild | &OnlyChild | &Root | &Checked // | &Empty | &Lang(*) | &NthChild(..) | &NthLastChild(..) | &NthOfType(..) | &NthLastOfType(..) @@ -497,6 +498,7 @@ fn parse_simple_pseudo_class(name: &str) -> Result<SimpleSelector, ()> { "hover" => Ok(Hover), "disabled" => Ok(Disabled), "enabled" => Ok(Enabled), + "checked" => Ok(Checked), "first-child" => Ok(FirstChild), "last-child" => Ok(LastChild), "only-child" => Ok(OnlyChild), diff --git a/resources/servo.css b/resources/servo.css index 37fe28f9847..5fb55e1734f 100644 --- a/resources/servo.css +++ b/resources/servo.css @@ -10,9 +10,9 @@ input[type="checkbox"], input[type="radio"] { font-family: monospace !important; border: none !important; background: transparent; } input[type="checkbox"]::before { content: "[ ]"; padding: 0; } -input[type="checkbox"][checked]::before { content: "[✓]"; } +input[type="checkbox"]:checked::before { content: "[✓]"; } input[type="radio"]::before { content: "( )"; padding: 0; } -input[type="radio"][checked]::before { content: "(●)"; } +input[type="radio"]:checked::before { content: "(●)"; } td[align="left"] { text-align: left; } td[align="center"] { text-align: center; } |