diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2017-10-31 17:52:31 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2017-10-31 19:08:43 +0100 |
commit | 3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7 (patch) | |
tree | 2195f088d8a31d195f76b61984be05f591f430e1 | |
parent | a3ac21d23d3fc717334bf4c8df0f9b1c613cbaaa (diff) | |
download | servo-3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7.tar.gz servo-3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7.zip |
Use encoding-rs instead of rust-encoding for CSS parsing
-rw-r--r-- | Cargo.lock | 12 | ||||
-rw-r--r-- | components/script/Cargo.toml | 1 | ||||
-rw-r--r-- | components/script/lib.rs | 1 | ||||
-rw-r--r-- | components/script/stylesheet_loader.rs | 5 | ||||
-rw-r--r-- | components/style/Cargo.toml | 4 | ||||
-rw-r--r-- | components/style/encoding_support.rs | 40 |
6 files changed, 37 insertions, 26 deletions
diff --git a/Cargo.lock b/Cargo.lock index 761376ab838..892d0acf4ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,6 +855,14 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "encoding_rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "energy-monitor" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2610,6 +2618,7 @@ dependencies = [ "dom_struct 0.0.1", "domobject_derive 0.0.1", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "gleam 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3156,7 +3165,7 @@ dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", "fallible 0.0.1", "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3860,6 +3869,7 @@ dependencies = [ "checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" "checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +"checksum encoding_rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5215aabf22b83153be3ee44dfe3f940214541b2ce13d419c55e7a115c8c51a9" "checksum energy-monitor 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe872d0664f1cc60db36349af245d892ee67d3c8f78055df0ebc43271fd4e05c" "checksum energymon 0.3.0 (git+https://github.com/energymon/energymon-rust.git)" = "<none>" "checksum energymon-builder 0.3.0 (git+https://github.com/energymon/energymon-sys.git)" = "<none>" diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index c736ba19c8e..1013a3adfe2 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -40,6 +40,7 @@ devtools_traits = {path = "../devtools_traits"} dom_struct = {path = "../dom_struct"} domobject_derive = {path = "../domobject_derive"} encoding = "0.2" +encoding_rs = "0.7" euclid = "0.15" fnv = "1.0" gleam = "0.4" diff --git a/components/script/lib.rs b/components/script/lib.rs index 88fe2b4f593..74276422207 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -35,6 +35,7 @@ extern crate dom_struct; #[macro_use] extern crate domobject_derive; extern crate encoding; +extern crate encoding_rs; extern crate euclid; extern crate fnv; extern crate gleam; diff --git a/components/script/stylesheet_loader.rs b/components/script/stylesheet_loader.rs index 094eff5b022..09b22913424 100644 --- a/components/script/stylesheet_loader.rs +++ b/components/script/stylesheet_loader.rs @@ -13,8 +13,7 @@ use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; use dom::htmllinkelement::{RequestGenerationId, HTMLLinkElement}; use dom::node::{document_from_node, window_from_node}; -use encoding::EncodingRef; -use encoding::all::UTF_8; +use encoding_rs::UTF_8; use hyper::header::ContentType; use hyper::mime::{Mime, TopLevel, SubLevel}; use hyper_serde::Serde; @@ -127,7 +126,7 @@ impl FetchResponseListener for StylesheetContext { let data = if is_css { mem::replace(&mut self.data, vec![]) } else { vec![] }; // TODO: Get the actual value. http://dev.w3.org/csswg/css-syntax/#environment-encoding - let environment_encoding = UTF_8 as EncodingRef; + let environment_encoding = UTF_8; let protocol_encoding_label = metadata.charset.as_ref().map(|s| &**s); let final_url = metadata.final_url; diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index b5a192adbb3..9366ba3f519 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -20,7 +20,7 @@ gecko = ["nsstring", "num_cpus", "style_traits/gecko", "fallible/known_system_malloc"] use_bindgen = ["bindgen", "regex", "toml"] servo = ["serde", "style_traits/servo", "servo_atoms", "servo_config", "html5ever", - "cssparser/serde", "encoding", "malloc_size_of/servo", + "cssparser/serde", "encoding_rs", "malloc_size_of/servo", # FIXME: Uncomment when https://github.com/servo/servo/pull/16953 has landed: #"arrayvec/use_union" @@ -36,7 +36,7 @@ bitflags = "1.0" byteorder = "1.0" cfg-if = "0.1.0" cssparser = "0.22.0" -encoding = {version = "0.2", optional = true} +encoding_rs = {version = "0.7", optional = true} euclid = "0.15" fallible = { path = "../fallible" } fnv = "1.0" diff --git a/components/style/encoding_support.rs b/components/style/encoding_support.rs index fb655a5e01d..f2cc6db0ca4 100644 --- a/components/style/encoding_support.rs +++ b/components/style/encoding_support.rs @@ -4,43 +4,45 @@ //! Parsing stylesheets from bytes (not `&str`). -extern crate encoding; +extern crate encoding_rs; use context::QuirksMode; use cssparser::{stylesheet_encoding, EncodingSupport}; use error_reporting::ParseErrorReporter; use media_queries::MediaList; -use self::encoding::{EncodingRef, DecoderTrap}; use servo_arc::Arc; use shared_lock::SharedRwLock; +use std::borrow::Cow; use std::str; use stylesheets::{Stylesheet, StylesheetLoader, Origin, UrlExtraData}; -struct RustEncoding; +struct EncodingRs; -impl EncodingSupport for RustEncoding { - type Encoding = EncodingRef; +impl EncodingSupport for EncodingRs { + type Encoding = &'static encoding_rs::Encoding; fn utf8() -> Self::Encoding { - encoding::all::UTF_8 + encoding_rs::UTF_8 } fn is_utf16_be_or_le(encoding: &Self::Encoding) -> bool { - matches!(encoding.name(), "utf-16be" | "utf-16le") + *encoding == encoding_rs::UTF_16LE || + *encoding == encoding_rs::UTF_16BE } fn from_label(ascii_label: &[u8]) -> Option<Self::Encoding> { - str::from_utf8(ascii_label).ok().and_then(encoding::label::encoding_from_whatwg_label) + encoding_rs::Encoding::for_label(ascii_label) } } -fn decode_stylesheet_bytes(css: &[u8], protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>) - -> (String, EncodingRef) { - let fallback_encoding = stylesheet_encoding::<RustEncoding>( +fn decode_stylesheet_bytes<'a>(css: &'a [u8], protocol_encoding_label: Option<&str>, + environment_encoding: Option<&'static encoding_rs::Encoding>) + -> Cow<'a, str> { + let fallback_encoding = stylesheet_encoding::<EncodingRs>( css, protocol_encoding_label.map(str::as_bytes), environment_encoding); - let (result, used_encoding) = encoding::decode(css, DecoderTrap::Replace, fallback_encoding); - (result.unwrap(), used_encoding) + let (result, _used_encoding, _) = fallback_encoding.decode(&css); + // FIXME record used encoding for environment encoding of @import + result } impl Stylesheet { @@ -52,7 +54,7 @@ impl Stylesheet { pub fn from_bytes<R>(bytes: &[u8], url_data: UrlExtraData, protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>, + environment_encoding: Option<&'static encoding_rs::Encoding>, origin: Origin, media: MediaList, shared_lock: SharedRwLock, @@ -62,8 +64,7 @@ impl Stylesheet { -> Stylesheet where R: ParseErrorReporter { - let (string, _) = decode_stylesheet_bytes( - bytes, protocol_encoding_label, environment_encoding); + let string = decode_stylesheet_bytes(bytes, protocol_encoding_label, environment_encoding); Stylesheet::from_str(&string, url_data, origin, @@ -80,14 +81,13 @@ impl Stylesheet { pub fn update_from_bytes<R>(existing: &Stylesheet, bytes: &[u8], protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>, + environment_encoding: Option<&'static encoding_rs::Encoding>, url_data: UrlExtraData, stylesheet_loader: Option<&StylesheetLoader>, error_reporter: &R) where R: ParseErrorReporter { - let (string, _) = decode_stylesheet_bytes( - bytes, protocol_encoding_label, environment_encoding); + let string = decode_stylesheet_bytes(bytes, protocol_encoding_label, environment_encoding); Self::update_from_str(existing, &string, url_data, |