Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce ElementCSSInlineStyle for SVGElement #26789

Merged
merged 1 commit into from Jun 4, 2020
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

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

@@ -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>,

This comment has been minimized.

Copy link
@CYBAI

CYBAI Jun 4, 2020

Author Collaborator

also cc @emilio

I basically refer to HTMLElement to add this field. Does this make sense?

This comment has been minimized.

Copy link
@emilio

emilio Jun 4, 2020

Member

It does, though maybe it should be moved down to Element, even if not web-exposed there, because that's where style_attribute lives. Anyhow no big deal.

}

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,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,
)
})
}
}
@@ -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
},
@@ -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;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.