Skip to content

Commit

Permalink
Introduce ElementCSSInlineStyle for SVGElement
Browse files Browse the repository at this point in the history
  • Loading branch information
CYBAI committed Jun 4, 2020
1 parent ea491b4 commit c561a3e
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 2 deletions.
3 changes: 2 additions & 1 deletion components/script/dom/create.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
}
}

Expand Down
41 changes: 41 additions & 0 deletions components/script/dom/svgelement.rs
Expand Up @@ -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};
Expand All @@ -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,
Expand All @@ -24,12 +38,39 @@ 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 {
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,
)
})
}
}
4 changes: 4 additions & 0 deletions components/script/dom/virtualmethods.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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
},
Expand Down
3 changes: 2 additions & 1 deletion components/script/dom/webidls/SVGElement.webidl
Expand Up @@ -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;
Expand All @@ -20,3 +20,4 @@ interface SVGElement : Element {

//SVGElement includes GlobalEventHandlers;
//SVGElement includes SVGElementInstance;
SVGElement includes ElementCSSInlineStyle;

0 comments on commit c561a3e

Please sign in to comment.