mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Introduce ElementCSSInlineStyle for SVGElement
This commit is contained in:
parent
ea491b4117
commit
c561a3eb0e
4 changed files with 49 additions and 2 deletions
|
@ -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>,
|
||||
}
|
||||
|
||||
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,
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue