aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/wrapper.rs7
-rw-r--r--components/script/dom/element.rs19
-rw-r--r--components/script/dom/htmlinputelement.rs10
-rw-r--r--components/style/node.rs1
-rw-r--r--components/style/selector_matching.rs6
-rw-r--r--components/style/selectors.rs4
-rw-r--r--resources/servo.css4
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; }