diff options
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 |