aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2017-10-31 17:52:31 +0100
committerSimon Sapin <simon.sapin@exyr.org>2017-10-31 19:08:43 +0100
commit3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7 (patch)
tree2195f088d8a31d195f76b61984be05f591f430e1
parenta3ac21d23d3fc717334bf4c8df0f9b1c613cbaaa (diff)
downloadservo-3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7.tar.gz
servo-3c36a36cc942a6cce52d4575ad6c26bbde6e4bd7.zip
Use encoding-rs instead of rust-encoding for CSS parsing
-rw-r--r--Cargo.lock12
-rw-r--r--components/script/Cargo.toml1
-rw-r--r--components/script/lib.rs1
-rw-r--r--components/script/stylesheet_loader.rs5
-rw-r--r--components/style/Cargo.toml4
-rw-r--r--components/style/encoding_support.rs40
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,