diff options
Diffstat (limited to 'components/script/dom/svgelement.rs')
-rw-r--r-- | components/script/dom/svgelement.rs | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/components/script/dom/svgelement.rs b/components/script/dom/svgelement.rs index 1a0654ed312..92c56c95c5d 100644 --- a/components/script/dom/svgelement.rs +++ b/components/script/dom/svgelement.rs @@ -1,34 +1,76 @@ /* 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 dom::bindings::inheritance::Castable; -use dom::bindings::str::DOMString; -use dom::document::Document; -use dom::element::Element; -use dom::virtualmethods::VirtualMethods; +use crate::dom::bindings::codegen::Bindings::SVGElementBinding::SVGElementMethods; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; +use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; +use crate::dom::document::Document; +use crate::dom::element::Element; +use crate::dom::node::window_from_node; +use crate::dom::node::Node; +use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; -use html5ever_atoms::LocalName; +use html5ever::{LocalName, Prefix}; use style::element_state::ElementState; #[dom_struct] pub struct SVGElement { element: Element, + style_decl: MutNullableDom<CSSStyleDeclaration>, } impl SVGElement { - pub fn new_inherited_with_state(state: ElementState, tag_name: LocalName, - prefix: Option<DOMString>, document: &Document) - -> SVGElement { + fn new_inherited( + tag_name: LocalName, + prefix: Option<Prefix>, + document: &Document, + ) -> SVGElement { + SVGElement::new_inherited_with_state(ElementState::empty(), tag_name, prefix, document) + } + + pub fn new_inherited_with_state( + state: ElementState, + tag_name: LocalName, + prefix: Option<Prefix>, + document: &Document, + ) -> SVGElement { SVGElement { - element: - Element::new_inherited_with_state(state, tag_name, ns!(svg), prefix, document), + element: Element::new_inherited_with_state(state, tag_name, ns!(svg), prefix, document), + style_decl: Default::default(), } } + + pub fn new( + tag_name: LocalName, + prefix: Option<Prefix>, + document: &Document, + ) -> DomRoot<SVGElement> { + Node::reflect_node( + Box::new(SVGElement::new_inherited(tag_name, prefix, document)), + document, + ) + } } impl VirtualMethods for SVGElement { - fn super_type(&self) -> Option<&VirtualMethods> { - Some(self.upcast::<Element>() as &VirtualMethods) + fn super_type(&self) -> Option<&dyn VirtualMethods> { + Some(self.upcast::<Element>() as &dyn VirtualMethods) + } +} + +impl SVGElementMethods for SVGElement { + // https://html.spec.whatwg.org/multipage/#the-style-attribute + fn Style(&self) -> DomRoot<CSSStyleDeclaration> { + self.style_decl.or_init(|| { + let global = window_from_node(self); + CSSStyleDeclaration::new( + &global, + CSSStyleOwner::Element(Dom::from_ref(self.upcast())), + None, + CSSModificationAccess::ReadWrite, + ) + }) } } |