aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/interface.rs
diff options
context:
space:
mode:
authorConnor Brewster <connor.brewster@eagles.oc.edu>2017-07-19 12:58:15 -0600
committerConnor Brewster <connor.brewster@eagles.oc.edu>2017-08-09 11:06:22 -0600
commit8c5005fc44a61326579745dbfe094ea573581446 (patch)
tree5de222b8b1315b2d823a6fde1926710372b849da /components/script/dom/bindings/interface.rs
parent82de4c49f378aed7c9497ba6995020fa79dbf942 (diff)
downloadservo-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.rs55
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() {