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::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),
}
}

View file

@ -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<CSSStyleDeclaration>,
}
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(
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<Prefix>,
document: &Document,
) -> DomRoot<SVGElement> {
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::<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::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::<SVGSVGElement>().unwrap() as &dyn VirtualMethods,
NodeTypeId::Element(ElementTypeId::SVGElement(SVGElementTypeId::SVGElement)) => {
node.downcast::<SVGElement>().unwrap() as &dyn VirtualMethods
},
NodeTypeId::Element(ElementTypeId::Element) => {
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/. */
// 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;