Update web-platform-tests to revision fd0429f0b45f975b25d85256dac33762134952c5

This commit is contained in:
WPT Sync Bot 2019-04-15 21:58:05 -04:00
parent 0ba7da4431
commit c8202ddbe1
50 changed files with 1210 additions and 191 deletions

View file

@ -0,0 +1,27 @@
[Blob-array-buffer.any.html]
[Blob.arrayBuffer() non-unicode input]
expected: FAIL
[Blob.arrayBuffer()]
expected: FAIL
[Blob.arrayBuffer() non-ascii input]
expected: FAIL
[Blob.arrayBuffer() empty Blob data]
expected: FAIL
[Blob-array-buffer.any.worker.html]
[Blob.arrayBuffer() non-unicode input]
expected: FAIL
[Blob.arrayBuffer()]
expected: FAIL
[Blob.arrayBuffer() non-ascii input]
expected: FAIL
[Blob.arrayBuffer() empty Blob data]
expected: FAIL

View file

@ -0,0 +1,21 @@
[Blob-stream.any.worker.html]
[Blob.stream() empty Blob]
expected: FAIL
[Blob.stream()]
expected: FAIL
[Blob.stream() non-unicode input]
expected: FAIL
[Blob-stream.any.html]
[Blob.stream() empty Blob]
expected: FAIL
[Blob.stream()]
expected: FAIL
[Blob.stream() non-unicode input]
expected: FAIL

View file

@ -0,0 +1,45 @@
[Blob-text.any.html]
[Blob.text() different charset param in type option]
expected: FAIL
[Blob.text() different charset param with non-ascii input]
expected: FAIL
[Blob.text() multi-element array in constructor]
expected: FAIL
[Blob.text() invalid utf-8 input]
expected: FAIL
[Blob.text() non-unicode]
expected: FAIL
[Blob.text()]
expected: FAIL
[Blob.text() empty blob data]
expected: FAIL
[Blob-text.any.worker.html]
[Blob.text() different charset param in type option]
expected: FAIL
[Blob.text() different charset param with non-ascii input]
expected: FAIL
[Blob.text() multi-element array in constructor]
expected: FAIL
[Blob.text() invalid utf-8 input]
expected: FAIL
[Blob.text() non-unicode]
expected: FAIL
[Blob.text()]
expected: FAIL
[Blob.text() empty blob data]
expected: FAIL

View file

@ -18,3 +18,30 @@
[File API automated IDL tests] [File API automated IDL tests]
expected: FAIL expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "text()" with the proper type]
expected: FAIL
[Blob interface: operation stream()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "arrayBuffer()" with the proper type]
expected: FAIL
[Blob interface: operation text()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "text()" with the proper type]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "stream()" with the proper type]
expected: FAIL
[Blob interface: operation arrayBuffer()]
expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "stream()" with the proper type]
expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "arrayBuffer()" with the proper type]
expected: FAIL

View file

@ -30,3 +30,30 @@
[idlharness] [idlharness]
expected: FAIL expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "text()" with the proper type]
expected: FAIL
[Blob interface: operation stream()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "arrayBuffer()" with the proper type]
expected: FAIL
[Blob interface: operation text()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "text()" with the proper type]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "stream()" with the proper type]
expected: FAIL
[Blob interface: operation arrayBuffer()]
expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "stream()" with the proper type]
expected: FAIL
[Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "arrayBuffer()" with the proper type]
expected: FAIL

View file

@ -292127,6 +292127,11 @@
{} {}
] ]
], ],
"feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html.headers": [
[
{}
]
],
"feature-policy/experimental-features/resources/animation-property-height.js": [ "feature-policy/experimental-features/resources/animation-property-height.js": [
[ [
{} {}
@ -319252,7 +319257,7 @@
{} {}
] ]
], ],
"tools/manifest/tests/test_vcs.py": [ "tools/manifest/tests/test_utils.py": [
[ [
{} {}
] ]
@ -337034,6 +337039,38 @@
{} {}
] ]
], ],
"FileAPI/blob/Blob-array-buffer.any.js": [
[
"FileAPI/blob/Blob-array-buffer.any.html",
{
"script_metadata": [
[
"title",
"Blob Array Buffer"
],
[
"script",
"../support/Blob.js"
]
]
}
],
[
"FileAPI/blob/Blob-array-buffer.any.worker.html",
{
"script_metadata": [
[
"title",
"Blob Array Buffer"
],
[
"script",
"../support/Blob.js"
]
]
}
]
],
"FileAPI/blob/Blob-constructor-endings.html": [ "FileAPI/blob/Blob-constructor-endings.html": [
[ [
"FileAPI/blob/Blob-constructor-endings.html", "FileAPI/blob/Blob-constructor-endings.html",
@ -337064,6 +337101,70 @@
{} {}
] ]
], ],
"FileAPI/blob/Blob-stream.any.js": [
[
"FileAPI/blob/Blob-stream.any.html",
{
"script_metadata": [
[
"title",
"Blob Stream"
],
[
"script",
"../support/Blob.js"
]
]
}
],
[
"FileAPI/blob/Blob-stream.any.worker.html",
{
"script_metadata": [
[
"title",
"Blob Stream"
],
[
"script",
"../support/Blob.js"
]
]
}
]
],
"FileAPI/blob/Blob-text.any.js": [
[
"FileAPI/blob/Blob-text.any.html",
{
"script_metadata": [
[
"title",
"Blob Text"
],
[
"script",
"../support/Blob.js"
]
]
}
],
[
"FileAPI/blob/Blob-text.any.worker.html",
{
"script_metadata": [
[
"title",
"Blob Text"
],
[
"script",
"../support/Blob.js"
]
]
}
]
],
"FileAPI/file/File-constructor-endings.html": [ "FileAPI/file/File-constructor-endings.html": [
[ [
"FileAPI/file/File-constructor-endings.html", "FileAPI/file/File-constructor-endings.html",
@ -360283,6 +360384,18 @@
{} {}
] ]
], ],
"css/css-text-decor/parsing/text-decoration-line-invalid.html": [
[
"css/css-text-decor/parsing/text-decoration-line-invalid.html",
{}
]
],
"css/css-text-decor/parsing/text-decoration-line-valid.html": [
[
"css/css-text-decor/parsing/text-decoration-line-valid.html",
{}
]
],
"css/css-text-decor/text-decoration-serialization.tentative.html": [ "css/css-text-decor/text-decoration-serialization.tentative.html": [
[ [
"css/css-text-decor/text-decoration-serialization.tentative.html", "css/css-text-decor/text-decoration-serialization.tentative.html",
@ -380835,6 +380948,12 @@
{} {}
] ]
], ],
"feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html": [
[
"feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html",
{}
]
],
"feature-policy/experimental-features/sync-script.tentative.https.sub.html": [ "feature-policy/experimental-features/sync-script.tentative.https.sub.html": [
[ [
"feature-policy/experimental-features/sync-script.tentative.https.sub.html", "feature-policy/experimental-features/sync-script.tentative.https.sub.html",
@ -384370,6 +384489,18 @@
{} {}
] ]
], ],
"fetch/sec-metadata/prefetch.tentative.https.sub.html": [
[
"fetch/sec-metadata/prefetch.tentative.https.sub.html",
{}
]
],
"fetch/sec-metadata/preload.tentative.https.sub.html": [
[
"fetch/sec-metadata/preload.tentative.https.sub.html",
{}
]
],
"fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html": [ "fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html": [
[ [
"fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html", "fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html",
@ -387445,6 +387576,12 @@
{} {}
] ]
], ],
"html/dom/elements/global-attributes/dataset-binding.window.js": [
[
"html/dom/elements/global-attributes/dataset-binding.window.html",
{}
]
],
"html/dom/elements/global-attributes/dataset-delete.html": [ "html/dom/elements/global-attributes/dataset-delete.html": [
[ [
"html/dom/elements/global-attributes/dataset-delete.html", "html/dom/elements/global-attributes/dataset-delete.html",
@ -416189,6 +416326,12 @@
{} {}
] ]
], ],
"portals/portal-activate-event-constructor.html": [
[
"portals/portal-activate-event-constructor.html",
{}
]
],
"portals/portal-activate-event.html": [ "portals/portal-activate-event.html": [
[ [
"portals/portal-activate-event.html", "portals/portal-activate-event.html",
@ -442657,6 +442800,12 @@
{} {}
] ]
], ],
"webaudio/the-audio-api/the-audioworklet-interface/audioworklet-suspend.https.html": [
[
"webaudio/the-audio-api/the-audioworklet-interface/audioworklet-suspend.https.html",
{}
]
],
"webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html": [ "webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html": [
[ [
"webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html", "webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html",
@ -478714,6 +478863,10 @@
"506a59fec1eb33661658850254344e264c323c2e", "506a59fec1eb33661658850254344e264c323c2e",
"support" "support"
], ],
"FileAPI/blob/Blob-array-buffer.any.js": [
"b72427fd5cfaf60ab665eb30e31a4654c4169d01",
"testharness"
],
"FileAPI/blob/Blob-constructor-endings.html": [ "FileAPI/blob/Blob-constructor-endings.html": [
"1dee99ff775da3562194719be06b711c246b30ef", "1dee99ff775da3562194719be06b711c246b30ef",
"testharness" "testharness"
@ -478734,6 +478887,14 @@
"03fe6ca5343bd1dbac65c2d885a7eb79f064d99e", "03fe6ca5343bd1dbac65c2d885a7eb79f064d99e",
"testharness" "testharness"
], ],
"FileAPI/blob/Blob-stream.any.js": [
"894f09f8ece47cab1301b8b474285204a4b7c4f1",
"testharness"
],
"FileAPI/blob/Blob-text.any.js": [
"960c96054627fce66631f7bf59516cc6797d8521",
"testharness"
],
"FileAPI/file/File-constructor-endings.html": [ "FileAPI/file/File-constructor-endings.html": [
"f0f9090768f48e25fb7fd47e5cd182bf11f065e4", "f0f9090768f48e25fb7fd47e5cd182bf11f065e4",
"testharness" "testharness"
@ -478867,7 +479028,7 @@
"support" "support"
], ],
"FileAPI/support/Blob.js": [ "FileAPI/support/Blob.js": [
"1d66f23a6040f37ded99531627d0bc1ebdd9130f", "04069acd3ccbe713ad03f6e0a7d63f3e5a3c81b9",
"support" "support"
], ],
"FileAPI/support/document-domain-setter.sub.html": [ "FileAPI/support/document-domain-setter.sub.html": [
@ -602326,6 +602487,14 @@
"633c5c00392711f1fe1911a07f9cf53c3cd702e9", "633c5c00392711f1fe1911a07f9cf53c3cd702e9",
"reftest" "reftest"
], ],
"css/css-text-decor/parsing/text-decoration-line-invalid.html": [
"ec8d792c0a803dc726b01e762602b717befc5426",
"testharness"
],
"css/css-text-decor/parsing/text-decoration-line-valid.html": [
"3dd2d0c834ec8c7340b093a4c7a1272fb35a8a26",
"testharness"
],
"css/css-text-decor/reference/line-through-vertical-ref.html": [ "css/css-text-decor/reference/line-through-vertical-ref.html": [
"979512787a18ec9cbed7e9baf4b2cbd57ab99d33", "979512787a18ec9cbed7e9baf4b2cbd57ab99d33",
"support" "support"
@ -640455,7 +640624,7 @@
"testharness" "testharness"
], ],
"custom-elements/upgrading/Node-cloneNode.html": [ "custom-elements/upgrading/Node-cloneNode.html": [
"1a8786e914b9974ce114e9cda227823b3ea4a161", "364cecd76debd8b9657392641267be5f0918e84d",
"testharness" "testharness"
], ],
"custom-elements/upgrading/upgrading-enqueue-reactions.html": [ "custom-elements/upgrading/upgrading-enqueue-reactions.html": [
@ -640463,7 +640632,7 @@
"testharness" "testharness"
], ],
"custom-elements/upgrading/upgrading-parser-created-element.html": [ "custom-elements/upgrading/upgrading-parser-created-element.html": [
"7cc3b18aeefb8db55bcac7ac1cf321c1b5fff28c", "0f7f95786dd11fd7013f057fd492cc9b7c924db9",
"testharness" "testharness"
], ],
"device-memory/META.yml": [ "device-memory/META.yml": [
@ -645770,6 +645939,14 @@
"a913158982e04d34a79c662673a9754d457bb002", "a913158982e04d34a79c662673a9754d457bb002",
"testharness" "testharness"
], ],
"feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html": [
"2a6faefcd3bcab4efe6147fa142fc7369efafc81",
"testharness"
],
"feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html.headers": [
"8cba4d2df9c22809641984a0071aae947b4f91ae",
"support"
],
"feature-policy/experimental-features/resources/animation-property-height.js": [ "feature-policy/experimental-features/resources/animation-property-height.js": [
"79316cb488fade6e877c690f90c74961ff944f52", "79316cb488fade6e877c690f90c74961ff944f52",
"support" "support"
@ -647842,6 +648019,14 @@
"b60ae206c78b3dd8e934dde7a7408fe4a7465932", "b60ae206c78b3dd8e934dde7a7408fe4a7465932",
"testharness" "testharness"
], ],
"fetch/sec-metadata/prefetch.tentative.https.sub.html": [
"2c230b8949688940067d9bbc151b12f59e20b517",
"testharness"
],
"fetch/sec-metadata/preload.tentative.https.sub.html": [
"2fdf65d5920d5851416679eee21fd9362ca3d532",
"testharness"
],
"fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html": [ "fetch/sec-metadata/redirect/cross-site-redirect.tentative.https.sub.html": [
"06b58744fb5a26f16f5ed8fc923f1c91989e2eb8", "06b58744fb5a26f16f5ed8fc923f1c91989e2eb8",
"testharness" "testharness"
@ -647891,7 +648076,7 @@
"support" "support"
], ],
"fetch/sec-metadata/resources/record-header.py": [ "fetch/sec-metadata/resources/record-header.py": [
"f215b0165073ec6275308ed272cea763d9572a9e", "683c0a6a0c4b6e32e06fce50aa8f6af19eacff76",
"support" "support"
], ],
"fetch/sec-metadata/resources/sharedWorker.js": [ "fetch/sec-metadata/resources/sharedWorker.js": [
@ -652330,6 +652515,10 @@
"17077dafd1ff38298b052aa17fcc1e1062a83baf", "17077dafd1ff38298b052aa17fcc1e1062a83baf",
"testharness" "testharness"
], ],
"html/dom/elements/global-attributes/dataset-binding.window.js": [
"e0e85677d1d4c07533a5d8eaa6dc1268305fa0c6",
"testharness"
],
"html/dom/elements/global-attributes/dataset-delete.html": [ "html/dom/elements/global-attributes/dataset-delete.html": [
"1440118f6daa531d2bfde982c67676d22cffa197", "1440118f6daa531d2bfde982c67676d22cffa197",
"testharness" "testharness"
@ -669295,7 +669484,7 @@
"support" "support"
], ],
"interfaces/FileAPI.idl": [ "interfaces/FileAPI.idl": [
"15b2e5582fee1c7fee29e7d20bb82b0ca901af73", "b5b40296429646cfbe13110153f2e281201ba669",
"support" "support"
], ],
"interfaces/IndexedDB.idl": [ "interfaces/IndexedDB.idl": [
@ -682959,7 +683148,7 @@
"testharness" "testharness"
], ],
"pointerevents/pointerlock/pointerevent_coordinates_when_locked.html": [ "pointerevents/pointerlock/pointerevent_coordinates_when_locked.html": [
"2556e83da10d9b8ee36b8ebbe67d513597d2fe77", "9dfd5e1764d33dfd1af7ee62af20b1e0424ac64b",
"testharness" "testharness"
], ],
"pointerevents/pointerlock/pointerevent_movementxy-manual.html": [ "pointerevents/pointerlock/pointerevent_movementxy-manual.html": [
@ -683086,6 +683275,10 @@
"0d8ec33cae787ddd0ed22284ed0a955e312d505d", "0d8ec33cae787ddd0ed22284ed0a955e312d505d",
"testharness" "testharness"
], ],
"portals/portal-activate-event-constructor.html": [
"7263b121151f5b1331622c0c7007df49f90b6376",
"testharness"
],
"portals/portal-activate-event.html": [ "portals/portal-activate-event.html": [
"33d91e37d9d9ac77c5243a60b42ce841645d248e", "33d91e37d9d9ac77c5243a60b42ce841645d248e",
"testharness" "testharness"
@ -704503,7 +704696,7 @@
"support" "support"
], ],
"tools/manifest/download.py": [ "tools/manifest/download.py": [
"e8f27e7ac100dad8d587a91d67e9a5f2ff0c3433", "91ae664336e4c09ef165db25cf363e61fec3d603",
"support" "support"
], ],
"tools/manifest/item.py": [ "tools/manifest/item.py": [
@ -704515,7 +704708,7 @@
"support" "support"
], ],
"tools/manifest/manifest.py": [ "tools/manifest/manifest.py": [
"bfe57c7823b26f778e81fb793a7cb9b0fdfd264a", "8634b7089869fbbf9adb604909ebae09efdf36b3",
"support" "support"
], ],
"tools/manifest/sourcefile.py": [ "tools/manifest/sourcefile.py": [
@ -704542,20 +704735,20 @@
"18aa55a63a2695b3f3581e1b7eee5042f5cea051", "18aa55a63a2695b3f3581e1b7eee5042f5cea051",
"support" "support"
], ],
"tools/manifest/tests/test_vcs.py": [ "tools/manifest/tests/test_utils.py": [
"8124b9ac380d9e9826aa2d6493bb4802ae63372e", "1bdffb9b1fe0f10b6e49768fd3bdd502f8aeb3fd",
"support" "support"
], ],
"tools/manifest/update.py": [ "tools/manifest/update.py": [
"321cfebe2a605c9a50267129ed574127ed023634", "f1a70930bb3377d86164767b71d985bad42c0104",
"support" "support"
], ],
"tools/manifest/utils.py": [ "tools/manifest/utils.py": [
"a097ad5090e16aa1a43c8e43332f0761ecd6f240", "c3456d96604cb31d83de3d0a31dd0e259893e22c",
"support" "support"
], ],
"tools/manifest/vcs.py": [ "tools/manifest/vcs.py": [
"cfb0ff27c364a5a66f85c264bbb4978ae56d9b5b", "b63df4d0a8ae750a3a1edc7ee6c9eaa5fcc3718b",
"support" "support"
], ],
"tools/py27-flake8.ini": [ "tools/py27-flake8.ini": [
@ -713399,7 +713592,7 @@
"support" "support"
], ],
"webaudio/resources/audit.js": [ "webaudio/resources/audit.js": [
"b7ca020161071437087c349c0e8b59dbf132f764", "f3ce71911ac02d971157e31462b1c8d34f83f756",
"support" "support"
], ],
"webaudio/resources/biquad-filters.js": [ "webaudio/resources/biquad-filters.js": [
@ -713814,6 +714007,10 @@
"8194d1977ad452390efb870197057bcf48fad499", "8194d1977ad452390efb870197057bcf48fad499",
"testharness" "testharness"
], ],
"webaudio/the-audio-api/the-audioworklet-interface/audioworklet-suspend.https.html": [
"d5bcbfe990cacbb09c3dc22334cd0620e66b9ced",
"testharness"
],
"webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html": [ "webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html": [
"d87e35b571d75c0ff595ab023f4a54a420111523", "d87e35b571d75c0ff595ab023f4a54a420111523",
"testharness" "testharness"
@ -717583,7 +717780,7 @@
"support" "support"
], ],
"webstorage/set.window.js": [ "webstorage/set.window.js": [
"479ad588910b907e6e9fe41d5080b744a22a54fe", "228ce60296697a21520b8c635bd352ed1fbefb2c",
"testharness" "testharness"
], ],
"webstorage/storage_builtins.html": [ "webstorage/storage_builtins.html": [
@ -720931,7 +721128,7 @@
"testharness" "testharness"
], ],
"webxr/xrSession_transfer_outputContext.https.html": [ "webxr/xrSession_transfer_outputContext.https.html": [
"69c52d2bfb4d8d942e233872b40c618accaad1b9", "658cb322487df1af1f2333423ac8c223fdd8733c",
"testharness" "testharness"
], ],
"workers/META.yml": [ "workers/META.yml": [

View file

@ -314,3 +314,24 @@
[Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%'] [Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%']
expected: FAIL expected: FAIL
[Matching font-weight: '500' should prefer '400' over '350 399']
expected: FAIL
[Matching font-weight: '399' should prefer '500 501' over '502 510']
expected: FAIL
[Matching font-style: 'normal' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
[Matching font-weight: '500' should prefer '350 399' over '351 398']
expected: FAIL
[Matching font-style: 'oblique 21deg' should prefer 'oblique 20deg' over 'oblique 10deg']
expected: FAIL
[Matching font-style: 'oblique 10deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg']
expected: FAIL
[Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'italic']
expected: FAIL

View file

@ -0,0 +1,7 @@
[text-decoration-line-valid.html]
[e.style['text-decoration-line'\] = "spelling-error" should set the property value]
expected: FAIL
[e.style['text-decoration-line'\] = "grammar-error" should set the property value]
expected: FAIL

View file

@ -2,3 +2,12 @@
[Node.prototype.cloneNode(false) must be able to clone as a customized built-in element when it has an inconsistent "is" attribute] [Node.prototype.cloneNode(false) must be able to clone as a customized built-in element when it has an inconsistent "is" attribute]
expected: FAIL expected: FAIL
[HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed due to a custom element constructor constructing itself before super() call]
expected: FAIL
[Upgrading a custom element must throw TypeError when the custom element's constructor returns another element]
expected: FAIL
[HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed due to a custom element constructor constructing itself after super() call]
expected: FAIL

View file

@ -0,0 +1,16 @@
[upgrading-parser-created-element.html]
[Upgrading a custom element whose constructor returns a Text node must throw]
expected: FAIL
[HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed due to a custom element constructor constructing itself after super() call]
expected: FAIL
[Upgrading a custom element whose constructor returns an Element must throw]
expected: FAIL
[Upgrading a custom element must throw an TypeError when the returned element is not SameValue as the upgraded element]
expected: FAIL
[HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed due to a custom element constructor constructing itself before super() call]
expected: FAIL

View file

@ -32,7 +32,7 @@
[single-byte-decoder.html?XMLHttpRequest] [single-byte-decoder.html?XMLHttpRequest]
expected: CRASH expected: TIMEOUT
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
expected: FAIL expected: FAIL
@ -96,9 +96,6 @@
[windows-1254: csisolatin5 (XMLHttpRequest)] [windows-1254: csisolatin5 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1254: iso8859-9 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1254: iso-ir-148 (XMLHttpRequest)] [windows-1254: iso-ir-148 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
@ -126,5 +123,11 @@
[windows-1256: windows-1256 (XMLHttpRequest)] [windows-1256: windows-1256 (XMLHttpRequest)]
expected: TIMEOUT expected: TIMEOUT
[windows-1254: l5 (XMLHttpRequest)]
expected: TIMEOUT
[windows-1254: latin5 (XMLHttpRequest)]
expected: TIMEOUT
[single-byte-decoder.html?TextDecoder] [single-byte-decoder.html?TextDecoder]

View file

@ -0,0 +1,14 @@
[prefetch.tentative.https.sub.html]
expected: TIMEOUT
[<link rel='prefetch' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='prefetch' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='prefetch' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[Browser supports prefetch.]
expected: FAIL

View file

@ -0,0 +1,59 @@
[preload.tentative.https.sub.html]
expected: TIMEOUT
[<link rel='preload' as='fetch' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='script' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='font' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='script' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='track' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='image' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='image' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='track' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[Browser supports preload.]
expected: FAIL
[<link rel='preload' as='fetch' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='style' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='font' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='fetch' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='image' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='font' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='style' href='https://www.not-web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='script' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='track' href='https://www.web-platform.test:8443/...'>]
expected: TIMEOUT
[<link rel='preload' as='style' href='https://web-platform.test:8443/...'>]
expected: TIMEOUT

View file

@ -1,4 +0,0 @@
[traverse_the_history_5.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -1,5 +1,4 @@
[closed-attribute.window.html] [closed-attribute.window.html]
expected: CRASH
[closed and cross-site nested browsing context] [closed and cross-site nested browsing context]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,13 @@
[dataset-binding.window.html]
[Setting property for key x with accessor property on prototype]
expected: FAIL
[Setting property for key 9 with accessor property on prototype]
expected: FAIL
[Getting property descriptor for key 9]
expected: FAIL
[Getting property descriptor for key x]
expected: FAIL

View file

@ -1,10 +0,0 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
[createHTMLDocument]
expected: FAIL
[<template>]
expected: FAIL

View file

@ -1,4 +0,0 @@
[iframe_005.html]
[document.write external script into iframe write back into parent]
expected: FAIL

View file

@ -1,5 +1,4 @@
[offscreencanvas.commit.w.html] [offscreencanvas.commit.w.html]
expected: ERROR
[Test that calling OffscreenCanvas's commit pushes its contents to its placeholder.] [Test that calling OffscreenCanvas's commit pushes its contents to its placeholder.]
expected: FAIL expected: FAIL

View file

@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html] [realtimeanalyser-fft-scaling.html]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.] [X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,2 @@
[audioworklet-suspend.https.html]
expected: ERROR

View file

@ -5,3 +5,9 @@
[Setting property for key x on sessionStorage with accessor property on prototype] [Setting property for key x on sessionStorage with accessor property on prototype]
expected: FAIL expected: FAIL
[Setting property for key 9 on localStorage with accessor property on prototype]
expected: FAIL
[Setting property for key 9 on sessionStorage with accessor property on prototype]
expected: FAIL

View file

@ -1,2 +0,0 @@
[transition_calc_implicit.html]
expected: TIMEOUT

View file

@ -0,0 +1,34 @@
// META: title=Blob Array Buffer
// META: script=../support/Blob.js
'use strict';
promise_test(async () => {
const input_arr = new TextEncoder().encode("PASS");
const blob = new Blob([input_arr]);
const array_buffer = await blob.arrayBuffer();
assert_true(array_buffer instanceof ArrayBuffer);
assert_equals_typed_array(new Uint8Array(array_buffer), input_arr);
}, "Blob.arrayBuffer()")
promise_test(async () => {
const input_arr = new TextEncoder().encode("");
const blob = new Blob([input_arr]);
const array_buffer = await blob.arrayBuffer();
assert_true(array_buffer instanceof ArrayBuffer);
assert_equals_typed_array(new Uint8Array(array_buffer), input_arr);
}, "Blob.arrayBuffer() empty Blob data")
promise_test(async () => {
const input_arr = new TextEncoder().encode("\u08B8\u000a");
const blob = new Blob([input_arr]);
const array_buffer = await blob.arrayBuffer();
assert_equals_typed_array(new Uint8Array(array_buffer), input_arr);
}, "Blob.arrayBuffer() non-ascii input")
promise_test(async () => {
const input_arr = [8, 241, 48, 123, 151];
const typed_arr = new Uint8Array(input_arr);
const blob = new Blob([typed_arr]);
const array_buffer = await blob.arrayBuffer();
assert_equals_typed_array(new Uint8Array(array_buffer), typed_arr);
}, "Blob.arrayBuffer() non-unicode input")

View file

@ -0,0 +1,50 @@
// META: title=Blob Stream
// META: script=../support/Blob.js
'use strict';
// Takes in a ReadableStream and reads from it until it is done, returning
// an array that contains the results of each read operation
async function read_all_chunks(stream) {
assert_true(stream instanceof ReadableStream);
assert_true('getReader' in stream);
const reader = stream.getReader();
assert_true('read' in reader);
let read_value = await reader.read();
let out = [];
let i = 0;
while (!read_value.done) {
for (let val of read_value.value) {
out[i++] = val;
}
read_value = await reader.read();
}
return out;
}
promise_test(async () => {
const blob = new Blob(["PASS"]);
const stream = await blob.stream()
const chunks = await read_all_chunks(stream);
for (let [index, value] of chunks.entries()) {
assert_equals(value, "PASS".charCodeAt(index));
}
}, "Blob.stream()")
promise_test(async () => {
const blob = new Blob();
const stream = await blob.stream()
const chunks = await read_all_chunks(stream);
assert_array_equals(chunks, []);
}, "Blob.stream() empty Blob")
promise_test(async () => {
const input_arr = [8, 241, 48, 123, 151];
const typed_arr = new Uint8Array(input_arr);
const blob = new Blob([typed_arr]);
const stream = await blob.stream()
const chunks = await read_all_chunks(stream);
assert_array_equals(chunks, input_arr)
}, "Blob.stream() non-unicode input")

View file

@ -0,0 +1,52 @@
// META: title=Blob Text
// META: script=../support/Blob.js
'use strict';
promise_test(async () => {
const blob = new Blob(["PASS"]);
const text = await blob.text();
assert_equals(text, "PASS");
}, "Blob.text()")
promise_test(async () => {
const blob = new Blob();
const text = await blob.text();
assert_equals(text, "");
}, "Blob.text() empty blob data")
promise_test(async () => {
const blob = new Blob(["P", "A", "SS"]);
const text = await blob.text();
assert_equals(text, "PASS");
}, "Blob.text() multi-element array in constructor")
promise_test(async () => {
const non_unicode = "\u0061\u030A";
const input_arr = new TextEncoder().encode(non_unicode);
const blob = new Blob([input_arr]);
const text = await blob.text();
assert_equals(text, non_unicode);
}, "Blob.text() non-unicode")
promise_test(async () => {
const blob = new Blob(["PASS"], { type: "text/plain;charset=utf-16le" });
const text = await blob.text();
assert_equals(text, "PASS");
}, "Blob.text() different charset param in type option")
promise_test(async () => {
const non_unicode = "\u0061\u030A";
const input_arr = new TextEncoder().encode(non_unicode);
const blob = new Blob([input_arr], { type: "text/plain;charset=utf-16le" });
const text = await blob.text();
assert_equals(text, non_unicode);
}, "Blob.text() different charset param with non-ascii input")
promise_test(async () => {
const input_arr = new Uint8Array([192, 193, 245, 246, 247, 248, 249, 250, 251,
252, 253, 254, 255]);
const blob = new Blob([input_arr]);
const text = await blob.text();
assert_equals(text, "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd" +
"\ufffd\ufffd\ufffd\ufffd");
}, "Blob.text() invalid utf-8 input")

View file

@ -1,3 +1,5 @@
'use strict'
function test_blob(fn, expectations) { function test_blob(fn, expectations) {
var expected = expectations.expected, var expected = expectations.expected,
type = expectations.type, type = expectations.type,
@ -47,3 +49,22 @@ function test_blob_binary(fn, expectations) {
fr.readAsArrayBuffer(blob); fr.readAsArrayBuffer(blob);
}); });
} }
// Assert that two TypedArray objects have the same byte values
self.assert_equals_typed_array = (array1, array2) => {
const [view1, view2] = [array1, array2].map((array) => {
assert_true(array.buffer instanceof ArrayBuffer,
'Expect input ArrayBuffers to contain field `buffer`');
return new DataView(array.buffer, array.byteOffset, array.byteLength);
});
assert_equals(view1.byteLength, view2.byteLength,
'Expect both arrays to be of the same byte length');
const byteLength = view1.byteLength;
for (let i = 0; i < byteLength; ++i) {
assert_equals(view1.getUint8(i), view2.getUint8(i),
`Expect byte at buffer position ${i} to be equal`);
}
}

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Text Decoration Test: Parsing text-decoration-line with invalid values</title>
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-text-decor-4/#text-decoration-line-property">
<meta name="assert" content="text-decoration-line supports only the grammar 'none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script>
test_invalid_value("text-decoration-line", "auto");
test_invalid_value("text-decoration-line", "null");
test_invalid_value("text-decoration-line", "noone");
test_invalid_value("text-decoration-line", "under-line");
test_invalid_value("text-decoration-line", "over-line");
test_invalid_value("text-decoration-line", "linethrough");
test_invalid_value("text-decoration-line", "none underline");
test_invalid_value("text-decoration-line", "none spelling-error");
test_invalid_value("text-decoration-line", "underline underline");
test_invalid_value("text-decoration-line", "underline none overline");
test_invalid_value("text-decoration-line", "blink line-through blink");
test_invalid_value("text-decoration-line", "spelling-error overline");
test_invalid_value("text-decoration-line", "spelling-error grammar-error");
test_invalid_value("text-decoration-line", "blink underline line-through grammar-error");
</script>

View file

@ -0,0 +1,86 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Text Decoration Test: Parsing text-decoration-line with valid values</title>
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-text-decor-4/#text-decoration-line-property">
<meta name="assert" content="text-decoration-line supports the full grammar 'none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script>
// none
test_valid_value("text-decoration-line", "none");
// underline || overline || line-through || blink
test_valid_value("text-decoration-line", "underline");
test_valid_value("text-decoration-line", "overline");
test_valid_value("text-decoration-line", "line-through");
test_valid_value("text-decoration-line", "blink");
test_valid_value("text-decoration-line", "underline overline");
test_valid_value("text-decoration-line", "overline underline", "underline overline");
test_valid_value("text-decoration-line", "underline line-through");
test_valid_value("text-decoration-line", "line-through underline", "underline line-through");
test_valid_value("text-decoration-line", "underline blink");
test_valid_value("text-decoration-line", "blink underline", "underline blink");
test_valid_value("text-decoration-line", "overline line-through");
test_valid_value("text-decoration-line", "line-through overline", "overline line-through");
test_valid_value("text-decoration-line", "overline blink");
test_valid_value("text-decoration-line", "blink overline", "overline blink");
test_valid_value("text-decoration-line", "line-through blink");
test_valid_value("text-decoration-line", "blink line-through", "line-through blink");
test_valid_value("text-decoration-line", "underline overline line-through");
test_valid_value("text-decoration-line", "underline line-through overline", "underline overline line-through");
test_valid_value("text-decoration-line", "overline underline line-through", "underline overline line-through");
test_valid_value("text-decoration-line", "overline line-through underline", "underline overline line-through");
test_valid_value("text-decoration-line", "line-through underline overline", "underline overline line-through");
test_valid_value("text-decoration-line", "line-through overline underline", "underline overline line-through");
test_valid_value("text-decoration-line", "underline overline blink");
test_valid_value("text-decoration-line", "underline blink overline", "underline overline blink");
test_valid_value("text-decoration-line", "overline underline blink", "underline overline blink");
test_valid_value("text-decoration-line", "overline blink underline", "underline overline blink");
test_valid_value("text-decoration-line", "blink underline overline", "underline overline blink");
test_valid_value("text-decoration-line", "blink overline underline", "underline overline blink");
test_valid_value("text-decoration-line", "underline line-through blink");
test_valid_value("text-decoration-line", "underline blink line-through", "underline line-through blink");
test_valid_value("text-decoration-line", "line-through underline blink", "underline line-through blink");
test_valid_value("text-decoration-line", "line-through blink underline", "underline line-through blink");
test_valid_value("text-decoration-line", "blink underline line-through", "underline line-through blink");
test_valid_value("text-decoration-line", "blink line-through underline", "underline line-through blink");
test_valid_value("text-decoration-line", "overline line-through blink");
test_valid_value("text-decoration-line", "overline blink line-through", "overline line-through blink");
test_valid_value("text-decoration-line", "line-through overline blink", "overline line-through blink");
test_valid_value("text-decoration-line", "line-through blink overline", "overline line-through blink");
test_valid_value("text-decoration-line", "blink overline line-through", "overline line-through blink");
test_valid_value("text-decoration-line", "blink line-through overline", "overline line-through blink");
test_valid_value("text-decoration-line", "underline overline line-through blink");
test_valid_value("text-decoration-line", "underline overline blink line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "underline line-through overline blink", "underline overline line-through blink");
test_valid_value("text-decoration-line", "underline line-through blink overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "underline blink overline line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "underline blink line-through overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline underline line-through blink", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline underline blink line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline line-through underline blink", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline line-through blink underline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline blink underline line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "overline blink line-through underline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through underline overline blink", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through underline blink overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through overline underline blink", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through overline blink underline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through blink underline overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "line-through blink overline underline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink underline overline line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink underline line-through overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink overline underline line-through", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink overline line-through underline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink line-through underline overline", "underline overline line-through blink");
test_valid_value("text-decoration-line", "blink line-through overline underline", "underline overline line-through blink");
// spelling-error
test_valid_value("text-decoration-line", "spelling-error");
// grammar-error
test_valid_value("text-decoration-line", "grammar-error");
</script>

View file

@ -165,8 +165,8 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
instance.cloneNode(false); instance.cloneNode(false);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed' }, 'HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed'
+ ' due to a custom element constructor constructing itself after super() call'); + ' due to a custom element constructor constructing itself after super() call');
test(function () { test(function () {
@ -183,8 +183,8 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
instance.cloneNode(false); instance.cloneNode(false);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed' }, 'HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed'
+ ' due to a custom element constructor constructing itself before super() call'); + ' due to a custom element constructor constructing itself before super() call');
test(function () { test(function () {
@ -203,8 +203,8 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
instance.cloneNode(false); instance.cloneNode(false);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
}, 'Upgrading a custom element must throw InvalidStateError when the custom element\'s constructor returns another element'); }, 'Upgrading a custom element must throw TypeError when the custom element\'s constructor returns another element');
test(function () { test(function () {
var instance = document.createElement('my-custom-element-throw-exception'); var instance = document.createElement('my-custom-element-throw-exception');

View file

@ -15,6 +15,8 @@
<instantiates-itself-before-super></instantiates-itself-before-super> <instantiates-itself-before-super></instantiates-itself-before-super>
<my-other-element id="instance"></my-other-element> <my-other-element id="instance"></my-other-element>
<my-other-element id="otherInstance"></my-other-element> <my-other-element id="otherInstance"></my-other-element>
<not-an-element></not-an-element>
<not-an-html-element></not-an-html-element>
<script> <script>
setup({allow_uncaught_exception:true}); setup({allow_uncaught_exception:true});
@ -48,8 +50,8 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
customElements.define('instantiates-itself-after-super', InstantiatesItselfAfterSuper); customElements.define('instantiates-itself-after-super', InstantiatesItselfAfterSuper);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed' }, 'HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed'
+ ' due to a custom element constructor constructing itself after super() call'); + ' due to a custom element constructor constructing itself after super() call');
test(function () { test(function () {
@ -64,8 +66,8 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
customElements.define('instantiates-itself-before-super', InstantiatesItselfBeforeSuper); customElements.define('instantiates-itself-before-super', InstantiatesItselfBeforeSuper);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed' }, 'HTMLElement constructor must throw an TypeError when the top of the construction stack is marked AlreadyConstructed'
+ ' due to a custom element constructor constructing itself before super() call'); + ' due to a custom element constructor constructing itself before super() call');
test(function () { test(function () {
@ -85,12 +87,38 @@ test(function () {
var uncaughtError; var uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; } window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
customElements.define('my-other-element', MyOtherElement); customElements.define('my-other-element', MyOtherElement);
assert_equals(uncaughtError.name, 'InvalidStateError'); assert_equals(uncaughtError.name, 'TypeError');
assert_true(document.createElement('my-other-element') instanceof MyOtherElement, assert_true(document.createElement('my-other-element') instanceof MyOtherElement,
'Upgrading of custom elements must happen after the definition was added to the registry.'); 'Upgrading of custom elements must happen after the definition was added to the registry.');
}, 'Upgrading a custom element must throw an InvalidStateError when the returned element is not SameValue as the upgraded element'); }, 'Upgrading a custom element must throw an TypeError when the returned element is not SameValue as the upgraded element');
test(() => {
class NotAnElement extends HTMLElement {
constructor() {
return new Text();
}
}
let uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
customElements.define("not-an-element", NotAnElement);
assert_equals(uncaughtError.name, "TypeError");
}, "Upgrading a custom element whose constructor returns a Text node must throw");
test(() => {
class NotAnHTMLElement extends HTMLElement {
constructor() {
return document.createElementNS("", "test");
}
}
let uncaughtError;
window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
customElements.define("not-an-html-element", NotAnHTMLElement);
assert_equals(uncaughtError.name, "TypeError");
}, "Upgrading a custom element whose constructor returns an Element must throw");
</script> </script>
</body> </body>

View file

@ -0,0 +1,53 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/experimental-features/resources/common.js"></script>
<style>
html, body {
height: 100%;
width: 100%;
}
iframe {
width: 400px;
height: 400px;
margin: 10px;
}
.spacer {
width: 100%;
height: 10000px;
}
</style>
<div class="spacer"></div>
<script>
let load_timeout = 600; // ms
let expected_timeout_msg = false;
let cross_origin_url =
"http://{{hosts[alt][www]}}:{{ports[http][0]}}/" +
"feature-policy/experimental-features/resources/lazyload-contents.html";
window.scrollTo(0, 0);
// Verify that when 'loading-frame-default-eager' policy is disabled, the
// loading attribute "auto" leads to lazy loading.
promise_test(async(t) => {
// Add a frame with load="off".
let frame_loading_auto = createIframe(document.body, {
id: "auto",
// Sets the "loading" attribute to "auto".
loading: "auto",
src: `${cross_origin_url}?id=auto`
});
// Sanity-check: The frame is not visible.
assert_greater_than(
frame_loading_auto.getBoundingClientRect().top,
window.innerHeight * 2,
"Unexpected position for <iframe> with ID 'auto'.");
let msg_or_timeout =
await waitForMessageOrTimeout(t, "auto", load_timeout);
assert_false(msg_or_timeout, "Expected the frame not to load.");
}, "When 'loading-frame-default-eager' feature is disabled, a frame with " +
"'loading attribute 'auto' will be lazily loaded.");
</script>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script src=/common/utils.js></script>
<body></body>
<script>
test(t => {
assert_true(document.createElement('link').relList.supports('prefetch'));
}, "Browser supports prefetch.");
function create_test(host, expected) {
async_test(t => {
let nonce = token();
let key = "prefetch" + nonce;
let e = document.createElement('link');
e.rel = "prefetch";
e.href = `https://${host}/fetch/sec-metadata/resources/record-header.py?file=${key}`;
e.setAttribute("crossorigin", "crossorigin");
e.onload = t.step_func(e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(t.step_func(response => response.text()))
.then(t.step_func_done(text => assert_header_equals(text, expected)))
.catch(t.unreached_func("Fetching and verifying the results should succeed."));
});
e.onerror = t.unreached_func();
document.head.appendChild(e);
}, `<link rel='prefetch' href='https://${host}/...'>`);
}
create_test("{{host}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-origin", "user":"", "mode": "cors"});
create_test("{{hosts[][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-site", "user":"", "mode": "cors"});
create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"cross-site", "user":"", "mode": "cors"});
</script>

View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script src=/common/utils.js></script>
<body></body>
<script>
test(t => {
assert_true(document.createElement('link').relList.supports('preload'));
}, "Browser supports preload.");
function create_test(host, as, expected) {
async_test(t => {
let nonce = token();
let key = as + nonce;
let e = document.createElement('link');
e.rel = "preload";
e.href = `https://${host}/fetch/sec-metadata/resources/record-header.py?file=${key}`;
e.setAttribute("crossorigin", "crossorigin");
if (as !== undefined) {
e.setAttribute("as", as);
}
e.onload = e.onerror = t.step_func_done(e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(t.step_func(response => response.text()))
.then(t.step_func(text => assert_header_equals(text, expected)))
.then(t.step_func_done(_ => resolve()))
.catch(t.unreached_func());
});
document.head.appendChild(e);
}, `<link rel='preload' as='${as}' href='https://${host}/...'>`);
}
let as_tests = [
[ "fetch", "empty" ],
[ "font", "font" ],
[ "image", "image" ],
[ "script", "script" ],
[ "style", "style" ],
[ "track", "track" ],
];
as_tests.forEach(item => {
create_test("{{host}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-origin", "user":"", "mode": "cors"});
create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-site", "user":"", "mode": "cors"});
create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"cross-site", "user":"", "mode": "cors"});
});
</script>

View file

@ -54,6 +54,14 @@ def main(request, response):
if key.startswith("serviceworker"): if key.startswith("serviceworker"):
response.headers.set("Content-Type", "application/javascript") response.headers.set("Content-Type", "application/javascript")
## Add a valid image Content-Type ##
if key.startswith("image"):
response.headers.set("Content-Type", "image/png")
file = open(os.path.join(request.doc_root, "media", "1x1-green.png"), "r")
image = file.read()
file.close()
return image
## Return a valid .vtt content for the <track> tag ## ## Return a valid .vtt content for the <track> tag ##
if key.startswith("track"): if key.startswith("track"):
return "WEBVTT" return "WEBVTT"

View file

@ -0,0 +1,45 @@
[9, "x"].forEach(function(key) {
test(function() {
var element = document.createElement("div");
var dataset = element.dataset;
var value = "value for " + this.name;
assert_equals(dataset[key], undefined);
element.setAttribute("data-" + key, value);
assert_equals(element.getAttribute("data-" + key), value);
assert_equals(dataset[key], value);
var propdesc = Object.getOwnPropertyDescriptor(dataset, key);
assert_not_equals(propdesc, undefined);
assert_equals(propdesc.value, value);
assert_true(propdesc.writable);
assert_true(propdesc.enumerable);
assert_true(propdesc.configurable);
}, "Getting property descriptor for key " + key);
test(function() {
var element = document.createElement("div");
var dataset = element.dataset;
var proto = "proto getter for " + this.name;
var calledSetter = [];
Object.defineProperty(DOMStringMap.prototype, key, {
"get": function() { return proto; },
"set": this.unreached_func("Should not call [[Set]] on prototype"),
"configurable": true,
});
this.add_cleanup(function() {
delete DOMStringMap.prototype[key];
});
var value = "value for " + this.name;
assert_equals(dataset[key], proto);
assert_equals(element.getAttribute("data-" + key), null);
assert_equals(dataset[key] = value, value);
assert_equals(dataset[key], value);
assert_equals(element.getAttribute("data-" + key), value);
}, "Setting property for key " + key + " with accessor property on prototype");
});

View file

@ -15,6 +15,11 @@ interface Blob {
Blob slice(optional [Clamp] long long start, Blob slice(optional [Clamp] long long start,
optional [Clamp] long long end, optional [Clamp] long long end,
optional DOMString contentType); optional DOMString contentType);
// read from the Blob.
[NewObject] ReadableStream stream();
[NewObject] Promise<USVString> text();
[NewObject] Promise<ArrayBuffer> arrayBuffer();
}; };
enum EndingType { "transparent", "native" }; enum EndingType { "transparent", "native" };

View file

@ -73,15 +73,15 @@
}); });
var actions = new test_driver.Actions(); var actions = new test_driver.Actions();
actions.pointerMove(/* x = */ 0, /* y = */ 0, {origin: target}).pointerDown(); actions.pointerMove(/* x = */ 0, /* y = */ 0, {origin: div1}).pointerDown();
pos_x = target.getBoundingClientRect().x + target.offsetWidth / 2; pos_x = div1.offsetWidth / 2;
pos_y = target.getBoundingClientRect().y + target.offsetHeight / 2; pos_y = div1.offsetHeight / 2;
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
// Alternatively move left/right and up/down. // Alternatively move left/right and up/down.
pos_x += ((-1)**i) * i * 10; pos_x += ((-1)**i) * i * 10;
pos_y -= ((-1)**i) * i * 10; pos_y -= ((-1)**i) * i * 10;
actions.pointerMove(pos_x, pos_y); actions.pointerMove(pos_x, pos_y, {origin: div1});
} }
actions.pointerUp().send(); actions.pointerUp().send();
} }

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(() => {
// Even though UA-generated portalactivate events are different, the
// properties supplied should be used.
const e = new PortalActivateEvent("eventtype", { bubbles: true, cancelable: true });
assert_equals(e.type, "eventtype");
assert_true(e.bubbles);
assert_true(e.cancelable);
assert_equals(null, e.data);
}, "It should be possible to construct a PortalActivateEvent with a dictionary");
test(() => {
const data = {};
const e = new PortalActivateEvent("portalactivate", { data });
assert_equals(data, e.data);
}, "A PortalActivateEvent should expose exactly the data object supplied in the original realm");
test(() => {
const e = new PortalActivateEvent("portalactivate");
assert_throws("InvalidStateError", () => e.adoptPredecessor());
}, "Invoking adoptPredecessor on a synthetic PortalActivateEvent should throw");
</script>

View file

@ -15,7 +15,7 @@ try:
except ImportError: except ImportError:
zstandard = None zstandard = None
from .vcs import Git from .utils import git
from . import log from . import log
@ -40,9 +40,9 @@ def should_download(manifest_path, rebuild_time=timedelta(days=5)):
def merge_pr_tags(repo_root, max_count=50): def merge_pr_tags(repo_root, max_count=50):
git = Git.get_func(repo_root) gitfunc = git(repo_root)
tags = [] tags = []
for line in git("log", "--format=%D", "--max-count=%s" % max_count).split("\n"): for line in gitfunc("log", "--format=%D", "--max-count=%s" % max_count).split("\n"):
for ref in line.split(", "): for ref in line.split(", "):
if ref.startswith("tag: merge_pr_"): if ref.startswith("tag: merge_pr_"):
tags.append(ref[5:]) tags.append(ref[5:])

View file

@ -470,7 +470,7 @@ def load_and_update(tests_root,
rebuild=False, rebuild=False,
metadata_path=None, metadata_path=None,
cache_root=None, cache_root=None,
working_copy=False, working_copy=True,
types=None, types=None,
meta_filters=None, meta_filters=None,
write_manifest=True, write_manifest=True,

View file

@ -3,7 +3,7 @@ import subprocess
import mock import mock
from .. import vcs from .. import utils
def test_git_for_path_no_git(): def test_git_for_path_no_git():
@ -11,4 +11,4 @@ def test_git_for_path_no_git():
with mock.patch( with mock.patch(
"subprocess.check_output", "subprocess.check_output",
side_effect=subprocess.CalledProcessError(1, "foo")): side_effect=subprocess.CalledProcessError(1, "foo")):
assert vcs.Git.for_path(this_dir, "/", this_dir) is None assert utils.git(this_dir) is None

View file

@ -17,7 +17,7 @@ logger = get_logger()
def update(tests_root, def update(tests_root,
manifest, manifest,
manifest_path=None, manifest_path=None,
working_copy=False, working_copy=True,
cache_root=None, cache_root=None,
rebuild=False): rebuild=False):
logger.warning("Deprecated; use manifest.load_and_update instead") logger.warning("Deprecated; use manifest.load_and_update instead")
@ -41,8 +41,7 @@ def update_from_cli(**kwargs):
kwargs["url_base"], kwargs["url_base"],
update=True, update=True,
rebuild=kwargs["rebuild"], rebuild=kwargs["rebuild"],
cache_root=kwargs["cache_root"], cache_root=kwargs["cache_root"])
working_copy=kwargs["work"])
def abs_path(path): def abs_path(path):
@ -58,9 +57,6 @@ def create_parser():
parser.add_argument( parser.add_argument(
"-r", "--rebuild", action="store_true", default=False, "-r", "--rebuild", action="store_true", default=False,
help="Force a full rebuild of the manifest.") help="Force a full rebuild of the manifest.")
parser.add_argument(
"--work", action="store_true", default=False,
help="Build from the working tree rather than the latest commit")
parser.add_argument( parser.add_argument(
"--url-base", action="store", default="/", "--url-base", action="store", default="/",
help="Base url to use as the mount point for tests in this manifest.") help="Base url to use as the mount point for tests in this manifest.")

View file

@ -1,5 +1,6 @@
import platform
import os import os
import platform
import subprocess
from six import BytesIO from six import BytesIO
@ -32,6 +33,27 @@ def to_os_path(path):
return path.replace("/", os.path.sep) return path.replace("/", os.path.sep)
def git(path):
def gitfunc(cmd, *args):
full_cmd = ["git", cmd] + list(args)
try:
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT)
except Exception as e:
if platform.uname()[0] == "Windows" and isinstance(e, WindowsError):
full_cmd[0] = "git.bat"
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT)
else:
raise
try:
# this needs to be a command that fails if we aren't in a git repo
gitfunc("rev-parse", "--show-toplevel")
except (subprocess.CalledProcessError, OSError):
return None
else:
return gitfunc
class ContextManagerBytesIO(BytesIO): class ContextManagerBytesIO(BytesIO):
def __enter__(self): def __enter__(self):
return self return self

View file

@ -1,13 +1,10 @@
import json import json
import os import os
import platform
import stat import stat
import subprocess
from collections import deque from collections import deque
from six import iteritems
from .sourcefile import SourceFile from .sourcefile import SourceFile
from .utils import git
MYPY = False MYPY = False
if MYPY: if MYPY:
@ -16,7 +13,7 @@ if MYPY:
def get_tree(tests_root, manifest, manifest_path, cache_root, def get_tree(tests_root, manifest, manifest_path, cache_root,
working_copy=False, rebuild=False): working_copy=True, rebuild=False):
tree = None tree = None
if cache_root is None: if cache_root is None:
cache_root = os.path.join(tests_root, ".wptcache") cache_root = os.path.join(tests_root, ".wptcache")
@ -27,11 +24,8 @@ def get_tree(tests_root, manifest, manifest_path, cache_root,
cache_root = None cache_root = None
if not working_copy: if not working_copy:
tree = Git.for_path(tests_root, raise ValueError("working_copy=False unsupported")
manifest.url_base,
manifest_path=manifest_path,
cache_path=cache_root,
rebuild=rebuild)
if tree is None: if tree is None:
tree = FileSystem(tests_root, tree = FileSystem(tests_root,
manifest.url_base, manifest.url_base,
@ -41,39 +35,9 @@ def get_tree(tests_root, manifest, manifest_path, cache_root,
return tree return tree
class Git(object): class GitHasher(object):
def __init__(self, repo_root, url_base, cache_path, manifest_path=None, def __init__(self, path):
rebuild=False): self.git = git(path)
self.root = repo_root
self.git = Git.get_func(repo_root)
self.url_base = url_base
# rebuild is a noop for now since we don't cache anything
@staticmethod
def get_func(repo_path):
def git(cmd, *args):
full_cmd = ["git", cmd] + list(args)
try:
return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT)
except Exception as e:
if platform.uname()[0] == "Windows" and isinstance(e, WindowsError):
full_cmd[0] = "git.bat"
return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT)
else:
raise
return git
@classmethod
def for_path(cls, path, url_base, cache_path, manifest_path=None, rebuild=False):
git = Git.get_func(path)
try:
# this needs to be a command that fails if we aren't in a git repo
git("rev-parse", "--show-toplevel")
except (subprocess.CalledProcessError, OSError):
return None
else:
return cls(path, url_base, cache_path,
manifest_path=manifest_path, rebuild=rebuild)
def _local_changes(self): def _local_changes(self):
"""get a set of files which have changed between HEAD and working copy""" """get a set of files which have changed between HEAD and working copy"""
@ -95,10 +59,6 @@ class Git(object):
return changes return changes
def _show_file(self, path):
path = os.path.relpath(os.path.abspath(path), self.root)
return self.git("show", "HEAD:%s" % path)
def hash_cache(self): def hash_cache(self):
# type: () -> Dict[str, Optional[str]] # type: () -> Dict[str, Optional[str]]
""" """
@ -114,20 +74,6 @@ class Git(object):
return hash_cache return hash_cache
def __iter__(self):
for rel_path, hash in iteritems(self.hash_cache()):
if hash is None:
contents = self._show_file(rel_path)
else:
contents = None
yield SourceFile(self.root,
rel_path,
self.url_base,
hash,
contents=contents), True
def dump_caches(self):
pass
class FileSystem(object): class FileSystem(object):
@ -145,7 +91,7 @@ class FileSystem(object):
self.path_filter = gitignore.PathFilter(self.root, self.path_filter = gitignore.PathFilter(self.root,
extras=[".git/"], extras=[".git/"],
cache=self.ignore_cache) cache=self.ignore_cache)
git = Git.for_path(root, url_base, cache_path) git = GitHasher(root)
if git is not None: if git is not None:
self.hash_cache = git.hash_cache() self.hash_cache = git.hash_cache()
else: else:

View file

@ -1210,6 +1210,18 @@ window.Audit = (function() {
this._taskRunner._runNextTask(); this._taskRunner._runNextTask();
} }
// Runs |subTask| |time| milliseconds later. |setTimeout| is not allowed in
// WPT linter, so a thin wrapper around the harness's |step_timeout| is
// used here.
timeout(subTask, time) {
async_test((test) => {
test.step_timeout(() => {
subTask();
test.done();
}, time);
});
}
isPassed() { isPassed() {
return this._state === TaskState.FINISHED && this._result; return this._state === TaskState.FINISHED && this._result;
} }

View file

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<title>
Test if activation of worklet thread does not resume context rendering.
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
const audit = Audit.createTaskRunner();
const context = new AudioContext();
const filePath = 'processors/dummy-processor.js';
// Suspends the context right away and then activate worklet. The current
// time must not advance since the context is suspended.
audit.define(
{label: 'load-worklet-and-suspend'},
async (task, should) => {
context.suspend();
const suspendTime = context.currentTime;
await context.audioWorklet.addModule(filePath);
const dummy = new AudioWorkletNode(context, 'dummy');
dummy.connect(context.destination);
task.timeout(() => {
should(context.currentTime, 'context.currentTime')
.beEqualTo(suspendTime);
should(context.state, 'context.state').beEqualTo('suspended');
task.done();
}, 1000);
});
audit.run();
</script>
</body>
</html>

View file

@ -1,7 +1,8 @@
["localStorage", "sessionStorage"].forEach(function(name) { ["localStorage", "sessionStorage"].forEach(function(name) {
[9, "x"].forEach(function(key) { [9, "x"].forEach(function(key) {
test(function() { test(function() {
var value = "value"; var expected = "value for " + this.name;
var value = expected;
var storage = window[name]; var storage = window[name];
storage.clear(); storage.clear();
@ -9,13 +10,14 @@
assert_equals(storage[key], undefined); assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null); assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value); assert_equals(storage[key] = value, value);
assert_equals(storage[key], "value"); assert_equals(storage[key], expected);
assert_equals(storage.getItem(key), "value"); assert_equals(storage.getItem(key), expected);
}, "Setting property for key " + key + " on " + name); }, "Setting property for key " + key + " on " + name);
test(function() { test(function() {
var expected = "value for " + this.name;
var value = { var value = {
toString: function() { return "value"; } toString: function() { return expected; }
}; };
var storage = window[name]; var storage = window[name];
@ -24,79 +26,77 @@
assert_equals(storage[key], undefined); assert_equals(storage[key], undefined);
assert_equals(storage.getItem(key), null); assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value); assert_equals(storage[key] = value, value);
assert_equals(storage[key], "value"); assert_equals(storage[key], expected);
assert_equals(storage.getItem(key), "value"); assert_equals(storage.getItem(key), expected);
}, "Setting property with toString for key " + key + " on " + name); }, "Setting property with toString for key " + key + " on " + name);
test(function() { test(function() {
Storage.prototype[key] = "proto"; var proto = "proto for " + this.name;
Storage.prototype[key] = proto;
this.add_cleanup(function() { delete Storage.prototype[key]; }); this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value"; var value = "value for " + this.name;
var storage = window[name]; var storage = window[name];
storage.clear(); storage.clear();
assert_equals(storage[key], "proto"); assert_equals(storage[key], proto);
assert_equals(storage.getItem(key), null); assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value); assert_equals(storage[key] = value, value);
// Hidden because no [OverrideBuiltins]. // Hidden because no [OverrideBuiltins].
assert_equals(storage[key], "proto"); assert_equals(storage[key], proto);
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value"); assert_equals(storage.getItem(key), value);
}, "Setting property for key " + key + " on " + name + " with data property on prototype"); }, "Setting property for key " + key + " on " + name + " with data property on prototype");
test(function() { test(function() {
Storage.prototype[key] = "proto"; var proto = "proto for " + this.name;
Storage.prototype[key] = proto;
this.add_cleanup(function() { delete Storage.prototype[key]; }); this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value"; var value = "value for " + this.name;
var existing = "existing for " + this.name;
var storage = window[name]; var storage = window[name];
storage.clear(); storage.clear();
storage.setItem(key, "existing"); storage.setItem(key, existing);
// Hidden because no [OverrideBuiltins]. // Hidden because no [OverrideBuiltins].
assert_equals(storage[key], "proto"); assert_equals(storage[key], proto);
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "existing"); assert_equals(storage.getItem(key), existing);
assert_equals(storage[key] = value, value); assert_equals(storage[key] = value, value);
assert_equals(storage[key], "proto"); assert_equals(storage[key], proto);
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value"); assert_equals(storage.getItem(key), value);
}, "Setting property for key " + key + " on " + name + " with data property on prototype and existing item"); }, "Setting property for key " + key + " on " + name + " with data property on prototype and existing item");
test(function() { test(function() {
var calledSetter = [];
Object.defineProperty(Storage.prototype, key, {
"get": function() { return "proto getter"; },
"set": function(v) { calledSetter.push(v); },
configurable: true,
});
this.add_cleanup(function() { delete Storage.prototype[key]; });
var value = "value";
var storage = window[name]; var storage = window[name];
storage.clear(); storage.clear();
assert_equals(storage[key], "proto getter"); var proto = "proto getter for " + this.name;
Object.defineProperty(Storage.prototype, key, {
"get": function() { return proto; },
"set": this.unreached_func("Should not call [[Set]] on prototype"),
"configurable": true,
});
this.add_cleanup(function() {
delete Storage.prototype[key];
delete storage[key];
assert_false(key in storage);
});
var value = "value for " + this.name;
assert_equals(storage[key], proto);
assert_equals(storage.getItem(key), null); assert_equals(storage.getItem(key), null);
assert_equals(storage[key] = value, value); assert_equals(storage[key] = value, value);
// Property is hidden because no [OverrideBuiltins]. // Property is hidden because no [OverrideBuiltins].
if (typeof key === "number") { assert_equals(storage[key], proto);
// P is an array index: call through to OrdinarySetWithOwnDescriptor()
assert_array_equals(calledSetter, [value]);
assert_equals(storage[key], "proto getter");
assert_equals(storage.getItem(key), null);
} else {
// P is not an array index: early return in [[Set]] step 2.
// https://github.com/heycam/webidl/issues/630
assert_equals(storage[key], "proto getter");
assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined);
assert_equals(storage.getItem(key), "value"); assert_equals(storage.getItem(key), value);
}
}, "Setting property for key " + key + " on " + name + " with accessor property on prototype"); }, "Setting property for key " + key + " on " + name + " with accessor property on prototype");
}); });
}); });

View file

@ -3,41 +3,54 @@
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
<script src="resources/webxr_util.js"></script> <script src="resources/webxr_util.js"></script>
<canvas></canvas>
<script> <script>
xr_promise_test( xr_promise_test(
"Ensure that XRPresentationContexts are properly transfered between session", "Ensure that XRPresentationContexts are properly transfered between session",
(t) => { (t) => {
return XRTest.simulateDeviceConnection({ supportsImmersive:false }) return XRTest.simulateDeviceConnection({ supportsImmersive:false })
.then( (controller) => { .then( (controller) => {
Promise.all([ return Promise.all([
navigator.xr.requestSession({ mode: 'inline'}), navigator.xr.requestSession({ mode: 'inline'}),
navigator.xr.requestSession({ mode: 'inline'}) navigator.xr.requestSession({ mode: 'inline'})
]).then((sessions) => { ]).then((sessions) => {
t.step(() => {
assert_not_equals(sessions[0], null); assert_not_equals(sessions[0], null);
assert_not_equals(sessions[1], null); assert_not_equals(sessions[1], null);
});
const webglCanvas = document.getElementsByTagName('canvas')[0];
let gl = webglCanvas.getContext('webgl', {xrCompatible: true});
let outputContext = getOutputContext(); let outputContext = getOutputContext();
sessions[0].updateRenderState({ sessions[0].updateRenderState({
baseLayer: new XRWebGLLayer(session, gl), baseLayer: new XRWebGLLayer(sessions[0], gl),
outputContext: outputContext outputContext: outputContext
}); });
return new Promise((resolve, reject) => {
sessions[0].requestAnimationFrame((time, xrFrame) => { sessions[0].requestAnimationFrame((time, xrFrame) => {
sessions[1].updateRenderState({ sessions[1].updateRenderState({
baseLayer: new XRWebGLLayer(session, gl), baseLayer: new XRWebGLLayer(sessions[1], gl),
outputContext: outputContext outputContext: outputContext
}); });
t.step(() => {
// outputContext reassignment should not happen until the next frame is processed. // outputContext reassignment should not happen until the next frame is processed.
assert_equals(sessions[0].renderState.outputContext, outputContext); assert_equals(sessions[0].renderState.outputContext, outputContext);
assert_equals(sessions[1].renderState.outputContext, null); assert_equals(sessions[1].renderState.outputContext, null);
});
sessions[1].requestAnimationFrame((time, xrFrame) => { sessions[1].requestAnimationFrame((time, xrFrame) => {
t.step(() => {
// Ensure the outputContext was properly reassigned from one context to the other. // Ensure the outputContext was properly reassigned from one context to the other.
assert_equals(sessions[0].renderState.outputContext, null); assert_equals(sessions[0].renderState.outputContext, null);
assert_equals(sessions[1].renderState.outputContext, outputContext); assert_equals(sessions[1].renderState.outputContext, outputContext);
}); });
resolve();
});
});
}); });
}); });
}); });