aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorHiroyuki Ikezoe <hikezoe@mozilla.com>2017-05-13 18:33:48 +0900
committerHiroyuki Ikezoe <hikezoe@mozilla.com>2017-05-14 07:15:19 +0900
commitb6b3187efa34a13929b39a7c58d5756dc26f630f (patch)
treeb7fc5031828faa40ed1374e7bae862e6fa8e5528 /components
parentfcc50ea421f54893d41481e9d95cb4e3b29831ee (diff)
downloadservo-b6b3187efa34a13929b39a7c58d5756dc26f630f.tar.gz
servo-b6b3187efa34a13929b39a7c58d5756dc26f630f.zip
Make ParsingMode bitflags.
assert_parsing_mode_match() is mostly the same as assert_restyle_hints_match().
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/css.rs6
-rw-r--r--components/script/dom/cssmediarule.rs4
-rw-r--r--components/script/dom/cssstyledeclaration.rs4
-rw-r--r--components/script/dom/csssupportsrule.rs4
-rw-r--r--components/script/dom/htmllinkelement.rs4
-rw-r--r--components/script/dom/htmlstyleelement.rs4
-rw-r--r--components/script/dom/medialist.rs8
-rw-r--r--components/script/dom/window.rs4
-rw-r--r--components/style/build_gecko.rs1
-rw-r--r--components/style/keyframes.rs4
-rw-r--r--components/style/parser.rs47
-rw-r--r--components/style/properties/declaration_block.rs4
-rw-r--r--components/style/properties/properties.mako.rs4
-rw-r--r--components/style/stylesheets.rs6
14 files changed, 66 insertions, 38 deletions
diff --git a/components/script/dom/css.rs b/components/script/dom/css.rs
index ce71c49e5ef..d56575b9d38 100644
--- a/components/script/dom/css.rs
+++ b/components/script/dom/css.rs
@@ -10,7 +10,7 @@ use dom::bindings::str::DOMString;
use dom::window::Window;
use dom_struct::dom_struct;
use style::context::QuirksMode;
-use style::parser::{ParsingMode, ParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext};
use style::stylesheets::CssRuleType;
use style::supports::{Declaration, parse_condition_or_declaration};
@@ -32,7 +32,7 @@ impl CSS {
let decl = Declaration { prop: property.into(), val: value.into() };
let url = win.Document().url();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Supports),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
QuirksMode::NoQuirks);
decl.eval(&context)
}
@@ -44,7 +44,7 @@ impl CSS {
if let Ok(cond) = cond {
let url = win.Document().url();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Supports),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
QuirksMode::NoQuirks);
cond.eval(&context)
} else {
diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs
index ef560ce0be1..6986b0fe03d 100644
--- a/components/script/dom/cssmediarule.rs
+++ b/components/script/dom/cssmediarule.rs
@@ -16,7 +16,7 @@ use dom::medialist::MediaList;
use dom::window::Window;
use dom_struct::dom_struct;
use style::media_queries::parse_media_query_list;
-use style::parser::{ParsingMode, ParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext};
use style::shared_lock::{Locked, ToCssWithGuard};
use style::stylearc::Arc;
use style::stylesheets::{CssRuleType, MediaRule};
@@ -75,7 +75,7 @@ impl CSSMediaRule {
let url = win.get_url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
let new_medialist = parse_media_query_list(&context, &mut input);
let mut guard = self.cssconditionrule.shared_lock().write();
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs
index 797a9e16722..4d7d8feaac5 100644
--- a/components/script/dom/cssstyledeclaration.rs
+++ b/components/script/dom/cssstyledeclaration.rs
@@ -17,7 +17,7 @@ use dom_struct::dom_struct;
use servo_url::ServoUrl;
use std::ascii::AsciiExt;
use style::attr::AttrValue;
-use style::parser::ParsingMode;
+use style::parser::PARSING_MODE_DEFAULT;
use style::properties::{Importance, PropertyDeclarationBlock, PropertyId, LonghandId, ShorthandId};
use style::properties::{parse_one_declaration, parse_style_attribute};
use style::selector_parser::PseudoElement;
@@ -260,7 +260,7 @@ impl CSSStyleDeclaration {
let result =
parse_one_declaration(id, &value, &self.owner.base_url(),
window.css_error_reporter(),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
// Step 7
diff --git a/components/script/dom/csssupportsrule.rs b/components/script/dom/csssupportsrule.rs
index 23502a3b8c8..cba47f0acd7 100644
--- a/components/script/dom/csssupportsrule.rs
+++ b/components/script/dom/csssupportsrule.rs
@@ -13,7 +13,7 @@ use dom::cssrule::SpecificCSSRule;
use dom::cssstylesheet::CSSStyleSheet;
use dom::window::Window;
use dom_struct::dom_struct;
-use style::parser::{ParsingMode, ParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext};
use style::shared_lock::{Locked, ToCssWithGuard};
use style::stylearc::Arc;
use style::stylesheets::{CssRuleType, SupportsRule};
@@ -63,7 +63,7 @@ impl CSSSupportsRule {
let url = win.Document().url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Supports),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
let enabled = cond.eval(&context);
let mut guard = self.cssconditionrule.shared_lock().write();
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index 92dd0b9ed4a..fc1783985f8 100644
--- a/components/script/dom/htmllinkelement.rs
+++ b/components/script/dom/htmllinkelement.rs
@@ -32,7 +32,7 @@ use std::cell::Cell;
use std::default::Default;
use style::attr::AttrValue;
use style::media_queries::parse_media_query_list;
-use style::parser::{ParsingMode, ParserContext as CssParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext as CssParserContext};
use style::str::HTML_SPACE_CHARACTERS;
use style::stylearc::Arc;
use style::stylesheets::{CssRuleType, Stylesheet};
@@ -282,7 +282,7 @@ impl HTMLLinkElement {
let win = document.window();
let doc_url = document.url();
let context = CssParserContext::new_for_cssom(&doc_url, win.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
document.quirks_mode());
let media = parse_media_query_list(&context, &mut css_parser);
diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs
index cf4011cf811..9f7a36c040c 100644
--- a/components/script/dom/htmlstyleelement.rs
+++ b/components/script/dom/htmlstyleelement.rs
@@ -23,7 +23,7 @@ use net_traits::ReferrerPolicy;
use script_layout_interface::message::Msg;
use std::cell::Cell;
use style::media_queries::parse_media_query_list;
-use style::parser::{ParsingMode, ParserContext as CssParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext as CssParserContext};
use style::stylearc::Arc;
use style::stylesheets::{CssRuleType, Stylesheet, Origin};
use stylesheet_loader::{StylesheetLoader, StylesheetOwner};
@@ -88,7 +88,7 @@ impl HTMLStyleElement {
let context = CssParserContext::new_for_cssom(&url,
win.css_error_reporter(),
Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
doc.quirks_mode());
let shared_lock = node.owner_doc().style_shared_lock().clone();
let mq = Arc::new(shared_lock.wrap(
diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs
index 0f3432eefec..8915615ca37 100644
--- a/components/script/dom/medialist.rs
+++ b/components/script/dom/medialist.rs
@@ -14,7 +14,7 @@ use dom::window::Window;
use dom_struct::dom_struct;
use style::media_queries::{MediaQuery, parse_media_query_list};
use style::media_queries::MediaList as StyleMediaList;
-use style::parser::{ParsingMode, ParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext};
use style::shared_lock::{SharedRwLock, Locked};
use style::stylearc::Arc;
use style::stylesheets::CssRuleType;
@@ -77,7 +77,7 @@ impl MediaListMethods for MediaList {
let url = win.get_url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
*media_queries = parse_media_query_list(&context, &mut parser);
}
@@ -113,7 +113,7 @@ impl MediaListMethods for MediaList {
let url = win.get_url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
@@ -141,7 +141,7 @@ impl MediaListMethods for MediaList {
let url = win.get_url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 3078658bbdb..993749b00c2 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -104,7 +104,7 @@ use std::sync::mpsc::TryRecvError::{Disconnected, Empty};
use style::context::ReflowGoal;
use style::error_reporting::ParseErrorReporter;
use style::media_queries;
-use style::parser::{ParsingMode, ParserContext as CssParserContext};
+use style::parser::{PARSING_MODE_DEFAULT, ParserContext as CssParserContext};
use style::properties::PropertyId;
use style::properties::longhands::overflow_x;
use style::selector_parser::PseudoElement;
@@ -978,7 +978,7 @@ impl WindowMethods for Window {
let url = self.get_url();
let quirks_mode = self.Document().quirks_mode();
let context = CssParserContext::new_for_cssom(&url, self.css_error_reporter(), Some(CssRuleType::Media),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
let media_query_list = media_queries::parse_media_query_list(&context, &mut parser);
let document = self.Document();
diff --git a/components/style/build_gecko.rs b/components/style/build_gecko.rs
index 6a727012be1..4836d3f9dd8 100644
--- a/components/style/build_gecko.rs
+++ b/components/style/build_gecko.rs
@@ -334,6 +334,7 @@ mod bindings {
.bitfield_enum("nsChangeHint")
.bitfield_enum("nsRestyleHint")
.constified_enum("UpdateAnimationsTasks")
+ .constified_enum("ParsingMode")
.parse_callbacks(Box::new(Callbacks));
let whitelist_vars = [
"NS_AUTHOR_SPECIFIED_.*",
diff --git a/components/style/keyframes.rs b/components/style/keyframes.rs
index c8bf83c3411..dc4a75806a5 100644
--- a/components/style/keyframes.rs
+++ b/components/style/keyframes.rs
@@ -9,7 +9,7 @@
use cssparser::{AtRuleParser, Parser, QualifiedRuleParser, RuleListParser};
use cssparser::{DeclarationListParser, DeclarationParser, parse_one_rule};
use error_reporting::NullReporter;
-use parser::{ParsingMode, ParserContext, log_css_error};
+use parser::{PARSING_MODE_DEFAULT, ParserContext, log_css_error};
use properties::{Importance, PropertyDeclaration, PropertyDeclarationBlock, PropertyId};
use properties::{PropertyDeclarationId, LonghandId, ParsedDeclaration};
use properties::LonghandIdSet;
@@ -131,7 +131,7 @@ impl Keyframe {
&parent_stylesheet.url_data,
&error_reporter,
Some(CssRuleType::Keyframe),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
parent_stylesheet.quirks_mode);
let mut input = Parser::new(css);
diff --git a/components/style/parser.rs b/components/style/parser.rs
index 05ee642f083..9874bf49f54 100644
--- a/components/style/parser.rs
+++ b/components/style/parser.rs
@@ -10,21 +10,48 @@ use error_reporting::ParseErrorReporter;
use style_traits::OneOrMoreCommaSeparated;
use stylesheets::{CssRuleType, Origin, UrlExtraData};
-/// The mode to use when parsing lengths.
-#[derive(PartialEq, Eq, Copy, Clone)]
-pub enum ParsingMode {
- /// In CSS, lengths must have units, except for zero values, where the unit can be omitted.
- /// https://www.w3.org/TR/css3-values/#lengths
- Default,
- /// In SVG, a coordinate or length value without a unit identifier (e.g., "25") is assumed to be in user units (px).
- /// https://www.w3.org/TR/SVG/coords.html#Units
- AllowUnitlessLength,
+bitflags! {
+ /// The mode to use when parsing values.
+ pub flags ParsingMode: u8 {
+ /// In CSS, lengths must have units, except for zero values, where the unit can be omitted.
+ /// https://www.w3.org/TR/css3-values/#lengths
+ const PARSING_MODE_DEFAULT = 0x00,
+ /// In SVG, a coordinate or length value without a unit identifier (e.g., "25") is assumed
+ /// to be in user units (px).
+ /// https://www.w3.org/TR/SVG/coords.html#Units
+ const PARSING_MODE_ALLOW_UNITLESS_LENGTH = 0x01,
+ }
}
impl ParsingMode {
/// Whether the parsing mode allows unitless lengths for non-zero values to be intpreted as px.
pub fn allows_unitless_lengths(&self) -> bool {
- *self == ParsingMode::AllowUnitlessLength
+ self.intersects(PARSING_MODE_ALLOW_UNITLESS_LENGTH)
+ }
+}
+
+/// Asserts that all ParsingMode flags have a matching ParsingMode value in gecko.
+#[cfg(feature = "gecko")]
+#[inline]
+pub fn assert_parsing_mode_match() {
+ use gecko_bindings::structs;
+
+ macro_rules! check_parsing_modes {
+ ( $( $a:ident => $b:ident ),*, ) => {
+ if cfg!(debug_assertions) {
+ let mut hints = ParsingMode::all();
+ $(
+ assert_eq!(structs::$a as usize, $b.bits() as usize, stringify!($b));
+ hints.remove($b);
+ )*
+ assert_eq!(hints, ParsingMode::empty(), "all ParsingMode bits should have an assertion");
+ }
+ }
+ }
+
+ check_parsing_modes! {
+ ParsingMode_Default => PARSING_MODE_DEFAULT,
+ ParsingMode_AllowUnitlessLength => PARSING_MODE_ALLOW_UNITLESS_LENGTH,
}
}
diff --git a/components/style/properties/declaration_block.rs b/components/style/properties/declaration_block.rs
index 423ed54034c..201ad8ea33d 100644
--- a/components/style/properties/declaration_block.rs
+++ b/components/style/properties/declaration_block.rs
@@ -10,7 +10,7 @@ use context::QuirksMode;
use cssparser::{DeclarationListParser, parse_important};
use cssparser::{Parser, AtRuleParser, DeclarationParser, Delimiter};
use error_reporting::ParseErrorReporter;
-use parser::{ParsingMode, ParserContext, log_css_error};
+use parser::{PARSING_MODE_DEFAULT, ParsingMode, ParserContext, log_css_error};
use std::fmt;
use style_traits::ToCss;
use stylesheets::{CssRuleType, Origin, UrlExtraData};
@@ -649,7 +649,7 @@ pub fn parse_style_attribute(input: &str,
url_data,
error_reporter,
Some(CssRuleType::Style),
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
parse_property_declaration_list(&context, &mut Parser::new(input))
}
diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs
index 186ca94269d..5772410c38d 100644
--- a/components/style/properties/properties.mako.rs
+++ b/components/style/properties/properties.mako.rs
@@ -29,7 +29,7 @@ use font_metrics::FontMetricsProvider;
#[cfg(feature = "servo")] use logical_geometry::{LogicalMargin, PhysicalSide};
use logical_geometry::WritingMode;
use media_queries::Device;
-use parser::{ParsingMode, Parse, ParserContext};
+use parser::{PARSING_MODE_DEFAULT, Parse, ParserContext};
use properties::animated_properties::TransitionProperty;
#[cfg(feature = "servo")] use servo_config::prefs::PREFS;
use shared_lock::StylesheetGuards;
@@ -387,7 +387,7 @@ impl PropertyDeclarationIdSet {
url_data,
error_reporter,
None,
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
quirks_mode);
Parser::new(&css).parse_entirely(|input| {
match from_shorthand {
diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs
index 026d896cc5b..84b5753fb9b 100644
--- a/components/style/stylesheets.rs
+++ b/components/style/stylesheets.rs
@@ -26,7 +26,7 @@ use gecko_bindings::sugar::refptr::RefPtr;
use keyframes::{Keyframe, parse_keyframe_list};
use media_queries::{Device, MediaList, parse_media_query_list};
use parking_lot::RwLock;
-use parser::{ParsingMode, Parse, ParserContext, log_css_error};
+use parser::{PARSING_MODE_DEFAULT, Parse, ParserContext, log_css_error};
use properties::{PropertyDeclarationBlock, parse_property_declaration_list};
use selector_parser::{SelectorImpl, SelectorParser};
use selectors::parser::SelectorList;
@@ -442,7 +442,7 @@ impl CssRule {
&parent_stylesheet.url_data,
&error_reporter,
None,
- ParsingMode::Default,
+ PARSING_MODE_DEFAULT,
parent_stylesheet.quirks_mode);
let mut input = Parser::new(css);
@@ -744,7 +744,7 @@ impl Stylesheet {
shared_lock: shared_lock,
loader: stylesheet_loader,
context: ParserContext::new_with_line_number_offset(origin, url_data, error_reporter,
- line_number_offset, ParsingMode::Default,
+ line_number_offset, PARSING_MODE_DEFAULT,
quirks_mode),
state: Cell::new(State::Start),
};