diff options
author | Connor Brewster <connor.brewster@eagles.oc.edu> | 2017-07-19 12:58:15 -0600 |
---|---|---|
committer | Connor Brewster <connor.brewster@eagles.oc.edu> | 2017-08-09 11:06:22 -0600 |
commit | 8c5005fc44a61326579745dbfe094ea573581446 (patch) | |
tree | 5de222b8b1315b2d823a6fde1926710372b849da /components/script/dom/bindings/interface.rs | |
parent | 82de4c49f378aed7c9497ba6995020fa79dbf942 (diff) | |
download | servo-8c5005fc44a61326579745dbfe094ea573581446.tar.gz servo-8c5005fc44a61326579745dbfe094ea573581446.zip |
Add construction stack
Diffstat (limited to 'components/script/dom/bindings/interface.rs')
-rw-r--r-- | components/script/dom/bindings/interface.rs | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index 887a62f11eb..0df46f40241 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -80,6 +80,7 @@ use dom::bindings::guard::Guard; use dom::bindings::js::Root; use dom::bindings::utils::{DOM_PROTOTYPE_SLOT, ProtoOrIfaceArray, get_proto_or_iface_array}; use dom::create::create_native_html_element; +use dom::customelementregistry::ConstructionStackEntry; use dom::element::{Element, ElementCreator}; use dom::htmlelement::HTMLElement; use dom::window::Window; @@ -281,24 +282,42 @@ pub unsafe fn html_constructor<T>(window: &Window, call_args: &CallArgs) -> Fall } } - // Step 8.1 - let name = QualName::new(None, ns!(html), definition.local_name.clone()); - let element = if definition.is_autonomous() { - Root::upcast(HTMLElement::new(name.local, None, &*document)) - } else { - create_native_html_element(name, None, &*document, ElementCreator::ScriptCreated) - }; - - // Step 8.2 is performed in the generated caller code. - - // TODO: Step 8.3 - 8.4 - // Set the element's custom element state and definition. - - // Step 8.5 - Root::downcast(element).ok_or(Error::InvalidState) - - // TODO: Steps 9-13 - // Custom element upgrades are not implemented yet, so these steps are unnecessary. + let entry = definition.construction_stack.borrow().last().cloned(); + match entry { + // Step 8 + None => { + // Step 8.1 + let name = QualName::new(None, ns!(html), definition.local_name.clone()); + let element = if definition.is_autonomous() { + Root::upcast(HTMLElement::new(name.local, None, &*document)) + } else { + create_native_html_element(name, None, &*document, ElementCreator::ScriptCreated) + }; + + // Step 8.2 is performed in the generated caller code. + + // TODO: Step 8.3 - 8.4 + // Set the element's custom element state and definition. + element.set_custom_element_definition(definition.clone()); + + // Step 8.5 + Root::downcast(element).ok_or(Error::InvalidState) + }, + // Step 9 + Some(ConstructionStackEntry::Element(element)) => { + // Step 11 is performed in the generated caller code. + + // Step 12 + let mut construction_stack = definition.construction_stack.borrow_mut(); + construction_stack.pop(); + construction_stack.push(ConstructionStackEntry::AlreadyConstructedMarker); + + // Step 13 + Root::downcast(element).ok_or(Error::InvalidState) + }, + // Step 10 + Some(ConstructionStackEntry::AlreadyConstructedMarker) => Err(Error::InvalidState), + } } pub fn push_new_element_queue() { |