aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/medialist.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/medialist.rs')
-rw-r--r--components/script/dom/medialist.rs136
1 files changed, 86 insertions, 50 deletions
diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs
index 881c17966da..772c508fc04 100644
--- a/components/script/dom/medialist.rs
+++ b/components/script/dom/medialist.rs
@@ -1,50 +1,55 @@
/* 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/. */
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use cssparser::Parser;
-use dom::bindings::codegen::Bindings::MediaListBinding;
-use dom::bindings::codegen::Bindings::MediaListBinding::MediaListMethods;
-use dom::bindings::js::{JS, Root};
-use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
-use dom::bindings::str::DOMString;
-use dom::cssstylesheet::CSSStyleSheet;
-use dom::window::Window;
+use crate::dom::bindings::codegen::Bindings::MediaListBinding::MediaListMethods;
+use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
+use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
+use crate::dom::bindings::root::{Dom, DomRoot};
+use crate::dom::bindings::str::DOMString;
+use crate::dom::cssstylesheet::CSSStyleSheet;
+use crate::dom::window::Window;
+use cssparser::{Parser, ParserInput};
use dom_struct::dom_struct;
-use std::sync::Arc;
-use style::media_queries::{MediaQuery, parse_media_query_list};
+use servo_arc::Arc;
use style::media_queries::MediaList as StyleMediaList;
-use style::parser::{LengthParsingMode, ParserContext};
-use style::shared_lock::{SharedRwLock, Locked};
-use style::stylesheets::CssRuleType;
-use style_traits::ToCss;
+use style::media_queries::MediaQuery;
+use style::parser::ParserContext;
+use style::shared_lock::{Locked, SharedRwLock};
+use style::stylesheets::{CssRuleType, Origin};
+use style_traits::{ParsingMode, ToCss};
#[dom_struct]
pub struct MediaList {
reflector_: Reflector,
- parent_stylesheet: JS<CSSStyleSheet>,
- #[ignore_heap_size_of = "Arc"]
+ parent_stylesheet: Dom<CSSStyleSheet>,
+ #[ignore_malloc_size_of = "Arc"]
media_queries: Arc<Locked<StyleMediaList>>,
}
impl MediaList {
#[allow(unrooted_must_root)]
- pub fn new_inherited(parent_stylesheet: &CSSStyleSheet,
- media_queries: Arc<Locked<StyleMediaList>>) -> MediaList {
+ pub fn new_inherited(
+ parent_stylesheet: &CSSStyleSheet,
+ media_queries: Arc<Locked<StyleMediaList>>,
+ ) -> MediaList {
MediaList {
- parent_stylesheet: JS::from_ref(parent_stylesheet),
+ parent_stylesheet: Dom::from_ref(parent_stylesheet),
reflector_: Reflector::new(),
media_queries: media_queries,
}
}
#[allow(unrooted_must_root)]
- pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet,
- media_queries: Arc<Locked<StyleMediaList>>)
- -> Root<MediaList> {
- reflect_dom_object(box MediaList::new_inherited(parent_stylesheet, media_queries),
- window,
- MediaListBinding::Wrap)
+ pub fn new(
+ window: &Window,
+ parent_stylesheet: &CSSStyleSheet,
+ media_queries: Arc<Locked<StyleMediaList>>,
+ ) -> DomRoot<MediaList> {
+ reflect_dom_object(
+ Box::new(MediaList::new_inherited(parent_stylesheet, media_queries)),
+ window,
+ )
}
fn shared_lock(&self) -> &SharedRwLock {
@@ -62,7 +67,7 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-mediatext
fn SetMediaText(&self, value: DOMString) {
let mut guard = self.shared_lock().write();
- let mut media_queries = self.media_queries.write_with(&mut guard);
+ let media_queries = self.media_queries.write_with(&mut guard);
// Step 2
if value.is_empty() {
// Step 1
@@ -70,13 +75,22 @@ impl MediaListMethods for MediaList {
return;
}
// Step 3
- let mut parser = Parser::new(&value);
+ let mut input = ParserInput::new(&value);
+ let mut parser = Parser::new(&mut input);
let global = self.global();
- let win = global.as_window();
- let url = win.get_url();
- let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- LengthParsingMode::Default);
- *media_queries = parse_media_query_list(&context, &mut parser);
+ let window = global.as_window();
+ let url = window.get_url();
+ let quirks_mode = window.Document().quirks_mode();
+ let context = ParserContext::new(
+ Origin::Author,
+ &url,
+ Some(CssRuleType::Media),
+ ParsingMode::DEFAULT,
+ quirks_mode,
+ window.css_error_reporter(),
+ None,
+ );
+ *media_queries = StyleMediaList::parse(&context, &mut parser);
}
// https://drafts.csswg.org/cssom/#dom-medialist-length
@@ -88,12 +102,11 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-item
fn Item(&self, index: u32) -> Option<DOMString> {
let guard = self.shared_lock().read();
- self.media_queries.read_with(&guard).media_queries
- .get(index as usize).and_then(|query| {
- let mut s = String::new();
- query.to_css(&mut s).unwrap();
- Some(DOMString::from_string(s))
- })
+ self.media_queries
+ .read_with(&guard)
+ .media_queries
+ .get(index as usize)
+ .map(|query| query.to_css_string().into())
}
// https://drafts.csswg.org/cssom/#dom-medialist-item
@@ -104,12 +117,21 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-appendmedium
fn AppendMedium(&self, medium: DOMString) {
// Step 1
- let mut parser = Parser::new(&medium);
+ let mut input = ParserInput::new(&medium);
+ let mut parser = Parser::new(&mut input);
let global = self.global();
let win = global.as_window();
let url = win.get_url();
- let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- LengthParsingMode::Default);
+ let quirks_mode = win.Document().quirks_mode();
+ let context = ParserContext::new(
+ Origin::Author,
+ &url,
+ Some(CssRuleType::Media),
+ ParsingMode::DEFAULT,
+ quirks_mode,
+ win.css_error_reporter(),
+ None,
+ );
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
if let Err(_) = m {
@@ -119,7 +141,10 @@ impl MediaListMethods for MediaList {
let m_serialized = m.clone().unwrap().to_css_string();
let mut guard = self.shared_lock().write();
let mq = self.media_queries.write_with(&mut guard);
- let any = mq.media_queries.iter().any(|q| m_serialized == q.to_css_string());
+ let any = mq
+ .media_queries
+ .iter()
+ .any(|q| m_serialized == q.to_css_string());
if any {
return;
}
@@ -130,12 +155,21 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-deletemedium
fn DeleteMedium(&self, medium: DOMString) {
// Step 1
- let mut parser = Parser::new(&medium);
+ let mut input = ParserInput::new(&medium);
+ let mut parser = Parser::new(&mut input);
let global = self.global();
let win = global.as_window();
let url = win.get_url();
- let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Media),
- LengthParsingMode::Default);
+ let quirks_mode = win.Document().quirks_mode();
+ let context = ParserContext::new(
+ Origin::Author,
+ &url,
+ Some(CssRuleType::Media),
+ ParsingMode::DEFAULT,
+ quirks_mode,
+ win.css_error_reporter(),
+ None,
+ );
let m = MediaQuery::parse(&context, &mut parser);
// Step 2
if let Err(_) = m {
@@ -144,10 +178,12 @@ impl MediaListMethods for MediaList {
// Step 3
let m_serialized = m.unwrap().to_css_string();
let mut guard = self.shared_lock().write();
- let mut media_list = self.media_queries.write_with(&mut guard);
- let new_vec = media_list.media_queries.drain(..)
- .filter(|q| m_serialized != q.to_css_string())
- .collect();
+ let media_list = self.media_queries.write_with(&mut guard);
+ let new_vec = media_list
+ .media_queries
+ .drain(..)
+ .filter(|q| m_serialized != q.to_css_string())
+ .collect();
media_list.media_queries = new_vec;
}
}