author | Simon Sapin <simon.sapin@exyr.org> |
Thu, 16 Mar 2017 20:07:37 -0700 | |
changeset 348165 | c679469b5b875be9c9174de840c0f9a7d9ef97d2 |
parent 348164 | cfd64c2b49705b799236cc960150c2b36ed09a96 |
child 348166 | 4d074b176f371ae88e20950b48b1b55e632c0f1b |
push id | 88164 |
push user | cbook@mozilla.com |
push date | Fri, 17 Mar 2017 13:55:35 +0000 |
treeherder | mozilla-inbound@e46c08babe02 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | Manishearth |
milestone | 55.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/servo/components/style/Cargo.toml +++ b/servo/components/style/Cargo.toml @@ -12,27 +12,27 @@ name = "style" path = "lib.rs" doctest = false [features] gecko = ["nsstring_vendor", "rayon/unstable"] use_bindgen = ["bindgen", "regex"] servo = ["serde/unstable", "serde", "serde_derive", "heapsize_derive", "style_traits/servo", "servo_atoms", "html5ever-atoms", - "cssparser/heapsize", "cssparser/serde", + "cssparser/heapsize", "cssparser/serde", "encoding", "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.12" -encoding = "0.2" +encoding = {version = "0.2", optional = true} 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" matches = "0.1"
new file mode 100644 --- /dev/null +++ b/servo/components/style/encoding_support.rs @@ -0,0 +1,89 @@ +/* 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/. */ + +//! Parsing stylesheets from bytes (not `&str`). + +extern crate encoding; + +use cssparser::{stylesheet_encoding, EncodingSupport}; +use error_reporting::ParseErrorReporter; +use media_queries::MediaList; +use parser::ParserContextExtraData; +use self::encoding::{EncodingRef, DecoderTrap}; +use servo_url::ServoUrl; +use std::str; +use stylesheets::{Stylesheet, StylesheetLoader, Origin}; + +struct RustEncoding; + +impl EncodingSupport for RustEncoding { + type Encoding = EncodingRef; + + fn utf8() -> Self::Encoding { + encoding::all::UTF_8 + } + + fn is_utf16_be_or_le(encoding: &Self::Encoding) -> bool { + matches!(encoding.name(), "utf-16be" | "utf-16le") + } + + fn from_label(ascii_label: &[u8]) -> Option<Self::Encoding> { + str::from_utf8(ascii_label).ok().and_then(encoding::label::encoding_from_whatwg_label) + } +} + +fn decode_stylesheet_bytes(css: &[u8], protocol_encoding_label: Option<&str>, + environment_encoding: Option<EncodingRef>) + -> (String, EncodingRef) { + let fallback_encoding = stylesheet_encoding::<RustEncoding>( + 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) +} + +impl Stylesheet { + /// Parse a stylesheet from a set of bytes, potentially received over the + /// network. + /// + /// Takes care of decoding the network bytes and forwards the resulting + /// string to `Stylesheet::from_str`. + pub fn from_bytes(bytes: &[u8], + base_url: ServoUrl, + protocol_encoding_label: Option<&str>, + environment_encoding: Option<EncodingRef>, + origin: Origin, + media: MediaList, + stylesheet_loader: Option<&StylesheetLoader>, + error_reporter: &ParseErrorReporter, + extra_data: ParserContextExtraData) + -> Stylesheet { + let (string, _) = decode_stylesheet_bytes( + bytes, protocol_encoding_label, environment_encoding); + Stylesheet::from_str(&string, + base_url, + origin, + media, + stylesheet_loader, + error_reporter, + extra_data) + } + + /// Updates an empty stylesheet with a set of bytes that reached over the + /// network. + pub fn update_from_bytes(existing: &Stylesheet, + bytes: &[u8], + protocol_encoding_label: Option<&str>, + environment_encoding: Option<EncodingRef>, + stylesheet_loader: Option<&StylesheetLoader>, + error_reporter: &ParseErrorReporter, + extra_data: ParserContextExtraData) { + let (string, _) = decode_stylesheet_bytes( + bytes, protocol_encoding_label, environment_encoding); + Self::update_from_str(existing, + &string, + stylesheet_loader, + error_reporter, + extra_data) + } +}
--- a/servo/components/style/lib.rs +++ b/servo/components/style/lib.rs @@ -38,17 +38,16 @@ #![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; -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] extern crate lazy_static; @@ -84,16 +83,17 @@ pub mod bezier; pub mod bloom; pub mod cache; pub mod cascade_info; pub mod context; pub mod custom_properties; pub mod data; pub mod dom; pub mod element_state; +#[cfg(feature = "servo")] mod encoding_support; pub mod error_reporting; pub mod font_face; pub mod font_metrics; #[cfg(feature = "gecko")] #[allow(unsafe_code)] pub mod gecko; #[cfg(feature = "gecko")] #[allow(unsafe_code)] pub mod gecko_bindings; pub mod keyframes; #[allow(missing_docs)] // TODO. pub mod logical_geometry;
--- a/servo/components/style/stylesheets.rs +++ b/servo/components/style/stylesheets.rs @@ -2,34 +2,32 @@ * 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/. */ //! Style sheets and their CSS rules. #![deny(missing_docs)] use {Atom, Prefix, Namespace}; -use cssparser::{AtRuleParser, Parser, QualifiedRuleParser, stylesheet_encoding, EncodingSupport}; +use cssparser::{AtRuleParser, Parser, QualifiedRuleParser}; use cssparser::{AtRuleType, RuleListParser, SourcePosition, Token, parse_one_rule}; use cssparser::ToCss as ParserToCss; -use encoding::{self, EncodingRef, DecoderTrap}; use error_reporting::ParseErrorReporter; use font_face::{FontFaceRule, parse_font_face_block}; use keyframes::{Keyframe, parse_keyframe_list}; use media_queries::{Device, MediaList, parse_media_query_list}; use parking_lot::RwLock; use parser::{ParserContext, ParserContextExtraData, log_css_error}; use properties::{PropertyDeclarationBlock, parse_property_declaration_list}; use selector_parser::{SelectorImpl, SelectorParser}; use selectors::parser::SelectorList; use servo_config::prefs::PREFS; use servo_url::ServoUrl; use std::cell::Cell; use std::fmt; -use std::str; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use style_traits::ToCss; use stylist::FnvHashMap; use supports::SupportsCondition; use values::specified::url::SpecifiedUrl; use viewport::ViewportRule; @@ -535,88 +533,17 @@ impl ToCss for StyleRule { try!(write!(dest, " ")); } // Step 5 try!(dest.write_str("}")); Ok(()) } } -struct RustEncoding; - -impl EncodingSupport for RustEncoding { - type Encoding = EncodingRef; - - fn utf8() -> Self::Encoding { - encoding::all::UTF_8 - } - - fn is_utf16_be_or_le(encoding: &Self::Encoding) -> bool { - matches!(encoding.name(), "utf-16be" | "utf-16le") - } - - fn from_label(ascii_label: &[u8]) -> Option<Self::Encoding> { - str::from_utf8(ascii_label).ok().and_then(encoding::label::encoding_from_whatwg_label) - } -} - -fn decode_stylesheet_bytes(css: &[u8], protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>) - -> (String, EncodingRef) { - let fallback_encoding = stylesheet_encoding::<RustEncoding>( - 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) -} - impl Stylesheet { - /// Parse a stylesheet from a set of bytes, potentially received over the - /// network. - /// - /// Takes care of decoding the network bytes and forwards the resulting - /// string to `Stylesheet::from_str`. - pub fn from_bytes(bytes: &[u8], - base_url: ServoUrl, - protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>, - origin: Origin, - media: MediaList, - stylesheet_loader: Option<&StylesheetLoader>, - error_reporter: &ParseErrorReporter, - extra_data: ParserContextExtraData) - -> Stylesheet { - let (string, _) = decode_stylesheet_bytes( - bytes, protocol_encoding_label, environment_encoding); - Stylesheet::from_str(&string, - base_url, - origin, - media, - stylesheet_loader, - error_reporter, - extra_data) - } - - /// Updates an empty stylesheet with a set of bytes that reached over the - /// network. - pub fn update_from_bytes(existing: &Stylesheet, - bytes: &[u8], - protocol_encoding_label: Option<&str>, - environment_encoding: Option<EncodingRef>, - stylesheet_loader: Option<&StylesheetLoader>, - error_reporter: &ParseErrorReporter, - extra_data: ParserContextExtraData) { - let (string, _) = decode_stylesheet_bytes( - bytes, protocol_encoding_label, environment_encoding); - Self::update_from_str(existing, - &string, - stylesheet_loader, - error_reporter, - extra_data) - } - /// Updates an empty stylesheet from a given string of text. pub fn update_from_str(existing: &Stylesheet, css: &str, stylesheet_loader: Option<&StylesheetLoader>, error_reporter: &ParseErrorReporter, extra_data: ParserContextExtraData) { let mut rules = existing.rules.write(); let mut namespaces = existing.namespaces.write();