Index: third_party/WebKit/LayoutTests/imported/wpt/custom-elements/reaction-timing.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/reaction-timing.html b/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/reaction-timing.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9e5bafbedfec42d28eb94c95ed84396941bc61ac |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/custom-elements/reaction-timing.html |
@@ -0,0 +1,88 @@ |
+<!DOCTYPE html> |
+<html> |
+<head> |
+<title>Custom Elements: Custom element reactions must be invoked before returning to author scripts</title> |
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> |
+<meta name="assert" content="Custom element reactions must be invoked before returning to author scripts"> |
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions"> |
+<script src="/resources/testharness.js"></script> |
+<script src="/resources/testharnessreport.js"></script> |
+</head> |
+<body> |
+<div id="log"></div> |
+<script> |
+ |
+class MyCustomElement extends HTMLElement { |
+ attributeChangedCallback(...args) { |
+ this.handler(...args); |
+ } |
+ |
+ handler() { } |
+} |
+MyCustomElement.observedAttributes = ['data-title', 'title']; |
+customElements.define('my-custom-element', MyCustomElement); |
+ |
+test(function () { |
+ var instance = document.createElement('my-custom-element'); |
+ var anotherInstance = document.createElement('my-custom-element'); |
+ |
+ var callbackOrder = []; |
+ instance.handler = function () { |
+ callbackOrder.push([this, 'begin']); |
+ anotherInstance.setAttribute('data-title', 'baz'); |
+ callbackOrder.push([this, 'end']); |
+ } |
+ anotherInstance.handler = function () { |
+ callbackOrder.push([this, 'begin']); |
+ callbackOrder.push([this, 'end']); |
+ } |
+ |
+ instance.setAttribute('title', 'foo'); |
+ assert_equals(callbackOrder.length, 4); |
+ |
+ assert_array_equals(callbackOrder[0], [instance, 'begin']); |
+ assert_array_equals(callbackOrder[1], [anotherInstance, 'begin']); |
+ assert_array_equals(callbackOrder[2], [anotherInstance, 'end']); |
+ assert_array_equals(callbackOrder[3], [instance, 'end']); |
+ |
+}, 'setAttribute and removeAttribute must enqueue and invoke attributeChangedCallback'); |
+ |
+test(function () { |
+ var shouldCloneAnotherInstance = false; |
+ var anotherInstanceClone; |
+ var log = []; |
+ |
+ class SelfCloningElement extends HTMLElement { |
+ constructor() { |
+ super(); |
+ log.push([this, 'begin']); |
+ if (shouldCloneAnotherInstance) { |
+ shouldCloneAnotherInstance = false; |
+ anotherInstanceClone = anotherInstance.cloneNode(false); |
+ } |
+ log.push([this, 'end']); |
+ } |
+ } |
+ customElements.define('self-cloning-element', SelfCloningElement); |
+ |
+ var instance = document.createElement('self-cloning-element'); |
+ var anotherInstance = document.createElement('self-cloning-element'); |
+ shouldCloneAnotherInstance = true; |
+ |
+ assert_equals(log.length, 4); |
+ var instanceClone = instance.cloneNode(false); |
+ |
+ assert_equals(log.length, 8); |
+ assert_array_equals(log[0], [instance, 'begin']); |
+ assert_array_equals(log[1], [instance, 'end']); |
+ assert_array_equals(log[2], [anotherInstance, 'begin']); |
+ assert_array_equals(log[3], [anotherInstance, 'end']); |
+ assert_array_equals(log[4], [instanceClone, 'begin']); |
+ assert_array_equals(log[5], [anotherInstanceClone, 'begin']); |
+ assert_array_equals(log[6], [anotherInstanceClone, 'end']); |
+ assert_array_equals(log[7], [instanceClone, 'end']); |
+}, 'Calling Node.prototype.cloneNode(false) must push a new element queue to the processing stack'); |
+ |
+</script> |
+</body> |
+</html> |