From ef033b8362b143f3671863313bcd792c4bf17f45 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Wed, 14 Jun 2017 18:14:54 -0500 Subject: Implemented paint worklet properties. --- components/script/dom/stylepropertymapreadonly.rs | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 components/script/dom/stylepropertymapreadonly.rs (limited to 'components/script/dom/stylepropertymapreadonly.rs') diff --git a/components/script/dom/stylepropertymapreadonly.rs b/components/script/dom/stylepropertymapreadonly.rs new file mode 100644 index 00000000000..323f5dae5a9 --- /dev/null +++ b/components/script/dom/stylepropertymapreadonly.rs @@ -0,0 +1,66 @@ +/* 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 dom::bindings::codegen::Bindings::StylePropertyMapReadOnlyBinding::StylePropertyMapReadOnlyMethods; +use dom::bindings::codegen::Bindings::StylePropertyMapReadOnlyBinding::Wrap; +use dom::bindings::js::JS; +use dom::bindings::js::Root; +use dom::bindings::reflector::Reflector; +use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::str::DOMString; +use dom::cssstylevalue::CSSStyleValue; +use dom::globalscope::GlobalScope; +use dom_struct::dom_struct; +use servo_atoms::Atom; +use std::collections::HashMap; +use std::iter::Iterator; + +#[dom_struct] +pub struct StylePropertyMapReadOnly { + reflector: Reflector, + entries: HashMap>, +} + +impl StylePropertyMapReadOnly { + fn new_inherited(entries: Entries) -> StylePropertyMapReadOnly where + Entries: IntoIterator)> + { + StylePropertyMapReadOnly { + reflector: Reflector::new(), + entries: entries.into_iter().collect(), + } + } + + pub fn from_iter(global: &GlobalScope, entries: Entries) -> Root where + Entries: IntoIterator, + { + let mut keys = Vec::new(); + rooted_vec!(let mut values); + let iter = entries.into_iter(); + let (lo, _) = iter.size_hint(); + keys.reserve(lo); + values.reserve(lo); + for (key, value) in iter { + let value = CSSStyleValue::new(global, value); + keys.push(key); + values.push(JS::from_ref(&*value)); + } + let iter = keys.drain(..).zip(values.iter().cloned()); + reflect_dom_object(box StylePropertyMapReadOnly::new_inherited(iter), global, Wrap) + } +} + +impl StylePropertyMapReadOnlyMethods for StylePropertyMapReadOnly { + /// https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymapreadonly-get + fn Get(&self, property: DOMString) -> Option> { + // TODO: avoid constructing an Atom + self.entries.get(&Atom::from(property)).map(|value| Root::from_ref(&**value)) + } + + /// https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymapreadonly-has + fn Has(&self, property: DOMString) -> bool { + // TODO: avoid constructing an Atom + self.entries.contains_key(&Atom::from(property)) + } +} -- cgit v1.2.3