diff options
author | Nazım Can Altınova <canaltinova@gmail.com> | 2016-12-02 01:19:20 +0300 |
---|---|---|
committer | Nazım Can Altınova <canaltinova@gmail.com> | 2016-12-02 23:46:40 +0300 |
commit | c05283528164ddca1052727e2073e4a9dc2765ae (patch) | |
tree | 8ce550481ae50d44a667c366326744dcefdac78c /components/script/dom/medialist.rs | |
parent | 5abbc9f69668f23469a9c01937c68e305fa36cd8 (diff) | |
download | servo-c05283528164ddca1052727e2073e4a9dc2765ae.tar.gz servo-c05283528164ddca1052727e2073e4a9dc2765ae.zip |
Implement MediaList interface
Diffstat (limited to 'components/script/dom/medialist.rs')
-rw-r--r-- | components/script/dom/medialist.rs | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs new file mode 100644 index 00000000000..b6e5fd9c1ee --- /dev/null +++ b/components/script/dom/medialist.rs @@ -0,0 +1,122 @@ +/* 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/. */ + +use core::default::Default; +use cssparser::Parser; +use dom::bindings::codegen::Bindings::MediaListBinding; +use dom::bindings::codegen::Bindings::MediaListBinding::MediaListMethods; +use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::str::DOMString; +use dom::window::Window; +use parking_lot::RwLock; +use std::sync::Arc; +use style::media_queries::{MediaQuery, parse_media_query_list}; +use style::media_queries::MediaList as StyleMediaList; +use style_traits::ToCss; + +#[dom_struct] +pub struct MediaList { + reflector_: Reflector, + #[ignore_heap_size_of = "Arc"] + media_queries: Arc<RwLock<StyleMediaList>>, +} + +impl MediaList { + #[allow(unrooted_must_root)] + pub fn new_inherited(media_queries: Arc<RwLock<StyleMediaList>>) -> MediaList { + MediaList { + reflector_: Reflector::new(), + media_queries: media_queries, + } + } + + #[allow(unrooted_must_root)] + pub fn new(window: &Window, media_queries: Arc<RwLock<StyleMediaList>>) + -> Root<MediaList> { + reflect_dom_object(box MediaList::new_inherited(media_queries), + window, + MediaListBinding::Wrap) + } + +} + +impl MediaListMethods for MediaList { + // https://drafts.csswg.org/cssom/#dom-medialist-mediatext + fn MediaText(&self) -> DOMString { + DOMString::from(self.media_queries.read().to_css_string()) + } + + // https://drafts.csswg.org/cssom/#dom-medialist-mediatext + fn SetMediaText(&self, value: DOMString) { + let mut media_queries = self.media_queries.write(); + // Step 2 + if value.is_empty() { + // Step 1 + *media_queries = StyleMediaList::default(); + return; + } + // Step 3 + let mut parser = Parser::new(&value); + *media_queries = parse_media_query_list(&mut parser); + } + + // https://drafts.csswg.org/cssom/#dom-medialist-length + fn Length(&self) -> u32 { + self.media_queries.read().media_queries.len() as u32 + } + + // https://drafts.csswg.org/cssom/#dom-medialist-item + fn Item(&self, index: u32) -> Option<DOMString> { + self.media_queries.read().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)) + }) + } + + // https://drafts.csswg.org/cssom/#dom-medialist-item + fn IndexedGetter(&self, index: u32) -> Option<DOMString> { + self.Item(index) + } + + // https://drafts.csswg.org/cssom/#dom-medialist-appendmedium + fn AppendMedium(&self, medium: DOMString) { + // Step 1 + let mut parser = Parser::new(&medium); + let m = MediaQuery::parse(&mut parser); + // Step 2 + if let Err(_) = m { + return; + } + // Step 3 + let m_serialized = m.clone().unwrap().to_css_string(); + let any = self.media_queries.read().media_queries.iter() + .any(|q| m_serialized == q.to_css_string()); + if any { + return; + } + // Step 4 + self.media_queries.write().media_queries.push(m.unwrap()); + } + + // https://drafts.csswg.org/cssom/#dom-medialist-deletemedium + fn DeleteMedium(&self, medium: DOMString) { + // Step 1 + let mut parser = Parser::new(&medium); + let m = MediaQuery::parse(&mut parser); + // Step 2 + if let Err(_) = m { + return; + } + // Step 3 + let m_serialized = m.unwrap().to_css_string(); + let mut media_list = self.media_queries.write(); + let new_vec = media_list.media_queries.drain(..) + .filter(|q| m_serialized != q.to_css_string()) + .collect(); + media_list.media_queries = new_vec; + } +} |