aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/MANIFEST.json23
-rw-r--r--tests/wpt/metadata/css/css-values/vh-support-atviewport.html.ini2
-rw-r--r--tests/wpt/metadata/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html.ini7
-rw-r--r--tests/wpt/metadata/encoding/single-byte-decoder.html.ini7
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini7
-rw-r--r--tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini5
-rw-r--r--tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini3
-rw-r--r--tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini2
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm22
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/vh-support-atviewport.html51
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html223
18 files changed, 319 insertions, 54 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index e3a1ebe61ed..2341518ad75 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -158046,7 +158046,7 @@
"/css/css-values/vh-support-atviewport.html",
[
[
- "/css/css-values/reference/all-green.html",
+ "/css/css-values/reference/vh-support-atviewport-ref.htm",
"=="
]
],
@@ -275214,6 +275214,11 @@
{}
]
],
+ "css/css-values/reference/vh-support-atviewport-ref.htm": [
+ [
+ {}
+ ]
+ ],
"css/css-values/reference/vh_not_refreshing_on_chrome-ref.html": [
[
{}
@@ -353391,6 +353396,12 @@
{}
]
],
+ "custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html": [
+ [
+ "/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html",
+ {}
+ ]
+ ],
"custom-elements/historical.html": [
[
"/custom-elements/historical.html",
@@ -586988,6 +586999,10 @@
"962a748d2c059b45fca4d7788b04b77c61e0b923",
"support"
],
+ "css/css-values/reference/vh-support-atviewport-ref.htm": [
+ "cfa9e8d02d48436ee1c311da7c7bd65b0f4291cf",
+ "support"
+ ],
"css/css-values/reference/vh_not_refreshing_on_chrome-ref.html": [
"279d1c69b9f7fbe60edb55b7e8a5d507eda24936",
"support"
@@ -587225,7 +587240,7 @@
"reftest"
],
"css/css-values/vh-support-atviewport.html": [
- "c79ace6df18a7432dba34fa83cdb1af183206156",
+ "c1999c4a22e2933259b3f77193c2b20c3b53f199",
"reftest"
],
"css/css-values/vh-support-margin.html": [
@@ -608036,6 +608051,10 @@
"7f5a4d0f8e76d495acfdedfe172ef5acfdac75b4",
"testharness"
],
+ "custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html": [
+ "2fd932f29a3bae3e80ee90a1996c1d25ea7934cf",
+ "testharness"
+ ],
"custom-elements/historical.html": [
"70981ce59c41dd352bccf1b70a1cb7c8cecf30ec",
"testharness"
diff --git a/tests/wpt/metadata/css/css-values/vh-support-atviewport.html.ini b/tests/wpt/metadata/css/css-values/vh-support-atviewport.html.ini
new file mode 100644
index 00000000000..9d9d54aebb6
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/vh-support-atviewport.html.ini
@@ -0,0 +1,2 @@
+[vh-support-atviewport.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html.ini b/tests/wpt/metadata/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html.ini
new file mode 100644
index 00000000000..e2a1761324e
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html.ini
@@ -0,0 +1,7 @@
+[enqueue-custom-element-callback-reactions-inside-another-callback.html]
+ [Connecting an element without connectedCallback while it has a disconnectedCallback in its custom element reaction queue must not result in disconnectedCallback getting invoked before the insertion completes]
+ expected: FAIL
+
+ [Connecting a element with connectedCallback while it has a disconnectedCallback in its custom element reaction queue must result in disconnectedCallback getting invoked before the insertion completes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
index bc427d4a05a..7f1abc15692 100644
--- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
+++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
@@ -2,7 +2,7 @@
type: testharness
[single-byte-decoder.html?document]
- expected: TIMEOUT
+ expected: CRASH
[ISO-8859-4: iso_8859-4:1988 (document.characterSet and document.inputEncoding)]
expected: FAIL
@@ -32,7 +32,7 @@
[single-byte-decoder.html?XMLHttpRequest]
- expected: CRASH
+ expected: TIMEOUT
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
expected: FAIL
@@ -141,8 +141,5 @@
[windows-1254: cp1254 (XMLHttpRequest)]
expected: TIMEOUT
- [windows-1253: cp1253 (XMLHttpRequest)]
- expected: TIMEOUT
-
[single-byte-decoder.html?TextDecoder]
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
deleted file mode 100644
index 75d75b4cda2..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_2.html]
- [Multiple history traversals, last would be aborted]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
deleted file mode 100644
index 385376c7321..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_4.html]
- [Multiple history traversals, last would be aborted]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini
index 6f7e41795a2..772148dc71f 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini
@@ -11,5 +11,5 @@
expected: TIMEOUT
[picture: source (max-width:500px) valid image, img valid image, resize to narrow]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
new file mode 100644
index 00000000000..9e522297c94
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
@@ -0,0 +1,7 @@
+[toggleEvent.html]
+ [Calling open twice on 'details' fires only one toggle event]
+ expected: FAIL
+
+ [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini
deleted file mode 100644
index c6d49957c4a..00000000000
--- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[aborted-parser.window.html]
- [document.open() after parser is aborted]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
new file mode 100644
index 00000000000..63682614c4f
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
@@ -0,0 +1,5 @@
+[promise-rejection-events.html]
+ expected: TIMEOUT
+ [rejectionhandled is dispatched from a queued task, and not immediately]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
index 99a24216c88..7725b118e9d 100644
--- a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
+++ b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
@@ -12,3 +12,6 @@
[Verifies the resolution of entry.startTime is at least 5 microseconds.]
expected: TIMEOUT
+ [Verifies the resolution of performance.now() is at least 5 microseconds.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini b/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini
index 88339633554..4f9df99fc13 100644
--- a/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini
+++ b/tests/wpt/metadata/resource-timing/buffer-full-store-and-clear-during-callback.html.ini
@@ -1,5 +1,5 @@
[buffer-full-store-and-clear-during-callback.html]
- expected: TIMEOUT
+ expected: ERROR
[Test that entries overflowing the buffer trigger the buffer full event, can be stored, and find themselves in the primary buffer after it's cleared.]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index 66bd350083b..a56bad443a2 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html]
+ expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL
diff --git a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini
deleted file mode 100644
index dbea4f293ad..00000000000
--- a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[transition_calc_implicit.html]
- expected: TIMEOUT
diff --git a/tests/wpt/web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm b/tests/wpt/web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm
new file mode 100644
index 00000000000..cfa9e8d02d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html><head>
+ <meta charset="utf-8">
+ <title>
+ CSS Reftest Reference
+ </title>
+
+ <link href="mailto:fremycompany.developer@yahoo.fr" rel="author" title="François REMY">
+
+ <style type="text/css">
+ html
+ {
+ background-color: yellow;
+ border-left: blue solid 50vw;
+ height: 100vh;
+ }
+ </style>
+
+</head>
+<body>
+
+</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-values/vh-support-atviewport.html b/tests/wpt/web-platform-tests/css/css-values/vh-support-atviewport.html
index c79ace6df18..c1999c4a22e 100644
--- a/tests/wpt/web-platform-tests/css/css-values/vh-support-atviewport.html
+++ b/tests/wpt/web-platform-tests/css/css-values/vh-support-atviewport.html
@@ -1,44 +1,41 @@
<!DOCTYPE html>
-<html>
-<head>
+<html><head>
<meta charset="utf-8">
<title>
CSS Values and Units Test:
Viewports units are supported in @viewport rules
</title>
- <meta name="assert" content="
+ <meta content="
Viewports units are supported in @viewport rules
- " />
+ " name="assert">
- <link
- rel="author"
- title="François REMY"
- href="mailto:fremycompany.developer@yahoo.fr"
- />
+ <link href="mailto:fremycompany.developer@yahoo.fr" rel="author" title="François REMY">
- <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths" />
- <link rel="help" href="https://drafts.csswg.org/css-device-adapt-1/" />
+ <link href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths" rel="help">
+ <link href="https://drafts.csswg.org/css-device-adapt-1/#atviewport-rule" rel="help">
- <link
- rel="match"
- href="reference/all-green.html"
- />
+ <link href="reference/vh-support-atviewport-ref.htm" rel="match">
<style type="text/css">
-
- html, body { margin: 0px; padding: 0px; overflow: hidden; }
-
- @viewport { width: 1vw; }
-
- html { background: red; }
- #target { background: green; width: 100vw; height: 100vh; }
-
+ html
+ {
+ background-color: yellow;
+ }
+
+ body
+ {
+ background-color: blue;
+ height: 100vh;
+ margin: 0;
+ }
+
+ @viewport
+ {
+ width: 50vw;
+ }
</style>
</head>
<body>
- <div id="target"></div>
-
-</body>
-</html>
+</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html b/tests/wpt/web-platform-tests/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html
new file mode 100644
index 00000000000..2fd932f29a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/enqueue-custom-element-callback-reactions-inside-another-callback.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: must enqueue an element on the appropriate element queue after checking callback is null and the attribute name</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="To enqueue a custom element callback reaction, the callback must be checked of being null and whether the attribute name is observed or not">
+<link rel="help" content="https://html.spec.whatwg.org/multipage/custom-elements.html#enqueue-a-custom-element-callback-reaction">
+<link rel="help" content="https://github.com/w3c/webcomponents/issues/760">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<script>
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ const child = this.firstChild;
+ child.remove();
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ connectedCallback() { logs.push('connected'); }
+ disconnectedCallback() { logs.push('disconnected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'connected', 'disconnected', 'end']);
+}, 'Disconnecting an element with disconnectedCallback while it has a connectedCallback in its custom element reaction queue must result in connectedCallback getting invoked before the removal completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ const child = this.firstChild;
+ child.remove();
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ connectedCallback() { logs.push('connected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'end', 'connected']);
+}, 'Disconnecting an element without disconnectedCallback while it has a connectedCallback in its custom element reaction queue must not result in connectedCallback getting invoked before the removal completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ disconnectedCallback()
+ {
+ logs.push('begin');
+ contentDocument.body.appendChild(this.firstChild);
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ connectedCallback() { logs.push('connected'); }
+ disconnectedCallback() { logs.push('disconnected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ parent.remove();
+ assert_array_equals(logs, ['connected', 'begin', 'disconnected', 'connected', 'end']);
+}, 'Connecting a element with connectedCallback while it has a disconnectedCallback in its custom element reaction queue must result in disconnectedCallback getting invoked before the insertion completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ disconnectedCallback()
+ {
+ logs.push('begin');
+ contentDocument.body.appendChild(this.firstChild);
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ disconnectedCallback() { logs.push('disconnected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ parent.remove();
+ assert_array_equals(logs, ['begin', 'end', 'disconnected']);
+}, 'Connecting an element without connectedCallback while it has a disconnectedCallback in its custom element reaction queue must not result in disconnectedCallback getting invoked before the insertion completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ document.adoptNode(this.firstChild);
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ adoptedCallback() { logs.push('adopted'); }
+ connectedCallback() { logs.push('connected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'connected', 'adopted', 'end']);
+}, 'Adopting an element with adoptingCallback while it has a connectedCallback in its custom element reaction queue must result in connectedCallback getting invoked before the adoption completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ document.adoptNode(this.firstChild);
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ connectedCallback() { logs.push('connected'); }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'end', 'connected']);
+}, 'Adopting an element without adoptingCallback while it has a connectedCallback in its custom element reaction queue must not result in connectedCallback getting invoked before the adoption completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ this.firstChild.setAttribute('title', 'foo');
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ attributeChangedCallback() { logs.push('attributeChanged'); }
+ connectedCallback() { logs.push('connected'); }
+ static get observedAttributes() { return ['title']; }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'connected', 'attributeChanged', 'end']);
+}, 'Setting an observed attribute on an element with attributeChangedCallback while it has a connectedCallback in its custom element reaction queue must result in connectedCallback getting invoked before the attribute change completes');
+
+test_with_window((contentWindow, contentDocument) => {
+ class ParentElement extends contentWindow.HTMLElement {
+ connectedCallback()
+ {
+ logs.push('begin');
+ this.firstChild.setAttribute('lang', 'en');
+ logs.push('end');
+ }
+ }
+ contentWindow.customElements.define('parent-element', ParentElement);
+
+ const logs = [];
+ class ChildElement extends contentWindow.HTMLElement {
+ attributeChangedCallback() { logs.push('attributeChanged'); }
+ connectedCallback() { logs.push('connected'); }
+ static get observedAttributes() { return ['title']; }
+ }
+ contentWindow.customElements.define('child-element', ChildElement);
+
+ const parent = new ParentElement;
+ const child = new ChildElement;
+ parent.appendChild(child);
+ contentDocument.body.appendChild(parent);
+ assert_array_equals(logs, ['begin', 'end', 'connected']);
+}, 'Setting an observed attribute on an element with attributeChangedCallback while it has a connectedCallback in its custom element reaction queue must not result in connectedCallback getting invoked before the attribute change completes');
+
+</script>
+</body>
+</html>