diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2017-05-18 10:32:26 +0200 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2017-05-18 17:13:18 +0200 |
commit | 7149a6a29de6d1c351eedf1404369aa5f9efbd09 (patch) | |
tree | 5161224c61d7d107be3c072622bd6e8dbb282691 | |
parent | 853b688d0b1e5caff55685ef0cb029b3ebe151ed (diff) | |
download | servo-7149a6a29de6d1c351eedf1404369aa5f9efbd09.tar.gz servo-7149a6a29de6d1c351eedf1404369aa5f9efbd09.zip |
ol[type=…] and li[type=…] preshints need to be case-sensitive
7 files changed, 53 insertions, 19 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 6f423f47162..55175fd45c6 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -2451,6 +2451,11 @@ impl<'a> ::selectors::Element for Root<Element> { } }, + NonTSPseudoClass::ServoCaseSensitiveTypeAttr(ref expected_value) => { + self.get_attribute(&ns!(), &local_name!("type")) + .map_or(false, |attr| attr.value().eq(expected_value)) + } + // FIXME(#15746): This is wrong, we need to instead use extended filtering as per RFC4647 // https://tools.ietf.org/html/rfc4647#section-3.3.2 NonTSPseudoClass::Lang(ref lang) => extended_filtering(&*self.get_lang(), &*lang), diff --git a/components/script/layout_wrapper.rs b/components/script/layout_wrapper.rs index 0e9dffd28ab..62e5158f321 100644 --- a/components/script/layout_wrapper.rs +++ b/components/script/layout_wrapper.rs @@ -706,7 +706,10 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { _ => true, } }, - + NonTSPseudoClass::ServoCaseSensitiveTypeAttr(ref expected_value) => { + self.get_attr_enum(&ns!(), &local_name!("type")) + .map_or(false, |attr| attr == expected_value) + } NonTSPseudoClass::ReadOnly => !self.element.get_state_for_layout().contains(pseudo_class.state_flag()), diff --git a/components/style/attr.rs b/components/style/attr.rs index d1e97703e5e..535d9109151 100644 --- a/components/style/attr.rs +++ b/components/style/attr.rs @@ -379,6 +379,15 @@ impl ::std::ops::Deref for AttrValue { } } +impl PartialEq<Atom> for AttrValue { + fn eq(&self, other: &Atom) -> bool { + match *self { + AttrValue::Atom(ref value) => value == other, + _ => other == &**self, + } + } +} + /// https://html.spec.whatwg.org/multipage/#rules-for-parsing-non-zero-dimension-values pub fn parse_nonzero_length(value: &str) -> LengthOrPercentageOrAuto { match parse_length(value) { diff --git a/components/style/servo/selector_parser.rs b/components/style/servo/selector_parser.rs index c5eb67b6a5a..fdc14b11e29 100644 --- a/components/style/servo/selector_parser.rs +++ b/components/style/servo/selector_parser.rs @@ -175,6 +175,7 @@ pub enum NonTSPseudoClass { ReadWrite, ReadOnly, ServoNonZeroBorder, + ServoCaseSensitiveTypeAttr(Atom), Target, Visited, } @@ -182,10 +183,18 @@ pub enum NonTSPseudoClass { impl ToCss for NonTSPseudoClass { fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { use self::NonTSPseudoClass::*; - if let Lang(ref lang) = *self { - dest.write_str(":lang(")?; - serialize_identifier(lang, dest)?; - return dest.write_str(")"); + match *self { + Lang(ref lang) => { + dest.write_str(":lang(")?; + serialize_identifier(lang, dest)?; + return dest.write_str(")") + } + ServoCaseSensitiveTypeAttr(ref value) => { + dest.write_str(":-servo-case-sensitive-type-attr(")?; + serialize_identifier(value, dest)?; + return dest.write_str(")") + } + _ => {} } dest.write_str(match *self { @@ -198,7 +207,6 @@ impl ToCss for NonTSPseudoClass { Fullscreen => ":fullscreen", Hover => ":hover", Indeterminate => ":indeterminate", - Lang(_) => unreachable!(), Link => ":link", PlaceholderShown => ":placeholder-shown", ReadWrite => ":read-write", @@ -206,6 +214,8 @@ impl ToCss for NonTSPseudoClass { ServoNonZeroBorder => ":-servo-nonzero-border", Target => ":target", Visited => ":visited", + Lang(_) | + ServoCaseSensitiveTypeAttr(_) => unreachable!(), }) } } @@ -244,7 +254,8 @@ impl NonTSPseudoClass { Lang(_) | Link | Visited | - ServoNonZeroBorder => ElementState::empty(), + ServoNonZeroBorder | + ServoCaseSensitiveTypeAttr(_) => ElementState::empty(), } } @@ -313,7 +324,15 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> { -> Result<NonTSPseudoClass, ()> { use self::NonTSPseudoClass::*; let pseudo_class = match_ignore_ascii_case!{ &name, - "lang" => Lang(String::from(try!(parser.expect_ident_or_string())).into_boxed_str()), + "lang" => { + Lang(parser.expect_ident_or_string()?.into_owned().into_boxed_str()) + } + "-servo-case-sensitive-type-attr" => { + if !self.in_user_agent_stylesheet() { + return Err(()); + } + ServoCaseSensitiveTypeAttr(Atom::from(parser.expect_ident()?)) + } _ => return Err(()) }; diff --git a/resources/presentational-hints.css b/resources/presentational-hints.css index 84157dcb4bd..63f42491dd3 100644 --- a/resources/presentational-hints.css +++ b/resources/presentational-hints.css @@ -18,11 +18,15 @@ br[clear=right i] { clear: right; } br[clear=all i], br[clear=both i] { clear: both; } -ol[type=1], li[type=1] { list-style-type: decimal; } -ol[type=a], li[type=a] { list-style-type: lower-alpha; } -ol[type=A], li[type=A] { list-style-type: upper-alpha; } -ol[type=i], li[type=i] { list-style-type: lower-roman; } -ol[type=I], li[type=I] { list-style-type: upper-roman; } +ol[type="1"], li[type="1"] { list-style-type: decimal; } +ol:-servo-case-sensitive-type-attr(a), +li:-servo-case-sensitive-type-attr(a) { list-style-type: lower-alpha; } +ol:-servo-case-sensitive-type-attr(A), +li:-servo-case-sensitive-type-attr(A) { list-style-type: upper-alpha; } +ol:-servo-case-sensitive-type-attr(i), +li:-servo-case-sensitive-type-attr(i) { list-style-type: lower-roman; } +ol:-servo-case-sensitive-type-attr(I), +li:-servo-case-sensitive-type-attr(I) { list-style-type: upper-roman; } ul[type=none i], li[type=none i] { list-style-type: none; } ul[type=disc i], li[type=disc i] { list-style-type: disc; } ul[type=circle i], li[type=circle i] { list-style-type: circle; } diff --git a/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported-xhtml.xhtml.ini b/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported-xhtml.xhtml.ini deleted file mode 100644 index 3ac5a7343ca..00000000000 --- a/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported-xhtml.xhtml.ini +++ /dev/null @@ -1,3 +0,0 @@ -[li-type-supported-xhtml.xhtml] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported.html.ini b/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported.html.ini deleted file mode 100644 index 1f631a1d1b8..00000000000 --- a/tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[li-type-supported.html] - type: reftest - expected: FAIL |