Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1721)

Unified Diff: third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html

Issue 2089383003: Added test for step 2, 14 in define element. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html b/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
index b3fed436a10a506f3eed44e807c7e5ae27e0f68d..059855c3f9205c55fe1f8faea6022e7b9aa35471 100644
--- a/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
@@ -64,9 +64,7 @@ test_with_window((w) => {
'a NotSupportedError');
}, 'Duplicate name');
-// TODO(dominicc): Update this (perhaps by removing this comment) when
-// https://github.com/whatwg/html/pull/1333 lands/issue
-// https://github.com/whatwg/html/issues/1329 is closed.
+
dominicc (has gone to gerrit) 2016/06/23 04:13:10 Delete this blank line; put just one blank line be
test_with_window((w) => {
class Y extends w.HTMLElement {}
let X = (function () {}).bind({});
@@ -79,13 +77,9 @@ test_with_window((w) => {
return new Object();
}
});
- // TODO(dominicc): When callback retrieval is implemented, change this
- // to pass a valid constructor and recursively call define when retrieving
- // callbacks instead; then it is possible to assert the first definition
- // worked:
- // let element = Reflect.construct(HTMLElement, [], X);
- // assert_equals(element.localName, 'a-a');
w.customElements.define('a-a', X);
+ assert_true(w.customElements.get('a-a') === X, 'asserting that the first definition worked');
dominicc (has gone to gerrit) 2016/06/23 04:13:10 Don't put "asserting" in the message because that'
+ assert_false(w.customElements.get('a-a') === Y, 'asserting that the first definition worked');
dominicc (has gone to gerrit) 2016/06/23 04:13:10 You can probably omit this assertion; it is not ve
}, 'Duplicate name defined recursively');
test_with_window((w) => {
@@ -97,9 +91,6 @@ test_with_window((w) => {
'registry should throw a NotSupportedError');
}, 'Reused constructor');
-// TODO(dominicc): Update this (perhaps by removing this comment) when
-// https://github.com/whatwg/html/pull/1333 lands/issue
-// https://github.com/whatwg/html/issues/1329 is closed.
test_with_window((w) => {
let X = (function () {}).bind({});
Object.defineProperty(X, 'prototype', {
@@ -111,13 +102,9 @@ test_with_window((w) => {
return new Object();
}
});
- // TODO(dominicc): When callback retrieval is implemented, change this
- // to pass a valid constructor and recursively call define when retrieving
- // callbacks instead; then it is possible to assert the first definition
- // worked:
- // let element = Reflect.construct(HTMLElement, [], X);
- // assert_equals(element.localName, 'a-a');
w.customElements.define('first-name', X);
+ assert_true(w.customElements.get('first-name') === X, 'asserting that the first definition worked');
+ assert_false(w.customElements.get('second-name') === X, 'asserting that the first definition worked');
}, 'Reused constructor recursively');
test_with_window((w) => {
@@ -192,6 +179,7 @@ test_with_window((w) => {
'document element');
}, 'Upgrade: sets prototype of existing elements');
+
test_with_window((w) => {
let doc = w.document;
var shadow = doc.body.attachShadow({mode: 'open'});
@@ -209,4 +197,96 @@ test_with_window((w) => {
'the constructor should have been invoked once for the ' +
'elements in the shadow tree');
}, 'Upgrade: shadow tree');
+
+test_with_window((w) => {
+ let invocations = [];
dominicc (has gone to gerrit) 2016/06/23 04:13:10 There's only one thing going into invocations, so
+ class Y extends w.HTMLElement {}
+ let X = (function () {}).bind({});
+ Object.defineProperty(X, 'prototype', {
+ get() { throw 42; }
+ });
+ try {
+ w.customElements.define('a-a', X);
+ } catch(e) {
+ invocations.push(e);
+ }
+ assert_equals(invocations[0], 42, 'rethrows Get(constructor, "prototype") exception');
+ w.customElements.define('a-a', Y);
+ assert_true(w.customElements.get('a-a') === Y, 'algorithm terminates when the first set of steps threw an exception');
dominicc (has gone to gerrit) 2016/06/23 04:13:10 "the first set of steps" is a bit vague. This desc
+}, 'If an exception is thrown, rethrow that exception and terminate the algorithm');
+
+test_with_window((w) => {
dominicc (has gone to gerrit) 2016/06/23 04:13:10 Tests from here vvv
+ function F() {}
+ F.prototype = new Object();
+ Object.defineProperty(F.prototype, 'connectedCallback', {
+ get() { return new Object(); }
+ });
+ assert_throws(TypeError.prototype, () => {
+ w.customElements.define('a-a', F);
+ }, 'defining an element with a constructor with a connectedCallback that is ' +
+ 'not undefined and not callable should throw a TypeError');
+}, 'Retrieved connectedCallback is not undefined and not callable');
+
+test_with_window((w) => {
+ function F() {}
+ F.prototype = new Object();
+ Object.defineProperty(F.prototype, 'disconnectedCallback', {
+ get() { return new Object(); }
+ });
+ assert_throws(TypeError.prototype, () => {
+ w.customElements.define('a-a', F);
+ }, 'defining an element with a constructor with a disconnectedCallback that is ' +
+ 'not undefined and not callable should throw a TypeError');
+}, 'Retrieved disconnectedCallback is not undefined and not callable');
+
+test_with_window((w) => {
+ function F() {}
+ F.prototype = new Object();
+ Object.defineProperty(F.prototype, 'attributeChangedCallback', {
+ get() {return new Object(); }
+ });
+ assert_throws(TypeError.prototype, () => {
+ w.customElements.define('a-a', F);
+ }, 'defining an element with a constructor with a attribiteChangedCallback that is ' +
+ 'not undefined and not callable should throw a TypeError');
+}, 'Retrieved attrbuteChangedCallback is not undefined and not callable');
dominicc (has gone to gerrit) 2016/06/23 04:13:10 ... to here ^^^ are perfect. Good work.
+
+// should be TypeError
+test_with_window((w) => {
+ let invalid_name = 'annotation-xml';
+ assert_throws('SYNTAX_ERR', () => {
dominicc (has gone to gerrit) 2016/06/23 04:13:10 The implementation has a bug you found--awesome. W
+ w.customElements.define(invalid_name, HTMLElement);
+ }, 'defining a constructor that is an interface object whose interface is HTMLElement' +
+ 'should throw TypeError not SyntaxError');
dominicc (has gone to gerrit) 2016/06/23 04:13:09 Let's put a comment mentioning the exact step. Th
+}, 'Invalid constructor');
+
+// should be TypeError
+test_with_window((w) => {
+ let invalid_name = 'annotation-xml';
+ assert_throws('SYNTAX_ERR', () => {
+ w.customElements.define(invalid_name, HTMLButtonElement);
+ }, 'defining a constructor that is an interface object who has HTMLElement in its set of inhertied interfaces' +
+ 'should throw TypeError not SyntaxError');
+}, 'Invalid constructor');
+
+
+test_with_window((w) => {
+ let invalid_name = 'annotation-xml';
+ assert_throws('SYNTAX_ERR', () => {
+ w.customElements.define(invalid_name, class extends HTMLElement {});
+ }, 'defining author-defined custom element constructor' +
+ 'should pass this step without throwing TypeError');
+}, 'Invalid constructor');
+
+
+test_with_window((w) => {
+ let element = w.document.createElement('a-a');
+ w.document.body.appendChild(element);
+ w.customElements.define('a-a', Set);
+ assert_true(w.customElements.get('a-a') === Set, 'definition is added to CustomElementRegistry');
+ assert_equals(element.matches(':defined'), false, 'fails during upgrade');
+ assert_equals(element.matches(':not(:defined)'), true, 'fails during upgrade');
+}, 'Invalid constructor');
+
+
</script>
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698