Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement unitless length quirk #16609

Merged
merged 22 commits into from Apr 28, 2017
Merged
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f872fda
Make Stylist::quirks_mode hold a QuirksMode
nox Apr 23, 2017
4df7af5
Run a test per property and value in unitless-length.html
nox Apr 25, 2017
10fb8e6
Enable /quirks-mode/ tests
nox Apr 24, 2017
f68e2fd
Propagate quirks mode all the way to ParserContext
nox Apr 23, 2017
080f74c
Implement the unitless length quirk for background-position
nox Apr 24, 2017
03d24e8
Implement the unitless length quirk for border-spacing
nox Apr 24, 2017
b5a558e
Implement the unitless length quirk for border-*-width
nox Apr 24, 2017
91cc300
Implement the unitless length quirk for border-width
nox Apr 24, 2017
46913ff
Implement the unitless length quirk for position properties
nox Apr 24, 2017
ba59faf
Implement the unitless length quirk for clip
nox Apr 24, 2017
0e7308e
Implement the unitless length quirk for font-size
nox Apr 24, 2017
65f74ea
Implement the unitless length quirk for physical size properties
nox Apr 24, 2017
72186c2
Implement the unitless length quirk for letter-spacing
nox Apr 24, 2017
bcc6d45
Implement the unitless length quirk for margin-*
nox Apr 24, 2017
2aea6d8
Implement the unitless length quirk for margin
nox Apr 24, 2017
37118e1
Implement the unitless length quirk for physical size extremums
nox Apr 24, 2017
3f94739
Implement the unitless length quirk for padding-*
nox Apr 24, 2017
dd6d3d6
Implement the unitless length quirk for padding
nox Apr 24, 2017
16dd554
Implement the unitless length quirk for text-indent
nox Apr 24, 2017
59a7819
Implement the unitless length quirk for vertical-align
nox Apr 25, 2017
d53eb77
Implement the unitless length quirk for word-spacing
nox Apr 25, 2017
1091af6
Copy the damn unitless-length.html test in /_mozilla/
nox Apr 27, 2017
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -601,7 +601,7 @@ impl LayoutThread {
Msg::AddStylesheet(style_info) => {
self.handle_add_stylesheet(style_info, possibly_locked_rw_data)
}
Msg::SetQuirksMode => self.handle_set_quirks_mode(possibly_locked_rw_data),
Msg::SetQuirksMode(mode) => self.handle_set_quirks_mode(possibly_locked_rw_data, mode),
Msg::GetRPC(response_chan) => {
response_chan.send(box LayoutRPCImpl(self.rw_data.clone()) as
Box<LayoutRPC + Send>).unwrap();
@@ -772,9 +772,11 @@ impl LayoutThread {
}

/// Sets quirks mode for the document, causing the quirks mode stylesheet to be used.
fn handle_set_quirks_mode<'a, 'b>(&self, possibly_locked_rw_data: &mut RwData<'a, 'b>) {
fn handle_set_quirks_mode<'a, 'b>(&self,
possibly_locked_rw_data: &mut RwData<'a, 'b>,
quirks_mode: QuirksMode) {
let mut rw_data = possibly_locked_rw_data.lock();
Arc::get_mut(&mut rw_data.stylist).unwrap().set_quirks_mode(true);
Arc::get_mut(&mut rw_data.stylist).unwrap().set_quirks_mode(quirks_mode);
possibly_locked_rw_data.block(rw_data);
}

@@ -1587,7 +1589,8 @@ fn get_ua_stylesheets() -> Result<UserAgentStylesheets, &'static str> {
MediaList::empty(),
shared_lock.clone(),
None,
&NullReporter))
&NullReporter,
QuirksMode::NoQuirks))
}

let shared_lock = SharedRwLock::new();
@@ -1600,7 +1603,7 @@ fn get_ua_stylesheets() -> Result<UserAgentStylesheets, &'static str> {
for &(ref contents, ref url) in &opts::get().user_stylesheets {
user_or_user_agent_stylesheets.push(Stylesheet::from_bytes(
&contents, url.clone(), None, None, Origin::User, MediaList::empty(),
shared_lock.clone(), None, &RustLogReporter));
shared_lock.clone(), None, &RustLogReporter, QuirksMode::NoQuirks));
}

let quirks_mode_stylesheet = try!(parse_ua_stylesheet(&shared_lock, "quirks-mode.css"));
@@ -9,6 +9,7 @@ use dom::bindings::reflector::Reflector;
use dom::bindings::str::DOMString;
use dom::window::Window;
use dom_struct::dom_struct;
use style::context::QuirksMode;
use style::parser::{LengthParsingMode, ParserContext};
use style::stylesheets::CssRuleType;
use style::supports::{Declaration, parse_condition_or_declaration};
@@ -31,7 +32,8 @@ 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),
LengthParsingMode::Default);
LengthParsingMode::Default,
QuirksMode::NoQuirks);
decl.eval(&context)
}

@@ -42,7 +44,8 @@ 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),
LengthParsingMode::Default);
LengthParsingMode::Default,
QuirksMode::NoQuirks);
cond.eval(&context)
} else {
false
@@ -5,6 +5,7 @@
use cssparser::Parser;
use dom::bindings::codegen::Bindings::CSSMediaRuleBinding;
use dom::bindings::codegen::Bindings::CSSMediaRuleBinding::CSSMediaRuleMethods;
use dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
use dom::bindings::js::{MutNullableJS, Root};
use dom::bindings::reflector::{DomObject, reflect_dom_object};
use dom::bindings::str::DOMString;
@@ -72,8 +73,10 @@ impl CSSMediaRule {
let global = self.global();
let win = global.as_window();
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
let new_medialist = parse_media_query_list(&context, &mut input);
let mut guard = self.cssconditionrule.shared_lock().write();

@@ -256,9 +256,12 @@ impl CSSStyleDeclaration {

// Step 6
let window = self.owner.window();
let quirks_mode = window.Document().quirks_mode();
let result =
parse_one_declaration(id, &value, &self.owner.base_url(),
window.css_error_reporter(), LengthParsingMode::Default);
window.css_error_reporter(),
LengthParsingMode::Default,
quirks_mode);

// Step 7
let parsed = match result {
@@ -434,11 +437,13 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
return Err(Error::NoModificationAllowed);
}

let quirks_mode = window.Document().quirks_mode();
self.owner.mutate_associated_block(|mut pdb, mut _changed| {
// Step 3
*pdb = parse_style_attribute(&value,
&self.owner.base_url(),
window.css_error_reporter());
window.css_error_reporter(),
quirks_mode);
});

Ok(())
@@ -61,8 +61,10 @@ impl CSSSupportsRule {
let global = self.global();
let win = global.as_window();
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
let enabled = cond.eval(&context);
let mut guard = self.cssconditionrule.shared_lock().write();
let rule = self.supportsrule.write_with(&mut guard);
@@ -542,7 +542,7 @@ impl Document {
self.quirks_mode.set(mode);

if mode == QuirksMode::Quirks {
self.window.layout_chan().send(Msg::SetQuirksMode).unwrap();
self.window.layout_chan().send(Msg::SetQuirksMode(mode)).unwrap();
}
}

@@ -2196,7 +2196,8 @@ impl VirtualMethods for Element {
Arc::new(doc.style_shared_lock().wrap(parse_style_attribute(
&attr.value(),
&doc.base_url(),
win.css_error_reporter())))
win.css_error_reporter(),
doc.quirks_mode())))
};

Some(block)
@@ -282,7 +282,8 @@ 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),
LengthParsingMode::Default);
LengthParsingMode::Default,
document.quirks_mode());
let media = parse_media_query_list(&context, &mut css_parser);

let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity"));
@@ -113,6 +113,7 @@ impl HTMLMetaElement {
// force all styles to be recomputed.
dirty_on_viewport_size_change: AtomicBool::new(false),
disabled: AtomicBool::new(false),
quirks_mode: document.quirks_mode(),
}));
let doc = document_from_node(self);
doc.invalidate_stylesheets();
@@ -76,6 +76,7 @@ impl HTMLStyleElement {
assert!(node.is_in_doc());

let win = window_from_node(node);
let doc = document_from_node(self);

let mq_attribute = element.get_attribute(&ns!(), &local_name!("media"));
let mq_str = match mq_attribute {
@@ -88,14 +89,16 @@ impl HTMLStyleElement {
let context = CssParserContext::new_for_cssom(&url,
win.css_error_reporter(),
Some(CssRuleType::Media),
LengthParsingMode::Default);
LengthParsingMode::Default,
doc.quirks_mode());
let shared_lock = node.owner_doc().style_shared_lock().clone();
let mq = Arc::new(shared_lock.wrap(
parse_media_query_list(&context, &mut CssParser::new(&mq_str))));
let loader = StylesheetLoader::for_element(self.upcast());
let sheet = Stylesheet::from_str(&data, win.get_url(), Origin::Author, mq,
shared_lock, Some(&loader),
win.css_error_reporter(),
doc.quirks_mode(),
self.line_number);

let sheet = Arc::new(sheet);
@@ -107,7 +110,6 @@ impl HTMLStyleElement {

win.layout_chan().send(Msg::AddStylesheet(sheet.clone())).unwrap();
*self.stylesheet.borrow_mut() = Some(sheet);
let doc = document_from_node(self);
doc.invalidate_stylesheets();
}

@@ -5,6 +5,7 @@
use cssparser::Parser;
use dom::bindings::codegen::Bindings::MediaListBinding;
use dom::bindings::codegen::Bindings::MediaListBinding::MediaListMethods;
use dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
use dom::bindings::js::{JS, Root};
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
@@ -74,8 +75,10 @@ impl MediaListMethods for MediaList {
let global = self.global();
let win = global.as_window();
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
*media_queries = parse_media_query_list(&context, &mut parser);
}

@@ -108,8 +111,10 @@ impl MediaListMethods for MediaList {
let global = self.global();
let win = global.as_window();
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
if let Err(_) = m {
@@ -134,8 +139,10 @@ impl MediaListMethods for MediaList {
let global = self.global();
let win = global.as_window();
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
if let Err(_) = m {
@@ -77,7 +77,7 @@ impl MediaQueryList {
if let Some(window_size) = self.document.window().window_size() {
let viewport_size = window_size.initial_viewport;
let device = Device::new(MediaType::Screen, viewport_size);
self.media_query_list.evaluate(&device)
self.media_query_list.evaluate(&device, self.document.quirks_mode())
} else {
false
}
@@ -976,8 +976,10 @@ impl WindowMethods for Window {
fn MatchMedia(&self, query: DOMString) -> Root<MediaQueryList> {
let mut parser = Parser::new(&query);
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),
LengthParsingMode::Default);
LengthParsingMode::Default,
quirks_mode);
let media_query_list = media_queries::parse_media_query_list(&context, &mut parser);
let document = self.Document();
let mql = MediaQueryList::new(&document, media_query_list);
@@ -144,7 +144,8 @@ impl FetchResponseListener for StylesheetContext {
media.take().unwrap(),
shared_lock,
Some(&loader),
win.css_error_reporter()));
win.css_error_reporter(),
document.quirks_mode()));

if link.is_alternate() {
sheet.set_disabled(true);
@@ -17,7 +17,7 @@ use script_traits::{LayoutMsg as ConstellationMsg, StackingContextScrollState, W
use servo_url::ServoUrl;
use std::sync::Arc;
use std::sync::mpsc::{Receiver, Sender};
use style::context::ReflowGoal;
use style::context::{QuirksMode, ReflowGoal};
use style::properties::PropertyId;
use style::selector_parser::PseudoElement;
use style::stylesheets::Stylesheet;
@@ -27,8 +27,8 @@ pub enum Msg {
/// Adds the given stylesheet to the document.
AddStylesheet(Arc<Stylesheet>),

/// Puts a document into quirks mode, causing the quirks mode stylesheet to be loaded.
SetQuirksMode,
/// Change the quirks mode.
SetQuirksMode(QuirksMode),

/// Requests a reflow.
Reflow(ScriptReflow),
@@ -451,7 +451,8 @@ fn compute_style_for_animation_step(context: &SharedStyleContext,
/* cascade_info = */ None,
&*context.error_reporter,
font_metrics_provider,
CascadeFlags::empty());
CascadeFlags::empty(),
context.quirks_mode);
computed
}
}
@@ -6,6 +6,7 @@

extern crate encoding;

use context::QuirksMode;
use cssparser::{stylesheet_encoding, EncodingSupport};
use error_reporting::ParseErrorReporter;
use media_queries::MediaList;
@@ -56,7 +57,8 @@ impl Stylesheet {
media: MediaList,
shared_lock: SharedRwLock,
stylesheet_loader: Option<&StylesheetLoader>,
error_reporter: &ParseErrorReporter)
error_reporter: &ParseErrorReporter,
quirks_mode: QuirksMode)
-> Stylesheet {
let (string, _) = decode_stylesheet_bytes(
bytes, protocol_encoding_label, environment_encoding);
@@ -67,6 +69,7 @@ impl Stylesheet {
shared_lock,
stylesheet_loader,
error_reporter,
quirks_mode,
0u64)
}

@@ -5,6 +5,7 @@
//! Gecko's media-query device and expression representation.

use app_units::Au;
use context::QuirksMode;
use cssparser::{CssStringWriter, Parser, Token};
use euclid::Size2D;
use font_metrics::get_metrics_provider_for_product;
@@ -521,7 +522,7 @@ impl Expression {
}

/// Returns whether this media query evaluates to true for the given device.
pub fn matches(&self, device: &Device) -> bool {
pub fn matches(&self, device: &Device, quirks_mode: QuirksMode) -> bool {
let mut css_value = nsCSSValue::null();
unsafe {
(self.feature.mGetter.unwrap())(device.pres_context,
@@ -534,12 +535,13 @@ impl Expression {
None => return false,
};

self.evaluate_against(device, &value)
self.evaluate_against(device, &value, quirks_mode)
}

fn evaluate_against(&self,
device: &Device,
actual_value: &MediaExpressionValue)
actual_value: &MediaExpressionValue,
quirks_mode: QuirksMode)
-> bool {
use self::MediaExpressionValue::*;
use std::cmp::Ordering;
@@ -564,6 +566,8 @@ impl Expression {
style: default_values.clone(),
font_metrics_provider: &provider,
in_media_query: true,
// TODO: pass the correct value here.
quirks_mode: quirks_mode,
};

let required_value = match self.value {
@@ -16,7 +16,7 @@

use app_units::Au;
use atomic_refcell::AtomicRefCell;
use context::{SharedStyleContext, UpdateAnimationsTasks};
use context::{QuirksMode, SharedStyleContext, UpdateAnimationsTasks};
use data::ElementData;
use dom::{self, AnimationRules, DescendantsBit, LayoutIterator, NodeInfo, TElement, TNode, UnsafeNode};
use dom::{OpaqueNode, PresentationalHintsSynthetizer};
@@ -324,7 +324,7 @@ impl<'le> GeckoElement<'le> {
/// Parse the style attribute of an element.
pub fn parse_style_attribute(value: &str,
url_data: &UrlExtraData) -> PropertyDeclarationBlock {
parse_style_attribute(value, url_data, &RustLogReporter)
parse_style_attribute(value, url_data, &RustLogReporter, QuirksMode::NoQuirks)
}

fn flags(&self) -> u32 {
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.