Introduce ElementCSSInlineStyle for SVGElement

This commit is contained in:
CYBAI 2020-06-04 21:37:29 +09:00
parent ea491b4117
commit c561a3eb0e
4 changed files with 49 additions and 2 deletions

View file

@ -80,6 +80,7 @@ use crate::dom::htmltrackelement::HTMLTrackElement;
use crate::dom::htmlulistelement::HTMLUListElement; use crate::dom::htmlulistelement::HTMLUListElement;
use crate::dom::htmlunknownelement::HTMLUnknownElement; use crate::dom::htmlunknownelement::HTMLUnknownElement;
use crate::dom::htmlvideoelement::HTMLVideoElement; use crate::dom::htmlvideoelement::HTMLVideoElement;
use crate::dom::svgelement::SVGElement;
use crate::dom::svgsvgelement::SVGSVGElement; use crate::dom::svgsvgelement::SVGSVGElement;
use crate::realms::{enter_realm, InRealm}; use crate::realms::{enter_realm, InRealm};
use crate::script_thread::ScriptThread; use crate::script_thread::ScriptThread;
@ -110,7 +111,7 @@ fn create_svg_element(
match name.local { match name.local {
local_name!("svg") => make!(SVGSVGElement), local_name!("svg") => make!(SVGSVGElement),
_ => Element::new(name.local, name.ns, prefix, document), _ => make!(SVGElement),
} }
} }

View file

@ -2,9 +2,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * 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::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::document::Document;
use crate::dom::element::Element; use crate::dom::element::Element;
use crate::dom::node::window_from_node;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods; use crate::dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix}; use html5ever::{LocalName, Prefix};
@ -13,9 +18,18 @@ use style::element_state::ElementState;
#[dom_struct] #[dom_struct]
pub struct SVGElement { pub struct SVGElement {
element: Element, element: Element,
style_decl: MutNullableDom<CSSStyleDeclaration>,
} }
impl SVGElement { impl 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( pub fn new_inherited_with_state(
state: ElementState, state: ElementState,
tag_name: LocalName, tag_name: LocalName,
@ -24,8 +38,20 @@ impl SVGElement {
) -> SVGElement { ) -> SVGElement {
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 { impl VirtualMethods for SVGElement {
@ -33,3 +59,18 @@ impl VirtualMethods for SVGElement {
Some(self.upcast::<Element>() as &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,
)
})
}
}

View file

@ -52,6 +52,7 @@ use crate::dom::htmltextareaelement::HTMLTextAreaElement;
use crate::dom::htmltitleelement::HTMLTitleElement; use crate::dom::htmltitleelement::HTMLTitleElement;
use crate::dom::htmlvideoelement::HTMLVideoElement; use crate::dom::htmlvideoelement::HTMLVideoElement;
use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node, UnbindContext}; use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node, UnbindContext};
use crate::dom::svgelement::SVGElement;
use crate::dom::svgsvgelement::SVGSVGElement; use crate::dom::svgsvgelement::SVGSVGElement;
use html5ever::LocalName; use html5ever::LocalName;
use style::attr::AttrValue; use style::attr::AttrValue;
@ -269,6 +270,9 @@ pub fn vtable_for(node: &Node) -> &dyn VirtualMethods {
NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGGraphicsElement( NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGGraphicsElement(
SVGGraphicsElementTypeId::SVGSVGElement, SVGGraphicsElementTypeId::SVGSVGElement,
))) => node.downcast::<SVGSVGElement>().unwrap() as &dyn VirtualMethods, ))) => node.downcast::<SVGSVGElement>().unwrap() as &dyn VirtualMethods,
NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGElement)) => {
node.downcast::<SVGElement>().unwrap() as &dyn VirtualMethods
},
NodeTypeId::Element(ElementTypeId::Element) => { NodeTypeId::Element(ElementTypeId::Element) => {
node.downcast::<Element>().unwrap() as &dyn VirtualMethods node.downcast::<Element>().unwrap() as &dyn VirtualMethods
}, },

View file

@ -3,7 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
// https://svgwg.org/svg2-draft/types.html#InterfaceSVGElement // https://svgwg.org/svg2-draft/types.html#InterfaceSVGElement
[Exposed=Window, Abstract, Pref="dom.svg.enabled"] [Exposed=Window, Pref="dom.svg.enabled"]
interface SVGElement : Element { interface SVGElement : Element {
//[SameObject] readonly attribute SVGAnimatedString className; //[SameObject] readonly attribute SVGAnimatedString className;
@ -20,3 +20,4 @@ interface SVGElement : Element {
//SVGElement includes GlobalEventHandlers; //SVGElement includes GlobalEventHandlers;
//SVGElement includes SVGElementInstance; //SVGElement includes SVGElementInstance;
SVGElement includes ElementCSSInlineStyle;