From c561a3eb0e72a4d20f23eef2d61549284e6dd237 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Thu, 4 Jun 2020 21:37:29 +0900 Subject: [PATCH] Introduce ElementCSSInlineStyle for SVGElement --- components/script/dom/create.rs | 3 +- components/script/dom/svgelement.rs | 41 +++++++++++++++++++ components/script/dom/virtualmethods.rs | 4 ++ .../script/dom/webidls/SVGElement.webidl | 3 +- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 62484c6f8618..37aaf07286fb 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -80,6 +80,7 @@ use crate::dom::htmltrackelement::HTMLTrackElement; use crate::dom::htmlulistelement::HTMLUListElement; use crate::dom::htmlunknownelement::HTMLUnknownElement; use crate::dom::htmlvideoelement::HTMLVideoElement; +use crate::dom::svgelement::SVGElement; use crate::dom::svgsvgelement::SVGSVGElement; use crate::realms::{enter_realm, InRealm}; use crate::script_thread::ScriptThread; @@ -110,7 +111,7 @@ fn create_svg_element( match name.local { local_name!("svg") => make!(SVGSVGElement), - _ => Element::new(name.local, name.ns, prefix, document), + _ => make!(SVGElement), } } diff --git a/components/script/dom/svgelement.rs b/components/script/dom/svgelement.rs index a877cd908609..92c56c95c5d8 100644 --- a/components/script/dom/svgelement.rs +++ b/components/script/dom/svgelement.rs @@ -2,9 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +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::{LocalName, Prefix}; @@ -13,9 +18,18 @@ use style::element_state::ElementState; #[dom_struct] pub struct SVGElement { element: Element, + style_decl: MutNullableDom, } impl SVGElement { + fn new_inherited( + tag_name: LocalName, + prefix: Option, + 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, @@ -24,8 +38,20 @@ impl SVGElement { ) -> SVGElement { SVGElement { 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, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(SVGElement::new_inherited(tag_name, prefix, document)), + document, + ) + } } impl VirtualMethods for SVGElement { @@ -33,3 +59,18 @@ impl VirtualMethods for SVGElement { Some(self.upcast::() as &dyn VirtualMethods) } } + +impl SVGElementMethods for SVGElement { + // https://html.spec.whatwg.org/multipage/#the-style-attribute + fn Style(&self) -> DomRoot { + self.style_decl.or_init(|| { + let global = window_from_node(self); + CSSStyleDeclaration::new( + &global, + CSSStyleOwner::Element(Dom::from_ref(self.upcast())), + None, + CSSModificationAccess::ReadWrite, + ) + }) + } +} diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index f3b8b6332322..9f175d8d621c 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -52,6 +52,7 @@ use crate::dom::htmltextareaelement::HTMLTextAreaElement; use crate::dom::htmltitleelement::HTMLTitleElement; use crate::dom::htmlvideoelement::HTMLVideoElement; use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node, UnbindContext}; +use crate::dom::svgelement::SVGElement; use crate::dom::svgsvgelement::SVGSVGElement; use html5ever::LocalName; use style::attr::AttrValue; @@ -269,6 +270,9 @@ pub fn vtable_for(node: &Node) -> &dyn VirtualMethods { NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGGraphicsElement( SVGGraphicsElementTypeId::SVGSVGElement, ))) => node.downcast::().unwrap() as &dyn VirtualMethods, + NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGElement)) => { + node.downcast::().unwrap() as &dyn VirtualMethods + }, NodeTypeId::Element(ElementTypeId::Element) => { node.downcast::().unwrap() as &dyn VirtualMethods }, diff --git a/components/script/dom/webidls/SVGElement.webidl b/components/script/dom/webidls/SVGElement.webidl index 51214b261164..2da7f062b890 100644 --- a/components/script/dom/webidls/SVGElement.webidl +++ b/components/script/dom/webidls/SVGElement.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://svgwg.org/svg2-draft/types.html#InterfaceSVGElement -[Exposed=Window, Abstract, Pref="dom.svg.enabled"] +[Exposed=Window, Pref="dom.svg.enabled"] interface SVGElement : Element { //[SameObject] readonly attribute SVGAnimatedString className; @@ -20,3 +20,4 @@ interface SVGElement : Element { //SVGElement includes GlobalEventHandlers; //SVGElement includes SVGElementInstance; +SVGElement includes ElementCSSInlineStyle;