aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-10-19 16:16:02 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-10-25 14:27:16 +0200
commit21b314e6338ab0681db7e536376a6867939008cc (patch)
tree73090958e428483064f7a58c5d661800f5fde637
parent5da0a8d8725edde1aab0e802b1381bb379fd6638 (diff)
downloadservo-21b314e6338ab0681db7e536376a6867939008cc.tar.gz
servo-21b314e6338ab0681db7e536376a6867939008cc.zip
stylo: Honor CallerType for media query parsing.
So that matchMedia can parse internal stuff in Chrome code. Bug: 1410074 Reviewed-by: xidorn MozReview-Commit-ID: 6M4HHqVJ1dp
-rw-r--r--components/style/gecko/generated/bindings.rs4
-rw-r--r--ports/geckolib/glue.rs43
2 files changed, 37 insertions, 10 deletions
diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs
index 7375fba01ba..3f1fe721076 100644
--- a/components/style/gecko/generated/bindings.rs
+++ b/components/style/gecko/generated/bindings.rs
@@ -14,6 +14,7 @@ use gecko_bindings::structs::mozilla::css::ErrorReporter;
use gecko_bindings::structs::mozilla::css::ImageValue;
use gecko_bindings::structs::mozilla::css::URLValue;
use gecko_bindings::structs::mozilla::css::URLValueData;
+use gecko_bindings::structs::mozilla::dom::CallerType;
use gecko_bindings::structs::mozilla::AnonymousCounterStyle;
use gecko_bindings::structs::mozilla::AtomArray;
use gecko_bindings::structs::mozilla::MallocSizeOf;
@@ -2868,7 +2869,8 @@ extern "C" {
}
extern "C" {
pub fn Servo_MediaList_SetText(list: RawServoMediaListBorrowed,
- text: *const nsACString);
+ text: *const nsACString,
+ aCallerType: CallerType);
}
extern "C" {
pub fn Servo_MediaList_GetLength(list: RawServoMediaListBorrowed) -> u32;
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index f0f1baaf661..65273b47173 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -78,7 +78,7 @@ use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t;
use style::gecko_bindings::bindings::nsTimingFunctionBorrowed;
use style::gecko_bindings::bindings::nsTimingFunctionBorrowedMut;
use style::gecko_bindings::structs;
-use style::gecko_bindings::structs::{CSSPseudoElementType, CompositeOperation};
+use style::gecko_bindings::structs::{CallerType, CSSPseudoElementType, CompositeOperation};
use style::gecko_bindings::structs::{Loader, LoaderReusableStyleSheets};
use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleContextStrong, RustString};
use style::gecko_bindings::structs::{ServoStyleSheet, SheetParsingMode, nsAtom, nsCSSPropertyID};
@@ -2793,16 +2793,41 @@ pub extern "C" fn Servo_MediaList_GetText(list: RawServoMediaListBorrowed, resul
}
#[no_mangle]
-pub extern "C" fn Servo_MediaList_SetText(list: RawServoMediaListBorrowed, text: *const nsACString) {
- let text = unsafe { text.as_ref().unwrap().as_str_unchecked() };
+pub unsafe extern "C" fn Servo_MediaList_SetText(
+ list: RawServoMediaListBorrowed,
+ text: *const nsACString,
+ caller_type: CallerType,
+) {
+ let text = (*text).as_str_unchecked();
+
let mut input = ParserInput::new(&text);
let mut parser = Parser::new(&mut input);
- let url_data = unsafe { dummy_url_data() };
- let context = ParserContext::new_for_cssom(url_data, Some(CssRuleType::Media),
- PARSING_MODE_DEFAULT,
- QuirksMode::NoQuirks);
- write_locked_arc(list, |list: &mut MediaList| {
- *list = parse_media_query_list(&context, &mut parser, &NullReporter);
+ let url_data = dummy_url_data();
+
+ // TODO(emilio): If the need for `CallerType` appears in more places,
+ // consider adding an explicit member in `ParserContext` instead of doing
+ // this (or adding a dummy "chrome://" url data).
+ //
+ // For media query parsing it's effectively the same, so for now...
+ let origin = match caller_type {
+ CallerType::System => Origin::UserAgent,
+ CallerType::NonSystem => Origin::Author,
+ };
+
+ let context = ParserContext::new(
+ origin,
+ url_data,
+ Some(CssRuleType::Media),
+ PARSING_MODE_DEFAULT,
+ QuirksMode::NoQuirks,
+ );
+
+ write_locked_arc(list, |list: &mut MediaList| {
+ *list = parse_media_query_list(
+ &context,
+ &mut parser,
+ &NullReporter,
+ );
})
}