aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/create.rs19
-rw-r--r--components/script/dom/customelementregistry.rs37
-rw-r--r--tests/wpt/metadata/custom-elements/Document-createElement.html.ini3
-rw-r--r--tests/wpt/metadata/custom-elements/builtin-coverage.html.ini216
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini3
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini3
6 files changed, 37 insertions, 244 deletions
diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs
index e992a8707dd..c45e4286992 100644
--- a/components/script/dom/create.rs
+++ b/components/script/dom/create.rs
@@ -189,14 +189,21 @@ fn create_html_element(
}
}
- // Steps 7.1-7.2
+ // Steps 7.1-7.3
let result = create_native_html_element(name.clone(), prefix, document, creator);
+ match is {
+ Some(is) => {
+ result.set_is(is);
+ result.set_custom_element_state(CustomElementState::Undefined);
+ },
+ None => {
+ if is_valid_custom_element_name(&*name.local) {
+ result.set_custom_element_state(CustomElementState::Undefined);
+ }
+ },
+ };
- // Step 7.3
- if is_valid_custom_element_name(&*name.local) || is.is_some() {
- result.set_custom_element_state(CustomElementState::Undefined);
- }
-
+ // Step 8
result
}
diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs
index 7b4229835e2..dbeacdc7ebb 100644
--- a/components/script/dom/customelementregistry.rs
+++ b/components/script/dom/customelementregistry.rs
@@ -581,7 +581,9 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
return;
}
- // Step 3
+ // Step 3 happens later to save having to undo it in an exception
+
+ // Step 4
for attr in element.attrs().iter() {
let local_name = attr.local_name().clone();
let value = DOMString::from(&**attr.value());
@@ -593,7 +595,7 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
);
}
- // Step 4
+ // Step 5
if element.is_connected() {
ScriptThread::enqueue_callback_reaction(
element,
@@ -602,44 +604,51 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
);
}
- // Step 5
+ // Step 6
definition
.construction_stack
.borrow_mut()
.push(ConstructionStackEntry::Element(DomRoot::from_ref(element)));
- // Step 7
+ // Steps 7-8, successful case
let result = run_upgrade_constructor(&definition.constructor, element);
+ // "regardless of whether the above steps threw an exception" step
definition.construction_stack.borrow_mut().pop();
- // Step 7 exception handling
+ // Step 8 exception handling
if let Err(error) = result {
- // Step 7.1
+ // Step 8.exception.1
element.set_custom_element_state(CustomElementState::Failed);
- // Step 7.2
+ // Step 8.exception.2 isn't needed since step 3 hasn't happened yet
+
+ // Step 8.exception.3
element.clear_reaction_queue();
- // Step 7.3
+ // Step 8.exception.4
let global = GlobalScope::current().expect("No current global");
let cx = global.get_cx();
unsafe {
throw_dom_exception(cx, &global, error);
report_pending_exception(*cx, true);
}
+
return;
}
- // Step 8
+ // TODO Step 9: "If element is a form-associated custom element..."
+
+ // Step 10
+
element.set_custom_element_state(CustomElementState::Custom);
- // Step 9
+ // Step 3
element.set_custom_element_definition(definition);
}
/// <https://html.spec.whatwg.org/multipage/#concept-upgrade-an-element>
-/// Steps 7.1-7.2
+/// Steps 8.1-8.3
#[allow(unsafe_code)]
fn run_upgrade_constructor(
constructor: &Rc<CustomElementConstructor>,
@@ -654,10 +663,12 @@ fn run_upgrade_constructor(
}
rooted!(in(*cx) let mut construct_result = ptr::null_mut::<JSObject>());
{
+ // Step 8.1 TODO when shadow DOM exists
+
// Go into the constructor's compartment
let _ac = JSAutoRealm::new(*cx, constructor.callback());
let args = HandleValueArray::new();
- // Step 7.1
+ // Step 8.2
if unsafe {
!Construct1(
*cx,
@@ -668,7 +679,7 @@ fn run_upgrade_constructor(
} {
return Err(Error::JSFailed);
}
- // Step 7.2
+ // Step 8.3
let mut same = false;
rooted!(in(*cx) let construct_result_val = ObjectValue(construct_result.get()));
if unsafe {
diff --git a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
index 228fc09afd7..174f0d03891 100644
--- a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
+++ b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
@@ -1,7 +1,4 @@
[Document-createElement.html]
- [document.createElement with unknown "is" value should create "undefined" state element]
- expected: FAIL
-
[document.createElement must create an instance of autonomous custom elements when it has is attribute]
expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
index 92de0b6d054..196dd3decbd 100644
--- a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
+++ b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
@@ -8,437 +8,221 @@
[a: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [a: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[abbr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [abbr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[address: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [address: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[area: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [area: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[article: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [article: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[aside: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [aside: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[audio: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [audio: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[b: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [b: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[base: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [base: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[bdi: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [bdi: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[bdo: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [bdo: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[blockquote: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [blockquote: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[body: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [body: document parser should instantiate a customized built-in element]
- expected: FAIL
[br: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [br: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[button: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [button: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[canvas: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [canvas: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[caption: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [caption: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[cite: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [cite: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[code: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [code: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[col: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [col: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[colgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [colgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[data: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [data: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[datalist: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [datalist: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dd: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dd: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[del: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [del: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[details: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [details: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dfn: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dfn: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dialog: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dialog: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[div: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [div: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dl: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dl: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dt: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dt: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[em: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [em: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[embed: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [embed: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[fieldset: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [fieldset: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[figcaption: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [figcaption: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[figure: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [figure: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[footer: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [footer: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[form: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [form: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h1: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h1: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h2: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h2: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h3: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h3: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h4: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h4: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h5: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h5: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h6: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h6: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[header: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [header: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[hgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [hgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[hr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [hr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[html: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [html: document parser should instantiate a customized built-in element]
- expected: FAIL
[i: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [i: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[iframe: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [iframe: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[img: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [img: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[input: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [input: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ins: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ins: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[kbd: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [kbd: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[label: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [label: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[legend: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [legend: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[li: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [li: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[link: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [link: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[main: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [main: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[map: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [map: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[mark: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [mark: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[menu: Define a customized built-in element]
expected: FAIL
[meta: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [meta: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[meter: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [meter: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[nav: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [nav: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[noscript: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [noscript: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[object: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [object: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ol: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ol: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[optgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [optgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[option: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [option: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[output: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [output: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[p: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [p: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[param: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [param: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[picture: Define a customized built-in element]
expected: FAIL
[pre: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [pre: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[progress: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [progress: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[q: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [q: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[rp: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [rp: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[rt: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [rt: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ruby: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ruby: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[s: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [s: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[samp: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [samp: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[script: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [script: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[section: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [section: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[select: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [select: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[small: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [small: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[source: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [source: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[span: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [span: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[strong: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [strong: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[style: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [style: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[sub: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [sub: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[summary: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [summary: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[sup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [sup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[table: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [table: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tbody: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tbody: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[td: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [td: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[template: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [template: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[textarea: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [textarea: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tfoot: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tfoot: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[th: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [th: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[thead: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [thead: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[time: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [time: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[title: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [title: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[track: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [track: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[u: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [u: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ul: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ul: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[var: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [var: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[video: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [video: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[wbr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [wbr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
index 589b0d6ff32..e7c91ebb270 100644
--- a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
+++ b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
@@ -1,7 +1,4 @@
[Document-importNode.html]
- [built-in: document.importNode() should import "undefined" custom elements successfully]
- expected: FAIL
-
[Document-importNode]
expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini
deleted file mode 100644
index 503570bcb71..00000000000
--- a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[Node-cloneNode.html]
- [Node.prototype.cloneNode(false) must be able to clone as a customized built-in element when it has an inconsistent "is" attribute]
- expected: FAIL