apply is: to Document.createElement even when name isn't registered yet

This commit is contained in:
Patrick Shaughnessy 2019-12-22 20:46:31 -05:00
parent 3e77a0ae09
commit 14d278ff1c
6 changed files with 37 additions and 244 deletions

View file

@ -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
}

View file

@ -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 {

View file

@ -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

View file

@ -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

View file

@ -1,7 +1,4 @@
[Document-importNode.html]
[built-in: document.importNode() should import "undefined" custom elements successfully]
expected: FAIL
[Document-importNode]
expected: FAIL

View file

@ -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