diff options
Diffstat (limited to 'components/script/dom/medialist.rs')
-rw-r--r-- | components/script/dom/medialist.rs | 136 |
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; } } |