aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/svgelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/svgelement.rs')
-rw-r--r--components/script/dom/svgelement.rs70
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,
+ )
+ })
}
}