aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2017-05-18 10:32:26 +0200
committerSimon Sapin <simon.sapin@exyr.org>2017-05-18 17:13:18 +0200
commit7149a6a29de6d1c351eedf1404369aa5f9efbd09 (patch)
tree5161224c61d7d107be3c072622bd6e8dbb282691
parent853b688d0b1e5caff55685ef0cb029b3ebe151ed (diff)
downloadservo-7149a6a29de6d1c351eedf1404369aa5f9efbd09.tar.gz
servo-7149a6a29de6d1c351eedf1404369aa5f9efbd09.zip
ol[type=…] and li[type=…] preshints need to be case-sensitive
-rw-r--r--components/script/dom/element.rs5
-rw-r--r--components/script/layout_wrapper.rs5
-rw-r--r--components/style/attr.rs9
-rw-r--r--components/style/servo/selector_parser.rs33
-rw-r--r--resources/presentational-hints.css14
-rw-r--r--tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported-xhtml.xhtml.ini3
-rw-r--r--tests/wpt/metadata/html/rendering/non-replaced-elements/lists/li-type-supported.html.ini3
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