mirror of
https://github.com/servo/servo.git
synced 2025-06-17 21:04:28 +00:00
Use encoding-rs instead of rust-encoding for CSS parsing
This commit is contained in:
parent
a3ac21d23d
commit
3c36a36cc9
6 changed files with 37 additions and 26 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -854,6 +854,14 @@ name = "encoding_index_tests"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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]]
|
[[package]]
|
||||||
name = "energy-monitor"
|
name = "energy-monitor"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
@ -2610,6 +2618,7 @@ dependencies = [
|
||||||
"dom_struct 0.0.1",
|
"dom_struct 0.0.1",
|
||||||
"domobject_derive 0.0.1",
|
"domobject_derive 0.0.1",
|
||||||
"encoding 0.2.33 (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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"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)",
|
"euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fallible 0.0.1",
|
"fallible 0.0.1",
|
||||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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-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-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_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 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 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>"
|
"checksum energymon-builder 0.3.0 (git+https://github.com/energymon/energymon-sys.git)" = "<none>"
|
||||||
|
|
|
@ -40,6 +40,7 @@ devtools_traits = {path = "../devtools_traits"}
|
||||||
dom_struct = {path = "../dom_struct"}
|
dom_struct = {path = "../dom_struct"}
|
||||||
domobject_derive = {path = "../domobject_derive"}
|
domobject_derive = {path = "../domobject_derive"}
|
||||||
encoding = "0.2"
|
encoding = "0.2"
|
||||||
|
encoding_rs = "0.7"
|
||||||
euclid = "0.15"
|
euclid = "0.15"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
gleam = "0.4"
|
gleam = "0.4"
|
||||||
|
|
|
@ -35,6 +35,7 @@ extern crate dom_struct;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate domobject_derive;
|
extern crate domobject_derive;
|
||||||
extern crate encoding;
|
extern crate encoding;
|
||||||
|
extern crate encoding_rs;
|
||||||
extern crate euclid;
|
extern crate euclid;
|
||||||
extern crate fnv;
|
extern crate fnv;
|
||||||
extern crate gleam;
|
extern crate gleam;
|
||||||
|
|
|
@ -13,8 +13,7 @@ use dom::eventtarget::EventTarget;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmllinkelement::{RequestGenerationId, HTMLLinkElement};
|
use dom::htmllinkelement::{RequestGenerationId, HTMLLinkElement};
|
||||||
use dom::node::{document_from_node, window_from_node};
|
use dom::node::{document_from_node, window_from_node};
|
||||||
use encoding::EncodingRef;
|
use encoding_rs::UTF_8;
|
||||||
use encoding::all::UTF_8;
|
|
||||||
use hyper::header::ContentType;
|
use hyper::header::ContentType;
|
||||||
use hyper::mime::{Mime, TopLevel, SubLevel};
|
use hyper::mime::{Mime, TopLevel, SubLevel};
|
||||||
use hyper_serde::Serde;
|
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![] };
|
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
|
// 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 protocol_encoding_label = metadata.charset.as_ref().map(|s| &**s);
|
||||||
let final_url = metadata.final_url;
|
let final_url = metadata.final_url;
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ gecko = ["nsstring", "num_cpus",
|
||||||
"style_traits/gecko", "fallible/known_system_malloc"]
|
"style_traits/gecko", "fallible/known_system_malloc"]
|
||||||
use_bindgen = ["bindgen", "regex", "toml"]
|
use_bindgen = ["bindgen", "regex", "toml"]
|
||||||
servo = ["serde", "style_traits/servo", "servo_atoms", "servo_config", "html5ever",
|
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:
|
# FIXME: Uncomment when https://github.com/servo/servo/pull/16953 has landed:
|
||||||
#"arrayvec/use_union"
|
#"arrayvec/use_union"
|
||||||
|
@ -36,7 +36,7 @@ bitflags = "1.0"
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
cfg-if = "0.1.0"
|
cfg-if = "0.1.0"
|
||||||
cssparser = "0.22.0"
|
cssparser = "0.22.0"
|
||||||
encoding = {version = "0.2", optional = true}
|
encoding_rs = {version = "0.7", optional = true}
|
||||||
euclid = "0.15"
|
euclid = "0.15"
|
||||||
fallible = { path = "../fallible" }
|
fallible = { path = "../fallible" }
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
|
|
|
@ -4,43 +4,45 @@
|
||||||
|
|
||||||
//! Parsing stylesheets from bytes (not `&str`).
|
//! Parsing stylesheets from bytes (not `&str`).
|
||||||
|
|
||||||
extern crate encoding;
|
extern crate encoding_rs;
|
||||||
|
|
||||||
use context::QuirksMode;
|
use context::QuirksMode;
|
||||||
use cssparser::{stylesheet_encoding, EncodingSupport};
|
use cssparser::{stylesheet_encoding, EncodingSupport};
|
||||||
use error_reporting::ParseErrorReporter;
|
use error_reporting::ParseErrorReporter;
|
||||||
use media_queries::MediaList;
|
use media_queries::MediaList;
|
||||||
use self::encoding::{EncodingRef, DecoderTrap};
|
|
||||||
use servo_arc::Arc;
|
use servo_arc::Arc;
|
||||||
use shared_lock::SharedRwLock;
|
use shared_lock::SharedRwLock;
|
||||||
|
use std::borrow::Cow;
|
||||||
use std::str;
|
use std::str;
|
||||||
use stylesheets::{Stylesheet, StylesheetLoader, Origin, UrlExtraData};
|
use stylesheets::{Stylesheet, StylesheetLoader, Origin, UrlExtraData};
|
||||||
|
|
||||||
struct RustEncoding;
|
struct EncodingRs;
|
||||||
|
|
||||||
impl EncodingSupport for RustEncoding {
|
impl EncodingSupport for EncodingRs {
|
||||||
type Encoding = EncodingRef;
|
type Encoding = &'static encoding_rs::Encoding;
|
||||||
|
|
||||||
fn utf8() -> Self::Encoding {
|
fn utf8() -> Self::Encoding {
|
||||||
encoding::all::UTF_8
|
encoding_rs::UTF_8
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_utf16_be_or_le(encoding: &Self::Encoding) -> bool {
|
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> {
|
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>,
|
fn decode_stylesheet_bytes<'a>(css: &'a [u8], protocol_encoding_label: Option<&str>,
|
||||||
environment_encoding: Option<EncodingRef>)
|
environment_encoding: Option<&'static encoding_rs::Encoding>)
|
||||||
-> (String, EncodingRef) {
|
-> Cow<'a, str> {
|
||||||
let fallback_encoding = stylesheet_encoding::<RustEncoding>(
|
let fallback_encoding = stylesheet_encoding::<EncodingRs>(
|
||||||
css, protocol_encoding_label.map(str::as_bytes), environment_encoding);
|
css, protocol_encoding_label.map(str::as_bytes), environment_encoding);
|
||||||
let (result, used_encoding) = encoding::decode(css, DecoderTrap::Replace, fallback_encoding);
|
let (result, _used_encoding, _) = fallback_encoding.decode(&css);
|
||||||
(result.unwrap(), used_encoding)
|
// FIXME record used encoding for environment encoding of @import
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Stylesheet {
|
impl Stylesheet {
|
||||||
|
@ -52,7 +54,7 @@ impl Stylesheet {
|
||||||
pub fn from_bytes<R>(bytes: &[u8],
|
pub fn from_bytes<R>(bytes: &[u8],
|
||||||
url_data: UrlExtraData,
|
url_data: UrlExtraData,
|
||||||
protocol_encoding_label: Option<&str>,
|
protocol_encoding_label: Option<&str>,
|
||||||
environment_encoding: Option<EncodingRef>,
|
environment_encoding: Option<&'static encoding_rs::Encoding>,
|
||||||
origin: Origin,
|
origin: Origin,
|
||||||
media: MediaList,
|
media: MediaList,
|
||||||
shared_lock: SharedRwLock,
|
shared_lock: SharedRwLock,
|
||||||
|
@ -62,8 +64,7 @@ impl Stylesheet {
|
||||||
-> Stylesheet
|
-> Stylesheet
|
||||||
where R: ParseErrorReporter
|
where R: ParseErrorReporter
|
||||||
{
|
{
|
||||||
let (string, _) = decode_stylesheet_bytes(
|
let string = decode_stylesheet_bytes(bytes, protocol_encoding_label, environment_encoding);
|
||||||
bytes, protocol_encoding_label, environment_encoding);
|
|
||||||
Stylesheet::from_str(&string,
|
Stylesheet::from_str(&string,
|
||||||
url_data,
|
url_data,
|
||||||
origin,
|
origin,
|
||||||
|
@ -80,14 +81,13 @@ impl Stylesheet {
|
||||||
pub fn update_from_bytes<R>(existing: &Stylesheet,
|
pub fn update_from_bytes<R>(existing: &Stylesheet,
|
||||||
bytes: &[u8],
|
bytes: &[u8],
|
||||||
protocol_encoding_label: Option<&str>,
|
protocol_encoding_label: Option<&str>,
|
||||||
environment_encoding: Option<EncodingRef>,
|
environment_encoding: Option<&'static encoding_rs::Encoding>,
|
||||||
url_data: UrlExtraData,
|
url_data: UrlExtraData,
|
||||||
stylesheet_loader: Option<&StylesheetLoader>,
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: &R)
|
error_reporter: &R)
|
||||||
where R: ParseErrorReporter
|
where R: ParseErrorReporter
|
||||||
{
|
{
|
||||||
let (string, _) = decode_stylesheet_bytes(
|
let string = decode_stylesheet_bytes(bytes, protocol_encoding_label, environment_encoding);
|
||||||
bytes, protocol_encoding_label, environment_encoding);
|
|
||||||
Self::update_from_str(existing,
|
Self::update_from_str(existing,
|
||||||
&string,
|
&string,
|
||||||
url_data,
|
url_data,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue