mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Support arbitrary protos when wrapping DOM objects with constructors.
This commit is contained in:
parent
d9600ff50f
commit
dbff26bce0
197 changed files with 2028 additions and 586 deletions
|
@ -85,28 +85,30 @@ use crate::dom::svgsvgelement::SVGSVGElement;
|
|||
use crate::realms::{enter_realm, InRealm};
|
||||
use crate::script_thread::ScriptThread;
|
||||
use html5ever::{LocalName, Prefix, QualName};
|
||||
use js::rust::HandleObject;
|
||||
use servo_config::pref;
|
||||
|
||||
fn create_svg_element(
|
||||
name: QualName,
|
||||
prefix: Option<Prefix>,
|
||||
document: &Document,
|
||||
proto: Option<HandleObject>,
|
||||
) -> DomRoot<Element> {
|
||||
assert_eq!(name.ns, ns!(svg));
|
||||
|
||||
macro_rules! make(
|
||||
($ctor:ident) => ({
|
||||
let obj = $ctor::new(name.local, prefix, document);
|
||||
let obj = $ctor::new(name.local, prefix, document, proto);
|
||||
DomRoot::upcast(obj)
|
||||
});
|
||||
($ctor:ident, $($arg:expr),+) => ({
|
||||
let obj = $ctor::new(name.local, prefix, document, $($arg),+);
|
||||
let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+);
|
||||
DomRoot::upcast(obj)
|
||||
})
|
||||
);
|
||||
|
||||
if !pref!(dom.svg.enabled) {
|
||||
return Element::new(name.local, name.ns, prefix, document);
|
||||
return Element::new(name.local, name.ns, prefix, document, proto);
|
||||
}
|
||||
|
||||
match name.local {
|
||||
|
@ -124,6 +126,7 @@ fn create_html_element(
|
|||
document: &Document,
|
||||
creator: ElementCreator,
|
||||
mode: CustomElementCreationMode,
|
||||
proto: Option<HandleObject>,
|
||||
) -> DomRoot<Element> {
|
||||
assert_eq!(name.ns, ns!(html));
|
||||
|
||||
|
@ -138,6 +141,7 @@ fn create_html_element(
|
|||
name.local.clone(),
|
||||
prefix.clone(),
|
||||
document,
|
||||
proto,
|
||||
));
|
||||
result.set_custom_element_state(CustomElementState::Undefined);
|
||||
ScriptThread::enqueue_upgrade_reaction(&*result, definition);
|
||||
|
@ -145,6 +149,7 @@ fn create_html_element(
|
|||
},
|
||||
CustomElementCreationMode::Synchronous => {
|
||||
let local_name = name.local.clone();
|
||||
//TODO(jdm) Pass proto to create_element?
|
||||
return match definition.create_element(document, prefix.clone()) {
|
||||
Ok(element) => {
|
||||
element.set_custom_element_definition(definition.clone());
|
||||
|
@ -165,7 +170,7 @@ fn create_html_element(
|
|||
|
||||
// Step 6.1.2
|
||||
let element = DomRoot::upcast::<Element>(HTMLUnknownElement::new(
|
||||
local_name, prefix, document,
|
||||
local_name, prefix, document, proto,
|
||||
));
|
||||
element.set_custom_element_state(CustomElementState::Failed);
|
||||
element
|
||||
|
@ -175,7 +180,7 @@ fn create_html_element(
|
|||
}
|
||||
} else {
|
||||
// Steps 5.1-5.2
|
||||
let element = create_native_html_element(name, prefix, document, creator);
|
||||
let element = create_native_html_element(name, prefix, document, creator, proto);
|
||||
element.set_is(definition.name.clone());
|
||||
element.set_custom_element_state(CustomElementState::Undefined);
|
||||
match mode {
|
||||
|
@ -191,7 +196,7 @@ fn create_html_element(
|
|||
}
|
||||
|
||||
// Steps 7.1-7.3
|
||||
let result = create_native_html_element(name.clone(), prefix, document, creator);
|
||||
let result = create_native_html_element(name.clone(), prefix, document, creator, proto);
|
||||
match is {
|
||||
Some(is) => {
|
||||
result.set_is(is);
|
||||
|
@ -215,16 +220,17 @@ pub fn create_native_html_element(
|
|||
prefix: Option<Prefix>,
|
||||
document: &Document,
|
||||
creator: ElementCreator,
|
||||
proto: Option<HandleObject>,
|
||||
) -> DomRoot<Element> {
|
||||
assert_eq!(name.ns, ns!(html));
|
||||
|
||||
macro_rules! make(
|
||||
($ctor:ident) => ({
|
||||
let obj = $ctor::new(name.local, prefix, document);
|
||||
let obj = $ctor::new(name.local, prefix, document, proto);
|
||||
DomRoot::upcast(obj)
|
||||
});
|
||||
($ctor:ident, $($arg:expr),+) => ({
|
||||
let obj = $ctor::new(name.local, prefix, document, $($arg),+);
|
||||
let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+);
|
||||
DomRoot::upcast(obj)
|
||||
})
|
||||
);
|
||||
|
@ -386,11 +392,12 @@ pub fn create_element(
|
|||
document: &Document,
|
||||
creator: ElementCreator,
|
||||
mode: CustomElementCreationMode,
|
||||
proto: Option<HandleObject>,
|
||||
) -> DomRoot<Element> {
|
||||
let prefix = name.prefix.clone();
|
||||
match name.ns {
|
||||
ns!(html) => create_html_element(name, prefix, is, document, creator, mode),
|
||||
ns!(svg) => create_svg_element(name, prefix, document),
|
||||
_ => Element::new(name.local, name.ns, prefix, document),
|
||||
ns!(html) => create_html_element(name, prefix, is, document, creator, mode, proto),
|
||||
ns!(svg) => create_svg_element(name, prefix, document, proto),
|
||||
_ => Element::new(name.local, name.ns, prefix, document, proto),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue