servo: Merge #15735 - Update cssparser to 0.11 (from servo:cssparserup); r=emilio
authorSimon Sapin <simon.sapin@exyr.org>
Sun, 26 Feb 2017 02:19:32 -0800
changeset 373986 6fec46f1729153a0e230f4dac07ba776eebe6102
parent 373985 0a3f512c84511c9418982a6e1a1cfe17444bd174
child 373987 7c76324244b436372227db5099183d2c84cd32c2
push id10863
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 23:02:23 +0000
treeherdermozilla-aurora@0931190cd725 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersemilio
milestone54.0a1
servo: Merge #15735 - Update cssparser to 0.11 (from servo:cssparserup); r=emilio <!-- Please describe your changes on the following line: --> <s>Depends on https://github.com/servo/rust-cssparser/pull/122.</s> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 94e563e4d9292d7b19ce061e070cda358e822172
servo/Cargo.lock
servo/components/canvas/Cargo.toml
servo/components/canvas_traits/Cargo.toml
servo/components/layout/Cargo.toml
servo/components/msg/Cargo.toml
servo/components/script/Cargo.toml
servo/components/script/dom/csskeyframesrule.rs
servo/components/script/lib.rs
servo/components/script_layout_interface/Cargo.toml
servo/components/selectors/Cargo.toml
servo/components/selectors/lib.rs
servo/components/style/Cargo.toml
servo/components/style/build.rs
servo/components/style/gecko/media_queries.rs
servo/components/style/lib.rs
servo/components/style/properties/build.py
servo/components/style/properties/helpers/animated_properties.mako.rs
servo/components/style/properties/longhand/box.mako.rs
servo/components/style/properties/longhand/counters.mako.rs
servo/components/style/properties/longhand/effects.mako.rs
servo/components/style/properties/longhand/font.mako.rs
servo/components/style/properties/longhand/inherited_svg.mako.rs
servo/components/style/properties/longhand/text.mako.rs
servo/components/style/properties/properties.mako.rs
servo/components/style/servo/media_queries.rs
servo/components/style/str.rs
servo/components/style/supports.rs
servo/components/style/values/mod.rs
servo/components/style/values/specified/align.rs
servo/components/style/values/specified/basic_shape.rs
servo/components/style/values/specified/image.rs
servo/components/style/values/specified/length.rs
servo/components/style/values/specified/mod.rs
servo/components/style/values/specified/position.rs
servo/components/style_traits/Cargo.toml
servo/components/style_traits/cursor.rs
servo/components/style_traits/lib.rs
servo/components/style_traits/values.rs
servo/ports/geckolib/Cargo.toml
servo/tests/unit/style/Cargo.toml
servo/tests/unit/style/str.rs
servo/tests/unit/stylo/Cargo.toml
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -270,32 +270,32 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "canvas"
 version = "0.0.1"
 dependencies = [
  "azure 0.14.0 (git+https://github.com/servo/rust-azure)",
  "canvas_traits 0.0.1",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_config 0.0.1",
  "webrender_traits 0.18.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "canvas_traits"
 version = "0.0.1"
 dependencies = [
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_traits 0.18.0 (git+https://github.com/servo/webrender)",
 ]
@@ -511,24 +511,36 @@ source = "registry+https://github.com/ru
 dependencies = [
  "core-foundation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cssparser"
-version = "0.10.0"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
+ "cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "dbghelp-sys"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -900,17 +912,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "geckoservo"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1311,17 +1323,17 @@ source = "registry+https://github.com/ru
 [[package]]
 name = "layout"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "canvas_traits 0.0.1",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx 0.0.1",
  "gfx_traits 0.0.1",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1624,17 +1636,17 @@ dependencies = [
  "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "msg"
 version = "0.0.1"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_traits 0.18.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
@@ -2203,17 +2215,18 @@ dependencies = [
  "audio-video-metadata 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bluetooth_traits 0.0.1",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "canvas_traits 0.0.1",
  "caseless 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "cmake 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "deny_public_fields 0.0.1",
  "devtools_traits 0.0.1",
  "dom_struct 0.0.1",
  "domobject_derive 0.0.1",
  "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx_traits 0.0.1",
@@ -2273,17 +2286,17 @@ dependencies = [
 
 [[package]]
 name = "script_layout_interface"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "canvas_traits 0.0.1",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx_traits 0.0.1",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2342,17 +2355,18 @@ dependencies = [
  "webvr_traits 0.0.1",
 ]
 
 [[package]]
 name = "selectors"
 version = "0.18.0"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "semver"
 version = "0.1.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2711,17 +2725,18 @@ source = "registry+https://github.com/ru
 name = "style"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bindgen 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2730,17 +2745,16 @@ dependencies = [
  "nsstring_vendor 0.1.0",
  "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "pdqsort 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
- "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.18.0",
  "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_atoms 0.0.1",
  "servo_config 0.0.1",
  "servo_url 0.0.1",
@@ -2751,17 +2765,17 @@ dependencies = [
  "walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "style_tests"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.18.0",
@@ -2772,31 +2786,32 @@ dependencies = [
  "style_traits 0.0.1",
 ]
 
 [[package]]
 name = "style_traits"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "stylo_tests"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "geckoservo 0.0.1",
  "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3372,17 +3387,18 @@ dependencies = [
 "checksum color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a475fc4af42d83d28adf72968d9bcfaf035a1a9381642d8e85d8a04957767b0d"
 "checksum compiletest_rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f3f344389765ad7bec166f64c1b39ed6dd2b54d81c4c5dd8af789169351d380c"
 "checksum content-blocker 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "44dfb2f06e219a5bdec05c5811dde4d893c34c49ffed384c9d0a2e9caca9c154"
 "checksum cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0e3d6405328b6edb412158b3b7710e2634e23f3614b9bb1c412df7952489a626"
 "checksum core-foundation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f51ce3b8ebe311c56de14231eb57572c15abebd2d32b3bcb99bcdb9c101f5ac3"
 "checksum core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41115a6aa5d3e1e5ef98148373f25971d1fad53818553f216495f9e67e90a624"
 "checksum core-graphics 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ead017dcf77f503dc991f6b52de6084eeea60a94b0a652baa9bf88654a28e83f"
 "checksum core-text 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9719616a10f717628e074744f8c55df7b450f7a34d29c196d14f4498aad05d"
-"checksum cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "693cc9c8d3d0779ff60ff6b8b73497bda2c7151b6489c3a9c1f95f5d4f4497e5"
+"checksum cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d8352ccd22c5ebab558d179e32f6d3dd26eed30252f8420d636bfae5052eb50e"
+"checksum cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a85e1452f40a50777c8424fa7fcaa7dd7074c7bc5419014fbffe7ea3d750dee8"
 "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"
 "checksum dbus 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "94d266a872aaf68b50d02083c429a3686935ab6ab54824290509cdc422673eaf"
 "checksum debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3"
 "checksum deflate 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "24c5f3de3a8e183ab9a169654b652407e5e80bed40986bcca92c2b088b9bfa80"
 "checksum deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1614659040e711785ed8ea24219140654da1729f3ec8a47a9719d041112fe7bf"
 "checksum device 0.0.1 (git+https://github.com/servo/devices)" = "<none>"
 "checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"
 "checksum dwmapi-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07c4c7cc7b396419bc0a4d90371d0cee16cb5053b53647d287c0b728000c41fe"
--- a/servo/components/canvas/Cargo.toml
+++ b/servo/components/canvas/Cargo.toml
@@ -7,17 +7,17 @@ publish = false
 
 [lib]
 name = "canvas"
 path = "lib.rs"
 
 [dependencies]
 azure = {git = "https://github.com/servo/rust-azure"}
 canvas_traits = {path = "../canvas_traits"}
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
 euclid = "0.11"
 gleam = "0.2.8"
 ipc-channel = "0.7"
 log = "0.3.5"
 num-traits = "0.1.32"
 offscreen_gl_context = "0.6"
 servo_config = {path = "../config"}
 
--- a/servo/components/canvas_traits/Cargo.toml
+++ b/servo/components/canvas_traits/Cargo.toml
@@ -5,17 +5,17 @@ authors = ["The Servo Project Developers
 license = "MPL-2.0"
 publish = false
 
 [lib]
 name = "canvas_traits"
 path = "lib.rs"
 
 [dependencies]
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
 euclid = "0.11"
 heapsize = "0.3.0"
 heapsize_derive = "0.1"
 ipc-channel = "0.7"
 serde = {version = "0.9", features = ["unstable"]}
 serde_derive = "0.9"
 
 [dependencies.webrender_traits]
--- a/servo/components/layout/Cargo.toml
+++ b/servo/components/layout/Cargo.toml
@@ -9,17 +9,17 @@ publish = false
 name = "layout"
 path = "lib.rs"
 
 [dependencies]
 app_units = "0.4"
 atomic_refcell = "0.1"
 bitflags = "0.7"
 canvas_traits = {path = "../canvas_traits"}
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
 euclid = "0.11"
 fnv = "1.0"
 gfx = {path = "../gfx"}
 gfx_traits = {path = "../gfx_traits"}
 heapsize = "0.3.0"
 html5ever-atoms = "0.2"
 ipc-channel = "0.7"
 libc = "0.2"
--- a/servo/components/msg/Cargo.toml
+++ b/servo/components/msg/Cargo.toml
@@ -6,17 +6,17 @@ license = "MPL-2.0"
 publish = false
 
 [lib]
 name = "msg"
 path = "lib.rs"
 
 [dependencies]
 bitflags = "0.7"
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
 heapsize = "0.3.0"
 heapsize_derive = "0.1"
 serde = "0.9"
 serde_derive = "0.9"
 
 [dependencies.webrender_traits]
 git = "https://github.com/servo/webrender"
 default-features = false
--- a/servo/components/script/Cargo.toml
+++ b/servo/components/script/Cargo.toml
@@ -29,17 +29,18 @@ app_units = "0.4"
 audio-video-metadata = "0.1.2"
 atomic_refcell = "0.1"
 bitflags = "0.7"
 bluetooth_traits = {path = "../bluetooth_traits"}
 byteorder = "1.0"
 canvas_traits = {path = "../canvas_traits"}
 caseless = "0.1.0"
 cookie = "0.2.5"
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
+cssparser-macros = "0.1.0"
 deny_public_fields = {path = "../deny_public_fields"}
 devtools_traits = {path = "../devtools_traits"}
 dom_struct = {path = "../dom_struct"}
 domobject_derive = {path = "../domobject_derive"}
 encoding = "0.2"
 euclid = "0.11"
 fnv = "1.0"
 gfx_traits = {path = "../gfx_traits"}
--- a/servo/components/script/dom/csskeyframesrule.rs
+++ b/servo/components/script/dom/csskeyframesrule.rs
@@ -110,17 +110,17 @@ impl CSSKeyframesRuleMethods for CSSKeyf
         DOMString::from(&*self.keyframesrule.read().name)
     }
 
     // https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-name
     fn SetName(&self, value: DOMString) -> ErrorResult {
         // https://github.com/w3c/csswg-drafts/issues/801
         // Setting this property to a CSS-wide keyword or `none` will
         // throw a Syntax Error.
-        match_ignore_ascii_case! { value,
+        match_ignore_ascii_case! { &value,
             "initial" => return Err(Error::Syntax),
             "inherit" => return Err(Error::Syntax),
             "unset" => return Err(Error::Syntax),
             "none" => return Err(Error::Syntax),
             _ => ()
         }
         self.keyframesrule.write().name = Atom::from(value);
         Ok(())
--- a/servo/components/script/lib.rs
+++ b/servo/components/script/lib.rs
@@ -31,20 +31,19 @@ extern crate audio_video_metadata;
 #[macro_use]
 extern crate bitflags;
 extern crate bluetooth_traits;
 extern crate byteorder;
 extern crate canvas_traits;
 extern crate caseless;
 extern crate cookie as cookie_rs;
 extern crate core;
-#[macro_use]
-extern crate cssparser;
-#[macro_use]
-extern crate deny_public_fields;
+#[macro_use] extern crate cssparser;
+#[macro_use] extern crate cssparser_macros;
+#[macro_use] extern crate deny_public_fields;
 extern crate devtools_traits;
 extern crate dom_struct;
 #[macro_use]
 extern crate domobject_derive;
 extern crate encoding;
 extern crate euclid;
 extern crate fnv;
 extern crate gfx_traits;
--- a/servo/components/script_layout_interface/Cargo.toml
+++ b/servo/components/script_layout_interface/Cargo.toml
@@ -8,17 +8,17 @@ publish = false
 [lib]
 name = "script_layout_interface"
 path = "lib.rs"
 
 [dependencies]
 app_units = "0.4"
 atomic_refcell = "0.1"
 canvas_traits = {path = "../canvas_traits"}
-cssparser = {version = "0.10", features = ["heapsize", "serde"]}
+cssparser = {version = "0.11", features = ["heapsize", "serde"]}
 euclid = "0.11"
 gfx_traits = {path = "../gfx_traits"}
 heapsize = "0.3.0"
 heapsize_derive = "0.1"
 html5ever-atoms = "0.2"
 ipc-channel = "0.7"
 libc = "0.2"
 log = "0.3.5"
--- a/servo/components/selectors/Cargo.toml
+++ b/servo/components/selectors/Cargo.toml
@@ -13,10 +13,11 @@ license = "MPL-2.0"
 
 [lib]
 name = "selectors"
 path = "lib.rs"
 
 [dependencies]
 bitflags = "0.7"
 matches = "0.1"
-cssparser = "0.10"
+cssparser = "0.11"
+cssparser-macros = "0.1.0"
 fnv = "1.0"
--- a/servo/components/selectors/lib.rs
+++ b/servo/components/selectors/lib.rs
@@ -1,14 +1,15 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #[macro_use] extern crate bitflags;
 #[macro_use] extern crate cssparser;
+#[macro_use] extern crate cssparser_macros;
 #[macro_use] extern crate matches;
 extern crate fnv;
 
 pub mod bloom;
 pub mod matching;
 pub mod parser;
 mod tree;
 
--- a/servo/components/style/Cargo.toml
+++ b/servo/components/style/Cargo.toml
@@ -21,17 +21,18 @@ servo = ["serde/unstable", "serde", "ser
          "rayon/unstable", "servo_url/servo"]
 testing = []
 
 [dependencies]
 app_units = "0.4"
 atomic_refcell = "0.1"
 bitflags = "0.7"
 cfg-if = "0.1.0"
-cssparser = "0.10"
+cssparser = "0.11"
+cssparser-macros = "0.1.0"
 encoding = "0.2"
 euclid = "0.11"
 fnv = "1.0"
 heapsize = "0.3.0"
 heapsize_derive = {version = "0.1", optional = true}
 html5ever-atoms = {version = "0.2", optional = true}
 lazy_static = "0.2"
 log = "0.3.5"
@@ -57,11 +58,10 @@ time = "0.1"
 unicode-segmentation = "1.0"
 
 [target.'cfg(windows)'.dependencies]
 kernel32-sys = "0.2"
 
 [build-dependencies]
 lazy_static = "0.2"
 bindgen = { version = "0.22", optional = true }
-phf_codegen = "0.7.20"
 regex = {version = "0.2", optional = true}
 walkdir = "1.0"
--- a/servo/components/style/build.rs
+++ b/servo/components/style/build.rs
@@ -5,21 +5,18 @@
 #[cfg(feature = "gecko")]
 #[macro_use]
 extern crate lazy_static;
 #[cfg(feature = "bindgen")]
 extern crate bindgen;
 #[cfg(feature = "bindgen")]
 extern crate regex;
 extern crate walkdir;
-extern crate phf_codegen;
 
 use std::env;
-use std::fs::File;
-use std::io::{BufWriter, BufReader, BufRead, Write};
 use std::path::Path;
 use std::process::{Command, exit};
 use walkdir::WalkDir;
 
 #[cfg(feature = "gecko")]
 mod build_gecko;
 
 #[cfg(not(feature = "gecko"))]
@@ -73,32 +70,15 @@ fn generate_properties() {
         .arg(product)
         .arg("style-crate")
         .arg(if cfg!(feature = "testing") { "testing" } else { "regular" })
         .status()
         .unwrap();
     if !status.success() {
         exit(1)
     }
-
-    let path = Path::new(&env::var("OUT_DIR").unwrap()).join("static_ids.rs");
-    let static_ids = Path::new(&env::var("OUT_DIR").unwrap()).join("static_ids.txt");
-    let mut file = BufWriter::new(File::create(&path).unwrap());
-    let static_ids = BufReader::new(File::open(&static_ids).unwrap());
-
-    write!(&mut file, "static STATIC_IDS: ::phf::Map<&'static str, StaticId> = ").unwrap();
-    let mut map = phf_codegen::Map::new();
-    for result in static_ids.lines() {
-        let line = result.unwrap();
-        let mut split = line.split('\t');
-        let key = split.next().unwrap().to_owned();
-        let value = split.next().unwrap();
-        map.entry(key, value);
-    }
-    map.build(&mut file).unwrap();
-    write!(&mut file, ";\n").unwrap();
 }
 
 fn main() {
     println!("cargo:rerun-if-changed=build.rs");
     generate_properties();
     build_gecko::generate();
 }
--- a/servo/components/style/gecko/media_queries.rs
+++ b/servo/components/style/gecko/media_queries.rs
@@ -160,17 +160,17 @@ impl Resolution {
     fn parse(input: &mut Parser) -> Result<Self, ()> {
         let (value, unit) = match try!(input.next()) {
             Token::Dimension(value, unit) => {
                 (value.value, unit)
             },
             _ => return Err(()),
         };
 
-        Ok(match_ignore_ascii_case! { unit,
+        Ok(match_ignore_ascii_case! { &unit,
             "dpi" => Resolution::Dpi(value),
             "dppx" => Resolution::Dppx(value),
             "dpcm" => Resolution::Dpcm(value),
             _ => return Err(())
         })
     }
 }
 
--- a/servo/components/style/lib.rs
+++ b/servo/components/style/lib.rs
@@ -37,18 +37,18 @@
 
 #![recursion_limit = "500"]  // For define_css_keyword_enum! in -moz-appearance
 
 extern crate app_units;
 extern crate atomic_refcell;
 #[macro_use]
 extern crate bitflags;
 #[cfg(feature = "gecko")] #[macro_use] #[no_link] extern crate cfg_if;
-#[macro_use]
-extern crate cssparser;
+#[macro_use] extern crate cssparser;
+#[macro_use] extern crate cssparser_macros;
 extern crate encoding;
 extern crate euclid;
 extern crate fnv;
 #[cfg(feature = "gecko")] #[macro_use] pub mod gecko_string_cache;
 extern crate heapsize;
 #[cfg(feature = "servo")] #[macro_use] extern crate heapsize_derive;
 #[cfg(feature = "servo")] #[macro_use] extern crate html5ever_atoms;
 #[macro_use]
--- a/servo/components/style/properties/build.py
+++ b/servo/components/style/properties/build.py
@@ -28,17 +28,16 @@ def main():
     if product not in ["servo", "gecko"] or output not in ["style-crate", "geckolib", "html"]:
         abort(usage)
 
     properties = data.PropertiesData(product=product, testing=testing)
     template = os.path.join(BASE, "properties.mako.rs")
     rust = render(template, product=product, data=properties, __file__=template)
     if output == "style-crate":
         write(os.environ["OUT_DIR"], "properties.rs", rust)
-        write(os.environ["OUT_DIR"], "static_ids.txt", static_ids(properties))
         if product == "gecko":
             template = os.path.join(BASE, "gecko.mako.rs")
             rust = render(template, data=properties)
             write(os.environ["OUT_DIR"], "gecko_properties.rs", rust)
     elif output == "html":
         write_html(properties)
 
 
@@ -67,29 +66,16 @@ def render(filename, **context):
 
 
 def write(directory, filename, content):
     if not os.path.exists(directory):
         os.makedirs(directory)
     open(os.path.join(directory, filename), "wb").write(content)
 
 
-def static_id_generator(properties):
-    for kind, props in [("Longhand", properties.longhands),
-                        ("Shorthand", properties.shorthands)]:
-        for p in props:
-            yield "%s\tStaticId::%s(%sId::%s)" % (p.name, kind, kind, p.camel_case)
-            for alias in p.alias:
-                yield "%s\tStaticId::%s(%sId::%s)" % (alias, kind, kind, p.camel_case)
-
-
-def static_ids(properties):
-    return '\n'.join(static_id_generator(properties))
-
-
 def write_html(properties):
     properties = dict(
         (p.name, {
             "flag": p.experimental,
             "shorthand": hasattr(p, "sub_properties")
         })
         for p in properties.longhands + properties.shorthands
     )
--- a/servo/components/style/properties/helpers/animated_properties.mako.rs
+++ b/servo/components/style/properties/helpers/animated_properties.mako.rs
@@ -64,17 +64,17 @@ impl TransitionProperty {
             % if prop.animatable:
                 cb(TransitionProperty::${prop.camel_case});
             % endif
         % endfor
     }
 
     /// Parse a transition-property value.
     pub fn parse(input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "all" => Ok(TransitionProperty::All),
             % for prop in data.longhands:
                 % if prop.animatable:
                     "${prop.name}" => Ok(TransitionProperty::${prop.camel_case}),
                 % endif
             % endfor
             _ => Err(())
         }
--- a/servo/components/style/properties/longhand/box.mako.rs
+++ b/servo/components/style/properties/longhand/box.mako.rs
@@ -63,17 +63,17 @@
     #[inline]
     pub fn get_initial_value() -> computed_value::T {
         computed_value::T::${to_rust_ident(values[0])}
     }
 
     /// Parse a display value.
     pub fn parse(_context: &ParserContext, input: &mut Parser)
                  -> Result<SpecifiedValue, ()> {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             % for value in values:
                 "${value}" => {
                     Ok(computed_value::T::${to_rust_ident(value)})
                 },
             % endfor
             _ => Err(())
         }
     }
@@ -294,17 +294,17 @@
         }
     }
     /// baseline | sub | super | top | text-top | middle | bottom | text-bottom
     /// | <percentage> | <length>
     pub fn parse(context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue, ()> {
         input.try(|i| specified::LengthOrPercentage::parse(context, i))
         .map(SpecifiedValue::LengthOrPercentage)
         .or_else(|_| {
-            match_ignore_ascii_case! { try!(input.expect_ident()),
+            match_ignore_ascii_case! { &try!(input.expect_ident()),
                 % for keyword in vertical_align_keywords:
                     "${keyword}" => Ok(SpecifiedValue::${to_rust_ident(keyword)}),
                 % endfor
                 _ => Err(())
             }
         })
     }
 
@@ -583,17 +583,17 @@
         CubicBezier(Point2D<f32>, Point2D<f32>),
         Steps(u32, StartEnd),
         Keyword(FunctionKeyword),
     }
 
     impl Parse for SpecifiedValue {
         fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result<Self, ()> {
             if let Ok(function_name) = input.try(|input| input.expect_function()) {
-                return match_ignore_ascii_case! { function_name,
+                return match_ignore_ascii_case! { &function_name,
                     "cubic-bezier" => {
                         let (mut p1x, mut p1y, mut p2x, mut p2y) = (0.0, 0.0, 0.0, 0.0);
                         try!(input.parse_nested_block(|input| {
                             p1x = try!(specified::parse_number(input));
                             try!(input.expect_comma());
                             p1y = try!(specified::parse_number(input));
                             try!(input.expect_comma());
                             p2x = try!(specified::parse_number(input));
@@ -613,17 +613,17 @@
                         try!(input.parse_nested_block(|input| {
                             step_count = try!(specified::parse_integer(input));
                             if step_count < 1 {
                                 return Err(())
                             }
 
                             if input.try(|input| input.expect_comma()).is_ok() {
                                 start_end = try!(match_ignore_ascii_case! {
-                                    try!(input.expect_ident()),
+                                    &try!(input.expect_ident()),
                                     "start" => Ok(StartEnd::Start),
                                     "end" => Ok(StartEnd::End),
                                     _ => Err(())
                                 });
                             }
                             Ok(())
                         }));
                         Ok(SpecifiedValue::Steps(step_count as u32, start_end))
@@ -1314,17 +1314,17 @@
 
         let mut result = Vec::new();
         loop {
             let name = match input.expect_function() {
                 Ok(name) => name,
                 Err(_) => break,
             };
             match_ignore_ascii_case! {
-                name,
+                &name,
                 "matrix" => {
                     try!(input.parse_nested_block(|input| {
                         let values = try!(input.parse_comma_separated(|input| {
                             specified::parse_number(input)
                         }));
                         if values.len() != 6 {
                             return Err(())
                         }
--- a/servo/components/style/properties/longhand/counters.mako.rs
+++ b/servo/components/style/properties/longhand/counters.mako.rs
@@ -135,17 +135,17 @@
         }
         let mut content = vec![];
         loop {
             match input.next() {
                 Ok(Token::QuotedString(value)) => {
                     content.push(ContentItem::String(value.into_owned()))
                 }
                 Ok(Token::Function(name)) => {
-                    content.push(try!(match_ignore_ascii_case! { name,
+                    content.push(try!(match_ignore_ascii_case! { &name,
                         "counter" => input.parse_nested_block(|input| {
                             let name = try!(input.expect_ident()).into_owned();
                             let style = input.try(|input| {
                                 try!(input.expect_comma());
                                 list_style_type::parse(context, input)
                             }).unwrap_or(list_style_type::computed_value::T::decimal);
                             Ok(ContentItem::Counter(name, style))
                         }),
@@ -158,17 +158,17 @@
                                 list_style_type::parse(context, input)
                             }).unwrap_or(list_style_type::computed_value::T::decimal);
                             Ok(ContentItem::Counters(name, separator, style))
                         }),
                         _ => return Err(())
                     }));
                 }
                 Ok(Token::Ident(ident)) => {
-                    match_ignore_ascii_case! { ident,
+                    match_ignore_ascii_case! { &ident,
                         "open-quote" => content.push(ContentItem::OpenQuote),
                         "close-quote" => content.push(ContentItem::CloseQuote),
                         "no-open-quote" => content.push(ContentItem::NoOpenQuote),
                         "no-close-quote" => content.push(ContentItem::NoCloseQuote),
 
                         % if product == "gecko":
                             "-moz-alt-content" => content.push(ContentItem::MozAltContent),
                         % endif
--- a/servo/components/style/properties/longhand/effects.mako.rs
+++ b/servo/components/style/properties/longhand/effects.mako.rs
@@ -334,17 +334,17 @@
         loop {
             % if product == "gecko":
                 if let Ok(url) = input.try(|i| SpecifiedUrl::parse(context, i)) {
                     filters.push(SpecifiedFilter::Url(url));
                 } else
             % endif
             if let Ok(function_name) = input.try(|input| input.expect_function()) {
                 filters.push(try!(input.parse_nested_block(|input| {
-                    match_ignore_ascii_case! { function_name,
+                    match_ignore_ascii_case! { &function_name,
                         "blur" => specified::Length::parse_non_negative(input).map(SpecifiedFilter::Blur),
                         "brightness" => parse_factor(input).map(SpecifiedFilter::Brightness),
                         "contrast" => parse_factor(input).map(SpecifiedFilter::Contrast),
                         "grayscale" => parse_factor(input).map(SpecifiedFilter::Grayscale),
                         "hue-rotate" => Angle::parse(context, input).map(SpecifiedFilter::HueRotate),
                         "invert" => parse_factor(input).map(SpecifiedFilter::Invert),
                         "opacity" => parse_factor(input).map(SpecifiedFilter::Opacity),
                         "saturate" => parse_factor(input).map(SpecifiedFilter::Saturate),
@@ -440,17 +440,17 @@ pub struct OriginParseResult {
 
 pub fn parse_origin(context: &ParserContext, input: &mut Parser) -> Result<OriginParseResult,()> {
     use values::specified::{LengthOrPercentage, Percentage};
     let (mut horizontal, mut vertical, mut depth) = (None, None, None);
     loop {
         if let Err(_) = input.try(|input| {
             let token = try!(input.expect_ident());
             match_ignore_ascii_case! {
-                token,
+                &token,
                 "left" => {
                     if horizontal.is_none() {
                         horizontal = Some(LengthOrPercentage::Percentage(Percentage(0.0)))
                     } else {
                         return Err(())
                     }
                 },
                 "center" => {
--- a/servo/components/style/properties/longhand/font.mako.rs
+++ b/servo/components/style/properties/longhand/font.mako.rs
@@ -58,17 +58,17 @@
                     atom!("sans-serif") |
                     atom!("cursive") |
                     atom!("fantasy") |
                     atom!("monospace") => {
                         return FontFamily::Generic(input)
                     }
                     _ => {}
                 }
-                match_ignore_ascii_case! { input,
+                match_ignore_ascii_case! { &input,
                     "serif" => return FontFamily::Generic(atom!("serif")),
                     "sans-serif" => return FontFamily::Generic(atom!("sans-serif")),
                     "cursive" => return FontFamily::Generic(atom!("cursive")),
                     "fantasy" => return FontFamily::Generic(atom!("fantasy")),
                     "monospace" => return FontFamily::Generic(atom!("monospace")),
                     _ => {}
                 }
                 FontFamily::FamilyName(FamilyName(input))
@@ -80,17 +80,17 @@
                     return Ok(FontFamily::FamilyName(FamilyName(Atom::from(&*value))))
                 }
                 let first_ident = try!(input.expect_ident());
 
                 // FIXME(bholley): The fast thing to do here would be to look up the
                 // string (as lowercase) in the static atoms table. We don't have an
                 // API to do that yet though, so we do the simple thing for now.
                 let mut css_wide_keyword = false;
-                match_ignore_ascii_case! { first_ident,
+                match_ignore_ascii_case! { &first_ident,
                     "serif" => return Ok(FontFamily::Generic(atom!("serif"))),
                     "sans-serif" => return Ok(FontFamily::Generic(atom!("sans-serif"))),
                     "cursive" => return Ok(FontFamily::Generic(atom!("cursive"))),
                     "fantasy" => return Ok(FontFamily::Generic(atom!("fantasy"))),
                     "monospace" => return Ok(FontFamily::Generic(atom!("monospace"))),
 
                     // https://drafts.csswg.org/css-fonts/#propdef-font-family
                     // "Font family names that happen to be the same as a keyword value
@@ -249,17 +249,17 @@
                     SpecifiedValue::Weight${weight} => dest.write_str("${weight}"),
                 % endfor
             }
         }
     }
     /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
     pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue, ()> {
         input.try(|input| {
-            match_ignore_ascii_case! { try!(input.expect_ident()),
+            match_ignore_ascii_case! { &try!(input.expect_ident()),
                 "normal" => Ok(SpecifiedValue::Normal),
                 "bold" => Ok(SpecifiedValue::Bold),
                 "bolder" => Ok(SpecifiedValue::Bolder),
                 "lighter" => Ok(SpecifiedValue::Lighter),
                 _ => Err(())
             }
         }).or_else(|()| {
             match try!(input.expect_integer()) {
@@ -552,17 +552,17 @@
 
     #[inline]
     pub fn get_initial_value() -> computed_value::T {
         SpecifiedValue { weight: true, style: true }
     }
 
     pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue, ()> {
         let mut result = SpecifiedValue { weight: false, style: false };
-        match_ignore_ascii_case! {try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "none" => Ok(result),
             "weight" => {
                 result.weight = true;
                 if input.try(|input| input.expect_ident_matching("style")).is_ok() {
                     result.style = true;
                 }
                 Ok(result)
             },
--- a/servo/components/style/properties/longhand/inherited_svg.mako.rs
+++ b/servo/components/style/properties/longhand/inherited_svg.mako.rs
@@ -17,22 +17,22 @@
 ${helpers.single_keyword("text-anchor",
                          "start middle end",
                          products="gecko",
                          animatable=False,
                          spec="https://www.w3.org/TR/SVG/text.html#TextAnchorProperty")}
 
 // Section 11 - Painting: Filling, Stroking and Marker Symbols
 ${helpers.single_keyword("color-interpolation",
-                         "auto sRGB linearRGB",
+                         "auto srgb linearrgb",
                          products="gecko",
                          animatable=False,
                          spec="https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationProperty")}
 
-${helpers.single_keyword("color-interpolation-filters", "auto sRGB linearRGB",
+${helpers.single_keyword("color-interpolation-filters", "auto srgb linearrgb",
                          products="gecko",
                          gecko_constant_prefix="NS_STYLE_COLOR_INTERPOLATION",
                          animatable=False,
                          spec="https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationFiltersProperty")}
 
 ${helpers.predefined_type(
     "fill", "SVGPaint",
     "::values::computed::SVGPaint::black()",
@@ -47,17 +47,17 @@
 
 ${helpers.single_keyword("fill-rule", "nonzero evenodd",
                          gecko_enum_prefix="StyleFillRule",
                          gecko_inexhaustive=True,
                          products="gecko", animatable=False,
                          spec="https://www.w3.org/TR/SVG11/painting.html#FillRuleProperty")}
 
 ${helpers.single_keyword("shape-rendering",
-                         "auto optimizeSpeed crispEdges geometricPrecision",
+                         "auto optimizespeed crispedges geometricprecision",
                          products="gecko",
                          animatable=False,
                          spec="https://www.w3.org/TR/SVG11/painting.html#ShapeRenderingProperty")}
 
 ${helpers.predefined_type(
     "stroke", "SVGPaint",
     "Default::default()",
     products="gecko",
@@ -191,17 +191,17 @@
             // bitfield representing what we've seen so far
             // bit 1 is fill, bit 2 is stroke, bit 3 is markers
             let mut seen = 0;
             let mut pos = 0;
 
             loop {
 
                 let result = input.try(|i| {
-                    match_ignore_ascii_case! { i.expect_ident()?,
+                    match_ignore_ascii_case! { &i.expect_ident()?,
                         "fill" => Ok(FILL),
                         "stroke" => Ok(STROKE),
                         "markers" => Ok(MARKERS),
                         _ => Err(())
                     }
                 });
 
                 match result {
--- a/servo/components/style/properties/longhand/text.mako.rs
+++ b/servo/components/style/properties/longhand/text.mako.rs
@@ -55,17 +55,17 @@
         Ok(SpecifiedValue {
             first: first,
             second: second,
         })
     }
     impl Parse for Side {
         fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Side, ()> {
             if let Ok(ident) = input.try(|input| input.expect_ident()) {
-                match_ignore_ascii_case! { ident,
+                match_ignore_ascii_case! { &ident,
                     "clip" => Ok(Side::Clip),
                     "ellipsis" => Ok(Side::Ellipsis),
                     _ => Err(())
                 }
             } else {
                 Ok(Side::String(try!(input.expect_string()).into_owned().into_boxed_str()))
             }
         }
@@ -174,17 +174,17 @@
         let mut result = SpecifiedValue::empty();
         if input.try(|input| input.expect_ident_matching("none")).is_ok() {
             return Ok(result)
         }
         let mut empty = true;
 
         while input.try(|input| {
                 if let Ok(ident) = input.expect_ident() {
-                    match_ignore_ascii_case! { ident,
+                    match_ignore_ascii_case! { &ident,
                         "underline" => if result.contains(UNDERLINE) { return Err(()) }
                                        else { empty = false; result.insert(UNDERLINE) },
                         "overline" => if result.contains(OVERLINE) { return Err(()) }
                                       else { empty = false; result.insert(OVERLINE) },
                         "line-through" => if result.contains(LINE_THROUGH) { return Err(()) }
                                           else { empty = false; result.insert(LINE_THROUGH) },
                         "blink" => if result.contains(BLINK) { return Err(()) }
                                    else { empty = false; result.insert(BLINK) },
--- a/servo/components/style/properties/properties.mako.rs
+++ b/servo/components/style/properties/properties.mako.rs
@@ -450,17 +450,17 @@ pub enum CSSWideKeyword {
     /// The `unset` keyword.
     UnsetKeyword,
 }
 
 impl Parse for CSSWideKeyword {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         let ident = input.expect_ident()?;
         input.expect_exhausted()?;
-        match_ignore_ascii_case! { ident,
+        match_ignore_ascii_case! { &ident,
             "initial" => Ok(CSSWideKeyword::InitialKeyword),
             "inherit" => Ok(CSSWideKeyword::InheritKeyword),
             "unset" => Ok(CSSWideKeyword::UnsetKeyword),
             _ => Err(())
         }
     }
 }
 
@@ -726,34 +726,43 @@ impl ToCss for PropertyId {
         match *self {
             PropertyId::Longhand(id) => dest.write_str(id.name()),
             PropertyId::Shorthand(id) => dest.write_str(id.name()),
             PropertyId::Custom(ref name) => write!(dest, "--{}", name),
         }
     }
 }
 
-// FIXME(https://github.com/rust-lang/rust/issues/33156): remove this enum and use PropertyId
-// when stable Rust allows destructors in statics.
-enum StaticId {
-    Longhand(LonghandId),
-    Shorthand(ShorthandId),
-}
-include!(concat!(env!("OUT_DIR"), "/static_ids.rs"));
 impl PropertyId {
     /// Returns a given property from the string `s`.
     ///
     /// Returns Err(()) for unknown non-custom properties
-    pub fn parse(s: Cow<str>) -> Result<Self, ()> {
-        if let Ok(name) = ::custom_properties::parse_name(&s) {
+    pub fn parse(property_name: Cow<str>) -> Result<Self, ()> {
+        if let Ok(name) = ::custom_properties::parse_name(&property_name) {
             return Ok(PropertyId::Custom(::custom_properties::Name::from(name)))
         }
 
-        let lower_case = ::str::cow_into_ascii_lowercase(s);
-        match STATIC_IDS.get(&*lower_case) {
+        // FIXME(https://github.com/rust-lang/rust/issues/33156): remove this enum and use PropertyId
+        // when stable Rust allows destructors in statics.
+        enum StaticId {
+            Longhand(LonghandId),
+            Shorthand(ShorthandId),
+        }
+        ascii_case_insensitive_phf_map! {
+            StaticIds: Map<StaticId> = {
+                % for (kind, properties) in [("Longhand", data.longhands), ("Shorthand", data.shorthands)]:
+                    % for property in properties:
+                        % for name in [property.name] + property.alias:
+                            "${name}" => "StaticId::${kind}(${kind}Id::${property.camel_case})",
+                        % endfor
+                    % endfor
+                % endfor
+            }
+        }
+        match StaticIds::get(&property_name) {
             Some(&StaticId::Longhand(id)) => Ok(PropertyId::Longhand(id)),
             Some(&StaticId::Shorthand(id)) => Ok(PropertyId::Shorthand(id)),
             None => Err(()),
         }
     }
 
     /// Returns a property id from Gecko's nsCSSPropertyID.
     #[cfg(feature = "gecko")]
--- a/servo/components/style/servo/media_queries.rs
+++ b/servo/components/style/servo/media_queries.rs
@@ -101,17 +101,17 @@ impl Expression {
     ///
     /// Only supports width and width ranges for now.
     pub fn parse(input: &mut Parser) -> Result<Self, ()> {
         try!(input.expect_parenthesis_block());
         input.parse_nested_block(|input| {
             let name = try!(input.expect_ident());
             try!(input.expect_colon());
             // TODO: Handle other media features
-            Ok(Expression(match_ignore_ascii_case! { name,
+            Ok(Expression(match_ignore_ascii_case! { &name,
                 "min-width" => {
                     ExpressionKind::Width(Range::Min(try!(specified::Length::parse_non_negative(input))))
                 },
                 "max-width" => {
                     ExpressionKind::Width(Range::Max(try!(specified::Length::parse_non_negative(input))))
                 },
                 "width" => {
                     ExpressionKind::Width(Range::Eq(try!(specified::Length::parse_non_negative(input))))
--- a/servo/components/style/str.rs
+++ b/servo/components/style/str.rs
@@ -2,18 +2,16 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 //! String utils for attributes and similar stuff.
 
 #![deny(missing_docs)]
 
 use num_traits::ToPrimitive;
-use std::ascii::AsciiExt;
-use std::borrow::Cow;
 use std::convert::AsRef;
 use std::iter::{Filter, Peekable};
 use std::str::Split;
 
 /// A static slice of characters.
 pub type StaticCharVec = &'static [char];
 
 /// A static slice of `str`s.
@@ -141,17 +139,8 @@ pub fn str_join<I, T>(strs: I, join: &st
           T: AsRef<str>,
 {
     strs.into_iter().enumerate().fold(String::new(), |mut acc, (i, s)| {
         if i > 0 { acc.push_str(join); }
         acc.push_str(s.as_ref());
         acc
     })
 }
-
-/// Like AsciiExt::to_ascii_lowercase, but avoids allocating when the input is already lower-case.
-pub fn cow_into_ascii_lowercase<'a, S: Into<Cow<'a, str>>>(s: S) -> Cow<'a, str> {
-    let mut cow = s.into();
-    if let Some(first_uppercase) = cow.bytes().position(|byte| byte >= b'A' && byte <= b'Z') {
-        cow.to_mut()[first_uppercase..].make_ascii_lowercase();
-    }
-    cow
-}
--- a/servo/components/style/supports.rs
+++ b/servo/components/style/supports.rs
@@ -42,17 +42,17 @@ impl SupportsCondition {
         let in_parens = SupportsCondition::parse_in_parens(input)?;
 
         let (keyword, wrapper) = match input.next() {
             Err(()) => {
                 // End of input
                 return Ok(in_parens)
             }
             Ok(Token::Ident(ident)) => {
-                match_ignore_ascii_case! { ident,
+                match_ignore_ascii_case! { &ident,
                     "and" => ("and", SupportsCondition::And as fn(_) -> _),
                     "or" => ("or", SupportsCondition::Or as fn(_) -> _),
                     _ => return Err(())
                 }
             }
             _ => return Err(())
         };
 
--- a/servo/components/style/values/mod.rs
+++ b/servo/components/style/values/mod.rs
@@ -23,17 +23,17 @@ macro_rules! define_numbered_css_keyword
         #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))]
         pub enum $name {
             $( $variant = $value ),+
         }
 
         impl Parse for $name {
             #[allow(missing_docs)]
             fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result<$name, ()> {
-                match_ignore_ascii_case! { try!(input.expect_ident()),
+                match_ignore_ascii_case! { &try!(input.expect_ident()),
                     $( $css => Ok($name::$variant), )+
                     _ => Err(())
                 }
             }
         }
 
         impl ToCss for $name {
             fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result
--- a/servo/components/style/values/specified/align.rs
+++ b/servo/components/style/values/specified/align.rs
@@ -318,50 +318,50 @@ impl Parse for JustifyItems {
         }
         Err(())
     }
 }
 
 // auto | normal | stretch | <baseline-position>
 fn parse_auto_normal_stretch_baseline(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "auto" => Ok(ALIGN_AUTO),
         "normal" => Ok(ALIGN_NORMAL),
         "stretch" => Ok(ALIGN_STRETCH),
         "baseline" => Ok(ALIGN_BASELINE),
         _ => Err(())
     }
 }
 
 // normal | stretch | <baseline-position>
 fn parse_normal_stretch_baseline(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "normal" => Ok(ALIGN_NORMAL),
         "stretch" => Ok(ALIGN_STRETCH),
         "baseline" => Ok(ALIGN_BASELINE),
         _ => Err(())
     }
 }
 
 // normal | <baseline-position>
 fn parse_normal_or_baseline(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "normal" => Ok(ALIGN_NORMAL),
         "baseline" => Ok(ALIGN_BASELINE),
         _ => Err(())
     }
 }
 
 // <content-distribution>
 fn parse_content_distribution(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
       "stretch" => Ok(ALIGN_STRETCH),
       "space_between" => Ok(ALIGN_SPACE_BETWEEN),
       "space_around" => Ok(ALIGN_SPACE_AROUND),
       "space_evenly" => Ok(ALIGN_SPACE_EVENLY),
       _ => Err(())
     }
 }
 
@@ -381,32 +381,32 @@ fn parse_overflow_content_position(input
         }
     }
     return Err(())
 }
 
 // <content-position>
 fn parse_content_position(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "start" => Ok(ALIGN_START),
         "end" => Ok(ALIGN_END),
         "flex-start" => Ok(ALIGN_FLEX_START),
         "flex-end" => Ok(ALIGN_FLEX_END),
         "center" => Ok(ALIGN_CENTER),
         "left" => Ok(ALIGN_LEFT),
         "right" => Ok(ALIGN_RIGHT),
         _ => Err(())
     }
 }
 
 // <overflow-position>
 fn parse_overflow_position(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "safe" => Ok(ALIGN_SAFE),
         "unsafe" => Ok(ALIGN_UNSAFE),
         _ => Err(())
     }
 }
 
 // [ <overflow-position>? && <self-position> ]
 fn parse_overflow_self_position(input: &mut Parser) -> Result<AlignFlags, ()> {
@@ -424,17 +424,17 @@ fn parse_overflow_self_position(input: &
         }
     }
     return Err(())
 }
 
 // <self-position>
 fn parse_self_position(input: &mut Parser) -> Result<AlignFlags, ()> {
     let ident = input.expect_ident()?;
-    match_ignore_ascii_case! { ident,
+    match_ignore_ascii_case! { &ident,
         "start" => Ok(ALIGN_START),
         "end" => Ok(ALIGN_END),
         "flex-start" => Ok(ALIGN_FLEX_START),
         "flex-end" => Ok(ALIGN_FLEX_END),
         "center" => Ok(ALIGN_CENTER),
         "left" => Ok(ALIGN_LEFT),
         "right" => Ok(ALIGN_RIGHT),
         "self-start" => Ok(ALIGN_SELF_START),
@@ -443,24 +443,24 @@ fn parse_self_position(input: &mut Parse
     }
 }
 
 // [ legacy && [ left | right | center ] ]
 fn parse_legacy(input: &mut Parser) -> Result<AlignFlags, ()> {
     let a = input.expect_ident()?;
     let b = input.expect_ident()?;
     if a.eq_ignore_ascii_case("legacy") {
-        match_ignore_ascii_case! { b,
+        match_ignore_ascii_case! { &b,
             "left" => Ok(ALIGN_LEGACY | ALIGN_LEFT),
             "right" => Ok(ALIGN_LEGACY | ALIGN_RIGHT),
             "center" => Ok(ALIGN_LEGACY | ALIGN_CENTER),
             _ => Err(())
         }
     } else if b.eq_ignore_ascii_case("legacy") {
-        match_ignore_ascii_case! { a,
+        match_ignore_ascii_case! { &a,
             "left" => Ok(ALIGN_LEGACY | ALIGN_LEFT),
             "right" => Ok(ALIGN_LEGACY | ALIGN_RIGHT),
             "center" => Ok(ALIGN_LEGACY | ALIGN_CENTER),
             _ => Err(())
         }
     } else {
         Err(())
     }
--- a/servo/components/style/values/specified/basic_shape.rs
+++ b/servo/components/style/values/specified/basic_shape.rs
@@ -136,17 +136,17 @@ pub enum BasicShape {
     Inset(InsetRect),
     Circle(Circle),
     Ellipse(Ellipse),
     Polygon(Polygon),
 }
 
 impl Parse for BasicShape {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<BasicShape, ()> {
-        match_ignore_ascii_case! { try!(input.expect_function()),
+        match_ignore_ascii_case! { &try!(input.expect_function()),
             "inset" => {
                 Ok(BasicShape::Inset(
                    try!(input.parse_nested_block(|i| InsetRect::parse_function_arguments(context, i)))))
             },
             "circle" => {
                 Ok(BasicShape::Circle(
                    try!(input.parse_nested_block(|i| Circle::parse_function_arguments(context, i)))))
             },
@@ -232,17 +232,17 @@ impl InsetRect {
             rect.round = Some(try!(BorderRadius::parse(context, input)));
         }
         Ok(rect)
     }
 }
 
 impl Parse for InsetRect {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_function()),
+        match_ignore_ascii_case! { &try!(input.expect_function()),
            "inset" => {
                input.parse_nested_block(|i| InsetRect::parse_function_arguments(context, i))
            },
            _ => Err(())
         }
     }
 }
 
@@ -408,17 +408,17 @@ impl Circle {
             radius: radius,
             position: position,
         })
     }
 }
 
 impl Parse for Circle {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_function()),
+        match_ignore_ascii_case! { &try!(input.expect_function()),
            "circle" => {
                input.parse_nested_block(|i| Circle::parse_function_arguments(context, i))
            },
            _ => Err(())
         }
     }
 }
 
@@ -492,17 +492,17 @@ impl Ellipse {
             semiaxis_y: b,
             position: position,
         })
     }
 }
 
 impl Parse for Ellipse {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_function()),
+        match_ignore_ascii_case! { &try!(input.expect_function()),
            "ellipse" => {
                input.parse_nested_block(|i| Ellipse::parse_function_arguments(context, i))
            },
            _ => Err(())
         }
     }
 }
 
@@ -570,17 +570,17 @@ impl Polygon {
             fill: fill,
             coordinates: buf,
         })
     }
 }
 
 impl Parse for Polygon {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_function()),
+        match_ignore_ascii_case! { &try!(input.expect_function()),
            "polygon" => {
                input.parse_nested_block(|i| Polygon::parse_function_arguments(context, i))
            },
            _ => Err(())
         }
     }
 }
 
@@ -659,17 +659,17 @@ impl Default for ShapeRadius {
     fn default() -> Self {
         ShapeRadius::ClosestSide
     }
 }
 
 impl Parse for ShapeRadius {
     fn parse(_: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         input.try(|i| LengthOrPercentage::parse_non_negative(i)).map(ShapeRadius::Length).or_else(|_| {
-            match_ignore_ascii_case! { try!(input.expect_ident()),
+            match_ignore_ascii_case! { &try!(input.expect_ident()),
                 "closest-side" => Ok(ShapeRadius::ClosestSide),
                 "farthest-side" => Ok(ShapeRadius::FarthestSide),
                 _ => Err(())
             }
         })
     }
 }
 
@@ -827,17 +827,17 @@ pub enum FillRule {
     // https://www.w3.org/TR/SVG/painting.html#FillRuleProperty
     // says that it can also be `inherit`
 }
 
 impl ComputedValueAsSpecified for FillRule {}
 
 impl Parse for FillRule {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<FillRule, ()> {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "nonzero" => Ok(FillRule::NonZero),
             "evenodd" => Ok(FillRule::EvenOdd),
             _ => Err(())
         }
     }
 }
 
 impl Default for FillRule {
@@ -866,17 +866,17 @@ pub enum GeometryBox {
     ShapeBox(ShapeBox),
 }
 
 impl Parse for GeometryBox {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         if let Ok(shape_box) = input.try(|i| ShapeBox::parse(context, i)) {
             Ok(GeometryBox::ShapeBox(shape_box))
         } else {
-            match_ignore_ascii_case! { try!(input.expect_ident()),
+            match_ignore_ascii_case! { &try!(input.expect_ident()),
                 "fill-box" => Ok(GeometryBox::Fill),
                 "stroke-box" => Ok(GeometryBox::Stroke),
                 "view-box" => Ok(GeometryBox::View),
                 _ => Err(())
             }
         }
     }
 }
@@ -903,17 +903,17 @@ pub enum ShapeBox {
     // https://drafts.csswg.org/css-backgrounds-3/#box
     Border,
     Padding,
     Content,
 }
 
 impl Parse for ShapeBox {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "margin-box" => Ok(ShapeBox::Margin),
             "border-box" => Ok(ShapeBox::Border),
             "padding-box" => Ok(ShapeBox::Padding),
             "content-box" => Ok(ShapeBox::Content),
             _ => Err(())
         }
     }
 }
--- a/servo/components/style/values/specified/image.rs
+++ b/servo/components/style/values/specified/image.rs
@@ -98,17 +98,17 @@ impl ToCss for Gradient {
         dest.write_str(")")
     }
 }
 
 impl Gradient {
     /// Parses a gradient from the given arguments.
     pub fn parse_function(context: &ParserContext, input: &mut Parser) -> Result<Gradient, ()> {
         let mut repeating = false;
-        let (gradient_kind, stops) = match_ignore_ascii_case! { try!(input.expect_function()),
+        let (gradient_kind, stops) = match_ignore_ascii_case! { &try!(input.expect_function()),
             "linear-gradient" => {
                 try!(input.parse_nested_block(|input| {
                         let kind = try!(GradientKind::parse_linear(context, input));
                         let stops = try!(input.parse_comma_separated(|i| ColorStop::parse(context, i)));
                         Ok((kind, stops))
                     })
                 )
             },
--- a/servo/components/style/values/specified/length.rs
+++ b/servo/components/style/values/specified/length.rs
@@ -1339,23 +1339,17 @@ impl ToCss for MinLength {
         }
     }
 }
 
 impl Parse for MinLength {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         input.try(ExtremumLength::parse).map(MinLength::ExtremumLength)
             .or_else(|()| input.try(LengthOrPercentage::parse_non_negative).map(MinLength::LengthOrPercentage))
-            .or_else(|()| {
-                match_ignore_ascii_case! { try!(input.expect_ident()),
-                    "auto" =>
-                        Ok(MinLength::Auto),
-                    _ => Err(())
-                }
-            })
+            .or_else(|()| input.expect_ident_matching("auto").map(|()| MinLength::Auto))
     }
 }
 
 /// A value suitable for a `max-width` or `max-height` property.
 #[derive(Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
 #[allow(missing_docs)]
 pub enum MaxLength {
@@ -1386,16 +1380,16 @@ impl ToCss for MaxLength {
     }
 }
 
 impl Parse for MaxLength {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         input.try(ExtremumLength::parse).map(MaxLength::ExtremumLength)
             .or_else(|()| input.try(LengthOrPercentage::parse_non_negative).map(MaxLength::LengthOrPercentage))
             .or_else(|()| {
-                match_ignore_ascii_case! { try!(input.expect_ident()),
+                match_ignore_ascii_case! { &try!(input.expect_ident()),
                     "none" =>
                         Ok(MaxLength::None),
                     _ => Err(())
                 }
             })
     }
 }
--- a/servo/components/style/values/specified/mod.rs
+++ b/servo/components/style/values/specified/mod.rs
@@ -292,32 +292,32 @@ impl Angle {
              _ => Err(())
         }
     }
 }
 
 #[allow(missing_docs)]
 pub fn parse_border_radius(context: &ParserContext, input: &mut Parser) -> Result<BorderRadiusSize, ()> {
     input.try(|i| BorderRadiusSize::parse(context, i)).or_else(|_| {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "thin" => Ok(BorderRadiusSize::circle(
                              LengthOrPercentage::Length(NoCalcLength::from_px(1.)))),
             "medium" => Ok(BorderRadiusSize::circle(
                                LengthOrPercentage::Length(NoCalcLength::from_px(3.)))),
             "thick" => Ok(BorderRadiusSize::circle(
                               LengthOrPercentage::Length(NoCalcLength::from_px(5.)))),
             _ => Err(())
         }
     })
 }
 
 #[allow(missing_docs)]
 pub fn parse_border_width(input: &mut Parser) -> Result<Length, ()> {
     input.try(Length::parse_non_negative).or_else(|()| {
-        match_ignore_ascii_case! { try!(input.expect_ident()),
+        match_ignore_ascii_case! { &try!(input.expect_ident()),
             "thin" => Ok(Length::from_px(1.)),
             "medium" => Ok(Length::from_px(3.)),
             "thick" => Ok(Length::from_px(5.)),
             _ => Err(())
         }
     })
 }
 
@@ -330,17 +330,17 @@ pub enum BorderWidth {
     Thick,
     Width(Length),
 }
 
 impl Parse for BorderWidth {
     fn parse(_context: &ParserContext, input: &mut Parser) -> Result<BorderWidth, ()> {
         match input.try(Length::parse_non_negative) {
             Ok(length) => Ok(BorderWidth::Width(length)),
-            Err(_) => match_ignore_ascii_case! { try!(input.expect_ident()),
+            Err(_) => match_ignore_ascii_case! { &try!(input.expect_ident()),
                "thin" => Ok(BorderWidth::Thin),
                "medium" => Ok(BorderWidth::Medium),
                "thick" => Ok(BorderWidth::Thick),
                _ => Err(())
             }
         }
     }
 }
@@ -709,17 +709,17 @@ pub enum SVGPaintKind {
     /// `context-fill`
     ContextFill,
     /// `context-stroke`
     ContextStroke,
 }
 
 impl SVGPaintKind {
     fn parse_ident(input: &mut Parser) -> Result<Self, ()> {
-        Ok(match_ignore_ascii_case! { input.expect_ident()?,
+        Ok(match_ignore_ascii_case! { &input.expect_ident()?,
             "none" => SVGPaintKind::None,
             "context-fill" => SVGPaintKind::ContextFill,
             "context-stroke" => SVGPaintKind::ContextStroke,
             _ => return Err(())
         })
     }
 }
 
--- a/servo/components/style/values/specified/position.rs
+++ b/servo/components/style/values/specified/position.rs
@@ -590,26 +590,26 @@ impl PositionComponent {
 
 impl Parse for PositionComponent {
     fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
         input.try(|i| LengthOrPercentage::parse(context, i))
             .map(PositionComponent::Length)
             .or_else(|()| {
                 match try!(input.next()) {
                     Token::Ident(value) => {
-                        match_ignore_ascii_case! { value,
-                                                   "center" => Ok(PositionComponent::Keyword(Keyword::Center)),
-                                                   "left" => Ok(PositionComponent::Keyword(Keyword::Left)),
-                                                   "right" => Ok(PositionComponent::Keyword(Keyword::Right)),
-                                                   "top" => Ok(PositionComponent::Keyword(Keyword::Top)),
-                                                   "bottom" => Ok(PositionComponent::Keyword(Keyword::Bottom)),
-                                                   "x-start" => Ok(PositionComponent::Keyword(Keyword::XStart)),
-                                                   "x-end" => Ok(PositionComponent::Keyword(Keyword::XEnd)),
-                                                   "y-start" => Ok(PositionComponent::Keyword(Keyword::YStart)),
-                                                   "y-end" => Ok(PositionComponent::Keyword(Keyword::YEnd)),
-                                                   _ => Err(())
+                        match_ignore_ascii_case! { &value,
+                            "center" => Ok(PositionComponent::Keyword(Keyword::Center)),
+                            "left" => Ok(PositionComponent::Keyword(Keyword::Left)),
+                            "right" => Ok(PositionComponent::Keyword(Keyword::Right)),
+                            "top" => Ok(PositionComponent::Keyword(Keyword::Top)),
+                            "bottom" => Ok(PositionComponent::Keyword(Keyword::Bottom)),
+                            "x-start" => Ok(PositionComponent::Keyword(Keyword::XStart)),
+                            "x-end" => Ok(PositionComponent::Keyword(Keyword::XEnd)),
+                            "y-start" => Ok(PositionComponent::Keyword(Keyword::YStart)),
+                            "y-end" => Ok(PositionComponent::Keyword(Keyword::YEnd)),
+                            _ => Err(())
                         }
                     },
                     _ => Err(())
                 }
             })
     }
 }
--- a/servo/components/style_traits/Cargo.toml
+++ b/servo/components/style_traits/Cargo.toml
@@ -10,14 +10,15 @@ name = "style_traits"
 path = "lib.rs"
 
 [features]
 servo = ["heapsize", "heapsize_derive", "serde", "serde_derive",
          "cssparser/heapsize", "cssparser/serde"]
 
 [dependencies]
 app_units = "0.4"
-cssparser = "0.10"
+cssparser = "0.11"
+cssparser-macros = "0.1.0"
 euclid = "0.11"
 heapsize = {version = "0.3.0", optional = true}
 heapsize_derive = {version = "0.1", optional = true}
 serde = {version = "0.9", optional = true}
 serde_derive = {version = "0.9", optional = true}
--- a/servo/components/style_traits/cursor.rs
+++ b/servo/components/style_traits/cursor.rs
@@ -15,18 +15,18 @@ macro_rules! define_cursor {
         #[allow(missing_docs)]
         pub enum Cursor {
             $( $variant = $value ),+
         }
 
         impl Cursor {
             /// Given a CSS keyword, get the corresponding cursor enum.
             pub fn from_css_keyword(keyword: &str) -> Result<Cursor, ()> {
-                match_ignore_ascii_case! { keyword,
-                    $( concat!($css) => Ok(Cursor::$variant), )+
+                match_ignore_ascii_case! { &keyword,
+                    $( $css => Ok(Cursor::$variant), )+
                     _ => Err(())
                 }
             }
         }
 
         impl ToCss for Cursor {
             fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result where W: ::std::fmt::Write {
                 match *self {
--- a/servo/components/style_traits/lib.rs
+++ b/servo/components/style_traits/lib.rs
@@ -9,18 +9,18 @@
 #![crate_name = "style_traits"]
 #![crate_type = "rlib"]
 
 #![deny(unsafe_code, missing_docs)]
 
 #![cfg_attr(feature = "servo", feature(plugin))]
 
 extern crate app_units;
-#[macro_use]
-extern crate cssparser;
+#[macro_use] extern crate cssparser;
+#[macro_use] extern crate cssparser_macros;
 extern crate euclid;
 #[cfg(feature = "servo")] extern crate heapsize;
 #[cfg(feature = "servo")] #[macro_use] extern crate heapsize_derive;
 #[cfg(feature = "servo")] #[macro_use] extern crate serde_derive;
 
 /// Opaque type stored in type-unsafe work queues for parallel layout.
 /// Must be transmutable to and from `TNode`.
 pub type UnsafeNode = (usize, usize);
--- a/servo/components/style_traits/values.rs
+++ b/servo/components/style_traits/values.rs
@@ -111,17 +111,18 @@ macro_rules! __define_css_keyword_enum__
         #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq $(, $derived_trait )* )]
         pub enum $name {
             $( $variant ),+
         }
 
         impl $name {
             /// Parse this property from a CSS input stream.
             pub fn parse(input: &mut ::cssparser::Parser) -> Result<$name, ()> {
-                match_ignore_ascii_case! { try!(input.expect_ident()),
+                let ident = input.expect_ident()?;
+                match_ignore_ascii_case! { &ident,
                                            $( $css => Ok($name::$variant), )+
                                            _ => Err(())
                 }
             }
         }
 
         impl ToCss for $name {
             fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result
--- a/servo/ports/geckolib/Cargo.toml
+++ b/servo/ports/geckolib/Cargo.toml
@@ -10,17 +10,17 @@ path = "lib.rs"
 crate-type = ["staticlib", "rlib"]
 
 [features]
 bindgen = ["style/use_bindgen"]
 
 [dependencies]
 app_units = "0.4"
 atomic_refcell = "0.1"
-cssparser = "0.10"
+cssparser = "0.11"
 env_logger = {version = "0.4", default-features = false} # disable `regex` to reduce code size
 euclid = "0.11"
 lazy_static = "0.2"
 libc = "0.2"
 log = {version = "0.3.5", features = ["release_max_level_info"]}
 num_cpus = "1.1.0"
 parking_lot = "0.3"
 rayon = "0.6"
--- a/servo/tests/unit/style/Cargo.toml
+++ b/servo/tests/unit/style/Cargo.toml
@@ -9,17 +9,17 @@ name = "style_tests"
 path = "lib.rs"
 doctest = false
 
 [features]
 testing = ["style/testing"]
 
 [dependencies]
 app_units = "0.4"
-cssparser = {version = "0.10", features = ["heapsize"]}
+cssparser = {version = "0.11", features = ["heapsize"]}
 euclid = "0.11"
 html5ever-atoms = "0.2"
 matches = "0.1"
 owning_ref = "0.2.2"
 parking_lot = "0.3"
 rayon = "0.6"
 rustc-serialize = "0.3"
 selectors = {path = "../../../components/selectors"}
--- a/servo/tests/unit/style/str.rs
+++ b/servo/tests/unit/style/str.rs
@@ -1,14 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 use std::borrow::Cow;
-use style::str::{split_html_space_chars, str_join, cow_into_ascii_lowercase};
+use style::str::{split_html_space_chars, str_join};
 
 #[test]
 pub fn split_html_space_chars_whitespace() {
     assert!(split_html_space_chars("").collect::<Vec<_>>().is_empty());
     assert!(split_html_space_chars("\u{0020}\u{0009}\u{000a}\u{000c}\u{000d}").collect::<Vec<_>>().is_empty());
 }
 
 #[test]
@@ -29,18 +29,8 @@ pub fn test_str_join_one() {
 
 #[test]
 pub fn test_str_join_many() {
     let slice = ["", "alpha", "", "beta", "gamma", ""];
     let actual = str_join(&slice, "-");
     let expected = "-alpha--beta-gamma-";
     assert_eq!(actual, expected);
 }
-
-#[test]
-pub fn test_cow_into_ascii_lowercase() {
-    assert!(matches!(cow_into_ascii_lowercase("abc.d"), Cow::Borrowed("abc.d")));
-    let string = String::from("abc.d");
-    assert!(matches!(cow_into_ascii_lowercase(string), Cow::Owned(ref s) if s == "abc.d"));
-    assert!(matches!(cow_into_ascii_lowercase("Abc.d"), Cow::Owned(ref s) if s == "abc.d"));
-    assert!(matches!(cow_into_ascii_lowercase("aBC.D"), Cow::Owned(ref s) if s == "abc.d"));
-    assert!(matches!(cow_into_ascii_lowercase("abc.D"), Cow::Owned(ref s) if s == "abc.d"));
-}
--- a/servo/tests/unit/stylo/Cargo.toml
+++ b/servo/tests/unit/stylo/Cargo.toml
@@ -9,17 +9,17 @@ build = "build.rs"
 [lib]
 name = "stylo_tests"
 path = "lib.rs"
 doctest = false
 
 [dependencies]
 app_units = "0.4"
 atomic_refcell = "0.1"
-cssparser = "0.10"
+cssparser = "0.11"
 env_logger = "0.4"
 euclid = "0.11"
 lazy_static = "0.2"
 libc = "0.2"
 log = {version = "0.3.5", features = ["release_max_level_info"]}
 num_cpus = "1.1.0"
 parking_lot = "0.3"
 rayon = "0.6"