22 * License, v. 2.0. If a copy of the MPL was not distributed with this
33 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44
5- use std:: borrow:: Cow :: Borrowed ;
5+ use std:: borrow:: Cow :: { self , Borrowed } ;
66use std:: fs:: File ;
77use std:: io:: { self , Write } ;
88use std:: path:: Path ;
99use std:: process:: Command ;
10- use std:: mem;
1110use rustc_serialize:: json:: { self , Json , ToJson } ;
1211use tempdir:: TempDir ;
1312
@@ -74,14 +73,8 @@ fn almost_equals(a: &Json, b: &Json) -> bool {
7473fn normalize ( json : & mut Json ) {
7574 match * json {
7675 Json :: Array ( ref mut list) => {
77- match find_url ( list) {
78- Some ( Ok ( url) ) => * list = vec ! [ "url" . to_json( ) , Json :: String ( url) ] ,
79- Some ( Err ( ( ) ) ) => * list = vec ! [ "error" . to_json( ) , "bad-url" . to_json( ) ] ,
80- None => {
81- for item in list. iter_mut ( ) {
82- normalize ( item)
83- }
84- }
76+ for item in list. iter_mut ( ) {
77+ normalize ( item)
8578 }
8679 }
8780 Json :: String ( ref mut s) => {
@@ -93,26 +86,6 @@ fn normalize(json: &mut Json) {
9386 }
9487}
9588
96- fn find_url ( list : & mut [ Json ] ) -> Option < Result < String , ( ) > > {
97- if list. len ( ) < 2 ||
98- list[ 0 ] . as_string ( ) != Some ( "function" ) ||
99- list[ 1 ] . as_string ( ) != Some ( "url" ) {
100- return None
101- }
102-
103- let mut args = list[ 2 ..] . iter_mut ( ) . filter ( |a| a. as_string ( ) != Some ( " " ) ) ;
104- if let ( Some ( & mut Json :: Array ( ref mut arg) ) , None ) = ( args. next ( ) , args. next ( ) ) {
105- if arg. len ( ) == 2 && arg[ 0 ] . as_string ( ) == Some ( "string" ) {
106- if let & mut Json :: String ( ref mut value) = & mut arg[ 1 ] {
107- return Some ( Ok ( mem:: replace ( value, String :: new ( ) ) ) )
108- }
109- }
110- }
111-
112- Some ( Err ( ( ) ) )
113- }
114-
115-
11689fn assert_json_eq ( results : json:: Json , mut expected : json:: Json , message : String ) {
11790 normalize ( & mut expected) ;
11891 if !almost_equals ( & results, & expected) {
@@ -281,6 +254,42 @@ fn outer_block_end_consumed() {
281254 assert_eq ! ( input. next( ) , Err ( ( ) ) ) ;
282255}
283256
257+ #[ test]
258+ fn unquoted_url_escaping ( ) {
259+ let token = Token :: UnquotedUrl ( "\
260+ \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \t \n \x0b \x0c \r \x0e \x0f \x10 \
261+ \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f \
262+ !\" #$%&\' ()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\ ]\
263+ ^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f é\
264+ ". into ( ) ) ;
265+ let serialized = token. to_css_string ( ) ;
266+ assert_eq ! ( serialized, "\
267+ url(\
268+ \\ 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \\ 7 \\ 8 \\ 9 \\ A \\ B \\ C \\ D \\ E \\ F \\ 10 \
269+ \\ 11 \\ 12 \\ 13 \\ 14 \\ 15 \\ 16 \\ 17 \\ 18 \\ 19 \\ 1A \\ 1B \\ 1C \\ 1D \\ 1E \\ 1F \\ 20 \
270+ !\\ \" #$%&\\ '\\ (\\ )*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\ \\ ]\
271+ ^_`abcdefghijklmnopqrstuvwxyz{|}~\\ 7F é\
272+ )\
273+ ") ;
274+ assert_eq ! ( Parser :: new( & serialized) . next( ) , Ok ( token) )
275+ }
276+
277+ #[ test]
278+ fn test_expect_url ( ) {
279+ fn parse ( s : & str ) -> Result < Cow < str > , ( ) > {
280+ Parser :: new ( s) . expect_url ( )
281+ }
282+ assert_eq ! ( parse( "url()" ) . unwrap( ) , "" ) ;
283+ assert_eq ! ( parse( "url( " ) . unwrap( ) , "" ) ;
284+ assert_eq ! ( parse( "url( abc" ) . unwrap( ) , "abc" ) ;
285+ assert_eq ! ( parse( "url( abc \t )" ) . unwrap( ) , "abc" ) ;
286+ assert_eq ! ( parse( "url( 'abc' \t )" ) . unwrap( ) , "abc" ) ;
287+ assert_eq ! ( parse( "url(abc more stuff)" ) , Err ( ( ) ) ) ;
288+ // The grammar at https://drafts.csswg.org/css-values/#urls plans for `<url-modifier>*`
289+ // at the position of "more stuff", but no such modifier is defined yet.
290+ assert_eq ! ( parse( "url('abc' more stuff)" ) , Err ( ( ) ) ) ;
291+ }
292+
284293
285294fn run_color_tests < F : Fn ( Result < Color , ( ) > ) -> Json > ( json_data : & str , to_json : F ) {
286295 run_json_tests ( json_data, |input| {
@@ -606,7 +615,7 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
606615 Token :: Hash ( value) => JArray ! [ "hash" , value, "unrestricted" ] ,
607616 Token :: IDHash ( value) => JArray ! [ "hash" , value, "id" ] ,
608617 Token :: QuotedString ( value) => JArray ! [ "string" , value] ,
609- Token :: Url ( value) => JArray ! [ "url" , value] ,
618+ Token :: UnquotedUrl ( value) => JArray ! [ "url" , value] ,
610619 Token :: Delim ( '\\' ) => "\\ " . to_json ( ) ,
611620 Token :: Delim ( value) => value. to_string ( ) . to_json ( ) ,
612621
0 commit comments