servo: Merge #18644 - stylo: Don't error out on trailing whitespace in attr() (from Manishearth:stylo-attr-ws); r=bz
authorManish Goregaokar <manishearth@gmail.com>
Tue, 26 Sep 2017 23:56:15 -0500
changeset 383228 4263e1c081c940b4eae7bcd388274ec8c5b5dd8b
parent 383173 5563e7da39b265ed1ba7796ec058bdbcf6f792f6
child 383229 b979663a7f4f4fe79f6e34cea1a1ddaa6a9fb674
push id95539
push userkwierso@gmail.com
push dateThu, 28 Sep 2017 00:01:12 +0000
treeherdermozilla-inbound@72de90e66155 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbz
bugs1403282
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
servo: Merge #18644 - stylo: Don't error out on trailing whitespace in attr() (from Manishearth:stylo-attr-ws); r=bz r=bz bug 1403282 Source-Repo: https://github.com/servo/servo Source-Revision: 97227aaca3613e22afc832554d29f7f7fdfb7220
servo/components/style/values/specified/mod.rs
--- a/servo/components/style/values/specified/mod.rs
+++ b/servo/components/style/values/specified/mod.rs
@@ -735,38 +735,42 @@ impl Attr {
     /// within a parse_nested_block()
     pub fn parse_function<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
                                   -> Result<Attr, ParseError<'i>> {
         // Syntax is `[namespace? `|`]? ident`
         // no spaces allowed
         let first = input.try(|i| i.expect_ident_cloned()).ok();
         if let Ok(token) = input.try(|i| i.next_including_whitespace().map(|t| t.clone())) {
             match token {
-                Token::Delim('|') => {}
+                Token::Delim('|') => {
+                    // must be followed by an ident
+                    let second_token = match *input.next_including_whitespace()? {
+                        Token::Ident(ref second) => second,
+                        ref t => return Err(BasicParseError::UnexpectedToken(t.clone()).into()),
+                    };
+
+                    let ns_with_id = if let Some(ns) = first {
+                        let ns = Namespace::from(ns.as_ref());
+                        let id: Result<_, ParseError> =
+                            get_id_for_namespace(&ns, context)
+                            .map_err(|()| StyleParseError::UnspecifiedError.into());
+                        Some((ns, id?))
+                    } else {
+                        None
+                    };
+                    return Ok(Attr {
+                        namespace: ns_with_id,
+                        attribute: second_token.as_ref().to_owned(),
+                    })
+                }
+                // In the case of attr(foobar    ) we don't want to error out
+                // because of the trailing whitespace
+                Token::WhiteSpace(_) => (),
                 ref t => return Err(BasicParseError::UnexpectedToken(t.clone()).into()),
             }
-            // must be followed by an ident
-            let second_token = match *input.next_including_whitespace()? {
-                Token::Ident(ref second) => second,
-                ref t => return Err(BasicParseError::UnexpectedToken(t.clone()).into()),
-            };
-
-            let ns_with_id = if let Some(ns) = first {
-                let ns = Namespace::from(ns.as_ref());
-                let id: Result<_, ParseError> =
-                    get_id_for_namespace(&ns, context)
-                    .map_err(|()| StyleParseError::UnspecifiedError.into());
-                Some((ns, id?))
-            } else {
-                None
-            };
-            return Ok(Attr {
-                namespace: ns_with_id,
-                attribute: second_token.as_ref().to_owned(),
-            })
         }
 
         if let Some(first) = first {
             Ok(Attr {
                 namespace: None,
                 attribute: first.as_ref().to_owned(),
             })
         } else {