aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-08-23 19:22:15 -0400
committerGitHub <noreply@github.com>2019-08-23 19:22:15 -0400
commit2fb324e174ed75eb545a6936c54c6944f24fadd6 (patch)
tree53f4ceac31d7398369d3d490d5d06a2aee6b978d
parent6680f8aae035157167b9b832ef72c43ca8592eff (diff)
parent482fda3a78d188fdaa5a6c1a11ead2d27861e8dc (diff)
downloadservo-2fb324e174ed75eb545a6936c54c6944f24fadd6.tar.gz
servo-2fb324e174ed75eb545a6936c54c6944f24fadd6.zip
Auto merge of #24039 - servo-wpt-sync:wpt_update_23-08-2019, r=servo-wpt-sync
Sync WPT with upstream (23-08-2019) Automated downstream sync of changes from upstream as of 23-08-2019. [no-wpt-sync] <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24039) <!-- Reviewable:end -->
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json4257
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini13
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini25
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini31
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini238
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini37
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini40
-rw-r--r--tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini58
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini11
-rw-r--r--tests/wpt/metadata/fetch/content-type/script.window.js.ini9
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini1
-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_4.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini34
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini34
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini4
-rw-r--r--tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini10
-rw-r--r--tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini16
-rw-r--r--tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini13
-rw-r--r--tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini16
-rw-r--r--tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini25
-rw-r--r--tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini136
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini4
-rw-r--r--tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini3
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini2
-rw-r--r--tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini4
-rw-r--r--tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini1
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/.azure-pipelines.yml15
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/pull_request.yml5
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js50
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html11
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js9
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js16
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js17
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js17
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js38
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html21
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js17
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html19
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js17
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html34
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/generate.py16
-rwxr-xr-xtests/wpt/web-platform-tests/bluetooth/generate_test.py2
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html4
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template10
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template7
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js43
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js44
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js41
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js21
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js43
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js43
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js44
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js44
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js41
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js21
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js21
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js36
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js36
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js35
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js41
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html122
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html134
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html217
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html166
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html52
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html123
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html103
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html49
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html132
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html161
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html194
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html159
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html192
-rw-r--r--tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js38
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html49
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html87
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html80
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html80
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html79
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html87
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html107
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html131
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html104
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html66
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html127
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html71
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html64
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html44
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml2
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md36
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/selectors.js8
-rw-r--r--tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html5
-rw-r--r--tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js12
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/META.yml1
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js16
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js12
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html85
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html88
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html87
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html89
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js12
-rw-r--r--tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html2
-rw-r--r--tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html (renamed from tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/test.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html6
-rw-r--r--tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html55
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html96
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js16
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.html (renamed from tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html)3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js4
-rw-r--r--tests/wpt/web-platform-tests/idle-detection/mock.js2
-rw-r--r--tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/appmanifest.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-animations.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-transitions.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-typed-om.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom-view.idl24
-rw-r--r--tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-nfc.idl16
-rw-r--r--tests/wpt/web-platform-tests/interfaces/worklets.idl1
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html27
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html46
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html49
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html53
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist8
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html155
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html166
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html30
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html35
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html58
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html80
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html55
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html58
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html80
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html7
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html11
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html13
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html7
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html11
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html9
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html26
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js8
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js16
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js16
-rw-r--r--tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html14
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js25
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js17
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webxr-test.js52
-rw-r--r--tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html22
-rw-r--r--tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html38
-rw-r--r--tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html23
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html103
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html15
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js19
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/rules.py7
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py30
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py61
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py24
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py124
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js4
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html25
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html13
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html26
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html24
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html18
-rw-r--r--[-rwxr-xr-x]tests/wpt/web-platform-tests/web-animations/resources/timing-override.js0
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html2
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html4
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html4
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js4
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html29
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html23
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt5
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js14
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html1
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html64
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html49
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrView_match.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html3
524 files changed, 14684 insertions, 3268 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
index a9e46713244..76b398963ae 100644
--- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -7,7 +7,7 @@
expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: TIMEOUT
+ expected: FAIL
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 15ec7336ee8..43826c8d5ba 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -105957,6 +105957,18 @@
{}
]
],
+ "css/css-backgrounds/background-position-negative-percentage-comparison.html": [
+ [
+ "css/css-backgrounds/background-position-negative-percentage-comparison.html",
+ [
+ [
+ "/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-backgrounds/background-repeat/background-repeat-no-repeat.xht": [
[
"css/css-backgrounds/background-repeat/background-repeat-no-repeat.xht",
@@ -113505,6 +113517,18 @@
{}
]
],
+ "css/css-contain/contain-size-012b.html": [
+ [
+ "css/css-contain/contain-size-012b.html",
+ [
+ [
+ "/css/css-contain/reference/pass_if_pass_below_clipped.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-contain/contain-size-013.html": [
[
"css/css-contain/contain-size-013.html",
@@ -117861,6 +117885,18 @@
{}
]
],
+ "css/css-flexbox/dynamic-change-simplified-layout.html": [
+ [
+ "css/css-flexbox/dynamic-change-simplified-layout.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-flexbox/fit-content-item-001.html": [
[
"css/css-flexbox/fit-content-item-001.html",
@@ -117873,6 +117909,42 @@
{}
]
],
+ "css/css-flexbox/fit-content-item-002.html": [
+ [
+ "css/css-flexbox/fit-content-item-002.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-flexbox/fit-content-item-003.html": [
+ [
+ "css/css-flexbox/fit-content-item-003.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-flexbox/fit-content-item-004.html": [
+ [
+ "css/css-flexbox/fit-content-item-004.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-flexbox/flex-001.htm": [
[
"css/css-flexbox/flex-001.htm",
@@ -119289,6 +119361,18 @@
{}
]
],
+ "css/css-flexbox/flexbox_align-items-stretch-3.html": [
+ [
+ "css/css-flexbox/flexbox_align-items-stretch-3.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-flexbox/flexbox_align-items-stretch.html": [
[
"css/css-flexbox/flexbox_align-items-stretch.html",
@@ -128119,6 +128203,174 @@
{}
]
],
+ "css/css-layout-api/edges/all.https.html": [
+ [
+ "css/css-layout-api/edges/all.https.html",
+ [
+ [
+ "/css/css-layout-api/edges/all-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-htb-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/border-htb-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-htb.https.html": [
+ [
+ "css/css-layout-api/edges/border-htb.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-vlr-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/border-vlr-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-vlr.https.html": [
+ [
+ "css/css-layout-api/edges/border-vlr.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-vrl-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/border-vrl-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/border-vrl.https.html": [
+ [
+ "css/css-layout-api/edges/border-vrl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-htb-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/padding-htb-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-htb.https.html": [
+ [
+ "css/css-layout-api/edges/padding-htb.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-vlr-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/padding-vlr-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-vlr.https.html": [
+ [
+ "css/css-layout-api/edges/padding-vlr.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-vrl-rtl.https.html": [
+ [
+ "css/css-layout-api/edges/padding-vrl-rtl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/padding-vrl.https.html": [
+ [
+ "css/css-layout-api/edges/padding-vrl.https.html",
+ [
+ [
+ "/css/css-layout-api/green-square-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-layout-api/edges/scrollbar.https.html": [
+ [
+ "css/css-layout-api/edges/scrollbar.https.html",
+ [
+ [
+ "/css/css-layout-api/edges/scrollbar-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-layout-api/fallback-layout/bad-return.https.html": [
[
"css/css-layout-api/fallback-layout/bad-return.https.html",
@@ -204981,6 +205233,66 @@
{}
]
],
+ "mathml/relations/css-styling/displaystyle-011.html": [
+ [
+ "mathml/relations/css-styling/displaystyle-011.html",
+ [
+ [
+ "/mathml/relations/css-styling/displaystyle-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/displaystyle-012.html": [
+ [
+ "mathml/relations/css-styling/displaystyle-012.html",
+ [
+ [
+ "/mathml/relations/css-styling/displaystyle-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/displaystyle-013.html": [
+ [
+ "mathml/relations/css-styling/displaystyle-013.html",
+ [
+ [
+ "/mathml/relations/css-styling/displaystyle-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/displaystyle-014.html": [
+ [
+ "mathml/relations/css-styling/displaystyle-014.html",
+ [
+ [
+ "/mathml/relations/css-styling/displaystyle-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/displaystyle-015.html": [
+ [
+ "mathml/relations/css-styling/displaystyle-015.html",
+ [
+ [
+ "/mathml/relations/css-styling/displaystyle-015-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"mathml/relations/css-styling/dynamic-dir-1.html": [
[
"mathml/relations/css-styling/dynamic-dir-1.html",
@@ -205005,6 +205317,114 @@
{}
]
],
+ "mathml/relations/css-styling/mathbackground-001.html": [
+ [
+ "mathml/relations/css-styling/mathbackground-001.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathbackground-001-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathbackground-002.html": [
+ [
+ "mathml/relations/css-styling/mathbackground-002.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathbackground-002-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathbackground-003.html": [
+ [
+ "mathml/relations/css-styling/mathbackground-003.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathbackground-003-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathbackground-004.html": [
+ [
+ "mathml/relations/css-styling/mathbackground-004.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathbackground-004-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathcolor-001.html": [
+ [
+ "mathml/relations/css-styling/mathcolor-001.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathcolor-001-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathcolor-002.html": [
+ [
+ "mathml/relations/css-styling/mathcolor-002.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathcolor-002-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathcolor-003.html": [
+ [
+ "mathml/relations/css-styling/mathcolor-003.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathcolor-003-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathcolor-004.html": [
+ [
+ "mathml/relations/css-styling/mathcolor-004.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathcolor-004-notref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mathml/relations/css-styling/mathsize-attribute-css-keywords.html": [
+ [
+ "mathml/relations/css-styling/mathsize-attribute-css-keywords.html",
+ [
+ [
+ "/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"mathml/relations/css-styling/mathsize-attribute-legacy-values.html": [
[
"mathml/relations/css-styling/mathsize-attribute-legacy-values.html",
@@ -210155,6 +210575,18 @@
{}
]
],
+ "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html": [
+ [
+ "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html",
+ [
+ [
+ "/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"webvtt/rendering/cues-with-video/processing-model/too_many_cues.html": [
[
"webvtt/rendering/cues-with-video/processing-model/too_many_cues.html",
@@ -212225,6 +212657,18 @@
"2dcontext/imagebitmap/common.sub.js": [
[]
],
+ "2dcontext/imagebitmap/resources/coop-coep-popup.html": [
+ []
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-popup.html.headers": [
+ []
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-worker.js": [
+ []
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-worker.js.headers": [
+ []
+ ],
"2dcontext/imagebitmap/transfer-worker.js": [
[]
],
@@ -214679,7 +215123,7 @@
"bluetooth/resources/health-thermometer-iframe.html": [
[]
],
- "bluetooth/script-tests/base_test_html.template": [
+ "bluetooth/script-tests/base_test_js.template": [
[]
],
"bluetooth/script-tests/characteristic/characteristic-is-removed.js": [
@@ -244373,6 +244817,9 @@
"css/css-backgrounds/reference/background-paint-order-001-ref.html": [
[]
],
+ "css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html": [
+ []
+ ],
"css/css-backgrounds/reference/background-rounded-image-clip.html": [
[]
],
@@ -251978,6 +252425,15 @@
"css/css-layout-api/constraints/support/constraints-fixed-inline-size.js": [
[]
],
+ "css/css-layout-api/edges/all-ref.html": [
+ []
+ ],
+ "css/css-layout-api/edges/scrollbar-ref.html": [
+ []
+ ],
+ "css/css-layout-api/edges/support/edges.js": [
+ []
+ ],
"css/css-layout-api/fallback-layout/fallback-ref.html": [
[]
],
@@ -265433,6 +265889,9 @@
"element-timing/resources/iframe-stores-entry.html": [
[]
],
+ "element-timing/resources/iframe-with-content.html": [
+ []
+ ],
"element-timing/resources/iframe-with-square-sends-entry.html": [
[]
],
@@ -268712,9 +269171,15 @@
"html/cross-origin-embedder-policy/non-initial-about-blank.https.html.headers": [
[]
],
+ "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers": [
+ []
+ ],
"html/cross-origin-embedder-policy/none.https.html.headers": [
[]
],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers": [
+ []
+ ],
"html/cross-origin-embedder-policy/require-corp.https.html.headers": [
[]
],
@@ -268748,6 +269213,9 @@
"html/cross-origin-embedder-policy/resources/script-factory.js": [
[]
],
+ "html/cross-origin-embedder-policy/resources/sw.js": [
+ []
+ ],
"html/cross-origin-embedder-policy/sandbox.https.html.headers": [
[]
],
@@ -271901,12 +272369,15 @@
"html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py": [
[]
],
- "html/interaction/focus/document-level-focus-apis/test.html": [
+ "html/interaction/focus/document-level-focus-apis/support/test.html": [
[]
],
"html/interaction/focus/processing-model/support/preventScroll-helper.html": [
[]
],
+ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html": [
+ []
+ ],
"html/obsolete/META.yml": [
[]
],
@@ -275420,12 +275891,54 @@
"mathml/relations/css-styling/display-1-ref.html": [
[]
],
+ "mathml/relations/css-styling/displaystyle-011-ref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/displaystyle-012-ref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/displaystyle-013-ref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/displaystyle-014-ref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/displaystyle-015-ref.html": [
+ []
+ ],
"mathml/relations/css-styling/dynamic-dir-1-ref.html": [
[]
],
"mathml/relations/css-styling/lengths-1-ref.html": [
[]
],
+ "mathml/relations/css-styling/mathbackground-001-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathbackground-002-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathbackground-003-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathbackground-004-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathcolor-001-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathcolor-002-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathcolor-003-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathcolor-004-notref.html": [
+ []
+ ],
+ "mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html": [
+ []
+ ],
"mathml/relations/css-styling/mathsize-attribute-legacy-values-ref.html": [
[]
],
@@ -279584,6 +280097,9 @@
"scroll-animations/resources/scrolltimeline-utils.js": [
[]
],
+ "scroll-to-text-fragment/scroll-to-text-fragment-target.html": [
+ []
+ ],
"secure-contexts/META.yml": [
[]
],
@@ -280463,6 +280979,9 @@
"service-workers/service-worker/resources/client-navigated-frame.html": [
[]
],
+ "service-workers/service-worker/resources/clients-frame-freeze.html": [
+ []
+ ],
"service-workers/service-worker/resources/clients-get-client-types-frame-worker.js": [
[]
],
@@ -286031,6 +286550,9 @@
"tools/wptrunner/requirements.txt": [
[]
],
+ "tools/wptrunner/requirements_android_webview.txt": [
+ []
+ ],
"tools/wptrunner/requirements_chrome.txt": [
[]
],
@@ -286166,6 +286688,9 @@
"tools/wptrunner/wptrunner/browsers/__init__.py": [
[]
],
+ "tools/wptrunner/wptrunner/browsers/android_webview.py": [
+ []
+ ],
"tools/wptrunner/wptrunner/browsers/base.py": [
[]
],
@@ -289187,6 +289712,9 @@
"webvtt/rendering/cues-with-video/processing-model/size_50-ref.html": [
[]
],
+ "webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html": [
+ []
+ ],
"webvtt/rendering/cues-with-video/processing-model/support/2_cues_overlapping_completely_move_up.vtt": [
[]
],
@@ -289319,6 +289847,9 @@
"webvtt/rendering/cues-with-video/processing-model/support/size_50.vtt": [
[]
],
+ "webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt": [
+ []
+ ],
"webvtt/rendering/cues-with-video/processing-model/support/start_alignment.vtt": [
[]
],
@@ -293251,6 +293782,23 @@
{}
]
],
+ "2dcontext/imagebitmap/no-coop-coep.https.window.js": [
+ [
+ "2dcontext/imagebitmap/no-coop-coep.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ]
+ ]
+ }
+ ]
+ ],
"2dcontext/line-styles/2d.line.cap.butt.html": [
[
"2dcontext/line-styles/2d.line.cap.butt.html",
@@ -306126,6 +306674,209 @@
}
]
],
+ "bluetooth/adapter/adapter-absent-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-absent-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/adapter-added-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-added-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/adapter-removed-getAvailability.https.window.js": [
+ [
+ "bluetooth/adapter/adapter-removed-getAvailability.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js": [
+ [
+ "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
"bluetooth/characteristic/characteristicProperties.https.window.js": [
[
"bluetooth/characteristic/characteristicProperties.https.window.html",
@@ -306155,67 +306906,235 @@
}
]
],
- "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [
+ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js": [
[
- "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html",
+ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [
+ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js": [
[
- "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html",
+ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html": [
+ "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js": [
[
- "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html",
+ "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js": [
[
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html",
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js": [
[
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html",
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [
+ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js": [
[
- "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html",
+ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html": [
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js": [
[
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html",
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html": [
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js": [
[
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html",
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -306364,11 +307283,32 @@
}
]
],
- "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [
+ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js": [
[
- "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html",
+ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -306517,11 +307457,32 @@
}
]
],
- "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
+ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js": [
[
- "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html",
+ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -306583,11 +307544,32 @@
}
]
],
- "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [
+ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js": [
[
- "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html",
+ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -306649,67 +307631,235 @@
}
]
],
- "bluetooth/descriptor/readValue/gen-service-is-removed.https.html": [
+ "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js": [
[
- "bluetooth/descriptor/readValue/gen-service-is-removed.https.html",
+ "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/descriptor/readValue/read-succeeds.https.html": [
+ "bluetooth/descriptor/readValue/read-succeeds.https.window.js": [
[
- "bluetooth/descriptor/readValue/read-succeeds.https.html",
+ "bluetooth/descriptor/readValue/read-succeeds.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/descriptor/writeValue/buffer-is-detached.https.html": [
+ "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js": [
[
- "bluetooth/descriptor/writeValue/buffer-is-detached.https.html",
+ "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [
+ "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js": [
[
- "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html",
+ "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [
+ "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js": [
[
- "bluetooth/device/gattserverdisconnected-event/disconnected.https.html",
+ "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [
+ "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js": [
[
- "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html",
+ "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [
+ "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js": [
[
- "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html",
+ "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [
+ "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js": [
[
- "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html",
+ "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -307122,131 +308272,467 @@
}
]
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [
+ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html",
+ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [
+ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html",
+ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html",
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html",
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html",
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html",
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [
+ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html",
+ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [
+ "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-get-same-object.https.html",
+ "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [
+ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html",
+ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [
+ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html",
+ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [
+ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html",
+ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [
+ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html",
+ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [
+ "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js": [
[
- "bluetooth/server/getPrimaryService/gen-service-not-found.https.html",
+ "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -307290,211 +308776,757 @@
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html",
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html",
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html",
+ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html",
+ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [
+ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js": [
[
- "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html",
+ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -307546,59 +309578,206 @@
}
]
],
- "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html": [
+ "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html",
+ "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html": [
+ "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html",
+ "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html": [
+ "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html",
+ "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-get-same-object.https.html": [
+ "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-get-same-object.https.html",
+ "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html": [
+ "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html",
+ "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html": [
+ "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html",
+ "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html": [
+ "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js": [
[
- "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html",
+ "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -307634,91 +309813,322 @@
}
]
],
- "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html": [
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html",
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-get-same-object.https.html": [
+ "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-get-same-object.https.html",
+ "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html": [
+ "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html",
+ "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html": [
+ "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html",
+ "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html": [
+ "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html",
+ "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
- "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html": [
+ "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js": [
[
- "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html",
+ "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.html",
{
- "testdriver": true
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testharness.js"
+ ],
+ [
+ "script",
+ "/resources/testharnessreport.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-helpers.js"
+ ]
+ ]
}
]
],
@@ -312835,6 +315245,30 @@
{}
]
],
+ "css/css-backgrounds/animations/background-color-interpolation.html": [
+ [
+ "css/css-backgrounds/animations/background-color-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/background-position-interpolation.html": [
+ [
+ "css/css-backgrounds/animations/background-position-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/background-position-origin-interpolation.html": [
+ [
+ "css/css-backgrounds/animations/background-position-origin-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/background-size-interpolation.html": [
+ [
+ "css/css-backgrounds/animations/background-size-interpolation.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/background-331.html": [
[
"css/css-backgrounds/background-331.html",
@@ -314739,6 +317173,36 @@
{}
]
],
+ "css/css-fonts/animations/font-size-adjust-interpolation.html": [
+ [
+ "css/css-fonts/animations/font-size-adjust-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/animations/font-size-interpolation-001.html": [
+ [
+ "css/css-fonts/animations/font-size-interpolation-001.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/animations/font-size-interpolation-002.html": [
+ [
+ "css/css-fonts/animations/font-size-interpolation-002.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/animations/font-size-interpolation-003.html": [
+ [
+ "css/css-fonts/animations/font-size-interpolation-003.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/animations/font-variation-settings-interpolation.html": [
+ [
+ "css/css-fonts/animations/font-variation-settings-interpolation.html",
+ {}
+ ]
+ ],
"css/css-fonts/calc-in-font-variation-settings.html": [
[
"css/css-fonts/calc-in-font-variation-settings.html",
@@ -314787,6 +317251,12 @@
{}
]
],
+ "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html": [
+ [
+ "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html",
+ {}
+ ]
+ ],
"css/css-fonts/font-style-angle.html": [
[
"css/css-fonts/font-style-angle.html",
@@ -317899,6 +320369,12 @@
{}
]
],
+ "css/css-logical/parsing/margin-block-inline-computed.html": [
+ [
+ "css/css-logical/parsing/margin-block-inline-computed.html",
+ {}
+ ]
+ ],
"css/css-logical/parsing/margin-block-inline-invalid.html": [
[
"css/css-logical/parsing/margin-block-inline-invalid.html",
@@ -317983,6 +320459,12 @@
{}
]
],
+ "css/css-logical/parsing/padding-block-inline-computed.html": [
+ [
+ "css/css-logical/parsing/padding-block-inline-computed.html",
+ {}
+ ]
+ ],
"css/css-logical/parsing/padding-block-inline-invalid.html": [
[
"css/css-logical/parsing/padding-block-inline-invalid.html",
@@ -320605,6 +323087,36 @@
{}
]
],
+ "css/css-sizing/animation/height-interpolation.html": [
+ [
+ "css/css-sizing/animation/height-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-sizing/animation/max-height-interpolation.html": [
+ [
+ "css/css-sizing/animation/max-height-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-sizing/animation/max-width-interpolation.html": [
+ [
+ "css/css-sizing/animation/max-width-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-sizing/animation/min-height-interpolation.html": [
+ [
+ "css/css-sizing/animation/min-height-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-sizing/animation/min-width-interpolation.html": [
+ [
+ "css/css-sizing/animation/min-width-interpolation.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/width-interpolation.html": [
[
"css/css-sizing/animation/width-interpolation.html",
@@ -320677,6 +323189,12 @@
{}
]
],
+ "css/css-sizing/parsing/max-height-computed.html": [
+ [
+ "css/css-sizing/parsing/max-height-computed.html",
+ {}
+ ]
+ ],
"css/css-sizing/parsing/max-height-invalid.html": [
[
"css/css-sizing/parsing/max-height-invalid.html",
@@ -320689,6 +323207,12 @@
{}
]
],
+ "css/css-sizing/parsing/max-width-computed.html": [
+ [
+ "css/css-sizing/parsing/max-width-computed.html",
+ {}
+ ]
+ ],
"css/css-sizing/parsing/max-width-invalid.html": [
[
"css/css-sizing/parsing/max-width-invalid.html",
@@ -320701,6 +323225,12 @@
{}
]
],
+ "css/css-sizing/parsing/min-height-computed.html": [
+ [
+ "css/css-sizing/parsing/min-height-computed.html",
+ {}
+ ]
+ ],
"css/css-sizing/parsing/min-height-invalid.html": [
[
"css/css-sizing/parsing/min-height-invalid.html",
@@ -320713,6 +323243,12 @@
{}
]
],
+ "css/css-sizing/parsing/min-width-computed.html": [
+ [
+ "css/css-sizing/parsing/min-width-computed.html",
+ {}
+ ]
+ ],
"css/css-sizing/parsing/min-width-invalid.html": [
[
"css/css-sizing/parsing/min-width-invalid.html",
@@ -321733,6 +324269,24 @@
{}
]
],
+ "css/css-text/animations/letter-spacing-interpolation.html": [
+ [
+ "css/css-text/animations/letter-spacing-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-text/animations/text-indent-interpolation.html": [
+ [
+ "css/css-text/animations/text-indent-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-text/animations/word-spacing-interpolation.html": [
+ [
+ "css/css-text/animations/word-spacing-interpolation.html",
+ {}
+ ]
+ ],
"css/css-text/i18n/css3-text-line-break-baspglwj-001.html": [
[
"css/css-text/i18n/css3-text-line-break-baspglwj-001.html",
@@ -326545,6 +329099,66 @@
{}
]
],
+ "css/css-values/minmax-angle-serialize.html": [
+ [
+ "css/css-values/minmax-angle-serialize.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-integer-computed.html": [
+ [
+ "css/css-values/minmax-integer-computed.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-length-computed.html": [
+ [
+ "css/css-values/minmax-length-computed.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-length-invalid.html": [
+ [
+ "css/css-values/minmax-length-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-number-computed.html": [
+ [
+ "css/css-values/minmax-number-computed.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-number-invalid.html": [
+ [
+ "css/css-values/minmax-number-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-percentage-computed.html": [
+ [
+ "css/css-values/minmax-percentage-computed.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-percentage-invalid.html": [
+ [
+ "css/css-values/minmax-percentage-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-time-computed.html": [
+ [
+ "css/css-values/minmax-time-computed.html",
+ {}
+ ]
+ ],
+ "css/css-values/minmax-time-invalid.html": [
+ [
+ "css/css-values/minmax-time-invalid.html",
+ {}
+ ]
+ ],
"css/css-values/rgba-011.html": [
[
"css/css-values/rgba-011.html",
@@ -349616,6 +352230,12 @@
{}
]
],
+ "html/browsers/the-window-object/window-open-defaults.window.js": [
+ [
+ "html/browsers/the-window-object/window-open-defaults.window.html",
+ {}
+ ]
+ ],
"html/browsers/the-window-object/window-open-noopener.html": [
[
"html/browsers/the-window-object/window-open-noopener.html?_parent",
@@ -349941,6 +352561,18 @@
{}
]
],
+ "html/cross-origin-embedder-policy/none-sw-from-none.https.html": [
+ [
+ "html/cross-origin-embedder-policy/none-sw-from-none.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html": [
+ [
+ "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html",
+ {}
+ ]
+ ],
"html/cross-origin-embedder-policy/none.https.html": [
[
"html/cross-origin-embedder-policy/none.https.html",
@@ -349949,6 +352581,18 @@
}
]
],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html": [
+ [
+ "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html",
+ {}
+ ]
+ ],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html": [
+ [
+ "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html",
+ {}
+ ]
+ ],
"html/cross-origin-embedder-policy/require-corp.https.html": [
[
"html/cross-origin-embedder-policy/require-corp.https.html",
@@ -351258,6 +353902,12 @@
}
]
],
+ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html": [
+ [
+ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html",
+ {}
+ ]
+ ],
"html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html": [
[
"html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html",
@@ -351734,6 +354384,12 @@
{}
]
],
+ "html/rendering/widgets/appearance/default-styles.html": [
+ [
+ "html/rendering/widgets/appearance/default-styles.html",
+ {}
+ ]
+ ],
"html/rendering/widgets/button-layout/abspos.html": [
[
"html/rendering/widgets/button-layout/abspos.html",
@@ -355196,6 +357852,12 @@
{}
]
],
+ "html/semantics/embedded-content/the-img-element/historical-progress-event.window.js": [
+ [
+ "html/semantics/embedded-content/the-img-element/historical-progress-event.window.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/img.complete.html": [
[
"html/semantics/embedded-content/the-img-element/img.complete.html",
@@ -355458,9 +358120,9 @@
{}
]
],
- "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html": [
+ "html/semantics/forms/autofocus/no-cross-origin-autofocus.html": [
[
- "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html",
+ "html/semantics/forms/autofocus/no-cross-origin-autofocus.html",
{
"testdriver": true
}
@@ -362524,19 +365186,25 @@
"import-maps/data.sub.tentative.html": [
[
"import-maps/data.sub.tentative.html",
- {}
+ {
+ "timeout": "long"
+ }
]
],
"import-maps/fallback-disallowed.sub.tentative.html": [
[
"import-maps/fallback-disallowed.sub.tentative.html",
- {}
+ {
+ "timeout": "long"
+ }
]
],
"import-maps/fallback.sub.tentative.html": [
[
"import-maps/fallback.sub.tentative.html",
- {}
+ {
+ "timeout": "long"
+ }
]
],
"import-maps/http.sub.tentative.html": [
@@ -363759,6 +366427,12 @@
{}
]
],
+ "largest-contentful-paint/iframe-content-not-observed.html": [
+ [
+ "largest-contentful-paint/iframe-content-not-observed.html",
+ {}
+ ]
+ ],
"largest-contentful-paint/image-TAO.sub.html": [
[
"largest-contentful-paint/image-TAO.sub.html",
@@ -363771,6 +366445,24 @@
{}
]
],
+ "largest-contentful-paint/invisible-images.html": [
+ [
+ "largest-contentful-paint/invisible-images.html",
+ {}
+ ]
+ ],
+ "largest-contentful-paint/larger-image.html": [
+ [
+ "largest-contentful-paint/larger-image.html",
+ {}
+ ]
+ ],
+ "largest-contentful-paint/larger-text.html": [
+ [
+ "largest-contentful-paint/larger-text.html",
+ {}
+ ]
+ ],
"largest-contentful-paint/loadTime-after-appendChild.html": [
[
"largest-contentful-paint/loadTime-after-appendChild.html",
@@ -391816,6 +394508,15 @@
{}
]
],
+ "scroll-to-text-fragment/scroll-to-text-fragment.html": [
+ [
+ "scroll-to-text-fragment/scroll-to-text-fragment.html",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
"secure-contexts/basic-dedicated-worker.html": [
[
"secure-contexts/basic-dedicated-worker.html",
@@ -392227,6 +394928,12 @@
{}
]
],
+ "selection/toString-ff-bug-001.html": [
+ [
+ "selection/toString-ff-bug-001.html",
+ {}
+ ]
+ ],
"selection/type.html": [
[
"selection/type.html",
@@ -392810,6 +395517,12 @@
{}
]
],
+ "service-workers/service-worker/clients-matchall-frozen.https.html": [
+ [
+ "service-workers/service-worker/clients-matchall-frozen.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [
[
"service-workers/service-worker/clients-matchall-include-uncontrolled.https.html",
@@ -402987,12 +405700,6 @@
{}
]
],
- "trusted-types/TrustedTypePolicy-exposed.tentative.html": [
- [
- "trusted-types/TrustedTypePolicy-exposed.tentative.html",
- {}
- ]
- ],
"trusted-types/TrustedTypePolicy-name.tentative.html": [
[
"trusted-types/TrustedTypePolicy-name.tentative.html",
@@ -403029,21 +405736,15 @@
{}
]
],
- "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html": [
- [
- "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html",
- {}
- ]
- ],
- "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [
+ "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [
[
- "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html",
+ "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html",
{}
]
],
- "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [
+ "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html": [
[
- "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html",
+ "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html",
{}
]
],
@@ -416013,6 +418714,12 @@
{}
]
],
+ "webxr/xrSession_features_deviceSupport.https.html": [
+ [
+ "webxr/xrSession_features_deviceSupport.https.html",
+ {}
+ ]
+ ],
"webxr/xrSession_input_events_end.https.html": [
[
"webxr/xrSession_input_events_end.https.html",
@@ -416067,6 +418774,12 @@
{}
]
],
+ "webxr/xrSession_viewer_availability.https.html": [
+ [
+ "webxr/xrSession_viewer_availability.https.html",
+ {}
+ ]
+ ],
"webxr/xrSession_viewer_referenceSpace.https.html": [
[
"webxr/xrSession_viewer_referenceSpace.https.html",
@@ -441709,7 +444422,7 @@
},
"paths": {
".azure-pipelines.yml": [
- "5799d624b4efc1e974b3cbeec0e7d9a9f6cf2e17",
+ "1884272c4fc71bbe25294c197d6e3b7cf867ff2d",
"support"
],
".codecov.yml": [
@@ -441721,7 +444434,7 @@
"support"
],
".github/workflows/pull_request.yml": [
- "0bedfe3d42ceadc2ffd32d8c66b9c38c120ab9ca",
+ "8f3940a291b25f48e578b22dc68f7cf94ce32202",
"support"
],
".github/workflows/push-build-publish-documentation-website.yml": [
@@ -444256,6 +446969,26 @@
"030263472a36c76f7ce15256187a658ed6b77cf7",
"testharness"
],
+ "2dcontext/imagebitmap/no-coop-coep.https.window.js": [
+ "5295f1e10cfdd572272519f96e4f17d63f60abec",
+ "testharness"
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-popup.html": [
+ "f0228503ffa8aa6dd57eebdead094f085ed7dedf",
+ "support"
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-popup.html.headers": [
+ "63b60e490f47f4db77d33d7a4ca2f5b9a4181de8",
+ "support"
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-worker.js": [
+ "a6e9cc58935c417369cf5aee29c03dd17c86a5c7",
+ "support"
+ ],
+ "2dcontext/imagebitmap/resources/coop-coep-worker.js.headers": [
+ "6604450991a122e3e241e40b1b9e0516c525389d",
+ "support"
+ ],
"2dcontext/imagebitmap/transfer-worker.js": [
"55465a899ca27d5202dfa796ec5200bde845892b",
"support"
@@ -452176,40 +454909,68 @@
"dcf3d2832c33f72e8dce2356956baac1d83eafed",
"support"
],
+ "bluetooth/adapter/adapter-absent-getAvailability.https.window.js": [
+ "cec09c38b138653297ee1df6ab0811a0575978bc",
+ "testharness"
+ ],
+ "bluetooth/adapter/adapter-added-getAvailability.https.window.js": [
+ "d5e9d1f2b6ffbb009b03d0cde8155144aeee630b",
+ "testharness"
+ ],
+ "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js": [
+ "8fe9265a46ed22a9bb0e0480f045135b323565f0",
+ "testharness"
+ ],
+ "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js": [
+ "8b9256a4c35680722ad2ee00784de6649b703611",
+ "testharness"
+ ],
+ "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js": [
+ "b8b49121fc0170eb9dc95614b5c3b19ef16bd02b",
+ "testharness"
+ ],
+ "bluetooth/adapter/adapter-removed-getAvailability.https.window.js": [
+ "cc2c33d1d4c2bf2cdad0cd0874a739b462ff90ec",
+ "testharness"
+ ],
+ "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js": [
+ "bf5e4226e08d44e521b533f020c0deaa95851983",
+ "testharness"
+ ],
"bluetooth/characteristic/characteristicProperties.https.window.js": [
"abe9f79ce26ed7cc9f5c17cfd2f0e1e70d1d3657",
"testharness"
],
- "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [
- "02aaeccb02283bf981d3ef08fa05a38f20c749e1",
+ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js": [
+ "97256a4533007d9c52ec395ba5a811c212aaf48c",
"testharness"
],
- "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [
- "52b39c1e0cb3c552c48b642c33e56e07cdf3614f",
+ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js": [
+ "8847efab3c1565150110155f3fcbf11c54003846",
"testharness"
],
- "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html": [
- "bfb4c8dcf6ad78aeee33b0b80a38c0e7c6772ecd",
+ "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js": [
+ "b9dc92482ab6f4f564c322c2fa9b19198e576e33",
"testharness"
],
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [
- "c00d4cf57833756412d265a52822d34892f9efec",
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js": [
+ "25bde7cecc5fbfa7d83bf5fd5c29f551598a2d43",
"testharness"
],
- "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [
- "a29548f3656217b614ab236298e92ef225ba2e35",
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js": [
+ "c3ff9f6a05c625da3ffc4ab5bdab3a6bab82f524",
"testharness"
],
- "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [
- "20df1d080024f12cbc28a09f3b90caed2d734730",
+ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js": [
+ "c997d7afda2c1faef8fe2e33ac430286334edd4d",
"testharness"
],
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html": [
- "de83400b20816908d45601bd670f4c5acc1c3b9a",
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js": [
+ "03bb51239dccd4ca479f8159052086c2c0c1c285",
"testharness"
],
- "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html": [
- "c9056dd3b3c937f157b0495ee2964bbf21a59692",
+ "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js": [
+ "762f9cc99554aa206f7cf4c767c2db5dbdb0634c",
"testharness"
],
"bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js": [
@@ -452232,8 +454993,8 @@
"eee34d0612d3611121d219c0b4098937df507ece",
"testharness"
],
- "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [
- "a80bccfe469223145ae4ec78dfd33e24a613fcd7",
+ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js": [
+ "a2de3c39e20626b617926618da10acfb5f81a83d",
"testharness"
],
"bluetooth/characteristic/readValue/read-succeeds.https.window.js": [
@@ -452256,8 +455017,8 @@
"6b1f543ae5e9944d4792a01209417016f4566a2e",
"testharness"
],
- "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
- "d9a9594320d5ec337b5b50ac5f7873e547e4b30a",
+ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js": [
+ "76b2d42a481f1f73ba869e2350627c080531bf7e",
"testharness"
],
"bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js": [
@@ -452268,8 +455029,8 @@
"33a963bed0950485a06685df8a601025bd4c419c",
"testharness"
],
- "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [
- "1652070463057dc48ef64cdb4bfe07379a672a49",
+ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js": [
+ "00c50894e5bb1e444ecc02c441d6bd6343ccdd58",
"testharness"
],
"bluetooth/characteristic/writeValue/service-is-removed.https.window.js": [
@@ -452280,44 +455041,44 @@
"1472c619a2dbdf5c8536e240ff024349a6e938ea",
"testharness"
],
- "bluetooth/descriptor/readValue/gen-service-is-removed.https.html": [
- "e453c8063741f565c15166ddf6565dd5bae02693",
+ "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js": [
+ "3b6c78a97c586fd02da2ccd53c81291b79512f8c",
"testharness"
],
- "bluetooth/descriptor/readValue/read-succeeds.https.html": [
- "35ff057cbadf12c8d7ada949fe1db07a01450a66",
+ "bluetooth/descriptor/readValue/read-succeeds.https.window.js": [
+ "5f3c5f8f084c11639ea86f7332d03f56e7c72b4e",
"testharness"
],
- "bluetooth/descriptor/writeValue/buffer-is-detached.https.html": [
- "2ab990de61c5603976d3dc915d078a59f11d30a2",
+ "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js": [
+ "23ea2329a64f4da8a4cc5cd4a9de7ed0a7b6047e",
"testharness"
],
- "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [
- "acd56c3aa45723f1019806b15332697e2e04690f",
+ "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js": [
+ "ca75ebaba8867c0ede9ed743537ace2b702f095d",
"testharness"
],
- "bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [
- "c406e50c199200c3df8df52c308ce8be68dfc9ee",
+ "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js": [
+ "245e43d31504a555af42971b87978a4f48c949a2",
"testharness"
],
- "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [
- "8208231bf55614f65d31e3dd46443c390adf1dc9",
+ "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js": [
+ "69e30443ee6f505fbd2a4623457251ac564bcb4b",
"testharness"
],
- "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [
- "92be9c35039adcb9e192f6a899e6800a7672ecd2",
+ "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js": [
+ "317eddee9ba86d6b1357ce6a845b2b99c78d15da",
"testharness"
],
- "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [
- "6d0c8e28c5d21bb2ec3a9b54a8b9037a39c0b6c8",
+ "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js": [
+ "93a46eeb934f0ebef9ff378ed7f9e59379d9d094",
"testharness"
],
"bluetooth/generate.py": [
- "034ca22c619bcfc93cd4c8b4cd29dd7a04a15ebc",
+ "f7fffddbc301f3e555f75ad4cb2d067430628925",
"support"
],
"bluetooth/generate_test.py": [
- "881f7dbcb73af73b18b447f5cea142f53ba2fd36",
+ "8cb61dda8fa43ac677998ee212006fda25dd6927",
"support"
],
"bluetooth/idl/idl-Bluetooth.https.html": [
@@ -452501,11 +455262,11 @@
"support"
],
"bluetooth/resources/health-thermometer-iframe.html": [
- "1545a513960ac346412fb63095b2a716aafe42f8",
+ "367b778c45416b0fe50e9d1281bb71062f5e381f",
"support"
],
- "bluetooth/script-tests/base_test_html.template": [
- "714333c5e1302ea918dd939190174ccd9c6f9998",
+ "bluetooth/script-tests/base_test_js.template": [
+ "56971d2c6c98faaf479f3a89fb0757e85bf9b42c",
"support"
],
"bluetooth/script-tests/characteristic/characteristic-is-removed.js": [
@@ -452648,68 +455409,68 @@
"04ccedeb5e9781923fe02d598a25218d3f59179e",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [
- "af00c66d789a0e3e1a98492f091e0554fb00a7ca",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js": [
+ "2d94b41e0207689824be914a21ef7fab4f866d10",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [
- "6656ff16a1439deede03eebe10e304d071c7e747",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js": [
+ "0d6e8a7a179070c7d4a023ad550d8b25f3a3bcdf",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [
- "760be97ebd8e5c8125762a5f6e38e455380333f8",
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js": [
+ "18af59d7f803a5a7adbcf1658a4449302b5d8291",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [
- "4c3c577fcc5969082121985b4d03f661b5c0d6fb",
+ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js": [
+ "5cfe893f5d81ca2a6c07ec02e4c29ab96b594175",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [
- "abfd1a9c2da426de15cb525e76f7d5009ee6464b",
+ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js": [
+ "622f2cf3212cf66f11545e157e0fa389c7f5f3d8",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [
- "098eec4113b06228787bdf7d78c28a920a32c5fc",
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js": [
+ "5afb0262658249caee332d8988f62a5da8829865",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [
- "233a45adf0695f44b4b03a4c9760dd0a33a4ede5",
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js": [
+ "86fa5e9b011b8c4c08ffad135a5e893c138c4e4b",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [
- "ab93d334818365216cd63d522dc76adb9b5b9b71",
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js": [
+ "2c35c1b7556297c4d595f451662ed6df7d09df77",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [
- "647aa504a208de51cb1b7d1bdb8bc19b9d0d101c",
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js": [
+ "cca8c2c5d2f2bf0c5f758b4299d54ca2a1f76e4d",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [
- "f09e4e65c27944a4b23a1f7bfd8c5b81915d27dc",
+ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js": [
+ "a0f073d8a314ea9574a9187a6b97c39fd7c1fdad",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [
- "35893d24a6037b7ab4086b8ec0d7b15a5e807f51",
+ "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js": [
+ "3deb387406e4fd197890422d77c1b0e288b9ad3a",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [
- "40777eee90679905f603d00e47d994e3f4bc30dd",
+ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js": [
+ "d59e202d71cc3d4b8876ebbdef188170fdaa339f",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [
- "7883ef36d4e0b60ed67add1cd5dd74138ca7b798",
+ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js": [
+ "89ca46884478194b5e0b447bbe51810ea8217cd7",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [
- "566a9fbe091a36f8fce020bb71f3c2671c70b864",
+ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js": [
+ "fec0055dcdb7ab1c11b44388d2ea4b2972e19910",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [
- "c9ce1b80aa43f89c947eb36a653f678a0c866ebf",
+ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js": [
+ "a0161a0446b37b00ba351eaff67ba5f6c4a53cda",
"testharness"
],
- "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [
- "aca14c5fd4082940cac547703fbac663200162d7",
+ "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js": [
+ "60fb4f2c529443eb06e28118cf506d5fff12bfd8",
"testharness"
],
"bluetooth/server/getPrimaryService/service-found.https.html": [
@@ -452732,108 +455493,108 @@
"9fffbd5d00e3c5d41e43e1b722d87f53933ea1a3",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [
- "4449d2ebbd4036a1465a47bf77d6bb4c9d38c86d",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js": [
+ "86a346d14839efc6a5baa913c430328517780d67",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [
- "3bf4ed6dccb84a9c3704e834384799168fe9f229",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js": [
+ "97e9f77d12e668021ca6303eb669666ec16b787d",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [
- "d7cb43725edf72c6a0903942c8dbd0c476e6d33c",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js": [
+ "37394075d80cf113bec492d02c48e7e2ba394651",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [
- "27440af916220d791ca7cb6f96d55300c9d64ecb",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js": [
+ "9c7aac67a4a3e1fba531a817973daf211e5e9fab",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [
- "7b9955ade4489154d84ba21314f7d799cf511a3e",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js": [
+ "bffcea4e9fb3b1e6367bbc353f36dd4ccd7d3855",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [
- "4b09bce4eeef026e7bf4ca394e6b6f186e9490ad",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js": [
+ "162a61f3eb5f15a1b152eb8d6d4d3b0463beea3c",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [
- "2ef6b5904ac8527f3e252398ae7180f1f29fa60c",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js": [
+ "05dce42424d02d7dd6a47d867189be3fdd827ea3",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [
- "bc21ea1f2dbc20b901bcf61e6d06a824bf80ba56",
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js": [
+ "e17162a71987c291060199dd156e64033d6829b7",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [
- "0a87bce2d03099804a572b320142d537afff4790",
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js": [
+ "3bfa60d8ccb3e6e5403b06d0d1d1fa82a52fc284",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [
- "dbc4428665ca20b23e3c396a373fb40cac666644",
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js": [
+ "7072b3efb1f7aeeb8d07eb2c5ff01f045859dad4",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [
- "460b94d2565e7ee1d1680de8818476ba633388c1",
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [
+ "589ebe386444f2f50820034a737c8a30cdbe5060",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [
- "38e0d455b462e5065b3baa462bb1a771feb947af",
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js": [
+ "15b8b978040129b6bc416d838b317ca97fc1219b",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
- "31ab862e82cc98bf55ae223c760feeb12ad930ef",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
+ "17495d24ebadcd9752b06201a7035f45cfcb3635",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [
- "a79060adc56ac3b45bf83e33193cdac9f167c549",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js": [
+ "741cd2171f894c99bdfa9fa506a62e1bd2488218",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [
- "b6f0e4a3eef6acae0a69092cbcaad3423f97b48a",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [
+ "1ee4f21ccba63ef5806840934248c7a6d6def35f",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [
- "baf7865b2f5690e0684674bab06287a3ad8d9fd8",
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js": [
+ "285b774c4e70557f8f14b05c4d9de2b8276a945f",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [
- "b87a24a5e0e5ebecebf9c22522a5d4bbc24b7a69",
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js": [
+ "eb20e6f4b2f8fc2193b2f566eb8b7952747c495c",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [
- "9ed3c50e6bef4d0002f837495ee9a0164d5ac439",
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js": [
+ "14fc656c70dd4352aa4d2ab53e98015dd2704978",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [
- "9d213d5dfd824c052c74ac2aa2647c643d7a49fc",
+ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js": [
+ "f3fc4906b44eec68feebcd289320a54fba682246",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [
- "258bda0ec68fc511189a138cf80f04e06d4b9f5c",
+ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js": [
+ "c7c488a18b9413e488680b431361981beacb5c1a",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [
- "969ad61ea65d91d2b7d83b00e6fca298277d6544",
+ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js": [
+ "025f1ccdf7c832343d6631e7a85452f7390c5c16",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [
- "696b1f9471dd61a290520457321c4e8261e94063",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js": [
+ "6f1bb251723a6fda193fe3f0428d730da416506c",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [
- "41bbf6eecd0af9ee5403c46b7549863853bbcb71",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js": [
+ "4bbddeae56ef7fa18656133191abc0e6b2bce1ca",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [
- "58bea8829463c50d1ccd2ab67444e40aaa2b8573",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js": [
+ "40b8b576ff4fc57b53a544a5c863985630bbe5ea",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [
- "4f8254ad86e3da558e90da3560b0b32a512ce9ea",
+ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js": [
+ "6f737ecf889d9f96c0e28851c2eb9f5782522fd9",
"testharness"
],
- "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [
- "cb5e0941f6662a40060fc0d91bb9675fa66f36da",
+ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js": [
+ "33946d281bd8219f4dd07a7a2166f626187c10cf",
"testharness"
],
"bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html": [
@@ -452860,32 +455621,32 @@
"9746f4b058ca73a508a875d5749175a782b752bb",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html": [
- "9e42a469c678d97893048150544c3def1b0c19fc",
+ "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js": [
+ "04176f1ecdadcdfa6214468973d9d52c2f074c90",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html": [
- "5fc3ec470acb80f0aca243f0e56915fd39b21338",
+ "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js": [
+ "cfec509c49205dd407cfe5b114800d1c65f87c8a",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html": [
- "0b81768d50876754b5335f309ba995cf446e71b7",
+ "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js": [
+ "9543a5e56337ad970a2ab29ef7d2cd2b3ad5c584",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-get-same-object.https.html": [
- "e8fc6542ccebc1f1088efeeb1b3e6c644a57d6eb",
+ "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js": [
+ "73691befa52f79c6739f2e1763569afce4a61c46",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html": [
- "08c1352155a8bb54cb05c994077cedab6af7bd84",
+ "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js": [
+ "d21dcf561224906c05e7dacd323f81bab7e408d1",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html": [
- "2fe9cd06cf7b043b7011e87585711e3c4017afe1",
+ "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js": [
+ "6f86214246457a68fe383ff2aa148f533f547a72",
"testharness"
],
- "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html": [
- "391c49a0babb7d3442fefac00eaaad9034d55e23",
+ "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js": [
+ "b6d6a9df96e73b53008c2655bf524c0d1fe2f687",
"testharness"
],
"bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html": [
@@ -452904,48 +455665,48 @@
"6401740681a66b8581120671edcb70f5663621a3",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html": [
- "eeaa5b3da30526fd13057968f70ba44369c35f00",
+ "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js": [
+ "3afd294d5b12755b4401287d2ff818e4c50f7f38",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html": [
- "7f32b30b3034ff7b402bea63347797d03755662e",
+ "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js": [
+ "549f6b2671940e0a132fa3b2123ae24be9a912c7",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
- "36ef29b6c5bfc4b9b2a5a339c6927c958304b96c",
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
+ "643e2f839efabbc2e907e20b062903e13dc2be92",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html": [
- "5768ff42abc1c5009524fa92cc86fa7ff39af53a",
+ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js": [
+ "b7db67f613f65f43dcb078740302d2fed08c4ded",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html": [
- "917d84df4c7229e8a550d0826eca7942a719525e",
+ "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js": [
+ "15b552af4913a45235ac196111692764f07691ef",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-get-same-object.https.html": [
- "ebdd803efa249ada38aaed6fe710b64effa5973e",
+ "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js": [
+ "df30d514f39adaa3e6d42747cf7c13a247011992",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html": [
- "0bcb25cdf0cac9caedf081076062e641be703a6d",
+ "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js": [
+ "f980ac03d5f4e5c2c9e1036eda709245c2836d27",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html": [
- "4226bcbbfa27b190bcd58f11d0fdc9c66a313dd7",
+ "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js": [
+ "eb4233764aaadc4389ebe9518b1eb89c882ce68c",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html": [
- "9157275640ce7f52a0fea8d44df3958b3a599308",
+ "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js": [
+ "a6d38805973a7638c36dfd09af6d566280576b44",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html": [
- "62caaad12b57af31aa8d2985ffcabf1c4c1a0786",
+ "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js": [
+ "527eb76527696505dde06078b11985499cb74ed1",
"testharness"
],
- "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html": [
- "4868127465adfe8ec405d843de9fc115d725c280",
+ "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js": [
+ "466503241ed098f063b59b6317e112434ac04c47",
"testharness"
],
"check_stability.ini": [
@@ -473637,11 +476398,11 @@
"testharness"
],
"content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html": [
- "16df5100b59a80178cab59ff703c250042d628b1",
+ "92e8f17acd5816c505289b71df45e2110a391a89",
"testharness"
],
"content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html": [
- "a076eafd559c80bb510aa3c43669be563646adb8",
+ "8a2e17ce8e7eafa0d7292845f9c9f81b86810d62",
"testharness"
],
"content-security-policy/style-src/stylehash-allowed.sub.html": [
@@ -537672,6 +540433,22 @@
"d673be5f4f29bf82619aba6f40ed7e287e902582",
"support"
],
+ "css/css-backgrounds/animations/background-color-interpolation.html": [
+ "bb727d8e4ef3328547a746c31340b6ca2b885f5c",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/background-position-interpolation.html": [
+ "35100fb33622c03f6454ebc051569ccba67564e9",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/background-position-origin-interpolation.html": [
+ "c6b84ca2aef0a8222b4b4c5713d1998beff799db",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/background-size-interpolation.html": [
+ "f6a480c7bd2ccc4a6c46fa2eade5e7231fab4938",
+ "testharness"
+ ],
"css/css-backgrounds/background-331.html": [
"121623453a61599fcc494a9582c31a79f78cfeb1",
"testharness"
@@ -538192,6 +540969,10 @@
"af0efd918ec401b8e2289b7589bcbf88c8b28848",
"reftest"
],
+ "css/css-backgrounds/background-position-negative-percentage-comparison.html": [
+ "389ee719196cd3dd1afae63d6d773039d0472111",
+ "reftest"
+ ],
"css/css-backgrounds/background-repeat-round-001.html": [
"d4ff39384de587a70e4d8e06780b25098d460fbb",
"visual"
@@ -540800,6 +543581,10 @@
"8be4ce20e3d756e9121299bddba79951005905fc",
"support"
],
+ "css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html": [
+ "aa68e23fe09ba6e2c4a2391f9b2ae129037f1dde",
+ "support"
+ ],
"css/css-backgrounds/reference/background-rounded-image-clip.html": [
"2436bedad5022b95f0913d07501e7ebf206f8a51",
"support"
@@ -543173,7 +545958,11 @@
"reftest"
],
"css/css-contain/contain-size-012.html": [
- "b80e605a32b50c51e75e6ea0eab386377ca94e37",
+ "5c8e4f0370647465b9c07e8bd6e487df4c37a0fd",
+ "reftest"
+ ],
+ "css/css-contain/contain-size-012b.html": [
+ "e52f34578532f95360db41c785c041006a541a07",
"reftest"
],
"css/css-contain/contain-size-013.html": [
@@ -546584,10 +549373,26 @@
"7148f26e2770b669dfcc69435e3a506882ffd457",
"reftest"
],
+ "css/css-flexbox/dynamic-change-simplified-layout.html": [
+ "5d15e22c5eba93488c8e6e667b61306669c32026",
+ "reftest"
+ ],
"css/css-flexbox/fit-content-item-001.html": [
"c5dfb74711f5c22c2f12b456f78cd7dd373f1659",
"reftest"
],
+ "css/css-flexbox/fit-content-item-002.html": [
+ "d10700d242ab53cd64cd37607d68ded1d9eae286",
+ "reftest"
+ ],
+ "css/css-flexbox/fit-content-item-003.html": [
+ "45905b16ce3ffb7db56181073345b6c050763936",
+ "reftest"
+ ],
+ "css/css-flexbox/fit-content-item-004.html": [
+ "b9318c2e1800723394b16572696bac5169b4784c",
+ "reftest"
+ ],
"css/css-flexbox/flex-001.htm": [
"df3fbe533aa59a87ba1e7670ac8c7446527c98aa",
"reftest"
@@ -547236,6 +550041,10 @@
"c74ad830e6b2586be1a13f0eec4a7e655b288da4",
"reftest"
],
+ "css/css-flexbox/flexbox_align-items-stretch-3.html": [
+ "09ef2eba0a18de13f91500a8f24baf70043b9978",
+ "reftest"
+ ],
"css/css-flexbox/flexbox_align-items-stretch-ref.html": [
"540724211bc1cd615bb9359db0615182639a2886",
"support"
@@ -549720,6 +552529,26 @@
"d47cbce32bb31ff1ea4df81f122c673d7f942677",
"reftest"
],
+ "css/css-fonts/animations/font-size-adjust-interpolation.html": [
+ "fd89da3b969c2ad2f8fb522c600bddc740d8146b",
+ "testharness"
+ ],
+ "css/css-fonts/animations/font-size-interpolation-001.html": [
+ "0f60018c2e1ce453fe87b3854ffb25c4eb26f924",
+ "testharness"
+ ],
+ "css/css-fonts/animations/font-size-interpolation-002.html": [
+ "d6f2f19ab1e585b802dc9b2214558bf6ae643022",
+ "testharness"
+ ],
+ "css/css-fonts/animations/font-size-interpolation-003.html": [
+ "d84ff7e5dfe3f4c86ed4b9bf30914ed3d11b156c",
+ "testharness"
+ ],
+ "css/css-fonts/animations/font-variation-settings-interpolation.html": [
+ "e11079cfc012ce8937b504662e1f0f6f92351fe2",
+ "testharness"
+ ],
"css/css-fonts/calc-in-font-variation-settings.html": [
"1a7c59abd5ddebfc6cd1f972ee6a186bdb7b97df",
"testharness"
@@ -550144,6 +552973,10 @@
"cae02b35af82db73522cfd8a3800f33506e47b80",
"reftest"
],
+ "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html": [
+ "167de8888725ca55090ac80cda43cddb299b7c7d",
+ "testharness"
+ ],
"css/css-fonts/font-stretch-01.html": [
"4d7dcd8d577da18b5aa81af6d143a3e808028228",
"reftest"
@@ -561228,6 +564061,74 @@
"5f175100e55ba48fa8cda6f2cd626affee0e3b09",
"testharness"
],
+ "css/css-layout-api/edges/all-ref.html": [
+ "2a04f96e7325e98c51fd4774e316e0c766b62ae6",
+ "support"
+ ],
+ "css/css-layout-api/edges/all.https.html": [
+ "e38d3666b87296df160ef19f94927760f66d53f7",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-htb-rtl.https.html": [
+ "cb200a76758c48d955bc001262d05d445c4451ef",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-htb.https.html": [
+ "67a38588303793d0b7705de2c6d938a6754e3de8",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-vlr-rtl.https.html": [
+ "8da84e9acc9d722976c5aa277c9902bf0fc4c25e",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-vlr.https.html": [
+ "b514b2f22ff485d560bc6508f4c2d70a630633ba",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-vrl-rtl.https.html": [
+ "38c8c3f0463b2b3dbe1b56aa6422a2141e7613ea",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/border-vrl.https.html": [
+ "94c5353eb93eff80c3734b17cf86959bbf28fd97",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-htb-rtl.https.html": [
+ "dfbf2bc099da97ff787ae9ba22ad70a7c3787629",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-htb.https.html": [
+ "ebad66594c634675c1bb6eca1bfb69bb56a9eacb",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-vlr-rtl.https.html": [
+ "86b0ca5425b6cc43f0d6529bb988d995738f852d",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-vlr.https.html": [
+ "563884ade3544edc39ea3920be32d7dcdba973bf",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-vrl-rtl.https.html": [
+ "bda0a211442e6f37badd576bb4a8ef4eb15ba291",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/padding-vrl.https.html": [
+ "a65ecad31152da6c44ca49c0fd81d47a950934fd",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/scrollbar-ref.html": [
+ "cc41754c0822f2895f12703cfd809bfc63542e39",
+ "support"
+ ],
+ "css/css-layout-api/edges/scrollbar.https.html": [
+ "76bbd4dccd075fe2f6e52aea606414999e1ee0a9",
+ "reftest"
+ ],
+ "css/css-layout-api/edges/support/edges.js": [
+ "b70a42f398c34f0d3a7981fec16447ffa8a1e97e",
+ "support"
+ ],
"css/css-layout-api/fallback-layout/bad-return.https.html": [
"4c90ae7d336682c948a237937c01475a6fa4cdae",
"reftest"
@@ -562044,6 +564945,10 @@
"2d8f937f075b0d0fbde677e15266f47af5fec3f8",
"testharness"
],
+ "css/css-logical/parsing/margin-block-inline-computed.html": [
+ "6ef52bda3b87363942461ddd52ad935abeccc31c",
+ "testharness"
+ ],
"css/css-logical/parsing/margin-block-inline-invalid.html": [
"a1e0cbf3885b6518266eba0ef23d40f53a0c5c20",
"testharness"
@@ -562100,6 +565005,10 @@
"fa4ba0d1bb2607d954d3a2ea3272282872704799",
"testharness"
],
+ "css/css-logical/parsing/padding-block-inline-computed.html": [
+ "230f18525a0ca4ef9a525081447461c444458bf8",
+ "testharness"
+ ],
"css/css-logical/parsing/padding-block-inline-invalid.html": [
"56c2adb07827ef54b42b6a797e0f700eeec56165",
"testharness"
@@ -567085,7 +569994,7 @@
"testharness"
],
"css/css-properties-values-api/register-property-syntax-parsing.html": [
- "6d7dbc63a1d38f108a3a10e99b09cddd84b135f7",
+ "fe2a63a57a168c8e791c6cec9d9d1843ca2c1216",
"testharness"
],
"css/css-properties-values-api/register-property.html": [
@@ -571896,8 +574805,28 @@
"086e654a8e039f259b5e828d024f808c2e95016b",
"support"
],
+ "css/css-sizing/animation/height-interpolation.html": [
+ "10ceed5b2cc0d5511b8020aeaced36be39834c3a",
+ "testharness"
+ ],
+ "css/css-sizing/animation/max-height-interpolation.html": [
+ "c4cab0e1cf4534d3705801f3159b6b8724977b66",
+ "testharness"
+ ],
+ "css/css-sizing/animation/max-width-interpolation.html": [
+ "111199baa7ed89c6023d43b56313413cc5aeeeeb",
+ "testharness"
+ ],
+ "css/css-sizing/animation/min-height-interpolation.html": [
+ "6fd5b4e2f5366f6b18678f60b982e82905558e51",
+ "testharness"
+ ],
+ "css/css-sizing/animation/min-width-interpolation.html": [
+ "d11fb3d5cb139f870d1eb40618bf547176f109b1",
+ "testharness"
+ ],
"css/css-sizing/animation/width-interpolation.html": [
- "33bc1b14c83f45afbea4cdfadbe3959ac829e615",
+ "16b67c5ed66b769359e24df7c17f9d7baf0a46e9",
"testharness"
],
"css/css-sizing/aspect-ratio-affects-container-width-when-height-changes.html": [
@@ -572100,6 +575029,10 @@
"204cd645ec4ca0d1ae7d0fb29b1ff4e2bf8d1211",
"testharness"
],
+ "css/css-sizing/parsing/max-height-computed.html": [
+ "c4c6703250d3850ff375665c67ffff7b28db5b85",
+ "testharness"
+ ],
"css/css-sizing/parsing/max-height-invalid.html": [
"3798bb31c52b64dfc18247e4d89da44a024ab42d",
"testharness"
@@ -572108,6 +575041,10 @@
"3c4aab833f173fb9d33b704baa0e16c1842bd833",
"testharness"
],
+ "css/css-sizing/parsing/max-width-computed.html": [
+ "7e1c0fc2388039b4a4d7719c878c25209b39e647",
+ "testharness"
+ ],
"css/css-sizing/parsing/max-width-invalid.html": [
"86e852833819e2c58e84cb15680e37e989e9f626",
"testharness"
@@ -572116,6 +575053,10 @@
"4788ccfe6631105e8745b89317298976b1f54557",
"testharness"
],
+ "css/css-sizing/parsing/min-height-computed.html": [
+ "c15ee9de772af2023063ef5cb4a35781aba0a7f4",
+ "testharness"
+ ],
"css/css-sizing/parsing/min-height-invalid.html": [
"0bb939b12be245758dde7ce93e1edab8a19fa0df",
"testharness"
@@ -572124,6 +575065,10 @@
"debefbe0b82748d3665c0e82566ebea78d0271b0",
"testharness"
],
+ "css/css-sizing/parsing/min-width-computed.html": [
+ "0a69352ed772ec3c4507cfb8d6154ba16837f792",
+ "testharness"
+ ],
"css/css-sizing/parsing/min-width-invalid.html": [
"b4e600900dbb8c722567570caa3629c7c5811461",
"testharness"
@@ -572981,7 +575926,7 @@
"testharness"
],
"css/css-tables/html5-table-formatting-3.html": [
- "a12e1df5d84f709705fc5b1d9176229151bb9894",
+ "f32e2dd39c03b4a38f859944aae371c68518d5f9",
"testharness"
],
"css/css-tables/html5-table-formatting-fixed-layout-1.html": [
@@ -574324,6 +577269,18 @@
"e7914c0fc7ff9e6999f8847dc1800968472483f2",
"support"
],
+ "css/css-text/animations/letter-spacing-interpolation.html": [
+ "7d4958113915913bb8a3a5af13f5cee90b080825",
+ "testharness"
+ ],
+ "css/css-text/animations/text-indent-interpolation.html": [
+ "2269fdfa5b60f6f4a8d63a7f777e6abbf499c4b7",
+ "testharness"
+ ],
+ "css/css-text/animations/word-spacing-interpolation.html": [
+ "ffd6bb476ad87976a1183cde70a10892bab77982",
+ "testharness"
+ ],
"css/css-text/boundary-shaping/boundary-shaping-001.html": [
"d6c8fa2b236f56e11f07b15c491321e062972ca3",
"reftest"
@@ -582257,7 +585214,7 @@
"testharness"
],
"css/css-transforms/parsing/transform-valid.html": [
- "e6f10154cb6a1d8b5c9eddbb8f1e7c3b2756554e",
+ "18de33f8a7a21be5b337cc02288471d7ba99f9ae",
"testharness"
],
"css/css-transforms/parsing/translate-parsing-invalid.html": [
@@ -591752,6 +594709,46 @@
"29dc15dfd965c940910ca5c63d6201643277f907",
"testharness"
],
+ "css/css-values/minmax-angle-serialize.html": [
+ "3f424589ba6f9806fefc444320301da5a12303ac",
+ "testharness"
+ ],
+ "css/css-values/minmax-integer-computed.html": [
+ "b3794acba9c8f5cfdf56b31292f971b4ccc0bb28",
+ "testharness"
+ ],
+ "css/css-values/minmax-length-computed.html": [
+ "410884495461508d94b3a11c385ab1afba60d75d",
+ "testharness"
+ ],
+ "css/css-values/minmax-length-invalid.html": [
+ "1405c3198128530939d9778642aaab2920bb6e60",
+ "testharness"
+ ],
+ "css/css-values/minmax-number-computed.html": [
+ "c72c276625466a193bf8829e3ddbb87d7a565dc0",
+ "testharness"
+ ],
+ "css/css-values/minmax-number-invalid.html": [
+ "3f34fde2f23732ed1b9bc540a098e5914ad674bf",
+ "testharness"
+ ],
+ "css/css-values/minmax-percentage-computed.html": [
+ "9f9d0a59d12c2642bfea8ca5a3e2f8528067c80e",
+ "testharness"
+ ],
+ "css/css-values/minmax-percentage-invalid.html": [
+ "48d2cdabec1bee5cde0d5d6f4c3524f463916db1",
+ "testharness"
+ ],
+ "css/css-values/minmax-time-computed.html": [
+ "36bcf601eb808311732562a6c1c6a7c801f33e9d",
+ "testharness"
+ ],
+ "css/css-values/minmax-time-invalid.html": [
+ "bebe674cd79565a364253f3290dd60b7073e2af1",
+ "testharness"
+ ],
"css/css-values/q-unit-case-insensitivity-001.html": [
"b4a08aa117952c6f92e2aec6f57843b46a460104",
"reftest"
@@ -592997,7 +595994,7 @@
"reftest"
],
"css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht": [
- "2af581d865c23e149975dc7a07ef04c4901fdf06",
+ "0100a9098f510f6f4687e645f1305a0cd662162d",
"reftest"
],
"css/css-writing-modes/abs-pos-non-replaced-vlr-215.xht": [
@@ -595957,11 +598954,11 @@
"reftest"
],
"css/css-writing-modes/reference/available-size-001-ref.html": [
- "84252946946d4e444f8b0dd69381a1bd04554c80",
+ "d59cde45f6e3be71762ca4acf2711f8d3b0bc50e",
"support"
],
"css/css-writing-modes/reference/available-size-002-ref.html": [
- "6fdbf9a2e34173722e69e23f17d1e477bfe8b651",
+ "ddebe938189a6aea77066747cbe537fbd9e87719",
"support"
],
"css/css-writing-modes/reference/available-size-011-ref.html": [
@@ -599401,23 +602398,23 @@
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-001-manual.html": [
- "a3878d148b2c9ce87ddf7f622ef8c976fbd58cad",
+ "a6ce755f712b74cc093eb6accb0c9cf4a71d0656",
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-002-manual.html": [
- "751057dc77c2b9ab6ee2e5041d4232f415ad7e74",
+ "9f331a0ec87f69c17557f12f986e6a1318f8a284",
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-003-manual.html": [
- "bf3d839ec40febcbac6247e70a80d1278fdb539f",
+ "624cd242cb5663a555b3e2930c7dd5574950cdb8",
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-004-manual.html": [
- "91f991f5285fc93f90b5e64fba7df9f62aef610f",
+ "ce11f1fcb6288f22020a777e66152c39e7cd11ab",
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-005-manual.html": [
- "361f9dbec22857e792b61045e3b6b90ed1dae339",
+ "c2bf8bb00b4c068206d04d947e34c2389bd4b23b",
"manual"
],
"css/css-writing-modes/writing-mode-vlr-forms-006-manual.html": [
@@ -599477,23 +602474,23 @@
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-001-manual.html": [
- "20dea4fbc36e93bd6dc80164083096cb2c0ec5cc",
+ "6963541d38ec93d7c5c3bbb0468b83006e4faabd",
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-002-manual.html": [
- "5d7db3e2a38664862a763b2abe6dd5cdc59bcf44",
+ "f7c1b0f69a6a5be9acd524afbd3179447a30d54e",
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-003-manual.html": [
- "3dfe1d61bf5166307eacba477ffa7a469b2b7a63",
+ "6e960b876f8364c2e75789596fd8d618330b3ab8",
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-004-manual.html": [
- "074603d5811d1a653213f1c2c73c6de417a19076",
+ "bebdf9ca160409904030eba58f4ec80ed669b6d3",
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-005-manual.html": [
- "2ce63cd5664044e6a3f25600fc8586258d84fd99",
+ "dfad4e00f8b083ccaa1da3ba0b4b2b230f02a236",
"manual"
],
"css/css-writing-modes/writing-mode-vrl-forms-006-manual.html": [
@@ -600865,7 +603862,7 @@
"support"
],
"css/filter-effects/animation/backdrop-filter-interpolation-001.html": [
- "576c6b92630129dc50cdd5dac07d0b0471f71c78",
+ "d539a36c5a4aeea7886ff9762f5b02393c85582f",
"testharness"
],
"css/filter-effects/animation/backdrop-filter-interpolation-002.html": [
@@ -600881,15 +603878,15 @@
"testharness"
],
"css/filter-effects/animation/filter-interpolation-001.html": [
- "b4a4b3f4bbad00fb76ee731dd9ed2ac7c2be41bc",
+ "62fcbf0a5de51b6483d3d70b9f411831e2e3afb8",
"testharness"
],
"css/filter-effects/animation/filter-interpolation-002.html": [
- "1b66c2751d417438bee5c8349cf1359dd2042f4a",
+ "6ef25a7dafec17a3f2a4440f82da03658da91986",
"testharness"
],
"css/filter-effects/animation/filter-interpolation-003.html": [
- "5ca1229e297fc65c3a9f4127913d8cc8813de66e",
+ "1d512487de9693b2f8143a46e465cf672709b80b",
"testharness"
],
"css/filter-effects/animation/filter-interpolation-004.html": [
@@ -604417,7 +607414,7 @@
"support"
],
"css/selectors/selectors-empty-001.xml": [
- "baf6bddef632e030ebe3a86f3feb9cb3ec660de3",
+ "3b882debcc717c3e85de8695476eca3fd5238e8a",
"reftest"
],
"css/selectors/selectors-namespace-001-ref.xml": [
@@ -614737,7 +617734,7 @@
"support"
],
"docs/writing-tests/testdriver-tutorial.md": [
- "a8ef3e07a0da92f167d3dcf8ca7416748f1710dd",
+ "275c813355c6cb8e6b5e2e6c1595f40bde28e7ec",
"support"
],
"docs/writing-tests/testdriver.md": [
@@ -616209,7 +619206,7 @@
"testharness"
],
"dom/nodes/selectors.js": [
- "553e62f2587dc904f92eb1899a29e0c8a9e16f10",
+ "c1680cedd708d3228603598d157883e6e8a77222",
"support"
],
"dom/ranges/Range-attributes.html": [
@@ -617300,6 +620297,10 @@
"2fa24769729f705547aa526cf4eca16c483cad78",
"support"
],
+ "element-timing/resources/iframe-with-content.html": [
+ "ab8cdfde0111206a44397e0911153063078b3078",
+ "support"
+ ],
"element-timing/resources/iframe-with-square-sends-entry.html": [
"b8af505d32bc68d7f98b79bf2d2575778a49b26e",
"support"
@@ -618581,7 +621582,7 @@
"testharness"
],
"encoding/textdecoder-ignorebom.any.js": [
- "1f5dabd7b51547d605c72218738b91cd169d4562",
+ "81f210eec89b4ec074040e081b82ca29439a212d",
"testharness"
],
"encoding/textdecoder-labels.any.js": [
@@ -619909,7 +622910,7 @@
"support"
],
"feature-policy/META.yml": [
- "a4136f77e3fbd8524939de235eaff9c0211bfdba",
+ "5fb6249c67a2c67ce692cd0345ea214feaa8cd95",
"support"
],
"feature-policy/README.md": [
@@ -620009,7 +623010,7 @@
"support"
],
"feature-policy/experimental-features/resources/common.js": [
- "cbd0518ff21521ba40422b2f06f36f745dc2bdb0",
+ "c6bea8175129f158f9d2c90c5463cd54f4919a2a",
"support"
],
"feature-policy/experimental-features/resources/defer-script.js": [
@@ -621049,7 +624050,7 @@
"support"
],
"fetch/api/policies/referrer-no-referrer-service-worker.https.html": [
- "0d30ef9e385060477ff3fb862b83a7548ca64e18",
+ "af898aa29f5f6e9ed832113a043980e89b03b88f",
"testharness"
],
"fetch/api/policies/referrer-no-referrer-worker.html": [
@@ -621121,7 +624122,7 @@
"support"
],
"fetch/api/policies/referrer-unsafe-url-service-worker.https.html": [
- "39a65b0e333af2fc99969794b5bdd9a0555d1910",
+ "634877edae8764c0f2017f512a41b0ef0859a09f",
"testharness"
],
"fetch/api/policies/referrer-unsafe-url-worker.html": [
@@ -623897,7 +626898,7 @@
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html": [
- "4b81c7c44f94c42680a812e9bf5b8eddbe7055a7",
+ "fec801e94babfcb3b2072842394547f1f3a8c5f9",
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html": [
@@ -626044,6 +629045,10 @@
"49247179738f68be143e0dc6e6c332f117945029",
"testharness"
],
+ "html/browsers/the-window-object/window-open-defaults.window.js": [
+ "1b2d68a4626ef984025587e16a4dbe61c6069145",
+ "testharness"
+ ],
"html/browsers/the-window-object/window-open-noopener.html": [
"c3c706605492c5c81bc296054eb98c280492527f",
"testharness"
@@ -626444,6 +629449,18 @@
"6604450991a122e3e241e40b1b9e0516c525389d",
"support"
],
+ "html/cross-origin-embedder-policy/none-sw-from-none.https.html": [
+ "5298347fd9d3f36220c03149d49d9f7ea63615cb",
+ "testharness"
+ ],
+ "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html": [
+ "1dec25fadadb8f996e7d3b725b1a3537be52e332",
+ "testharness"
+ ],
+ "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers": [
+ "8df98474b589d070992677cb0134bd47bd0509c4",
+ "support"
+ ],
"html/cross-origin-embedder-policy/none.https.html": [
"b1bb6fefc6cfa45a217cc3b04534df8065fa1579",
"testharness"
@@ -626452,6 +629469,18 @@
"43c44cffd64e01f12a8d0dc22bbddfdd05a79a90",
"support"
],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html": [
+ "896ea46ff08000dae262187268b7d8f57ccd1573",
+ "testharness"
+ ],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html": [
+ "e62184b7b6aa4dc4084516eb8195e8eb6b055c5a",
+ "testharness"
+ ],
+ "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers": [
+ "8df98474b589d070992677cb0134bd47bd0509c4",
+ "support"
+ ],
"html/cross-origin-embedder-policy/require-corp.https.html": [
"0bd6aab729533ba90ffaefccd4ea06e192b1e6b7",
"testharness"
@@ -626500,6 +629529,10 @@
"9db755226020479fd87e87f42ea622c999b38f7d",
"support"
],
+ "html/cross-origin-embedder-policy/resources/sw.js": [
+ "57f0b41ba5b5ff6318e1e4913dfd13bdb1f237a4",
+ "support"
+ ],
"html/cross-origin-embedder-policy/sandbox.https.html": [
"1e3f80a9186107350c307a3ff16fd5ad84e11ead",
"testharness"
@@ -632165,10 +635198,10 @@
"testharness"
],
"html/interaction/focus/document-level-focus-apis/document-level-apis.html": [
- "2d8c49c7f6127fdca7e29800dde3c3096be44aca",
+ "4a8a9a291a9fab7bfa67df1887c53bd5e34aadec",
"testharness"
],
- "html/interaction/focus/document-level-focus-apis/test.html": [
+ "html/interaction/focus/document-level-focus-apis/support/test.html": [
"90d63e51e931b147b23e8e1941324f8fb4237c94",
"support"
],
@@ -632232,6 +635265,14 @@
"bda7c846878833fd50daf1a877ba068a18bc7833",
"testharness"
],
+ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html": [
+ "e3aedea246e6f38904a4835c99c530a4777f41a6",
+ "support"
+ ],
+ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html": [
+ "27a92f76ab7b3a2030d31ed845f97fd507efbf8e",
+ "testharness"
+ ],
"html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html": [
"773739804b3aeaea268080317cd0cb79fba486d7",
"testharness"
@@ -633420,6 +636461,10 @@
"3f457eb492f0b72b2a9c5891e8784d0b69958b38",
"testharness"
],
+ "html/rendering/widgets/appearance/default-styles.html": [
+ "8869808696e39b3d2067f8551e6a41256c37e7bd",
+ "testharness"
+ ],
"html/rendering/widgets/button-layout/abspos.html": [
"c3089b1e39749e003fcadd7d822a8343575be212",
"testharness"
@@ -636840,6 +639885,10 @@
"f6ae65708c661c5ff1a957c3a8606d75a44827fb",
"testharness"
],
+ "html/semantics/embedded-content/the-img-element/historical-progress-event.window.js": [
+ "7c4e121b7c34741fa3fd64e323b65a1388790b5a",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-img-element/image-1.jpg": [
"2fb0255609adc25a3394ae3edbd75ce4a43cb06d",
"support"
@@ -636949,7 +639998,7 @@
"support"
],
"html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html": [
- "c564a5845d5d44c477e57c6f1d8eb6e8c0f457b0",
+ "ab1b2b25091a5cadc1598529f5a9594c24d03720",
"support"
],
"html/semantics/embedded-content/the-img-element/srcset/avoid-reload-on-resize.html": [
@@ -637144,8 +640193,8 @@
"de56cf74eda506c55460cc6da85923b5b7001381",
"testharness"
],
- "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html": [
- "cc018814c922534d57e3945bd3990444853a5131",
+ "html/semantics/forms/autofocus/no-cross-origin-autofocus.html": [
+ "c3974bd02a3655cef5513258e81f65e2f86e07d3",
"testharness"
],
"html/semantics/forms/autofocus/not-on-first-task.html": [
@@ -639549,7 +642598,7 @@
"support"
],
"html/semantics/scripting-1/the-script-element/json-module/non-object.any.js": [
- "398da56595f0f16210dac4f3deeddb2cd7473d65",
+ "dcbe60f2c2f9dc8478711a1cb4ed2e82defe7107",
"testharness"
],
"html/semantics/scripting-1/the-script-element/json-module/null.json": [
@@ -643301,7 +646350,7 @@
"testharness"
],
"idle-detection/mock.js": [
- "d88d1ad1c55afaee243e1e9146827b073c380613",
+ "cb67ce02c313443ef3cdf39340531c9d9e860c03",
"support"
],
"idle-detection/resources/idle-detection-allowed-by-feature-policy-worker.js": [
@@ -643697,15 +646746,15 @@
"testharness"
],
"import-maps/data.sub.tentative.html": [
- "1c7172bf7c6f21aeb22948f9d3eb05d9b3c11b86",
+ "634948942eea674ec923a4cb718cb92d5aab9021",
"testharness"
],
"import-maps/fallback-disallowed.sub.tentative.html": [
- "3f89e8f12dfe04b214b36ef89a89eeccdbea935b",
+ "280d02d847314f97bb88e02618aa46256e055f04",
"testharness"
],
"import-maps/fallback.sub.tentative.html": [
- "4cf3e18182a11a75d682106d88c532d069b6e77d",
+ "3f4f2887da8208e8f65df41735e5b95e6bf59d4f",
"testharness"
],
"import-maps/http.sub.tentative.html": [
@@ -644393,7 +647442,7 @@
"support"
],
"interfaces/appmanifest.idl": [
- "fd26c9ba71e93c7e0350115de745b8e45fc56a30",
+ "ddfe82dc34d31868ea044befa667a8c9987e5678",
"support"
],
"interfaces/audio-output.idl": [
@@ -644413,7 +647462,7 @@
"support"
],
"interfaces/clipboard-apis.idl": [
- "99d1155a3e36519633aa12351990723e3caed581",
+ "9e35287696b94cb4aad99292bf11e398f1d71f2b",
"support"
],
"interfaces/compat.idl": [
@@ -644441,7 +647490,7 @@
"support"
],
"interfaces/css-animations.idl": [
- "cd5f6016e5353f5c5cd74171d5b4c5d158ee2db0",
+ "f87015f6a87fccc0accab30920cd8371eee99e63",
"support"
],
"interfaces/css-conditional.idl": [
@@ -644493,15 +647542,15 @@
"support"
],
"interfaces/css-transitions.idl": [
- "129f1463ed86523f9dedfaaf1dd0d460178c414c",
+ "be5a635112b83cb4315006ac5a86ae7edc7fa43c",
"support"
],
"interfaces/css-typed-om.idl": [
- "be2946bc20f7689577c43635cc10ba635cc9c7df",
+ "b54a16338ec7f9397e1d3f97cc43569acc753709",
"support"
],
"interfaces/cssom-view.idl": [
- "9567b134cf9b4b183c75c63666eb48e2dd20b5ca",
+ "5d30ede1e40debc56ab71ba58a7ddec0ba5b40cf",
"support"
],
"interfaces/cssom.idl": [
@@ -644793,7 +647842,7 @@
"support"
],
"interfaces/shape-detection-api.idl": [
- "83b7f893552e8f290f677e63547b2c133abf1404",
+ "0144f04e046720d20f91a98af9d5c651e95b06fd",
"support"
],
"interfaces/speech-api.idl": [
@@ -644849,11 +647898,11 @@
"support"
],
"interfaces/web-bluetooth.idl": [
- "183f77326051ad116785e3a5c371435afd9f7b65",
+ "f515dda1a814ee1121623033684b3020c355f9ec",
"support"
],
"interfaces/web-nfc.idl": [
- "769eb7dd2f514d8c3e26b355b851588740ee63ee",
+ "ff28d84de3d7f5387b39cc281c5ca1c7e041769f",
"support"
],
"interfaces/web-share.idl": [
@@ -644909,7 +647958,7 @@
"support"
],
"interfaces/worklets.idl": [
- "22d04d15b0614eeb1cda161684edb0c1449d4f68",
+ "16187664b3b4124758c84d054b02b8ddbf585508",
"support"
],
"interfaces/xhr.idl": [
@@ -645416,6 +648465,10 @@
"273fef80ce2d855075781512a9a8ab0a736af420",
"testharness"
],
+ "largest-contentful-paint/iframe-content-not-observed.html": [
+ "7cb23ddbd2058b0079af7980a01781bb1561a3e7",
+ "testharness"
+ ],
"largest-contentful-paint/image-TAO.sub.html": [
"9409fd8fc05c338dc74a3c7bf8fe94d356679633",
"testharness"
@@ -645424,6 +648477,18 @@
"84a49f7ea2220c43c083f91057763ae161035532",
"testharness"
],
+ "largest-contentful-paint/invisible-images.html": [
+ "cd71f30ae45cb438950ca94ecb39a6382b97d48f",
+ "testharness"
+ ],
+ "largest-contentful-paint/larger-image.html": [
+ "7ff38cf2be10c6e20fc5f2ad3d1578755cfbb903",
+ "testharness"
+ ],
+ "largest-contentful-paint/larger-text.html": [
+ "973832ca6c864aff084b7db7880efb981c2bfecf",
+ "testharness"
+ ],
"largest-contentful-paint/loadTime-after-appendChild.html": [
"43ec9f6085d605098faeddce311b5ccbc626b073",
"testharness"
@@ -645537,7 +648602,7 @@
"testharness"
],
"lint.whitelist": [
- "669038166ab38e540f817a760d8346088f2219b9",
+ "a6aa9466810d226208051c597a8c6c3c24337c1e",
"support"
],
"loading/lazyload/common.js": [
@@ -646200,6 +649265,46 @@
"f32a15ec01ac808d2e32ecb8cb232c12a5e0aa19",
"reftest"
],
+ "mathml/relations/css-styling/displaystyle-011-ref.html": [
+ "400c46a2456d0e1d4d48860e3ad557fa5d2990ee",
+ "support"
+ ],
+ "mathml/relations/css-styling/displaystyle-011.html": [
+ "9a85a17dd0f6bd0938199aaa6ce26fc216e11069",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/displaystyle-012-ref.html": [
+ "96042b696ff23756da7d507d5b467519c321a35a",
+ "support"
+ ],
+ "mathml/relations/css-styling/displaystyle-012.html": [
+ "150443f25276d7b5548523ae8912fef27ca1da30",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/displaystyle-013-ref.html": [
+ "9a580350de93632e50334c02f51141afad33f682",
+ "support"
+ ],
+ "mathml/relations/css-styling/displaystyle-013.html": [
+ "60bc906452b670ff2edbed125172ca589234d4c3",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/displaystyle-014-ref.html": [
+ "085e2c429da98ab17c821859e52c4ac0492f8cce",
+ "support"
+ ],
+ "mathml/relations/css-styling/displaystyle-014.html": [
+ "5f30f534e5eb51efa3738a41d3221aa67aa03786",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/displaystyle-015-ref.html": [
+ "2e375c68865ee3f3951f5f00922b958a21eefe82",
+ "support"
+ ],
+ "mathml/relations/css-styling/displaystyle-015.html": [
+ "df25171dbd621ae64ae537ceb256b0dd6f80d7f5",
+ "reftest"
+ ],
"mathml/relations/css-styling/displaystyle-1.html": [
"73e5020e74ce3c77c38b0b7224ed4a0245f5f1b0",
"testharness"
@@ -646228,6 +649333,78 @@
"22fc40156f177564beb0eb0907637a6bce6e60ca",
"testharness"
],
+ "mathml/relations/css-styling/mathbackground-001-notref.html": [
+ "65e2781c5e13ac75127703b2b7a601882b7a9b02",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathbackground-001.html": [
+ "48318bc6c6def7cbb52aa18fc841805291e6ee96",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathbackground-002-notref.html": [
+ "8c984c26191d53eec2164e0d1073c3354c051cb7",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathbackground-002.html": [
+ "425488132c8bffffa2532c1c5154b6bf15e2f391",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathbackground-003-notref.html": [
+ "b6adaa8d4e6d686376f0da457a680920656b0f43",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathbackground-003.html": [
+ "780fdc4a7b6474f1ef734a7349c4f8b9d1a6f607",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathbackground-004-notref.html": [
+ "75465a6c382a6b12f03f4c22e441d0dc91c0c9d0",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathbackground-004.html": [
+ "3af508560150bb5e57ac0a90b79c7241a2c2bbaf",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathcolor-001-notref.html": [
+ "9bc1ba543637015fb73ee4772f8cc20e64be5ac5",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathcolor-001.html": [
+ "5c23ff4f4a3ebafd3451d8120ab78d2ab01c51b2",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathcolor-002-notref.html": [
+ "5f9fd2bb9b693837a9d9c8b57a17d3d45d7c21b8",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathcolor-002.html": [
+ "e0c1f3883a0e17292f0393adcad63d26bf680ebc",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathcolor-003-notref.html": [
+ "11e018ebc17043d823c84a970ead2e3d29f89f5e",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathcolor-003.html": [
+ "8b1ed83d6cd57bef8961e08eb7c81b51160926c3",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathcolor-004-notref.html": [
+ "67a45249e5264989bb3bda142ff32df43c75222d",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathcolor-004.html": [
+ "36ce0a4252e4931ef0cbe7771ad9ad9c7cfc26d1",
+ "reftest"
+ ],
+ "mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html": [
+ "d24fbf041afe481c8cab8cb3ffcbe154357b6955",
+ "support"
+ ],
+ "mathml/relations/css-styling/mathsize-attribute-css-keywords.html": [
+ "9b3852d0b379ef1959fe0f90d04bc27b78a1db5f",
+ "reftest"
+ ],
"mathml/relations/css-styling/mathsize-attribute-legacy-values-ref.html": [
"687efa49bebdda625ccbf13f100e870d45f78f7b",
"support"
@@ -650405,15 +653582,15 @@
"testharness"
],
"native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js": [
- "a4eb2871104f924347f9ec8791a6381313a54483",
+ "fd2ff888e371f383aa1ee87288dd983add46f662",
"testharness"
],
"native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js": [
- "2064fc46f05f5e30c14f77c14c5751b411d1c5e0",
+ "79154b058ff0864032c80b09aef9b8b8c760a105",
"testharness"
],
"native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js": [
- "473cad4c9c36660584c07d7b53dfc68c7f734cb4",
+ "fa38abbc5447625cd8396a76c420259840b264f3",
"testharness"
],
"native-file-system/FileSystemWriter.tentative.https.window.js": [
@@ -657849,7 +661026,7 @@
"testharness"
],
"payment-request/MerchantValidationEvent/constructor.https.html": [
- "2978226f3cc31cc7433d3fb94927a04eb5b83f0d",
+ "da30fef00198800f369b0f8bf9dbddb5df425321",
"testharness"
],
"payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [
@@ -669341,7 +672518,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
- "83bd6b8a0dea2d2434728b9ed52027e6b79b798a",
+ "9722f8ee57009254b9186bce2b195f02356a4f1b",
"support"
],
"resources/chromium/sensor.mojom.js": [
@@ -669365,7 +672542,7 @@
"support"
],
"resources/chromium/web-bluetooth-test.js": [
- "4c89463dcd2fcf902f9072b656316c8ade3bf824",
+ "ee8f082b874656fea9f0d83faed83fbb433971ea",
"support"
],
"resources/chromium/web-bluetooth-test.js.headers": [
@@ -669397,7 +672574,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
- "19b207ff4284af82e1c36cf9f584df793e8238f0",
+ "bb6b0c1be55067641f57d039f8fcc930e9decc46",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@@ -669912,6 +673089,14 @@
"0320210f8394c7439353a6e1efd0eba339b27e20",
"testharness"
],
+ "scroll-to-text-fragment/scroll-to-text-fragment-target.html": [
+ "724132fab29bf75c3e2d0bd4cc20d53aa04c5456",
+ "support"
+ ],
+ "scroll-to-text-fragment/scroll-to-text-fragment.html": [
+ "eaab18437063dce8621a49a8b1cecb10390114a7",
+ "testharness"
+ ],
"secure-contexts/META.yml": [
"e6537166280091c062a8894508f3f0ab9a33a8bf",
"support"
@@ -670176,6 +673361,10 @@
"42b982324b4e37633be7bccb037cff8f534b5712",
"support"
],
+ "selection/toString-ff-bug-001.html": [
+ "985be73b5ca2baba2e8f85d12b806805dbf556ff",
+ "testharness"
+ ],
"selection/type.html": [
"7be8ba61bc20cd2efe262de6b68a43fd3310b59e",
"testharness"
@@ -671388,6 +674577,10 @@
"a61c8af70196ac230c4b7085862e1bff8433fe38",
"testharness"
],
+ "service-workers/service-worker/clients-matchall-frozen.https.html": [
+ "ef27ac3d372e5d40fb576e2b59020026df8b66bc",
+ "testharness"
+ ],
"service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [
"9f34e5709eb3cb607dcd1b91ec80b51c3706dca6",
"testharness"
@@ -672132,6 +675325,10 @@
"307f7f9ac6ea8a4ffd97b4f781932d65137de32f",
"support"
],
+ "service-workers/service-worker/resources/clients-frame-freeze.html": [
+ "7468a660e9085866e8d38ff35f02cf6a50868232",
+ "support"
+ ],
"service-workers/service-worker/resources/clients-get-client-types-frame-worker.js": [
"0a1461b40e089f684faa00cac56d4491232a1432",
"support"
@@ -672185,7 +675382,7 @@
"support"
],
"service-workers/service-worker/resources/clients-matchall-worker.js": [
- "d6634f4d40ef6ada3440b443faff176e54082a71",
+ "13e111a2f91464bf17fa8c60fb6f6071443a474f",
"support"
],
"service-workers/service-worker/resources/cors-approved.txt": [
@@ -680341,11 +683538,11 @@
"support"
],
"tools/lint/lint.py": [
- "062c6a42d0f91836aaba5b308854ea6b5896b9aa",
+ "7397de7fb89b7869b85036bc2f4d098004e758bf",
"support"
],
"tools/lint/rules.py": [
- "9b78f3495b2291044243170c54af5c3cd6b61046",
+ "f354a33fa4905573ceef8ee6ae58ed0cd0b67e3b",
"support"
],
"tools/lint/tests/__init__.py": [
@@ -680485,7 +683682,7 @@
"support"
],
"tools/lint/tests/test_file_lints.py": [
- "31456ae8bbca8129bbf1ef0702221a45e09d914a",
+ "b3a83fe5f30bf2efe8c817c216ad2f8702b3e17b",
"support"
],
"tools/lint/tests/test_lint.py": [
@@ -685025,7 +688222,7 @@
"support"
],
"tools/wpt/browser.py": [
- "0943ee9f3d74fa1e7542712682563f0badfea54d",
+ "b905379c75442cd1421c7b300f2c132bda462721",
"support"
],
"tools/wpt/commands.json": [
@@ -685053,7 +688250,7 @@
"support"
],
"tools/wpt/run.py": [
- "617ea7282b893fc17e8a794191f3223911d63dde",
+ "181d6bfdea9b6ba630f672cbe7bd5e5a4ab41fc5",
"support"
],
"tools/wpt/testfiles.py": [
@@ -685152,6 +688349,10 @@
"d6c7a4ff3983663d088c64f6608e3fcf7de3bbfe",
"support"
],
+ "tools/wptrunner/requirements_android_webview.txt": [
+ "470aaf9a93996d0231e13e05cc35557a36d25de9",
+ "support"
+ ],
"tools/wptrunner/requirements_chrome.txt": [
"470aaf9a93996d0231e13e05cc35557a36d25de9",
"support"
@@ -685329,7 +688530,11 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/__init__.py": [
- "18434e499dc2276d6b23157b854dcc116c664901",
+ "75ec775658ce5d3b15e919bcd166a4af08ccb868",
+ "support"
+ ],
+ "tools/wptrunner/wptrunner/browsers/android_webview.py": [
+ "42ae8b64b142c95124fa392ccd7d0b632297a6db",
"support"
],
"tools/wptrunner/wptrunner/browsers/base.py": [
@@ -685421,7 +688626,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/base.py": [
- "588e0b2fad6afbe17ed4ba9ea5b8f25cc9b7e055",
+ "b1e86ff1fd07ee040ed7c905a2462053b9e30a62",
"support"
],
"tools/wptrunner/wptrunner/executors/executorchrome.py": [
@@ -685569,7 +688774,7 @@
"support"
],
"tools/wptrunner/wptrunner/testdriver-extra.js": [
- "e23073dece1f35db632d48ad6036a90a9cc12b46",
+ "9f97fac9a0cbc99ae8631ac2a1179da8bb9123a8",
"support"
],
"tools/wptrunner/wptrunner/testdriver-vendor.js": [
@@ -686224,10 +689429,6 @@
"475a264790482aedf714958f63a4d47d69661941",
"testharness"
],
- "trusted-types/TrustedTypePolicy-exposed.tentative.html": [
- "e671c6fb61dcb58392c9fb0ac3f4fb37a67698bf",
- "testharness"
- ],
"trusted-types/TrustedTypePolicy-name.tentative.html": [
"c121fe4cab50ab52a7159184bfa012e85d555768",
"testharness"
@@ -686252,18 +689453,14 @@
"1293493ec1f7780b297d2040274150f0aba32adc",
"testharness"
],
- "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html": [
- "a6dd2d1317aa4df94e693e1ad7d0d0684ea0bbc2",
- "testharness"
- ],
- "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [
- "137d0f54c8228645aaf184cc64654e1d66ffbaa6",
- "testharness"
- ],
"trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [
"6d43e0bafc61f34c17d7d7b751bf69f12d035adf",
"testharness"
],
+ "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html": [
+ "ea00566854d12cbd6d2610aafdac44fd549ffbe7",
+ "testharness"
+ ],
"trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html": [
"854f69ed1e550bd660b8cf7a18b4a81a666072fd",
"testharness"
@@ -686385,7 +689582,7 @@
"support"
],
"trusted-types/trusted-types-reporting.tentative.https.html": [
- "8dda8b23c8f06bfa375b6c6de874c7de0fbfc3c3",
+ "16e6d2a7d8d3e01c1cc469ea67b9e0361658495d",
"testharness"
],
"trusted-types/trusted-types-reporting.tentative.https.html.headers": [
@@ -688921,7 +692118,7 @@
"testharness"
],
"web-animations/timing-model/animations/pausing-an-animation.html": [
- "97c7214ac75fd77ad3fc2b3c0df12c3d850a0936",
+ "5383b520bb47ed2e4f5470d5c66438d1f12d8d75",
"testharness"
],
"web-animations/timing-model/animations/play-states.html": [
@@ -689105,11 +692302,11 @@
"support"
],
"web-nfc/NDEFMessage_constructor.https.html": [
- "24d5046f4839f560c8be2c9e164fd93b3ab86943",
+ "6515a7fdd0246c23d8193f06593687a4d9bdc658",
"testharness"
],
"web-nfc/NDEFRecord_constructor.https.html": [
- "2264815780b47107562750c39a2b0152c97ba865",
+ "4d6ec956eacfe08eb01d244a4b2b77fc7277f428",
"testharness"
],
"web-nfc/NFCErrorEvent_constructor.https.html": [
@@ -689145,7 +692342,7 @@
"testharness"
],
"web-nfc/resources/nfc-helpers.js": [
- "76c878ae094b8c98ad8f44aca335a0f157ea01f7",
+ "02f348ddf275d5f191e6cf4982c97d84900a59f9",
"support"
],
"web-share/META.yml": [
@@ -696764,6 +699961,14 @@
"6dc019754d52e508c620fecdf72efd6431eabcb4",
"reftest"
],
+ "webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html": [
+ "bcd2dd2942c846f4f56938e842360ccf992eae09",
+ "support"
+ ],
+ "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html": [
+ "f3705a1879b61669483ec6c0867d5be48ffa2421",
+ "reftest"
+ ],
"webvtt/rendering/cues-with-video/processing-model/support/2_cues_overlapping_completely_move_up.vtt": [
"1ca56e56f6a8be9c485cb11081c30108573a1b54",
"support"
@@ -696940,6 +700145,10 @@
"b165af1533b0cf1688ce3835eeeaccfe348979df",
"support"
],
+ "webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt": [
+ "2d102812eeb1a26b1e82161d21974da936195943",
+ "support"
+ ],
"webvtt/rendering/cues-with-video/processing-model/support/start_alignment.vtt": [
"9a92729381b3d974ef10dabd720d25f05c984717",
"support"
@@ -697157,7 +700366,7 @@
"support"
],
"webxr/resources/webxr_test_constants.js": [
- "a0b0e278a87401702aabf1fd375f3100f20dd7d7",
+ "e0330b80f53398a9ac0cff9edee7b82cc560a8b5",
"support"
],
"webxr/resources/webxr_util.js": [
@@ -697181,7 +700390,7 @@
"testharness"
],
"webxr/xrBoundedReferenceSpace_updates.https.html": [
- "1d7ad93695adedb538e43084568a80c9b40b7660",
+ "812acf457c155c64bd47341ba3b710d696993a8c",
"testharness"
],
"webxr/xrDevice_disconnect_ends.https.html": [
@@ -697273,11 +700482,11 @@
"testharness"
],
"webxr/xrReferenceSpace_originOffset.https.html": [
- "516df836b1bb886ea79002e7121dc33b7ce6b7fc",
+ "fd5fa68e1fc4a837b8bef41876a36278e6bb84fb",
"testharness"
],
"webxr/xrReferenceSpace_originOffsetBounded.https.html": [
- "d0f91a4630d045c2fc8f3f6dbc588cc769386fd2",
+ "5e2bd39d2dee2d6c2146b7a421371db0360c0577",
"testharness"
],
"webxr/xrRigidTransform_constructor.https.html": [
@@ -697293,7 +700502,7 @@
"testharness"
],
"webxr/xrRigidTransform_sameObject.https.html": [
- "d014fe6fb56766a636559db67abc06428a88e98c",
+ "57c7ef1853ea24f9ce8f339e01ce9e929dcaf22f",
"testharness"
],
"webxr/xrSession_cancelAnimationFrame.https.html": [
@@ -697308,6 +700517,10 @@
"e8c078ead9b7eaf4ed4312f14945ddfa07994614",
"testharness"
],
+ "webxr/xrSession_features_deviceSupport.https.html": [
+ "45a68c9df2f09e6905187b48377a39774a933908",
+ "testharness"
+ ],
"webxr/xrSession_input_events_end.https.html": [
"37e020605a7e88320c42e054f867f611955c5713",
"testharness"
@@ -697325,7 +700538,7 @@
"testharness"
],
"webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [
- "9ddc36e95b3fae928a3ccb01e0a9a76f3977f38e",
+ "70e9d6e6e5951aa8c7cfd69e8fcac6e158351153",
"testharness"
],
"webxr/xrSession_requestAnimationFrame_timestamp.https.html": [
@@ -697344,6 +700557,10 @@
"837fa0a008d6cdfcbd9ee134e7ec78bce7c2b95b",
"testharness"
],
+ "webxr/xrSession_viewer_availability.https.html": [
+ "686859166feb773c9f5701a801630359e7abdc4c",
+ "testharness"
+ ],
"webxr/xrSession_viewer_referenceSpace.https.html": [
"fd6082bc3468f094953152d220fceafa083baf76",
"testharness"
@@ -697361,11 +700578,11 @@
"testharness"
],
"webxr/xrView_match.https.html": [
- "142f272d36f812c49455a78bfc62f285f9e64818",
+ "9ccad9518b9c580be312be7e605840e24caa12e2",
"testharness"
],
"webxr/xrView_oneframeupdate.https.html": [
- "9404fcb8aaf33876f2918d3796190f16feafe506",
+ "4386433788c55dd13bc9a663b6796530e4852368",
"testharness"
],
"webxr/xrView_sameObject.https.html": [
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..2381bf3b21c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-absent-getAvailability.https.window.html]
+ [getAvailability() resolves with false if the system does not have an adapter.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..d27675d262d
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-added-getAvailability.https.window.html]
+ [getAvailability() resolves with true after adapter is inserted into a system with a platform that supports Bluetooth LE.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..4eeb745298f
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-powered-off-getAvailability.https.window.html]
+ [getAvailability() resolves with true if the Bluetooth radio is powered off, but the platform that supports Bluetooth LE.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..4d336bda5b0
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-powered-on-getAvailability.https.window.html]
+ [getAvailability() resolves with true if the Bluetooth radio is powered on and the platform supports Bluetooth LE.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..dd3c573439d
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-powered-on-off-on-getAvailability.https.window.html]
+ [getAvailability() is not affected by the powered state of the adapter.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini
new file mode 100644
index 00000000000..0f787434b24
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini
@@ -0,0 +1,4 @@
+[adapter-removed-getAvailability.https.window.html]
+ [getAvailability() resolves with false after the powered on adapter is removed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini
new file mode 100644
index 00000000000..65bf7c25b5b
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini
@@ -0,0 +1,4 @@
+[cross-origin-iframe-getAvailability.sub.https.window.html]
+ [getAvailability() resolves with false if called from a unique origin]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..e31590e2b73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..2d41bb08fa6
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-descriptor-get-same-object.https.window.html]
+ [Calls to getDescriptor should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..b0d6d6a2908
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service is removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..1142802d6d6
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed-with-uuid.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..e31590e2b73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..2176cf384e8
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-descriptor-get-same-object.https.window.html]
+ [Calls to getDescriptors should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..f5a0da03571
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed-with-uuid.https.window.html]
+ [Service is removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..b0d6d6a2908
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service is removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..e31590e2b73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..e31590e2b73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..e31590e2b73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-is-removed.https.window.html]
+ [Characteristic gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..8bc6d5ad998
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini
new file mode 100644
index 00000000000..595c74f9adb
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini
@@ -0,0 +1,4 @@
+[read-succeeds.https.window.html]
+ [A read request succeeds and returns the descriptor's value.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini
new file mode 100644
index 00000000000..900b56a01c7
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini
@@ -0,0 +1,4 @@
+[buffer-is-detached.https.window.html]
+ [writeValue() fails when passed a detached buffer]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..8bc6d5ad998
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service gets removed. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini
new file mode 100644
index 00000000000..9ed5c89acd2
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini
@@ -0,0 +1,4 @@
+[disconnected.https.window.html]
+ [A device disconnecting while connected should fire the gattserverdisconnected event.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini
new file mode 100644
index 00000000000..5fa614818e6
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini
@@ -0,0 +1,4 @@
+[disconnected_gc.https.window.html]
+ [A device disconnecting after the BluetoothDevice object has been GC'ed should not access freed memory.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini
new file mode 100644
index 00000000000..17178b457fa
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini
@@ -0,0 +1,4 @@
+[one-event-per-disconnection.https.window.html]
+ [If a site disconnects from a device while the platform is disconnecting that device, only one gattserverdisconnected event should fire.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini
new file mode 100644
index 00000000000..78fbd8c84a5
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini
@@ -0,0 +1,4 @@
+[reconnect-during-disconnected-event.https.window.html]
+ [A device that reconnects during the gattserverdisconnected event should still receive gattserverdisconnected events after re-connection.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini
new file mode 100644
index 00000000000..34036491560
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-before.https.window.html]
+ [disconnect() called before getPrimaryService. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini
new file mode 100644
index 00000000000..4a74d99b1e5
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-error.https.window.html]
+ [disconnect() called during a getPrimaryService call that fails. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini
new file mode 100644
index 00000000000..03f447e8462
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-success.https.window.html]
+ [disconnect() called during a getPrimaryService call that succeeds. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini
new file mode 100644
index 00000000000..fb3e2c0cf12
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-invalidates-objects.https.window.html]
+ [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini
new file mode 100644
index 00000000000..4515495540d
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnected-device.https.window.html]
+ [getPrimaryService called before connecting. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini
new file mode 100644
index 00000000000..cb130fb03ef
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-discovery-complete-no-permission-absent-service.https.window.html]
+ [Request for absent service without permission. Should Reject with SecurityError even if services have been discovered already.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini
new file mode 100644
index 00000000000..2eb9fdd84de
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-discovery-complete-service-not-found.https.window.html]
+ [Request for absent service. Must reject with NotFoundError even when the services have previously been discovered.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini
new file mode 100644
index 00000000000..ae1893e83e5
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error.https.window.html]
+ [Garbage Collection ran during a getPrimaryService call that failed. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini
new file mode 100644
index 00000000000..1aab32c36c3
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-success.https.window.html]
+ [Garbage Collection ran during a getPrimaryService call that succeeds. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini
new file mode 100644
index 00000000000..131f50484b8
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-different-service-after-reconnection.https.window.html]
+ [Calls to getPrimaryService after a disconnection should return a different object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..a5fbc9e8dc5
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object.https.window.html]
+ [Calls to getPrimaryService should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini
new file mode 100644
index 00000000000..97e4de15dc7
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-invalid-service-name.https.window.html]
+ [Wrong Service name. Reject with TypeError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini
new file mode 100644
index 00000000000..c790eddb45c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-absent-service.https.window.html]
+ [Request for absent service without permission. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini
new file mode 100644
index 00000000000..990b50c318b
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-for-any-service.https.window.html]
+ [Request for present service without permission to access any service. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini
new file mode 100644
index 00000000000..b7033c7aca2
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-present-service.https.window.html]
+ [Request for present service without permission. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini
new file mode 100644
index 00000000000..7c3074a6086
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-not-found.https.window.html]
+ [Request for absent service. Reject with NotFoundError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..ceb15fb9158
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-before-with-uuid.https.window.html]
+ [disconnect() called before getPrimaryServices. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini
new file mode 100644
index 00000000000..c306c71a357
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-before.https.window.html]
+ [disconnect() called before getPrimaryServices. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..24a53520e73
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-error-with-uuid.https.window.html]
+ [disconnect() called during a getPrimaryServices call that fails. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini
new file mode 100644
index 00000000000..82c7d94c882
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-error.https.window.html]
+ [disconnect() called during a getPrimaryServices call that fails. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..312f0fbad9a
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-success-with-uuid.https.window.html]
+ [disconnect() called during a getPrimaryServices call that succeeds. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini
new file mode 100644
index 00000000000..6c63b12d8b2
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-called-during-success.https.window.html]
+ [disconnect() called during a getPrimaryServices call that succeeds. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..711bb4c18e7
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-invalidates-objects-with-uuid.https.window.html]
+ [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini
new file mode 100644
index 00000000000..fb3e2c0cf12
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnect-invalidates-objects.https.window.html]
+ [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..e6f7d7885ef
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnected-device-with-uuid.https.window.html]
+ [getPrimaryServices called before connecting. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini
new file mode 100644
index 00000000000..f3339275113
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-disconnected-device.https.window.html]
+ [getPrimaryServices called before connecting. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..ceb1d394efb
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html]
+ [Request for absent service without permission. Should Reject with SecurityError even if services have been discovered already.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..c987da10e00
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-discovery-complete-service-not-found-with-uuid.https.window.html]
+ [Request for absent service. Must reject with NotFoundError even when the services have previously been discovered.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..81f7a5a79b3
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error-with-uuid.https.window.html]
+ [Garbage Collection ran during a getPrimaryServices call that failed. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini
new file mode 100644
index 00000000000..f70f0b63124
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error.https.window.html]
+ [Garbage Collection ran during a getPrimaryServices call that failed. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..65c5c0eecbf
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-success-with-uuid.https.window.html]
+ [Garbage Collection ran during a getPrimaryServices call that succeeds. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini
new file mode 100644
index 00000000000..7959c977b2a
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-success.https.window.html]
+ [Garbage Collection ran during a getPrimaryServices call that succeeds. Should not crash.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..aa941fe452c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-different-service-after-reconnection-with-uuid.https.window.html]
+ [Calls to getPrimaryServices after a disconnection should return a different object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini
new file mode 100644
index 00000000000..c568b1e70b9
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-different-service-after-reconnection.https.window.html]
+ [Calls to getPrimaryServices after a disconnection should return a different object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..7b33003b1e1
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object-with-uuid.https.window.html]
+ [Calls to getPrimaryServices should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..f918c020d7b
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object.https.window.html]
+ [Calls to getPrimaryServices should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini
new file mode 100644
index 00000000000..97e4de15dc7
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-invalid-service-name.https.window.html]
+ [Wrong Service name. Reject with TypeError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..aa0229428b8
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-absent-service-with-uuid.https.window.html]
+ [Request for absent service without permission. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..79d9cd78fe4
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-for-any-service-with-uuid.https.window.html]
+ [Request for present service without permission to access any service. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini
new file mode 100644
index 00000000000..990b50c318b
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-for-any-service.https.window.html]
+ [Request for present service without permission to access any service. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..7cbc7d5b499
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-no-permission-present-service-with-uuid.https.window.html]
+ [Request for present service without permission. Reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..e931f86fd76
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-not-found-with-uuid.https.window.html]
+ [Request for absent service. Reject with NotFoundError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini
new file mode 100644
index 00000000000..2f98d5da0d3
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-blocklisted-characteristic.https.window.html]
+ [Serial Number String characteristic is blocklisted. Should reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini
new file mode 100644
index 00000000000..45d32574c9c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-not-found.https.window.html]
+ [Request for absent characteristics with UUID. Reject with NotFoundError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini
new file mode 100644
index 00000000000..b8f96bbc75f
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error.https.window.html]
+ [Garbage Collection ran during getCharacteristic call that fails. Should not crash]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..76e58651387
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object.https.window.html]
+ [Calls to getCharacteristic should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini
new file mode 100644
index 00000000000..77fe3cb4170
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-invalid-characteristic-name.https.window.html]
+ [Wrong Characteristic name. Reject with TypeError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini
new file mode 100644
index 00000000000..b1651b829bf
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-reconnect-during.https.window.html]
+ [disconnect() and connect() called during getCharacteristic. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..18c89a7dca4
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service is removed before getCharacteristic call. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..de155411237
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-blocklisted-characteristic-with-uuid.https.window.html]
+ [Serial Number String characteristic is blocklisted. Should reject with SecurityError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..7312e44b568
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-characteristic-not-found-with-uuid.https.window.html]
+ [Request for absent characteristics with UUID. Reject with NotFoundError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..baa2c60a65f
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error-with-uuid.https.window.html]
+ [Garbage Collection ran during getCharacteristics call that fails. Should not crash]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini
new file mode 100644
index 00000000000..0bb21aebfd6
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-garbage-collection-ran-during-error.https.window.html]
+ [Garbage Collection ran during getCharacteristics call that fails. Should not crash]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..9e5eee8d71c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object-with-uuid.https.window.html]
+ [Calls to getCharacteristics should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini
new file mode 100644
index 00000000000..6b63ba87fef
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-get-same-object.https.window.html]
+ [Calls to getCharacteristics should return the same object.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini
new file mode 100644
index 00000000000..77fe3cb4170
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-invalid-characteristic-name.https.window.html]
+ [Wrong Characteristic name. Reject with TypeError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..87a6ae1e91a
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-reconnect-during-with-uuid.https.window.html]
+ [disconnect() and connect() called during getCharacteristics. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini
new file mode 100644
index 00000000000..ab2a94dab3c
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-reconnect-during.https.window.html]
+ [disconnect() and connect() called during getCharacteristics. Reject with NetworkError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini
new file mode 100644
index 00000000000..380115923b9
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed-with-uuid.https.window.html]
+ [Service is removed before getCharacteristics call. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini
new file mode 100644
index 00000000000..665b3871e29
--- /dev/null
+++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini
@@ -0,0 +1,4 @@
+[gen-service-is-removed.https.window.html]
+ [Service is removed before getCharacteristics call. Reject with InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini
new file mode 100644
index 00000000000..ca374b82142
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini
@@ -0,0 +1,4 @@
+[background-color-interpolation.html]
+ [background-color-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini
new file mode 100644
index 00000000000..cd4abcc999d
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini
@@ -0,0 +1,4 @@
+[background-position-interpolation.html]
+ [background-position-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini
new file mode 100644
index 00000000000..2a5a51aa646
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini
@@ -0,0 +1,4 @@
+[background-position-origin-interpolation.html]
+ [background-position-origin-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini
new file mode 100644
index 00000000000..cca534c8bbb
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini
@@ -0,0 +1,4 @@
+[background-size-interpolation.html]
+ [background-size-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini
new file mode 100644
index 00000000000..97f5bd10ffd
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini
@@ -0,0 +1,2 @@
+[background-position-negative-percentage-comparison.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini b/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini
new file mode 100644
index 00000000000..9880266ee58
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini
@@ -0,0 +1,2 @@
+[flexbox_align-items-stretch-3.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini
new file mode 100644
index 00000000000..0d88804e1be
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini
@@ -0,0 +1,4 @@
+[font-size-adjust-interpolation.html]
+ [font-size-adjust interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini
new file mode 100644
index 00000000000..cd3b7660d6c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini
@@ -0,0 +1,4 @@
+[font-size-interpolation-001.html]
+ [font-size interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini
new file mode 100644
index 00000000000..1f20ed1e9a7
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini
@@ -0,0 +1,4 @@
+[font-size-interpolation-002.html]
+ [font-size interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini
new file mode 100644
index 00000000000..724e6c41c63
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini
@@ -0,0 +1,4 @@
+[font-size-interpolation-003.html]
+ [font-size interpolation with zoom]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini
new file mode 100644
index 00000000000..28ab2aa6d51
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini
@@ -0,0 +1,4 @@
+[font-variation-settings-interpolation.html]
+ [font-variation-settings interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini
new file mode 100644
index 00000000000..10720d01e2f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini
@@ -0,0 +1,4 @@
+[letter-spacing-interpolation.html]
+ [letter-spacing-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini
new file mode 100644
index 00000000000..b0f38402877
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini
@@ -0,0 +1,4 @@
+[text-indent-interpolation.html]
+ [text-indent-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini
new file mode 100644
index 00000000000..9909c7e9051
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini
@@ -0,0 +1,4 @@
+[word-spacing-interpolation.html]
+ [word-spacing-interpolation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini b/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini
new file mode 100644
index 00000000000..65097b93460
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini
@@ -0,0 +1,13 @@
+[transform-valid.html]
+ [e.style['transform'\] = "skewX(2e80deg)" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(2e80deg)" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "translateX(2e80px)" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "scaleX(2e80)" should set the property value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini b/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini
new file mode 100644
index 00000000000..d08c22371d7
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini
@@ -0,0 +1,25 @@
+[minmax-angle-serialize.html]
+ [e.style['transform'\] = "rotate(min(1deg))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(min(1rad))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(max(1turn))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(max(1rad))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(min(1grad))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(max(1deg))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(max(1grad))" should set the property value]
+ expected: FAIL
+
+ [e.style['transform'\] = "rotate(min(1turn))" should set the property value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini
new file mode 100644
index 00000000000..0b6cc5fc550
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini
@@ -0,0 +1,31 @@
+[minmax-integer-computed.html]
+ [Property z-index value 'min(1.1, max(0.4, 0.6))' computes to '1']
+ expected: FAIL
+
+ [Property z-index value 'max(1)' computes to '1']
+ expected: FAIL
+
+ [Property z-index value 'max(0.4)' computes to '0']
+ expected: FAIL
+
+ [Property z-index value 'min(0.6)' computes to '1']
+ expected: FAIL
+
+ [Property z-index value 'max(0.3, min(1.1, 0.4))' computes to '0']
+ expected: FAIL
+
+ [Property z-index value 'max(0.6)' computes to '1']
+ expected: FAIL
+
+ [Property z-index value 'min(1)' computes to '1']
+ expected: FAIL
+
+ [Property z-index value 'calc(max(0.3, 0.6) / 2)' computes to '0']
+ expected: FAIL
+
+ [Property z-index value 'min(0.4)' computes to '0']
+ expected: FAIL
+
+ [Property z-index value 'calc(min(0.3, 0.6) * 2)' computes to '1']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini
new file mode 100644
index 00000000000..63c4f7864d2
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini
@@ -0,0 +1,238 @@
+[minmax-length-computed.html]
+ [Property letter-spacing value 'max(1px)' computes to '1px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(15px, 2em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1Q)' computes to '0.944882px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1pc)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(25px, 1em)' computes to '25px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1mm, 2mm)' computes to '7.55906px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vh)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1cm, 2cm)' computes to '75.5906px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1pt)' computes to '1.33333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1em, 2em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1in, 2in)' computes to '192px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(15px, 1em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vmax)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1pc, 2pc)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1ex, 2ex)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vmax, 2vmax)' computes to '20.4667px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1pc)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1ch, 2ch)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1px, 2px)' computes to '2px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1ch, 2ch)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vh)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(15px, 1em)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vw, 2vw)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1cm)' computes to '37.7953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1pt, 2pt)' computes to '1.33333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1in)' computes to '96px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(min(1em, 21px) + max(0.9em, 20px))' computes to '40px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vh, 2vh)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(15px, 1em)' computes to '15px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1Q)' computes to '0.944882px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(min(1em, 21px) * 2' computes to '40px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vmin, 2vmin)' computes to '14.8px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(min(1em, 21px) - 10px)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1in, 2in)' computes to '96px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1cm, 2cm)' computes to '37.7953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(max(1em, 19px) + 10px)' computes to '30px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1ch)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(min(1em, 21px) / 2' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(max(1em, 19px) - 10px)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vmin)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1mm, 2mm)' computes to '3.77953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(min(1em, 21px) + 10px)' computes to '30px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1rem)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1px, 2px)' computes to '1px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(25px, 1em)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vmin, 2vmin)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1ex)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vmax)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vw)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1pc, 2pc)' computes to '32px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1Q, 2Q)' computes to '0.944882px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(25px, max(15px, 1em))' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(95px, 1in)' computes to '96px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1rem, 2rem)' computes to '32px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vmax, 2vmax)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1pt)' computes to '1.33333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1Q, 2Q)' computes to '1.88976px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1rem, 2rem)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1cm)' computes to '37.7953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1em, 2em)' computes to '40px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vw)' computes to '10.2333px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(max(1em, 19px) / 2' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1ex)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(15px, min(25px, 1em))' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1rem)' computes to '16px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(95px, 1in)' computes to '95px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1vmin)' computes to '7.4px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vh, 2vh)' computes to '14.8px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1mm)' computes to '3.77953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1ex, 2ex)' computes to '20px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1ch)' computes to '10px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1mm)' computes to '3.77953px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1vw, 2vw)' computes to '20.4667px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1px)' computes to '1px']
+ expected: FAIL
+
+ [Property letter-spacing value 'max(1pt, 2pt)' computes to '2.66667px']
+ expected: FAIL
+
+ [Property letter-spacing value 'min(1in)' computes to '96px']
+ expected: FAIL
+
+ [Property letter-spacing value 'calc(max(1em, 19px) * 2' computes to '40px']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini
new file mode 100644
index 00000000000..b18a8cc2b58
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini
@@ -0,0 +1,37 @@
+[minmax-number-computed.html]
+ [Property opacity value 'calc(max(0.1, 0.2) * 2)' computes to '0.4']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) / 2)' computes to '0.05']
+ expected: FAIL
+
+ [Property opacity value 'calc(max(0.1, 0.2) - 0.05)' computes to '0.15']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) * 2)' computes to '0.2']
+ expected: FAIL
+
+ [Property opacity value 'max(0.1, min(0.2, 0.15))' computes to '0.15']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) - 0.05)' computes to '0.05']
+ expected: FAIL
+
+ [Property opacity value 'calc(max(0.1, 0.2) + 0.05)' computes to '0.25']
+ expected: FAIL
+
+ [Property opacity value 'min(0.2, max(0.1, 0.15))' computes to '0.15']
+ expected: FAIL
+
+ [Property opacity value 'calc(max(0.1, 0.2) / 2)' computes to '0.1']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) + 0.05)' computes to '0.15']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) + max(0.1, 0.05))' computes to '0.2']
+ expected: FAIL
+
+ [Property opacity value 'calc(min(0.1, 0.2) - max(0.1, 0.05))' computes to '0']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini
new file mode 100644
index 00000000000..b1c6d348dfa
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini
@@ -0,0 +1,40 @@
+[minmax-percentage-computed.html]
+ [Property margin-left value 'calc(min(10%, 20%) / 2)' computes to '20px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(max(10%, 20%) * 2)' computes to '160px']
+ expected: FAIL
+
+ [Property margin-left value 'min(1%)' computes to '4px']
+ expected: FAIL
+
+ [Property margin-left value 'max(1%)' computes to '4px']
+ expected: FAIL
+
+ [Property margin-left value 'min(20%, max(10%, 15%))' computes to '60px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(min(10%, 20%) * 2)' computes to '80px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(max(10%, 20%) - 5%)' computes to '60px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(max(10%, 20%) / 2)' computes to '40px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(min(10%, 20%) - 5%)' computes to '20px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(min(10%, 20%) + 5%)' computes to '60px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(min(10%, 20%) + max(10%, 5%))' computes to '80px']
+ expected: FAIL
+
+ [Property margin-left value 'max(10%, min(20%, 15%))' computes to '60px']
+ expected: FAIL
+
+ [Property margin-left value 'calc(max(10%, 20%) + 5%)' computes to '100px']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini
new file mode 100644
index 00000000000..4b4b684fdc3
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini
@@ -0,0 +1,58 @@
+[minmax-time-computed.html]
+ [Property transition-delay value 'min(1ms)' computes to '0.001s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(max(0.5s, 400ms) * 2)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'min(1ms, 2ms)' computes to '0.001s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(max(0.5s, 400ms) + 500ms)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(min(0.5s, 600ms) * 2)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(1000ms, min(2000ms, 1.5s))' computes to '1.5s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(0.9s, 1000ms)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(min(0.5s, 600ms) / 2)' computes to '0.25s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(min(0.5s, 600ms) + 500ms)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(max(0.5s, 400ms) / 2)' computes to '0.25s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(1ms)' computes to '0.001s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(1s, 2s)' computes to '2s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(1ms, 2ms)' computes to '0.002s']
+ expected: FAIL
+
+ [Property transition-delay value 'max(1s)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'calc(min(0.5s, 600ms) + max(500ms, 0.4s))' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'min(2s, max(1s, 1500ms))' computes to '1.5s']
+ expected: FAIL
+
+ [Property transition-delay value 'min(1s, 1100ms)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'min(1s)' computes to '1s']
+ expected: FAIL
+
+ [Property transition-delay value 'min(1s, 2s)' computes to '1s']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index f950aa53ba3..fc6f6c144f3 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -312,15 +312,9 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: */* text/html]
- expected: FAIL
-
[<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" text/plain]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
@@ -330,6 +324,9 @@
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
index d2df9b78483..2638e2f8172 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -56,3 +56,12 @@
[separate text/javascript x/x]
expected: FAIL
+ [separate text/javascript;charset=windows-1252 error text/javascript]
+ expected: FAIL
+
+ [separate text/javascript error]
+ expected: FAIL
+
+ [separate text/javascript;charset=windows-1252 text/javascript]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
index 4aa76db6401..f193b47347d 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
@@ -1,5 +1,6 @@
[scroll-restoration-fragment-scrolling-cross-origin.html]
type: testharness
+ expected: TIMEOUT
[Manual scroll restoration should take precedent over scrolling to fragment in cross origin navigation]
expected: TIMEOUT
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_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/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
index dec4c579137..16fa2c5cfc1 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
@@ -1,5 +1,4 @@
[creating_browsing_context_test_01.html]
- expected: TIMEOUT
[first argument: absolute url]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
index e150c9d848f..23eefb8eaf9 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-screenx-screeny.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `screenx`, `screeny`]
expected: FAIL
+ [features "screenx=-204" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-204" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-204.5" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-0" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screenx=-0" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "screenx=-204.5" should NOT set "left=204"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
index ad8840fbb68..940516ddd33 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-top-left.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for `top`, `left`]
expected: FAIL
+ [features "top=-204" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "top=-204.5" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "left=-204" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "top=-0" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "left=-204.5" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "left=-0" should NOT set "left=204"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
index d1ed9088b2b..9027336b453 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-width-height.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for `width`, `height`]
expected: FAIL
+ [features "height=-404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=-404e1" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=-404.5" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "width=-404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=-404e1" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=-404.5" should NOT set "width=404"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
index a70e9dbad4d..4e44584b123 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
@@ -1,32 +1,48 @@
[open-features-non-integer-height.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `height`]
expected: FAIL
[features "height=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "height=/404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"]
+ expected: TIMEOUT
+
+ [top=0,left=0: absence of feature "height" should be treated same as "height=0"]
+ expected: TIMEOUT
+
+ [features "height=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=L404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
index 779531b4a98..fcaeae5336d 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-innerheight.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerheight`]
expected: FAIL
[features "innerheight=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "innerheight=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=L404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=/404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
index 7a1b258d52e..42327fedd27 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-innerwidth.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerwidth`]
expected: FAIL
[features "innerwidth=405e-1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405*3" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405.5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405e1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405.32" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405 " should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405LLl" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405/5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405^4" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "innerwidth=/404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=_404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=L404" should NOT set "width=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
index 9ace8a4cbdb..64a08faf0e6 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-screenx.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screenx`]
expected: FAIL
[features "screenx=105.5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105e1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105 " should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105*3" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105e-1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105^4" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105LLl" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105/5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105.32" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "screenx=_104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "screenx=L104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "screenx=/104" should NOT set "left=104"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
index a82bd0f981a..4f22ef4ef29 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-screeny.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screeny`]
expected: FAIL
[features "screeny=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "screeny=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "screeny=L404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "screeny=/404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini
index 10f617db69e..8540f53d8d6 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-top.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `top`]
expected: FAIL
[features "top=105/5" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105*3" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105LLl" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105e-1" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105.32" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105e1" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105 " should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105^4" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "top=105.5" should set "top=105"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "top=/104" should NOT set "top=104"]
+ expected: TIMEOUT
+
+ [features "top=_104" should NOT set "top=104"]
+ expected: TIMEOUT
+
+ [features "top=L104" should NOT set "top=104"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
index 28f93ee71b5..9d841e61bc0 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
@@ -1,32 +1,48 @@
[open-features-non-integer-width.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `width`]
expected: FAIL
[features "width=405^4" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405.5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405e1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405 " should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405.32" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405LLl" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405*3" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405e-1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405/5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [top=0,left=0: absence of feature "width" should be treated same as "width=0"]
+ expected: TIMEOUT
+
+ [features "width=_404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"]
+ expected: TIMEOUT
+
+ [features "width=/404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=L404" should NOT set "width=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini b/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini
new file mode 100644
index 00000000000..8e1733fed8b
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini
@@ -0,0 +1,4 @@
+[window-open-defaults.window.html]
+ [window.open()'s url parameter default]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini
new file mode 100644
index 00000000000..015d5bb6dbe
--- /dev/null
+++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini
@@ -0,0 +1,10 @@
+[none-sw-from-none.https.html]
+ [making a cross-origin request for CORP: same-origin [PASS THROUGH\]]
+ expected: FAIL
+
+ [making a cross-origin request for CORP: same-origin]
+ expected: FAIL
+
+ [setting up]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini
new file mode 100644
index 00000000000..fa3a4cf489a
--- /dev/null
+++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini
@@ -0,0 +1,16 @@
+[none-sw-from-require-corp.https.html]
+ [making a cross-origin request for CORP: same-origin [PASS THROUGH\]]
+ expected: FAIL
+
+ [making a cross-origin request for CORP: same-origin]
+ expected: FAIL
+
+ [making a cross-origin request for no CORP]
+ expected: FAIL
+
+ [making a cross-origin request for no CORP [PASS THROUGH\]]
+ expected: FAIL
+
+ [setting up]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini
new file mode 100644
index 00000000000..28d8ce64692
--- /dev/null
+++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini
@@ -0,0 +1,13 @@
+[require-corp-sw-from-none.https.html]
+ [making a cross-origin request for CORP: same-origin [PASS THROUGH\]]
+ expected: FAIL
+
+ [making a cross-origin request for CORP: same-origin]
+ expected: FAIL
+
+ [making a cross-origin request for no CORP]
+ expected: FAIL
+
+ [setting up]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini
new file mode 100644
index 00000000000..7f31eda83ad
--- /dev/null
+++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini
@@ -0,0 +1,16 @@
+[require-corp-sw-from-require-corp.https.html]
+ [making a cross-origin request for CORP: same-origin [PASS THROUGH\]]
+ expected: FAIL
+
+ [making a cross-origin request for CORP: same-origin]
+ expected: FAIL
+
+ [making a cross-origin request for no CORP]
+ expected: FAIL
+
+ [making a cross-origin request for no CORP [PASS THROUGH\]]
+ expected: FAIL
+
+ [setting up]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini b/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini
new file mode 100644
index 00000000000..76ade2d0575
--- /dev/null
+++ b/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini
@@ -0,0 +1,25 @@
+[tabindex-getter-frame.html]
+ [connected frame element inside frameset .tabIndex should return 1 when set to 1]
+ expected: FAIL
+
+ [disconnected frame element .tabIndex should return 1 when set to 1]
+ expected: FAIL
+
+ [disconnected frame element .tabIndex should return 0 when set to 0]
+ expected: FAIL
+
+ [connected frame element inside frameset .tabIndex should return -1 when set to -1]
+ expected: FAIL
+
+ [connected frame element inside frameset .tabIndex should return 0 when set to 0]
+ expected: FAIL
+
+ [connected frame element inside frameset .tabIndex should return 0 by default]
+ expected: FAIL
+
+ [disconnected frame element .tabIndex should return 0 by default]
+ expected: FAIL
+
+ [disconnected frame element .tabIndex should return -1 when set to -1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini b/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini
new file mode 100644
index 00000000000..f3ef2b2aaae
--- /dev/null
+++ b/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini
@@ -0,0 +1,136 @@
+[default-styles.html]
+ [<marquee>]
+ expected: FAIL
+
+ [<input type="HIDDEN">]
+ expected: FAIL
+
+ [<summary>]
+ expected: FAIL
+
+ [<input type="button">]
+ expected: FAIL
+
+ [<input> (namespace: null)]
+ expected: FAIL
+
+ [<keygen>]
+ expected: FAIL
+
+ [<textarea>]
+ expected: FAIL
+
+ [<input type="month">]
+ expected: FAIL
+
+ [<input type="radio">]
+ expected: FAIL
+
+ [<select multiple="">]
+ expected: FAIL
+
+ [<video>]
+ expected: FAIL
+
+ [The body element]
+ expected: FAIL
+
+ [<input type="text">]
+ expected: FAIL
+
+ [<input>]
+ expected: FAIL
+
+ [<input type="TEXT">]
+ expected: FAIL
+
+ [<meter>]
+ expected: FAIL
+
+ [<input type="color">]
+ expected: FAIL
+
+ [<button>]
+ expected: FAIL
+
+ [<input type="range">]
+ expected: FAIL
+
+ [<select>]
+ expected: FAIL
+
+ [<progress>]
+ expected: FAIL
+
+ [<input> (namespace: http://www.w3.org/2000/svg)]
+ expected: FAIL
+
+ [<input type="checkbox">]
+ expected: FAIL
+
+ [<input type="datetime-local">]
+ expected: FAIL
+
+ [<input type="week">]
+ expected: FAIL
+
+ [<input type="unknowntype">]
+ expected: FAIL
+
+ [<input type="file">]
+ expected: FAIL
+
+ [<input type="email">]
+ expected: FAIL
+
+ [<input type="image">]
+ expected: FAIL
+
+ [<input type="search">]
+ expected: FAIL
+
+ [<select size="2">]
+ expected: FAIL
+
+ [<input type="submit">]
+ expected: FAIL
+
+ [<details>]
+ expected: FAIL
+
+ [<input type="date">]
+ expected: FAIL
+
+ [<input type="time">]
+ expected: FAIL
+
+ [<input type="tel">]
+ expected: FAIL
+
+ [<input type="reset">]
+ expected: FAIL
+
+ [<input type="number">]
+ expected: FAIL
+
+ [<menuitem>]
+ expected: FAIL
+
+ [<video controls="">]
+ expected: FAIL
+
+ [<input type="hidden">]
+ expected: FAIL
+
+ [<input type="url">]
+ expected: FAIL
+
+ [<input type="password">]
+ expected: FAIL
+
+ [<div>]
+ expected: FAIL
+
+ [The html element]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini
new file mode 100644
index 00000000000..d691ef02bd6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini
@@ -0,0 +1,4 @@
+[historical-progress-event.window.html]
+ [<img> does not support ProgressEvent or loadstart/progress/loadend]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
index 702af61a3c4..127392316de 100644
--- a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
@@ -1,11 +1,7 @@
[form-submission-algorithm.html]
- expected: TIMEOUT
[If form's firing submission events is true, then return; 'submit' event]
expected: FAIL
[If form's firing submission events is true, then return; 'invalid' event]
expected: FAIL
- [Cannot navigate (after constructing the entry list)]
- expected: TIMEOUT
-
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
index 496bad988c6..034d9baebfa 100644
--- 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
@@ -1,4 +1,5 @@
[promise-rejection-events.html]
+ expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
expected: FAIL
@@ -8,3 +9,6 @@
[no unhandledrejection/rejectionhandled: rejection handler attached synchronously to a promise created from createImageBitmap]
expected: FAIL
+ [rejectionhandled is dispatched from a queued task, and not immediately]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
index 494f0d4a752..aa36a14c6a6 100644
--- a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
+++ b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
@@ -20,3 +20,6 @@
[domainLookupStart should be 0 in cross-origin request.]
expected: FAIL
+ [responseEnd should be greater than 0 in cross-origin request.]
+ expected: FAIL
+
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/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
index 79c5a0136a6..628a484d456 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
@@ -11,3 +11,9 @@
[X SNR (19.41940600838733 dB) is not greater than or equal to 65.737. Got 19.41940600838733.]
expected: FAIL
+ [X SNR (19.516378895136103 dB) is not greater than or equal to 65.737. Got 19.516378895136103.]
+ expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t1.9724091887474060e-1\t9.5236867666244507e-1\t7.5512775778770447e-1\t7.9289436569253091e-1\t3.8985999999999999e-3\n\t[60\]\t-2.2450675070285797e-1\t-5.8084785938262939e-1\t3.5634110867977142e-1\t6.1348441407448528e-1\t3.8985999999999999e-3\n\t[90\]\t-3.7808802723884583e-1\t-5.9811043739318848e-1\t2.2002241015434265e-1\t3.6786251568070089e-1\t3.8985999999999999e-3\n\t[120\]\t7.6881676912307739e-1\t9.4563448429107666e-1\t1.7681771516799927e-1\t1.8698315057805445e-1\t3.8985999999999999e-3\n\t[151\]\t5.4644601186737418e-4\t-4.1306272149085999e-2\t4.1852718160953373e-2\t1.0132291292202573e+0\t3.8985999999999999e-3\n\t...and 1419 more errors.\n\tMax AbsError of 9.8619294445961714e-1 at index of 1178.\n\t[1178\]\t-1.3593670912086964e-2\t-9.9978661537170410e-1\t9.8619294445961714e-1\t9.8640342778840562e-1\t3.8985999999999999e-3\n\tMax RelError of 1.0132291292202573e+0 at index of 151.\n]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
index 6ff00c31bef..27f6c5ed7a2 100644
--- a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
@@ -1,5 +1,5 @@
[xrBoundedReferenceSpace_updates.https.html]
- expected: TIMEOUT
+ expected: ERROR
['XRBoundedReferenceSpace updates properly when the changes are applied]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini b/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini
new file mode 100644
index 00000000000..c2051682335
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_features_deviceSupport.https.html]
+ [Immersive XRSession requests with no supported device should reject]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini b/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini
new file mode 100644
index 00000000000..f7184958179
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_viewer_availability.https.html]
+ [Inline viewer support wtih no device]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini b/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini
index 650c91da4a6..333edb3a26e 100644
--- a/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini
+++ b/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini
@@ -1,5 +1,4 @@
[sharedworker-in-worker.html]
- expected: ERROR
[Base URL in workers: new SharedWorker()]
expected: FAIL
diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini
new file mode 100644
index 00000000000..80f9a4f15b8
--- /dev/null
+++ b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini
@@ -0,0 +1,2 @@
+[Worker-constructor.html]
+ expected: ERROR
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/.azure-pipelines.yml b/tests/wpt/web-platform-tests/.azure-pipelines.yml
index 5799d624b4e..1884272c4fc 100644
--- a/tests/wpt/web-platform-tests/.azure-pipelines.yml
+++ b/tests/wpt/web-platform-tests/.azure-pipelines.yml
@@ -247,9 +247,8 @@ jobs:
condition: |
or(eq(variables['Build.Reason'], 'Schedule'),
and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_dev']))
- # There are 12 agents in the pool, but use more jobs so that each takes <1h.
strategy:
- parallel: 20
+ parallel: 10 # chosen to make runtime ~2h
timeoutInMinutes: 360
pool:
name: 'Hosted Windows Client'
@@ -283,9 +282,8 @@ jobs:
condition: |
or(eq(variables['Build.Reason'], 'Schedule'),
and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_canary']))
- # There are 12 agents in the pool, but use more jobs so that each takes <1h.
strategy:
- parallel: 20
+ parallel: 10 # chosen to make runtime ~2h
timeoutInMinutes: 360
pool:
name: 'Hosted Windows Client'
@@ -336,10 +334,8 @@ jobs:
channel: stable
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- - script: |
- # TODO: drop this when `safaridriver --version` is supported.
- SAFARI_VERSION="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Safari.app/Contents/Info.plist) ($(/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Safari.app/Contents/Info.plist))"
- no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --browser-version "$SAFARI_VERSION" safari
+ # --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/16229
+ - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info safari --exclude /inert/inert-retargeting.tentative.html --exclude /inert/inert-retargeting-iframe.tentative.html
displayName: 'Run tests'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
@@ -370,7 +366,8 @@ jobs:
- template: tools/ci/azure/install_safari.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel preview safari
+ # --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/16229
+ - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel preview safari --exclude /inert/inert-retargeting.tentative.html --exclude /inert/inert-retargeting-iframe.tentative.html --exclude /payment-request/
displayName: 'Run tests'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
diff --git a/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml
index 0bedfe3d42c..8f3940a291b 100644
--- a/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml
+++ b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml
@@ -4,7 +4,10 @@ jobs:
update-pr-preview:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@v1.0.0
+ with:
+ ref: refs/heads/master
+ fetch-depth: 1
- name: update-pr-preview
uses: ./tools/docker/github
env:
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js
new file mode 100644
index 00000000000..5295f1e10cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js
@@ -0,0 +1,50 @@
+// META: script=/common/utils.js
+// META: script=/common/get-host-info.sub.js
+
+function taintedImageBitmap(t) {
+ return new Promise(resolve => {
+ const img = new Image();
+ img.src = `${get_host_info().HTTPS_REMOTE_ORIGIN}/images/blue.png`;
+ img.onload = t.step_func(() => {
+ resolve(createImageBitmap(img));
+ });
+ img.onerror = t.unreached_func();
+ });
+}
+
+async_test(t => {
+ const bc = new BroadcastChannel(token());
+ const popup = window.open(`resources/coop-coep-popup.html?channel=${bc.name}`);
+ const popupReady = new Promise(resolve => {
+ bc.onmessage = t.step_func(resolve);
+ });
+ const imageReady = taintedImageBitmap(t);
+ Promise.all([popupReady, imageReady]).then(t.step_func(([, bitmap]) => {
+ bc.onmessage = t.step_func_done(e => {
+ assert_equals(e.data, "Got failure as expected.");
+ });
+ bc.postMessage(bitmap);
+ }));
+}, "BroadcastChannel'ing a tainted ImageBitmap to a COOP+COEP popup");
+
+[
+ {
+ "type": "serialize/deserialize",
+ "message": (port, bitmap) => port.postMessage(bitmap)
+ },
+ {
+ "type": "transfer",
+ "message": (port, bitmap) => port.postMessage(bitmap, [bitmap])
+ }
+].forEach(({ type, message }) => {
+ async_test(t => {
+ const sw = new SharedWorker("resources/coop-coep-worker.js");
+ const imageReady = taintedImageBitmap(t);
+ imageReady.then(t.step_func(bitmap => {
+ sw.port.onmessage = t.step_func_done(e => {
+ assert_equals(e.data, "Got failure as expected.");
+ });
+ message(sw.port, bitmap);
+ }));
+ }, `Messaging a tainted ImageBitMap via ${type} to a COEP shared worker`);
+});
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html
new file mode 100644
index 00000000000..f0228503ffa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html
@@ -0,0 +1,11 @@
+<script>
+const channel = new URLSearchParams(location.search).get("channel");
+const bc = new BroadcastChannel(channel);
+bc.onmessageerror = e => {
+ bc.postMessage("Got failure as expected.");
+}
+bc.onmessage = e => {
+ bc.postMessage("Got message, expected failure.");
+}
+bc.postMessage("Initialize");
+</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers
new file mode 100644
index 00000000000..63b60e490f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers
@@ -0,0 +1,2 @@
+Cross-Origin-Opener-Policy: same-origin
+Cross-Origin-Embedder-Policy: require-corp
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js
new file mode 100644
index 00000000000..a6e9cc58935
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js
@@ -0,0 +1,9 @@
+onconnect = e => {
+ const port = e.source;
+ port.onmessageerror = e => {
+ port.postMessage("Got failure as expected.");
+ }
+ port.onmessage = e => {
+ port.postMessage("Got message, expected failure.");
+ }
+}
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers
new file mode 100644
index 00000000000..6604450991a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers
@@ -0,0 +1 @@
+Cross-Origin-Embedder-Policy: require-corp
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js
new file mode 100644
index 00000000000..cec09c38b13
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js
@@ -0,0 +1,16 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with false if the system does ' +
+ 'not have an adapter.';
+
+bluetooth_test(async () => {
+ await navigator.bluetooth.test.simulateCentral({state: 'absent'});
+ let availability = await navigator.bluetooth.getAvailability();
+ assert_false(
+ availability,
+ 'getAvailability() resolves promise with false when adapter is absent.');
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js
new file mode 100644
index 00000000000..d5e9d1f2b6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with true after adapter is ' +
+ 'inserted into a system with a platform that supports Bluetooth LE.';
+
+bluetooth_test(async () => {
+ const fake_central =
+ await navigator.bluetooth.test.simulateCentral({state: 'absent'});
+ let availability = await navigator.bluetooth.getAvailability();
+ assert_false(
+ availability,
+ 'getAvailability() resolves promise with false when adapter is absent.');
+
+ await fake_central.setState('powered-on');
+ availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true after Bluetooth LE ' +
+ 'capable adapter has been has been added.');
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js
new file mode 100644
index 00000000000..8fe9265a46e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js
@@ -0,0 +1,17 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
+ 'radio is powered off, but the platform that supports Bluetooth LE.';
+
+bluetooth_test(async () => {
+ await navigator.bluetooth.test.simulateCentral({state: 'powered-off'});
+ let availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true when adapter is powered ' +
+ 'off.');
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js
new file mode 100644
index 00000000000..8b9256a4c35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js
@@ -0,0 +1,17 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
+ 'radio is powered on and the platform supports Bluetooth LE.';
+
+bluetooth_test(async () => {
+ await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
+ let availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true when adapter is powered ' +
+ 'on and it supports Bluetooth Low-Energy.');
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js
new file mode 100644
index 00000000000..b8b49121fc0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js
@@ -0,0 +1,38 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() is not affected by the powered state of ' +
+ 'the adapter.';
+
+bluetooth_test(async () => {
+ const fake_central =
+ await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
+ {
+ const availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true when adapter is ' +
+ 'powered on and it supports Bluetooth Low-Energy.');
+ }
+
+ {
+ await fake_central.setState('powered-off');
+ const availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true after adapter powered ' +
+ 'off.');
+ }
+
+ {
+ await fake_central.setState('powered-on');
+ const availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true when adapter is ' +
+ 'powered back on.');
+ }
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js
new file mode 100644
index 00000000000..cc2c33d1d4c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with false after the powered ' +
+ 'on adapter is removed.';
+
+bluetooth_test(async () => {
+ const fake_central =
+ await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
+ let availability = await navigator.bluetooth.getAvailability();
+ assert_true(
+ availability,
+ 'getAvailability() resolves promise with true when adapter is powered ' +
+ 'on and it supports Bluetooth Low-Energy.');
+
+ await fake_central.setState('absent');
+ availability = await navigator.bluetooth.getAvailability();
+ assert_false(
+ availability,
+ 'getAvailability() resolves promise with false after adapter has been ' +
+ 'has been removed.');
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js
new file mode 100644
index 00000000000..bf5e4226e08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js
@@ -0,0 +1,32 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'getAvailability() resolves with false if called from a ' +
+ 'unique origin';
+const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ '/bluetooth/resources/health-thermometer-iframe.html'
+let iframe = document.createElement('iframe');
+
+bluetooth_test(async () => {
+ await navigator.bluetooth.test.simulateCentral({state: 'powered-on'});
+ await new Promise(resolve => {
+ iframe.src = cross_origin_src;
+ document.body.appendChild(iframe);
+ iframe.addEventListener('load', resolve);
+ });
+ await new Promise(resolve => {
+ callWithTrustedClick(
+ () => iframe.contentWindow.postMessage({type: 'GetAvailability'}, '*'));
+
+ window.onmessage = messageEvent => {
+ assert_equals(
+ messageEvent.data, false,
+ 'getAvailability resolves to false when called from a unique ' +
+ 'origin.');
+ resolve();
+ };
+ });
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html
deleted file mode 100644
index 02aaeccb022..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptor(user_description.name), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js
new file mode 100644
index 00000000000..97256a45330
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js
@@ -0,0 +1,29 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptor(user_description.name),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html
deleted file mode 100644
index 52b39c1e0cb..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getDescriptor should return the same object.';
-let characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({characteristic} = _))
- .then(() => Promise.all([
- characteristic.getDescriptor(user_description.alias),
- characteristic.getDescriptor(user_description.name),
- characteristic.getDescriptor(user_description.uuid)
- ]))
- .then(descriptors_arrays => {
- assert_true(descriptors_arrays.length > 0)
-
- // Convert to arrays if necessary.
- for (let i = 0; i < descriptors_arrays.length; i++) {
- descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
- }
-
- for (let i = 1; i < descriptors_arrays.length; i++) {
- assert_equals(descriptors_arrays[0].length,
- descriptors_arrays[i].length);
- }
-
- let base_set = new Set(descriptors_arrays[0]);
- for (let descriptors of descriptors_arrays) {
- descriptors.forEach(descriptor => assert_true(base_set.has(descriptor)));
- }
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js
new file mode 100644
index 00000000000..8847efab3c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js
@@ -0,0 +1,39 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getDescriptor should return the same object.';
+let characteristic;
+
+bluetooth_test(
+ () => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic} = _))
+ .then(() => Promise.all([
+ characteristic.getDescriptor(user_description.alias),
+ characteristic.getDescriptor(user_description.name),
+ characteristic.getDescriptor(user_description.uuid)
+ ]))
+ .then(descriptors_arrays => {
+ assert_true(descriptors_arrays.length > 0)
+
+ // Convert to arrays if necessary.
+ for (let i = 0; i < descriptors_arrays.length; i++) {
+ descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
+ }
+
+ for (let i = 1; i < descriptors_arrays.length; i++) {
+ assert_equals(
+ descriptors_arrays[0].length,
+ descriptors_arrays[i].length);
+ }
+
+ let base_set = new Set(descriptors_arrays[0]);
+ for (let descriptors of descriptors_arrays) {
+ descriptors.forEach(
+ descriptor => assert_true(base_set.has(descriptor)));
+ }
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html
deleted file mode 100644
index bfb4c8dcf6a..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-// TODO(https://crbug.com/672127) Use this test case to test the rest of
-// characteristic functions.
-'use strict';
-const test_desc = 'Service is removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let characteristic, fake_peripheral, fake_service;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptor(user_description.name),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..b9dc92482ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+// TODO(https://crbug.com/672127) Use this test case to test the rest of
+// characteristic functions.
+'use strict';
+const test_desc = 'Service is removed. Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let characteristic, fake_peripheral, fake_service;
+
+bluetooth_test(
+ () => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptor(user_description.name),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html
deleted file mode 100644
index c00d4cf5783..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptors(user_description.name), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js
new file mode 100644
index 00000000000..25bde7cecc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js
@@ -0,0 +1,29 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(user_description.name),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html
deleted file mode 100644
index a29548f3656..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptors(), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js
new file mode 100644
index 00000000000..c3ff9f6a05c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html
deleted file mode 100644
index 20df1d08002..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getDescriptors should return the same object.';
-let characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({characteristic} = _))
- .then(() => Promise.all([
- characteristic.getDescriptors(user_description.alias),
- characteristic.getDescriptors(user_description.name),
- characteristic.getDescriptors(user_description.uuid)
- ]))
- .then(descriptors_arrays => {
- assert_true(descriptors_arrays.length > 0)
-
- // Convert to arrays if necessary.
- for (let i = 0; i < descriptors_arrays.length; i++) {
- descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
- }
-
- for (let i = 1; i < descriptors_arrays.length; i++) {
- assert_equals(descriptors_arrays[0].length,
- descriptors_arrays[i].length);
- }
-
- let base_set = new Set(descriptors_arrays[0]);
- for (let descriptors of descriptors_arrays) {
- descriptors.forEach(descriptor => assert_true(base_set.has(descriptor)));
- }
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js
new file mode 100644
index 00000000000..c997d7afda2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js
@@ -0,0 +1,39 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getDescriptors should return the same object.';
+let characteristic;
+
+bluetooth_test(
+ () => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic} = _))
+ .then(() => Promise.all([
+ characteristic.getDescriptors(user_description.alias),
+ characteristic.getDescriptors(user_description.name),
+ characteristic.getDescriptors(user_description.uuid)
+ ]))
+ .then(descriptors_arrays => {
+ assert_true(descriptors_arrays.length > 0)
+
+ // Convert to arrays if necessary.
+ for (let i = 0; i < descriptors_arrays.length; i++) {
+ descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
+ }
+
+ for (let i = 1; i < descriptors_arrays.length; i++) {
+ assert_equals(
+ descriptors_arrays[0].length,
+ descriptors_arrays[i].length);
+ }
+
+ let base_set = new Set(descriptors_arrays[0]);
+ for (let descriptors of descriptors_arrays) {
+ descriptors.forEach(
+ descriptor => assert_true(base_set.has(descriptor)));
+ }
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html
deleted file mode 100644
index de83400b208..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-// TODO(https://crbug.com/672127) Use this test case to test the rest of
-// characteristic functions.
-'use strict';
-const test_desc = 'Service is removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let characteristic, fake_peripheral, fake_service;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptors(user_description.uuid),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js
new file mode 100644
index 00000000000..03bb51239dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+// TODO(https://crbug.com/672127) Use this test case to test the rest of
+// characteristic functions.
+'use strict';
+const test_desc = 'Service is removed. Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let characteristic, fake_peripheral, fake_service;
+
+bluetooth_test(
+ () => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(user_description.uuid),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html
deleted file mode 100644
index c9056dd3b3c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-// TODO(https://crbug.com/672127) Use this test case to test the rest of
-// characteristic functions.
-'use strict';
-const test_desc = 'Service is removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let characteristic, fake_peripheral, fake_service;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.getDescriptors(user_description.name),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..762f9cc9955
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+// TODO(https://crbug.com/672127) Use this test case to test the rest of
+// characteristic functions.
+'use strict';
+const test_desc = 'Service is removed. Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let characteristic, fake_peripheral, fake_service;
+
+bluetooth_test(
+ () => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(user_description.name),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html
deleted file mode 100644
index a80bccfe469..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.readValue(), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js
new file mode 100644
index 00000000000..a2de3c39e20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.readValue(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html
deleted file mode 100644
index d9a9594320d..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.startNotifications(), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js
new file mode 100644
index 00000000000..76b2d42a481
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.startNotifications(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html
deleted file mode 100644
index 16520704630..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Characteristic no longer exists.',
- 'InvalidStateError');
-let fake_peripheral, characteristic, fake_characteristic;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
- .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
- .then(() => characteristic.getDescriptor(user_description.name))
- .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
- .then(() => fake_characteristic.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- characteristic.writeValue(new Uint8Array(1)), expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js
new file mode 100644
index 00000000000..00c50894e5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException(
+ 'GATT Characteristic no longer exists.', 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(
+ () =>
+ getMeasurementIntervalCharacteristic()
+ .then(
+ _ => (
+ {fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(
+ () => null,
+ (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ characteristic.writeValue(new Uint8Array(1)), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html
deleted file mode 100644
index e453c806374..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Service gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let descriptor, fake_peripheral, fake_service;
-
-bluetooth_test(() => getUserDescriptionDescriptor()
- .then(_ => ({descriptor, fake_peripheral, fake_service} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- descriptor.readValue(),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..3b6c78a97c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Service gets removed. Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let descriptor, fake_peripheral, fake_service;
+
+bluetooth_test(
+ () =>
+ getUserDescriptionDescriptor()
+ .then(_ => ({descriptor, fake_peripheral, fake_service} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ descriptor.readValue(), expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html
deleted file mode 100644
index 35ff057cbad..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'A read request succeeds and returns the descriptor\'s value.';
-const EXPECTED_VALUE = [0, 1, 2];
-let descriptor, fake_descriptor;
-
-bluetooth_test(() => getUserDescriptionDescriptor()
- .then(_ => ({descriptor, fake_descriptor} = _))
- .then(() =>
- fake_descriptor.setNextReadResponse(GATT_SUCCESS, EXPECTED_VALUE))
- .then(() => descriptor.readValue())
- .then(value => assert_array_equals(Array.from(new Uint8Array(
- value.buffer)), EXPECTED_VALUE)),
- test_desc);
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js
new file mode 100644
index 00000000000..5f3c5f8f084
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js
@@ -0,0 +1,17 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = `A read request succeeds and returns the descriptor's value.`;
+
+bluetooth_test(async () => {
+ const {descriptor, fake_descriptor} = await getUserDescriptionDescriptor();
+
+ const EXPECTED_VALUE = [0, 1, 2];
+ await fake_descriptor.setNextReadResponse(GATT_SUCCESS, EXPECTED_VALUE);
+
+ const value = await descriptor.readValue();
+ assert_array_equals(Array.from(new Uint8Array(value.buffer)), EXPECTED_VALUE);
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html
deleted file mode 100644
index 2ab990de61c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-
-function detachBuffer(buffer) {
- window.postMessage('', '*', [buffer]);
-}
-
-bluetooth_test(async (t) => {
- let {descriptor, fake_descriptor} =
- await getUserDescriptionDescriptor();
-
- let typed_array = Uint8Array.of(1, 2);
- detachBuffer(typed_array.buffer);
- await promise_rejects(
- t, 'InvalidStateError', descriptor.writeValue(typed_array));
-
- let array_buffer = Uint8Array.of(3, 4).buffer;
- detachBuffer(array_buffer);
- await promise_rejects(
- t, 'InvalidStateError', descriptor.writeValue(array_buffer));
-}, 'writeValue() fails when passed a detached buffer');
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js
new file mode 100644
index 00000000000..23ea2329a64
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'writeValue() fails when passed a detached buffer';
+
+function detachBuffer(buffer) {
+ window.postMessage('', '*', [buffer]);
+}
+
+bluetooth_test(async (t) => {
+ const {descriptor, fake_descriptor} = await getUserDescriptionDescriptor();
+
+ const typed_array = Uint8Array.of(1, 2);
+ detachBuffer(typed_array.buffer);
+ await promise_rejects(
+ t, 'InvalidStateError', descriptor.writeValue(typed_array));
+
+ const array_buffer = Uint8Array.of(3, 4).buffer;
+ detachBuffer(array_buffer);
+ await promise_rejects(
+ t, 'InvalidStateError', descriptor.writeValue(array_buffer));
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html
deleted file mode 100644
index acd56c3aa45..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Service gets removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let descriptor, fake_peripheral, fake_service;
-
-bluetooth_test(() => getUserDescriptionDescriptor()
- .then(_ => ({descriptor, fake_peripheral, fake_service} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- descriptor.writeValue(new ArrayBuffer(1 /* length */)),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..ca75ebaba88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Service gets removed. Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let descriptor, fake_peripheral, fake_service;
+
+bluetooth_test(
+ () => getUserDescriptionDescriptor()
+ .then(_ => ({descriptor, fake_peripheral, fake_service} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ descriptor.writeValue(new ArrayBuffer(1 /* length */)),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html
deleted file mode 100644
index c406e50c199..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'A device disconnecting while connected should fire the ' +
- 'gattserverdisconnected event.';
-
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- fake_peripheral.simulateGATTDisconnection();
- return eventPromise(device, 'gattserverdisconnected');
- })
- .then(e => assert_true(e.bubbles)),
- test_desc);
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js
new file mode 100644
index 00000000000..245e43d3150
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js
@@ -0,0 +1,17 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'A device disconnecting while connected should fire the ' +
+ 'gattserverdisconnected event.';
+
+bluetooth_test(async () => {
+ const {device, fake_peripheral} = await getConnectedHealthThermometerDevice();
+ const disconnectPromise = eventPromise(device, 'gattserverdisconnected');
+
+ await fake_peripheral.simulateGATTDisconnection();
+ let disconnectEvent = await disconnectPromise;
+ assert_true(disconnectEvent.bubbles);
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html
deleted file mode 100644
index 8208231bf55..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'A device disconnecting after the BluetoothDevice object ' +
- 'has been GC\'ed should not access freed memory.';
-
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(({fake_peripheral}) => {
- // 1. Disconnect.
- fake_peripheral.simulateGATTDisconnection();
- // 2. Run garbage collection.
- fake_peripheral = undefined;
- runGarbageCollection();
- })
- // 3. Wait 50ms after the GC runs for the disconnection event to come back.
- // There's nothing to assert other than that only valid memory is used.
- .then(() => new Promise(resolve => step_timeout(resolve, 50))),
- test_desc);
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js
new file mode 100644
index 00000000000..69e30443ee6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'A device disconnecting after the BluetoothDevice object ' +
+ 'has been GC\'ed should not access freed memory.';
+
+bluetooth_test(async () => {
+ let {fake_peripheral} = await getConnectedHealthThermometerDevice();
+
+ // 1. Disconnect.
+ await fake_peripheral.simulateGATTDisconnection();
+
+ // 2. Run garbage collection.
+ fake_peripheral = undefined;
+ await runGarbageCollection();
+
+ // 3. Wait 50ms after the GC runs for the disconnection event to come back.
+ // There's nothing to assert other than that only valid memory is used.
+ await new Promise(resolve => step_timeout(resolve, 50));
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html
deleted file mode 100644
index 92be9c35039..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'If a site disconnects from a device while the platform is ' +
- 'disconnecting that device, only one gattserverdisconnected event should ' +
- 'fire.';
-let device, fake_peripheral;
-let num_events = 0;
-
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(_ => ({device, fake_peripheral} = _))
- // 1. Listen for disconnections.
- .then(() =>
- device.addEventListener('gattserverdisconnected', () => num_events++))
- // 2. Disconnect several times.
- .then(() => Promise.all([
- eventPromise(device, 'gattserverdisconnected'),
- fake_peripheral.simulateGATTDisconnection(),
- device.gatt.disconnect(),
- device.gatt.disconnect(),
- ]))
- // 3. Wait to catch disconnect events.
- .then(() => new Promise(resolve => step_timeout(resolve, 50)))
- // 4. Ensure there is exactly 1 disconnection recorded.
- .then(() => assert_equals(num_events, 1)),
- test_desc);
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js
new file mode 100644
index 00000000000..317eddee9ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js
@@ -0,0 +1,31 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'If a site disconnects from a device while the platform is ' +
+ 'disconnecting that device, only one gattserverdisconnected event should ' +
+ 'fire.';
+
+bluetooth_test(async () => {
+ const {device, fake_peripheral} = await getConnectedHealthThermometerDevice();
+ let num_events = 0;
+
+ // 1. Listen for disconnections.
+ device.addEventListener('gattserverdisconnected', () => num_events++);
+
+ // 2. Disconnect several times.
+ await Promise.all([
+ eventPromise(device, 'gattserverdisconnected'),
+ fake_peripheral.simulateGATTDisconnection(),
+ device.gatt.disconnect(),
+ device.gatt.disconnect(),
+ ]);
+
+ // 3. Wait to catch disconnect events.
+ await new Promise(resolve => step_timeout(resolve, 50));
+
+ // 4. Ensure there is exactly 1 disconnection recorded.
+ assert_equals(num_events, 1);
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html
deleted file mode 100644
index 6d0c8e28c5d..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-let test_desc = 'A device that reconnects during the gattserverdisconnected ' +
- 'event should still receive gattserverdisconnected events after ' +
- 're-connection.';
-let device, fake_peripheral;
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(_ => ({device, fake_peripheral} = _))
- // 1. Disconnect.
- .then(() => new Promise(resolve => {
- fake_peripheral.simulateGATTDisconnection();
- device.addEventListener(
- 'gattserverdisconnected', function onDisconnected() {
- device.removeEventListener('gattserverdisconnected', onDisconnected);
- // 2. Reconnect.
- fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- })
- .then(() => device.gatt.connect())
- .then(() => resolve());
- });
- }))
- // 3. Disconnect after reconnecting.
- .then(() => {
- fake_peripheral.simulateGATTDisconnection();
- return eventPromise(device, 'gattserverdisconnected')
- }), test_desc);
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js
new file mode 100644
index 00000000000..93a46eeb934
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js
@@ -0,0 +1,32 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+'use strict';
+const test_desc = 'A device that reconnects during the ' +
+ 'gattserverdisconnected event should still receive ' +
+ 'gattserverdisconnected events after re-connection.';
+
+bluetooth_test(async () => {
+ const {device, fake_peripheral} = await getConnectedHealthThermometerDevice();
+
+ const reconnectPromise = new Promise(async (resolve) => {
+ device.addEventListener('gattserverdisconnected', async () => {
+ // 2. Reconnect.
+ await fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ });
+ await device.gatt.connect();
+
+ // 3. Disconnect after reconnecting.
+ const disconnectPromise = eventPromise(device, 'gattserverdisconnected');
+ fake_peripheral.simulateGATTDisconnection();
+ resolve(disconnectPromise);
+ }, {once: true});
+ });
+
+ // 1. Disconnect.
+ await fake_peripheral.simulateGATTDisconnection();
+ await reconnectPromise;
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/generate.py b/tests/wpt/web-platform-tests/bluetooth/generate.py
index 034ca22c619..f7fffddbc30 100644
--- a/tests/wpt/web-platform-tests/bluetooth/generate.py
+++ b/tests/wpt/web-platform-tests/bluetooth/generate.py
@@ -8,9 +8,9 @@
For each script-tests/X.js creates the following test files depending on the
contents of X.js
-- getPrimaryService/X.html
-- getPrimaryServices/X.html
-- getPrimaryServices/X-with-uuid.html
+- getPrimaryService/X.https.window.js
+- getPrimaryServices/X.https.window.js
+- getPrimaryServices/X-with-uuid.https.window.js
script-tests/X.js files should contain "CALLS([variation1 | variation2 | ...])"
tokens that indicate what files to generate. Each variation in CALLS([...])
@@ -36,14 +36,14 @@ promise_test(() => {
this script will generate:
-// getPrimaryService/example.html
+// getPrimaryService/example.https.window.js
promise_test(() => {
return navigator.bluetooth.requestDevice(...)
.then(device => device.gatt.getPrimaryService('heart_rate'))
.then(device => device.gatt.getPrimaryService('heart_rate'));
}, 'example test for getPrimaryService');
-// getPrimaryServices/example-with-uuid.html
+// getPrimaryServices/example-with-uuid.https.window.js
promise_test(() => {
return navigator.bluetooth.requestDevice(...)
.then(device => device.gatt.getPrimaryServices('heart_rate'))
@@ -81,7 +81,7 @@ def GetGeneratedTests():
os.path.join(
bluetooth_tests_dir,
TEMPLATES_DIR,
- 'base_test_html.template'
+ 'base_test_js.template'
), 'r')
base_template_file_data = base_template_file_handle.read().decode('utf-8')
base_template_file_handle.close()
@@ -140,7 +140,7 @@ def GetGeneratedTests():
# Get test file name
group_dir = os.path.basename(os.path.abspath(os.path.join(template, os.pardir)))
- call_test_file_name = 'gen-{}{}.https.html'.format(template_name, '-with-uuid' if uuid_suffix else '')
+ call_test_file_name = 'gen-{}{}.https.window.js'.format(template_name, '-with-uuid' if uuid_suffix else '')
call_test_file_path = os.path.join(bluetooth_tests_dir, group_dir, function_name, call_test_file_name)
yield GeneratedTest(call_test_file_data, call_test_file_path, template)
@@ -150,7 +150,7 @@ def main():
previous_generated_files = set()
current_path = os.path.dirname(os.path.realpath(__file__))
for root, _, filenames in os.walk(current_path):
- for filename in fnmatch.filter(filenames, 'gen-*.https.html'):
+ for filename in fnmatch.filter(filenames, 'gen-*.https.window.js'):
previous_generated_files.add(os.path.join(root, filename))
generated_files = set()
diff --git a/tests/wpt/web-platform-tests/bluetooth/generate_test.py b/tests/wpt/web-platform-tests/bluetooth/generate_test.py
index 881f7dbcb73..8cb61dda8fa 100755
--- a/tests/wpt/web-platform-tests/bluetooth/generate_test.py
+++ b/tests/wpt/web-platform-tests/bluetooth/generate_test.py
@@ -42,7 +42,7 @@ def main():
previous_generated_files = set()
current_path = os.path.dirname(os.path.realpath(__file__))
for root, _, filenames in os.walk(current_path):
- for filename in fnmatch.filter(filenames, 'gen-*.https.html'):
+ for filename in fnmatch.filter(filenames, 'gen-*.https.window.js'):
previous_generated_files.add(os.path.join(root, filename))
if previous_generated_files != generated_files:
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
index 1545a513960..367b778c454 100644
--- a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
+++ b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
@@ -9,6 +9,10 @@ function requestDeviceWithOptionsAndConnect(options) {
window.addEventListener('message', (messageEvent) => {
switch (messageEvent.data.type) {
+ case 'GetAvailability':
+ navigator.bluetooth.getAvailability().then(
+ availability => parent.postMessage(availability, '*'));
+ break;
case 'RequestDevice':
navigator.bluetooth
.requestDevice({filters: [{services: ['generic_access']}]})
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template
deleted file mode 100644
index 714333c5e13..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-TEST
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template
new file mode 100644
index 00000000000..56971d2c6c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template
@@ -0,0 +1,7 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+TEST
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html
deleted file mode 100644
index af00c66d789..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called before getPrimaryService. ' +
- 'Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.disconnect())
- .then(() => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js
new file mode 100644
index 00000000000..2d94b41e020
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryService. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(
+ () => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html
deleted file mode 100644
index 6656ff16a14..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryService ' +
- 'call that fails. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.', 'NetworkError');
-let device;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(_ => ({device} = _))
- .then(() => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected)
- device.gatt.disconnect();
- return promise;
- }),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js
new file mode 100644
index 00000000000..0d6e8a7a179
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryService ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'), expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html
deleted file mode 100644
index 760be97ebd8..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryService call that ' +
- 'succeeds. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected);
- device.gatt.disconnect();
- return promise;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js
new file mode 100644
index 00000000000..18af59d7f80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryService call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ }).then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'), expected);
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html
deleted file mode 100644
index 4c3c577fcc5..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls on services after we disconnect and connect again. '+
- 'Should reject with InvalidStateError.';
-let device, services;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- // Convert to array if necessary.
- .then(s => services = [].concat(s))
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => {
- let promises = Promise.resolve();
- for (let service of services) {
- let error = new DOMException(
- `Service with UUID ${service.uuid} is no longer valid. Remember ` +
- `to retrieve the service again after reconnecting.`,
- 'InvalidStateError');
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristic('measurement_interval'),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics(),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics('measurement_interval'),
- error));
- }
- return promises;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js
new file mode 100644
index 00000000000..5cfe893f5d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js
@@ -0,0 +1,43 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. ' +
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${
+ service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics(), error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html
deleted file mode 100644
index abfd1a9c2da..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'getPrimaryService called before connecting. Reject with ' +
- 'NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getDiscoveredHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js
new file mode 100644
index 00000000000..622f2cf3212
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'getPrimaryService called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html
deleted file mode 100644
index 098eec4113b..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service without permission. Should ' +
- 'Reject with SecurityError even if services have been discovered already.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service ' +
- 'UUID to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-let device;
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: ['health_thermometer']}]
- })
- .then(_ => ({device} = _))
- .then(() => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js
new file mode 100644
index 00000000000..5afb0262658
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js
@@ -0,0 +1,29 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service without permission. Should ' +
+ 'Reject with SecurityError even if services have been discovered already.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+let device;
+
+bluetooth_test(
+ () => getHealthThermometerDeviceWithServicesDiscovered(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(_ => ({device} = _))
+ .then(() => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html
deleted file mode 100644
index 233a45adf06..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service. Must reject with ' +
- 'NotFoundError even when the services have previously been discovered.';
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['glucose']})
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('glucose'),
- new DOMException(
- `No Services matching UUID ${glucose.uuid} found in Device.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js
new file mode 100644
index 00000000000..86fa5e9b011
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service. Must reject with ' +
+ 'NotFoundError even when the services have previously been discovered.';
+
+bluetooth_test(
+ () => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('glucose'),
+ new DOMException(
+ `No Services matching UUID ${
+ glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html
deleted file mode 100644
index ab93d334818..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryService ' +
- 'call that failed. Should not crash.'
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
- 'with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected);
- // Disconnect called to clear attributeInstanceMap and allow the
- // object to get garbage collected.
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js
new file mode 100644
index 00000000000..2c35c1b7556
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryService ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html
deleted file mode 100644
index 647aa504a20..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryService call that ' +
- 'succeeds. Should not crash.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('health_thermometer'),
- expected);
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js
new file mode 100644
index 00000000000..cca8c2c5d2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Garbage Collection ran during a getPrimaryService call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html
deleted file mode 100644
index f09e4e65c27..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryService after a disconnection should return ' +
- 'a different object.';
-let device, services_first_connection, services_second_connection;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- .then(services => services_first_connection = services)
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- .then(services => services_second_connection = services)
- .then(() => {
- // Convert to arrays if necessary.
- services_first_connection = [].concat(services_first_connection);
- services_second_connection = [].concat(services_second_connection);
-
- assert_equals(services_first_connection.length,
- services_second_connection.length);
-
- let first_connection_set = new Set(services_first_connection);
- let second_connection_set = new Set(services_second_connection);
-
- // The two sets should be disjoint.
- let common_services = services_first_connection.filter(
- val => second_connection_set.has(val));
- assert_equals(common_services.length, 0);
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js
new file mode 100644
index 00000000000..a0f073d8a31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js
@@ -0,0 +1,44 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Calls to getPrimaryService after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection =
+ [].concat(services_first_connection);
+ services_second_connection =
+ [].concat(services_second_connection);
+
+ assert_equals(
+ services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html
deleted file mode 100644
index 35893d24a60..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryService should return the same object.';
-let device;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']})
- .then(({device}) => Promise.all([
- device.gatt.getPrimaryService('health_thermometer'),
- device.gatt.getPrimaryService('health_thermometer')]))
- .then(([services_first_call, services_second_call]) => {
- // Convert to arrays if necessary.
- services_first_call = [].concat(services_first_call);
- services_second_call = [].concat(services_second_call);
-
- assert_equals(services_first_call.length, services_second_call.length);
-
- let first_call_set = new Set(services_first_call);
- assert_equals(services_first_call.length, first_call_set.size);
- let second_call_set = new Set(services_second_call);
- assert_equals(services_second_call.length, second_call_set.size);
-
- services_first_call.forEach(service => {
- assert_true(second_call_set.has(service))
- });
-
- services_second_call.forEach(service => {
- assert_true(first_call_set.has(service));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js
new file mode 100644
index 00000000000..3deb387406e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js
@@ -0,0 +1,41 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getPrimaryService should return the same object.';
+let device;
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryService('health_thermometer'),
+ device.gatt.getPrimaryService('health_thermometer')
+ ]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(
+ services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(
+ services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(
+ service => {assert_true(second_call_set.has(service))});
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html
deleted file mode 100644
index 40777eee906..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Wrong Service name. Reject with TypeError.';
-const expected = new DOMException(
- "Failed to execute 'getPrimaryService' on " +
- "'BluetoothRemoteGATTServer': Invalid Service name: " +
- "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " +
- "UUID (lowercase hex characters e.g. " +
- "'00001234-0000-1000-8000-00805f9b34fb'), " +
- "or recognized standard name from " +
- "https://www.bluetooth.com/specifications/gatt/services" +
- " e.g. 'alert_notification'.",
- 'TypeError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('wrong_name'),
- expected,
- 'Wrong Service name passed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js
new file mode 100644
index 00000000000..d59e202d71c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Wrong Service name. Reject with TypeError.';
+const expected = new DOMException(
+ 'Failed to execute \'getPrimaryService\' on ' +
+ '\'BluetoothRemoteGATTServer\': Invalid Service name: ' +
+ '\'wrong_name\'. It must be a valid UUID alias (e.g. 0x1234), ' +
+ 'UUID (lowercase hex characters e.g. ' +
+ '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
+ 'or recognized standard name from ' +
+ 'https://www.bluetooth.com/specifications/gatt/services' +
+ ' e.g. \'alert_notification\'.',
+ 'TypeError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice().then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('wrong_name'), expected,
+ 'Wrong Service name passed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html
deleted file mode 100644
index 7883ef36d4e..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service without permission. ' +
- 'Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
- 'to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(glucose.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js
new file mode 100644
index 00000000000..89ca4688447
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html
deleted file mode 100644
index 566a9fbe091..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for present service without permission to access ' +
- 'any service. Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access any service. Tip: Add the service ' +
- 'UUID to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true})
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('heart_rate'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js
new file mode 100644
index 00000000000..fec0055dcdb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js
@@ -0,0 +1,21 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({acceptAllDevices: true})
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('heart_rate'), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html
deleted file mode 100644
index c9ce1b80aa4..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for present service without permission. ' +
- 'Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
- 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(generic_access.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(generic_access.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryService(generic_access.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js
new file mode 100644
index 00000000000..a0161a0446b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for present service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () =>
+ getConnectedHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.alias),
+ expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html
deleted file mode 100644
index aca14c5fd40..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service. Reject with NotFoundError.';
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['glucose']
- })
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryService('glucose'),
- new DOMException(
- `No Services matching UUID ${glucose.uuid} found in Device.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js
new file mode 100644
index 00000000000..60fb4f2c529
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service. Reject with NotFoundError.';
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('glucose'),
+ new DOMException(
+ `No Services matching UUID ${
+ glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html
deleted file mode 100644
index 4449d2ebbd4..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called before getPrimaryServices. ' +
- 'Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.disconnect())
- .then(() => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js
new file mode 100644
index 00000000000..86a346d1483
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryServices. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(
+ () => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html
deleted file mode 100644
index 3bf4ed6dccb..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called before getPrimaryServices. ' +
- 'Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.disconnect())
- .then(() => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js
new file mode 100644
index 00000000000..97e9f77d12e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js
@@ -0,0 +1,26 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryServices. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(
+ () => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html
deleted file mode 100644
index d7cb43725ed..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryServices ' +
- 'call that fails. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.', 'NetworkError');
-let device;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(_ => ({device} = _))
- .then(() => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected)
- device.gatt.disconnect();
- return promise;
- }),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js
new file mode 100644
index 00000000000..37394075d80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'), expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html
deleted file mode 100644
index 27440af9162..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryServices ' +
- 'call that fails. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.', 'NetworkError');
-let device;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(_ => ({device} = _))
- .then(() => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected)
- device.gatt.disconnect();
- return promise;
- }),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js
new file mode 100644
index 00000000000..9c7aac67a4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html
deleted file mode 100644
index 7b9955ade44..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
- 'succeeds. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected);
- device.gatt.disconnect();
- return promise;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js
new file mode 100644
index 00000000000..bffcea4e9fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ }).then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'), expected);
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html
deleted file mode 100644
index 4b09bce4eee..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
- 'succeeds. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => {
- let promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected);
- device.gatt.disconnect();
- return promise;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js
new file mode 100644
index 00000000000..162a61f3eb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ }).then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected);
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html
deleted file mode 100644
index 2ef6b5904ac..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls on services after we disconnect and connect again. '+
- 'Should reject with InvalidStateError.';
-let device, services;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryServices('health_thermometer'))
- // Convert to array if necessary.
- .then(s => services = [].concat(s))
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => {
- let promises = Promise.resolve();
- for (let service of services) {
- let error = new DOMException(
- `Service with UUID ${service.uuid} is no longer valid. Remember ` +
- `to retrieve the service again after reconnecting.`,
- 'InvalidStateError');
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristic('measurement_interval'),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics(),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics('measurement_interval'),
- error));
- }
- return promises;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js
new file mode 100644
index 00000000000..05dce42424d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js
@@ -0,0 +1,43 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. ' +
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${
+ service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics(), error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html
deleted file mode 100644
index bc21ea1f2db..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls on services after we disconnect and connect again. '+
- 'Should reject with InvalidStateError.';
-let device, services;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryServices())
- // Convert to array if necessary.
- .then(s => services = [].concat(s))
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => {
- let promises = Promise.resolve();
- for (let service of services) {
- let error = new DOMException(
- `Service with UUID ${service.uuid} is no longer valid. Remember ` +
- `to retrieve the service again after reconnecting.`,
- 'InvalidStateError');
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristic('measurement_interval'),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics(),
- error));
- promises = promises.then(() =>
- assert_promise_rejects_with_message(
- service.getCharacteristics('measurement_interval'),
- error));
- }
- return promises;
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js
new file mode 100644
index 00000000000..e17162a7198
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js
@@ -0,0 +1,43 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. ' +
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices())
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${
+ service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics(), error));
+ promises = promises.then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html
deleted file mode 100644
index 0a87bce2d03..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
- 'NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getDiscoveredHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js
new file mode 100644
index 00000000000..3bfa60d8ccb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html
deleted file mode 100644
index dbc4428665c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
- 'NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
- 'first with `device.gatt.connect`.',
- 'NetworkError');
-
-bluetooth_test(() => getDiscoveredHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js
new file mode 100644
index 00000000000..7072b3efb1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(
+ () => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html
deleted file mode 100644
index 460b94d2565..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service without permission. Should ' +
- 'Reject with SecurityError even if services have been discovered already.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service ' +
- 'UUID to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-let device;
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: ['health_thermometer']}]
- })
- .then(_ => ({device} = _))
- .then(() => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js
new file mode 100644
index 00000000000..589ebe38644
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js
@@ -0,0 +1,29 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service without permission. Should ' +
+ 'Reject with SecurityError even if services have been discovered already.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+let device;
+
+bluetooth_test(
+ () => getHealthThermometerDeviceWithServicesDiscovered(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(_ => ({device} = _))
+ .then(() => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html
deleted file mode 100644
index 38e0d455b46..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service. Must reject with ' +
- 'NotFoundError even when the services have previously been discovered.';
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['glucose']})
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('glucose'),
- new DOMException(
- `No Services matching UUID ${glucose.uuid} found in Device.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js
new file mode 100644
index 00000000000..15b8b978040
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service. Must reject with ' +
+ 'NotFoundError even when the services have previously been discovered.';
+
+bluetooth_test(
+ () => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('glucose'),
+ new DOMException(
+ `No Services matching UUID ${
+ glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html
deleted file mode 100644
index 31ab862e82c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
- 'call that failed. Should not crash.'
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
- 'with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected);
- // Disconnect called to clear attributeInstanceMap and allow the
- // object to get garbage collected.
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js
new file mode 100644
index 00000000000..17495d24eba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html
deleted file mode 100644
index a79060adc56..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
- 'call that failed. Should not crash.'
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
- 'with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getEmptyHealthThermometerDevice()
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected);
- // Disconnect called to clear attributeInstanceMap and allow the
- // object to get garbage collected.
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js
new file mode 100644
index 00000000000..741cd2171f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html
deleted file mode 100644
index b6f0e4a3eef..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' +
- 'succeeds. Should not crash.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('health_thermometer'),
- expected);
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js
new file mode 100644
index 00000000000..1ee4f21ccba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Garbage Collection ran during a getPrimaryServices call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html
deleted file mode 100644
index baf7865b2f5..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' +
- 'succeeds. Should not crash.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve services. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => {
- promise = assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected);
- device.gatt.disconnect();
- return runGarbageCollection();
- })
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js
new file mode 100644
index 00000000000..285b774c4e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Garbage Collection ran during a getPrimaryServices call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html
deleted file mode 100644
index b87a24a5e0e..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' +
- 'a different object.';
-let device, services_first_connection, services_second_connection;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryServices('health_thermometer'))
- .then(services => services_first_connection = services)
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => device.gatt.getPrimaryServices('health_thermometer'))
- .then(services => services_second_connection = services)
- .then(() => {
- // Convert to arrays if necessary.
- services_first_connection = [].concat(services_first_connection);
- services_second_connection = [].concat(services_second_connection);
-
- assert_equals(services_first_connection.length,
- services_second_connection.length);
-
- let first_connection_set = new Set(services_first_connection);
- let second_connection_set = new Set(services_second_connection);
-
- // The two sets should be disjoint.
- let common_services = services_first_connection.filter(
- val => second_connection_set.has(val));
- assert_equals(common_services.length, 0);
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js
new file mode 100644
index 00000000000..eb20e6f4b2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js
@@ -0,0 +1,44 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Calls to getPrimaryServices after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection =
+ [].concat(services_first_connection);
+ services_second_connection =
+ [].concat(services_second_connection);
+
+ assert_equals(
+ services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html
deleted file mode 100644
index 9ed3c50e6be..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' +
- 'a different object.';
-let device, services_first_connection, services_second_connection;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']
- })
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryServices())
- .then(services => services_first_connection = services)
- .then(() => device.gatt.disconnect())
- .then(() => device.gatt.connect())
- .then(() => device.gatt.getPrimaryServices())
- .then(services => services_second_connection = services)
- .then(() => {
- // Convert to arrays if necessary.
- services_first_connection = [].concat(services_first_connection);
- services_second_connection = [].concat(services_second_connection);
-
- assert_equals(services_first_connection.length,
- services_second_connection.length);
-
- let first_connection_set = new Set(services_first_connection);
- let second_connection_set = new Set(services_second_connection);
-
- // The two sets should be disjoint.
- let common_services = services_first_connection.filter(
- val => second_connection_set.has(val));
- assert_equals(common_services.length, 0);
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js
new file mode 100644
index 00000000000..14fc656c70d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js
@@ -0,0 +1,44 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc =
+ 'Calls to getPrimaryServices after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices())
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryServices())
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection =
+ [].concat(services_first_connection);
+ services_second_connection =
+ [].concat(services_second_connection);
+
+ assert_equals(
+ services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html
deleted file mode 100644
index 9d213d5dfd8..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryServices should return the same object.';
-let device;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']})
- .then(({device}) => Promise.all([
- device.gatt.getPrimaryServices('health_thermometer'),
- device.gatt.getPrimaryServices('health_thermometer')]))
- .then(([services_first_call, services_second_call]) => {
- // Convert to arrays if necessary.
- services_first_call = [].concat(services_first_call);
- services_second_call = [].concat(services_second_call);
-
- assert_equals(services_first_call.length, services_second_call.length);
-
- let first_call_set = new Set(services_first_call);
- assert_equals(services_first_call.length, first_call_set.size);
- let second_call_set = new Set(services_second_call);
- assert_equals(services_second_call.length, second_call_set.size);
-
- services_first_call.forEach(service => {
- assert_true(second_call_set.has(service))
- });
-
- services_second_call.forEach(service => {
- assert_true(first_call_set.has(service));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js
new file mode 100644
index 00000000000..f3fc4906b44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js
@@ -0,0 +1,41 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getPrimaryServices should return the same object.';
+let device;
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryServices('health_thermometer'),
+ device.gatt.getPrimaryServices('health_thermometer')
+ ]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(
+ services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(
+ services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(
+ service => {assert_true(second_call_set.has(service))});
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html
deleted file mode 100644
index 258bda0ec68..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getPrimaryServices should return the same object.';
-let device;
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['generic_access']})
- .then(({device}) => Promise.all([
- device.gatt.getPrimaryServices(),
- device.gatt.getPrimaryServices()]))
- .then(([services_first_call, services_second_call]) => {
- // Convert to arrays if necessary.
- services_first_call = [].concat(services_first_call);
- services_second_call = [].concat(services_second_call);
-
- assert_equals(services_first_call.length, services_second_call.length);
-
- let first_call_set = new Set(services_first_call);
- assert_equals(services_first_call.length, first_call_set.size);
- let second_call_set = new Set(services_second_call);
- assert_equals(services_second_call.length, second_call_set.size);
-
- services_first_call.forEach(service => {
- assert_true(second_call_set.has(service))
- });
-
- services_second_call.forEach(service => {
- assert_true(first_call_set.has(service));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js
new file mode 100644
index 00000000000..c7c488a18b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js
@@ -0,0 +1,40 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getPrimaryServices should return the same object.';
+let device;
+
+bluetooth_test(
+ () =>
+ getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryServices(), device.gatt.getPrimaryServices()
+ ]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(
+ services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(
+ service => {assert_true(second_call_set.has(service))});
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html
deleted file mode 100644
index 969ad61ea65..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Wrong Service name. Reject with TypeError.';
-const expected = new DOMException(
- "Failed to execute 'getPrimaryServices' on " +
- "'BluetoothRemoteGATTServer': Invalid Service name: " +
- "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " +
- "UUID (lowercase hex characters e.g. " +
- "'00001234-0000-1000-8000-00805f9b34fb'), " +
- "or recognized standard name from " +
- "https://www.bluetooth.com/specifications/gatt/services" +
- " e.g. 'alert_notification'.",
- 'TypeError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice()
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('wrong_name'),
- expected,
- 'Wrong Service name passed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js
new file mode 100644
index 00000000000..025f1ccdf7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js
@@ -0,0 +1,25 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Wrong Service name. Reject with TypeError.';
+const expected = new DOMException(
+ 'Failed to execute \'getPrimaryServices\' on ' +
+ '\'BluetoothRemoteGATTServer\': Invalid Service name: ' +
+ '\'wrong_name\'. It must be a valid UUID alias (e.g. 0x1234), ' +
+ 'UUID (lowercase hex characters e.g. ' +
+ '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
+ 'or recognized standard name from ' +
+ 'https://www.bluetooth.com/specifications/gatt/services' +
+ ' e.g. \'alert_notification\'.',
+ 'TypeError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice().then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('wrong_name'), expected,
+ 'Wrong Service name passed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html
deleted file mode 100644
index 696b1f9471d..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service without permission. ' +
- 'Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
- 'to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(glucose.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js
new file mode 100644
index 00000000000..6f1bb251723
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html
deleted file mode 100644
index 41bbf6eecd0..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for present service without permission to access ' +
- 'any service. Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access any service. Tip: Add the service ' +
- 'UUID to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true})
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('heart_rate'),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js
new file mode 100644
index 00000000000..4bbddeae56e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js
@@ -0,0 +1,21 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({acceptAllDevices: true})
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('heart_rate'), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html
deleted file mode 100644
index 58bea882946..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for present service without permission to access ' +
- 'any service. Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access any service. Tip: Add the service ' +
- 'UUID to \'optionalServices\' in requestDevice() options. ' +
- 'https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true})
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(),
- expected)),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js
new file mode 100644
index 00000000000..40b8b576ff4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js
@@ -0,0 +1,21 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getConnectedHealthThermometerDevice({acceptAllDevices: true})
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html
deleted file mode 100644
index 4f8254ad86e..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for present service without permission. ' +
- 'Reject with SecurityError.';
-const expected = new DOMException(
- 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
- 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
- 'SecurityError');
-
-bluetooth_test(() => getConnectedHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}]
- })
- .then(({device}) => Promise.all([
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(generic_access.alias), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(generic_access.name), expected),
- assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices(generic_access.uuid), expected)])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js
new file mode 100644
index 00000000000..6f737ecf889
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js
@@ -0,0 +1,29 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for present service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(
+ () =>
+ getConnectedHealthThermometerDevice(
+ {filters: [{services: ['health_thermometer']}]})
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.alias),
+ expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.name),
+ expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.uuid), expected)
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html
deleted file mode 100644
index cb5e0941f66..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent service. Reject with NotFoundError.';
-
-bluetooth_test(() => getHealthThermometerDevice({
- filters: [{services: ['health_thermometer']}],
- optionalServices: ['glucose']
- })
- .then(({device}) => assert_promise_rejects_with_message(
- device.gatt.getPrimaryServices('glucose'),
- new DOMException(
- `No Services matching UUID ${glucose.uuid} found in Device.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js
new file mode 100644
index 00000000000..33946d281bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent service. Reject with NotFoundError.';
+
+bluetooth_test(
+ () => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(
+ ({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('glucose'),
+ new DOMException(
+ `No Services matching UUID ${
+ glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html
deleted file mode 100644
index 9e42a469c67..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Serial Number String characteristic is blocklisted. ' +
- 'Should reject with SecurityError.';
-const expected = new DOMException(
- 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX',
- 'SecurityError');
-
-bluetooth_test(() => getHIDDevice({
- filters: [{services: ['device_information']}]
-})
- .then(({device}) => device.gatt.getPrimaryService('device_information'))
- .then(service => assert_promise_rejects_with_message(
- service.getCharacteristic('serial_number_string'),
- expected,
- 'Serial Number String characteristic is blocklisted.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js
new file mode 100644
index 00000000000..04176f1ecda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Serial Number String characteristic is blocklisted. ' +
+ 'Should reject with SecurityError.';
+const expected = new DOMException(
+ 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX',
+ 'SecurityError');
+
+bluetooth_test(
+ () =>
+ getHIDDevice({filters: [{services: ['device_information']}]})
+ .then(
+ ({device}) =>
+ device.gatt.getPrimaryService('device_information'))
+ .then(
+ service => assert_promise_rejects_with_message(
+ service.getCharacteristic('serial_number_string'), expected,
+ 'Serial Number String characteristic is blocklisted.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html
deleted file mode 100644
index 5fc3ec470ac..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent characteristics with UUID. ' +
- 'Reject with NotFoundError.';
-
-bluetooth_test(() => getEmptyHealthThermometerService()
- .then(({service}) => assert_promise_rejects_with_message(
- service.getCharacteristic('battery_level'),
- new DOMException(
- `No Characteristics matching UUID ${battery_level.uuid} found ` +
- `in Service with UUID ${health_thermometer.uuid}.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js
new file mode 100644
index 00000000000..cfec509c492
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js
@@ -0,0 +1,20 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent characteristics with UUID. ' +
+ 'Reject with NotFoundError.';
+
+bluetooth_test(
+ () => getEmptyHealthThermometerService().then(
+ ({service}) => assert_promise_rejects_with_message(
+ service.getCharacteristic('battery_level'),
+ new DOMException(
+ `No Characteristics matching UUID ${
+ battery_level.uuid} found ` +
+ `in Service with UUID ${health_thermometer.uuid}.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html
deleted file mode 100644
index 0b81768d508..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during getCharacteristic ' +
- 'call that fails. Should not crash';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => {
- promise = assert_promise_rejects_with_message(
- service.getCharacteristic('measurement_interval'), expected);
- // Disconnect called to clear attributeInstanceMap and allow the object to
- // get garbage collected.
- service.device.gatt.disconnect();
- })
- .then(runGarbageCollection)
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js
new file mode 100644
index 00000000000..9543a5e5633
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during getCharacteristic ' +
+ 'call that fails. Should not crash';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(({service}) => {
+ promise = assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ service.device.gatt.disconnect();
+ })
+ .then(runGarbageCollection)
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html
deleted file mode 100644
index e8fc6542cce..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getCharacteristic should return the same object.';
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => Promise.all([
- service.getCharacteristic('measurement_interval'),
- service.getCharacteristic('measurement_interval')]))
- .then(([characteristics_first_call, characteristics_second_call]) => {
- // Convert to arrays if necessary.
- characteristics_first_call = [].concat(characteristics_first_call);
- characteristics_second_call = [].concat(characteristics_second_call);
-
- let first_call_set = new Set(characteristics_first_call);
- assert_equals(characteristics_first_call.length, first_call_set.size);
- let second_call_set = new Set(characteristics_second_call);
- assert_equals(characteristics_second_call.length, second_call_set.size);
-
- characteristics_first_call.forEach(characteristic => {
- assert_true(second_call_set.has(characteristic));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js
new file mode 100644
index 00000000000..73691befa52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js
@@ -0,0 +1,36 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getCharacteristic should return the same object.';
+
+bluetooth_test(
+ () =>
+ getHealthThermometerService()
+ .then(({service}) => Promise.all([
+ service.getCharacteristic('measurement_interval'),
+ service.getCharacteristic('measurement_interval')
+ ]))
+ .then(
+ ([characteristics_first_call, characteristics_second_call]) => {
+ // Convert to arrays if necessary.
+ characteristics_first_call =
+ [].concat(characteristics_first_call);
+ characteristics_second_call =
+ [].concat(characteristics_second_call);
+
+ let first_call_set = new Set(characteristics_first_call);
+ assert_equals(
+ characteristics_first_call.length, first_call_set.size);
+ let second_call_set = new Set(characteristics_second_call);
+ assert_equals(
+ characteristics_second_call.length, second_call_set.size);
+
+ characteristics_first_call.forEach(characteristic => {
+ assert_true(second_call_set.has(characteristic));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html
deleted file mode 100644
index 08c1352155a..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
-const expected = new DOMException(
- "Failed to execute 'getCharacteristic' on " +
- "'BluetoothRemoteGATTService': Invalid Characteristic name: " +
- "'wrong_name'. " +
- "It must be a valid UUID alias (e.g. 0x1234), " +
- "UUID (lowercase hex characters e.g. " +
- "'00001234-0000-1000-8000-00805f9b34fb'), " +
- "or recognized standard name from " +
- "https://www.bluetooth.com/specifications/gatt/characteristics" +
- " e.g. 'aerobic_heart_rate_lower_limit'.",
- 'TypeError');
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => assert_promise_rejects_with_message(
- service.getCharacteristic('wrong_name'),
- expected,
- 'Wrong Characteristic name passed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js
new file mode 100644
index 00000000000..d21dcf56122
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js
@@ -0,0 +1,26 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
+const expected = new DOMException(
+ 'Failed to execute \'getCharacteristic\' on ' +
+ '\'BluetoothRemoteGATTService\': Invalid Characteristic name: ' +
+ '\'wrong_name\'. ' +
+ 'It must be a valid UUID alias (e.g. 0x1234), ' +
+ 'UUID (lowercase hex characters e.g. ' +
+ '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
+ 'or recognized standard name from ' +
+ 'https://www.bluetooth.com/specifications/gatt/characteristics' +
+ ' e.g. \'aerobic_heart_rate_lower_limit\'.',
+ 'TypeError');
+
+bluetooth_test(
+ () => getHealthThermometerService().then(
+ ({service}) => assert_promise_rejects_with_message(
+ service.getCharacteristic('wrong_name'), expected,
+ 'Wrong Characteristic name passed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html
deleted file mode 100644
index 2fe9cd06cf7..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() and connect() called during ' +
- 'getCharacteristic. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: [health_thermometer.name]}],
-})
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryService(health_thermometer.name))
- .then(service => Promise.all([
- // 1. Make a call to service.getCharacteristic, while the service is still
- // valid.
- assert_promise_rejects_with_message(service.getCharacteristic(measurement_interval.name), expected),
-
- // 2. disconnect() and connect before the initial call completes.
- // This is accomplished by making the calls without waiting for the
- // earlier promises to resolve.
- // connect() guarantees on OS-level connection, but disconnect()
- // only disconnects the current instance.
- // getHealthThermometerDeviceWithServicesDiscovered holds another
- // connection in an iframe, so disconnect() and connect() are certain to
- // reconnect. However, disconnect() will invalidate the service object so
- // the subsequent calls made to it will fail, even after reconnecting.
- device.gatt.disconnect(),
- device.gatt.connect()
- ])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js
new file mode 100644
index 00000000000..6f862142464
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js
@@ -0,0 +1,42 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() and connect() called during ' +
+ 'getCharacteristic. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: [health_thermometer.name]}],
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService(health_thermometer.name))
+ .then(service => Promise.all([
+ // 1. Make a call to service.getCharacteristic, while the service
+ // is still valid.
+ assert_promise_rejects_with_message(
+ service.getCharacteristic(measurement_interval.name),
+ expected),
+
+ // 2. disconnect() and connect before the initial call completes.
+ // This is accomplished by making the calls without waiting for
+ // the earlier promises to resolve. connect() guarantees on
+ // OS-level connection, but disconnect() only disconnects the
+ // current instance.
+ // getHealthThermometerDeviceWithServicesDiscovered holds another
+ // connection in an iframe, so disconnect() and connect() are
+ // certain to reconnect. However, disconnect() will invalidate
+ // the service object so the subsequent calls made to it will
+ // fail, even after reconnecting.
+ device.gatt.disconnect(), device.gatt.connect()
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html
deleted file mode 100644
index 391c49a0bab..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Service is removed before getCharacteristic call. ' +
- 'Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let service, fake_service, fake_peripheral;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(_ => ({service, fake_service, fake_peripheral} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- service.getCharacteristic('measurement_interval'),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..b6d6a9df96e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Service is removed before getCharacteristic call. ' +
+ 'Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(_ => ({service, fake_service, fake_peripheral} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html
deleted file mode 100644
index eeaa5b3da30..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Serial Number String characteristic is blocklisted. ' +
- 'Should reject with SecurityError.';
-const expected = new DOMException(
- 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX',
- 'SecurityError');
-
-bluetooth_test(() => getHIDDevice({
- filters: [{services: ['device_information']}]
-})
- .then(({device}) => device.gatt.getPrimaryService('device_information'))
- .then(service => assert_promise_rejects_with_message(
- service.getCharacteristics('serial_number_string'),
- expected,
- 'Serial Number String characteristic is blocklisted.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js
new file mode 100644
index 00000000000..3afd294d5b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Serial Number String characteristic is blocklisted. ' +
+ 'Should reject with SecurityError.';
+const expected = new DOMException(
+ 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX',
+ 'SecurityError');
+
+bluetooth_test(
+ () => getHIDDevice({filters: [{services: ['device_information']}]})
+ .then(
+ ({device}) =>
+ device.gatt.getPrimaryService('device_information'))
+ .then(
+ service => assert_promise_rejects_with_message(
+ service.getCharacteristics('serial_number_string'),
+ expected,
+ 'Serial Number String characteristic is blocklisted.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html
deleted file mode 100644
index 7f32b30b303..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Request for absent characteristics with UUID. ' +
- 'Reject with NotFoundError.';
-
-bluetooth_test(() => getEmptyHealthThermometerService()
- .then(({service}) => assert_promise_rejects_with_message(
- service.getCharacteristics('battery_level'),
- new DOMException(
- `No Characteristics matching UUID ${battery_level.uuid} found ` +
- `in Service with UUID ${health_thermometer.uuid}.`,
- 'NotFoundError'))),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js
new file mode 100644
index 00000000000..549f6b26719
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js
@@ -0,0 +1,20 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Request for absent characteristics with UUID. ' +
+ 'Reject with NotFoundError.';
+
+bluetooth_test(
+ () => getEmptyHealthThermometerService().then(
+ ({service}) => assert_promise_rejects_with_message(
+ service.getCharacteristics('battery_level'),
+ new DOMException(
+ `No Characteristics matching UUID ${
+ battery_level.uuid} found ` +
+ `in Service with UUID ${health_thermometer.uuid}.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html
deleted file mode 100644
index 36ef29b6c5b..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during getCharacteristics ' +
- 'call that fails. Should not crash';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => {
- promise = assert_promise_rejects_with_message(
- service.getCharacteristics('measurement_interval'), expected);
- // Disconnect called to clear attributeInstanceMap and allow the object to
- // get garbage collected.
- service.device.gatt.disconnect();
- })
- .then(runGarbageCollection)
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js
new file mode 100644
index 00000000000..643e2f839ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js
@@ -0,0 +1,28 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during getCharacteristics ' +
+ 'call that fails. Should not crash';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(({service}) => {
+ promise = assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ service.device.gatt.disconnect();
+ })
+ .then(runGarbageCollection)
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html
deleted file mode 100644
index 5768ff42abc..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Garbage Collection ran during getCharacteristics ' +
- 'call that fails. Should not crash';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let promise;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => {
- promise = assert_promise_rejects_with_message(
- service.getCharacteristics(), expected);
- // Disconnect called to clear attributeInstanceMap and allow the object to
- // get garbage collected.
- service.device.gatt.disconnect();
- })
- .then(runGarbageCollection)
- .then(() => promise),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js
new file mode 100644
index 00000000000..b7db67f613f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Garbage Collection ran during getCharacteristics ' +
+ 'call that fails. Should not crash';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(({service}) => {
+ promise = assert_promise_rejects_with_message(
+ service.getCharacteristics(), expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ service.device.gatt.disconnect();
+ })
+ .then(runGarbageCollection)
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html
deleted file mode 100644
index 917d84df4c7..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getCharacteristics should return the same object.';
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => Promise.all([
- service.getCharacteristics('measurement_interval'),
- service.getCharacteristics('measurement_interval')]))
- .then(([characteristics_first_call, characteristics_second_call]) => {
- // Convert to arrays if necessary.
- characteristics_first_call = [].concat(characteristics_first_call);
- characteristics_second_call = [].concat(characteristics_second_call);
-
- let first_call_set = new Set(characteristics_first_call);
- assert_equals(characteristics_first_call.length, first_call_set.size);
- let second_call_set = new Set(characteristics_second_call);
- assert_equals(characteristics_second_call.length, second_call_set.size);
-
- characteristics_first_call.forEach(characteristic => {
- assert_true(second_call_set.has(characteristic));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js
new file mode 100644
index 00000000000..15b552af491
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js
@@ -0,0 +1,36 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getCharacteristics should return the same object.';
+
+bluetooth_test(
+ () =>
+ getHealthThermometerService()
+ .then(({service}) => Promise.all([
+ service.getCharacteristics('measurement_interval'),
+ service.getCharacteristics('measurement_interval')
+ ]))
+ .then(
+ ([characteristics_first_call, characteristics_second_call]) => {
+ // Convert to arrays if necessary.
+ characteristics_first_call =
+ [].concat(characteristics_first_call);
+ characteristics_second_call =
+ [].concat(characteristics_second_call);
+
+ let first_call_set = new Set(characteristics_first_call);
+ assert_equals(
+ characteristics_first_call.length, first_call_set.size);
+ let second_call_set = new Set(characteristics_second_call);
+ assert_equals(
+ characteristics_second_call.length, second_call_set.size);
+
+ characteristics_first_call.forEach(characteristic => {
+ assert_true(second_call_set.has(characteristic));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html
deleted file mode 100644
index ebdd803efa2..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Calls to getCharacteristics should return the same object.';
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => Promise.all([
- service.getCharacteristics(),
- service.getCharacteristics()]))
- .then(([characteristics_first_call, characteristics_second_call]) => {
- // Convert to arrays if necessary.
- characteristics_first_call = [].concat(characteristics_first_call);
- characteristics_second_call = [].concat(characteristics_second_call);
-
- let first_call_set = new Set(characteristics_first_call);
- assert_equals(characteristics_first_call.length, first_call_set.size);
- let second_call_set = new Set(characteristics_second_call);
- assert_equals(characteristics_second_call.length, second_call_set.size);
-
- characteristics_first_call.forEach(characteristic => {
- assert_true(second_call_set.has(characteristic));
- });
- }), test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js
new file mode 100644
index 00000000000..df30d514f39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js
@@ -0,0 +1,35 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Calls to getCharacteristics should return the same object.';
+
+bluetooth_test(
+ () =>
+ getHealthThermometerService()
+ .then(({service}) => Promise.all([
+ service.getCharacteristics(), service.getCharacteristics()
+ ]))
+ .then(
+ ([characteristics_first_call, characteristics_second_call]) => {
+ // Convert to arrays if necessary.
+ characteristics_first_call =
+ [].concat(characteristics_first_call);
+ characteristics_second_call =
+ [].concat(characteristics_second_call);
+
+ let first_call_set = new Set(characteristics_first_call);
+ assert_equals(
+ characteristics_first_call.length, first_call_set.size);
+ let second_call_set = new Set(characteristics_second_call);
+ assert_equals(
+ characteristics_second_call.length, second_call_set.size);
+
+ characteristics_first_call.forEach(characteristic => {
+ assert_true(second_call_set.has(characteristic));
+ });
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html
deleted file mode 100644
index 0bcb25cdf0c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
-const expected = new DOMException(
- "Failed to execute 'getCharacteristics' on " +
- "'BluetoothRemoteGATTService': Invalid Characteristic name: " +
- "'wrong_name'. " +
- "It must be a valid UUID alias (e.g. 0x1234), " +
- "UUID (lowercase hex characters e.g. " +
- "'00001234-0000-1000-8000-00805f9b34fb'), " +
- "or recognized standard name from " +
- "https://www.bluetooth.com/specifications/gatt/characteristics" +
- " e.g. 'aerobic_heart_rate_lower_limit'.",
- 'TypeError');
-
-bluetooth_test(() => getHealthThermometerService()
- .then(({service}) => assert_promise_rejects_with_message(
- service.getCharacteristics('wrong_name'),
- expected,
- 'Wrong Characteristic name passed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js
new file mode 100644
index 00000000000..f980ac03d5f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js
@@ -0,0 +1,26 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
+const expected = new DOMException(
+ 'Failed to execute \'getCharacteristics\' on ' +
+ '\'BluetoothRemoteGATTService\': Invalid Characteristic name: ' +
+ '\'wrong_name\'. ' +
+ 'It must be a valid UUID alias (e.g. 0x1234), ' +
+ 'UUID (lowercase hex characters e.g. ' +
+ '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
+ 'or recognized standard name from ' +
+ 'https://www.bluetooth.com/specifications/gatt/characteristics' +
+ ' e.g. \'aerobic_heart_rate_lower_limit\'.',
+ 'TypeError');
+
+bluetooth_test(
+ () => getHealthThermometerService().then(
+ ({service}) => assert_promise_rejects_with_message(
+ service.getCharacteristics('wrong_name'), expected,
+ 'Wrong Characteristic name passed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html
deleted file mode 100644
index 4226bcbbfa2..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() and connect() called during ' +
- 'getCharacteristics. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: [health_thermometer.name]}],
-})
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryService(health_thermometer.name))
- .then(service => Promise.all([
- // 1. Make a call to service.getCharacteristics, while the service is still
- // valid.
- assert_promise_rejects_with_message(service.getCharacteristics(measurement_interval.name), expected),
-
- // 2. disconnect() and connect before the initial call completes.
- // This is accomplished by making the calls without waiting for the
- // earlier promises to resolve.
- // connect() guarantees on OS-level connection, but disconnect()
- // only disconnects the current instance.
- // getHealthThermometerDeviceWithServicesDiscovered holds another
- // connection in an iframe, so disconnect() and connect() are certain to
- // reconnect. However, disconnect() will invalidate the service object so
- // the subsequent calls made to it will fail, even after reconnecting.
- device.gatt.disconnect(),
- device.gatt.connect()
- ])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js
new file mode 100644
index 00000000000..eb4233764aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js
@@ -0,0 +1,42 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() and connect() called during ' +
+ 'getCharacteristics. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: [health_thermometer.name]}],
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService(health_thermometer.name))
+ .then(service => Promise.all([
+ // 1. Make a call to service.getCharacteristics, while the service
+ // is still valid.
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(measurement_interval.name),
+ expected),
+
+ // 2. disconnect() and connect before the initial call completes.
+ // This is accomplished by making the calls without waiting for
+ // the earlier promises to resolve. connect() guarantees on
+ // OS-level connection, but disconnect() only disconnects the
+ // current instance.
+ // getHealthThermometerDeviceWithServicesDiscovered holds another
+ // connection in an iframe, so disconnect() and connect() are
+ // certain to reconnect. However, disconnect() will invalidate
+ // the service object so the subsequent calls made to it will
+ // fail, even after reconnecting.
+ device.gatt.disconnect(), device.gatt.connect()
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html
deleted file mode 100644
index 9157275640c..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'disconnect() and connect() called during ' +
- 'getCharacteristics. Reject with NetworkError.';
-const expected = new DOMException(
- 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError');
-let device;
-
-bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
- filters: [{services: [health_thermometer.name]}],
-})
- .then(_ => ({device} = _))
- .then(() => device.gatt.getPrimaryService(health_thermometer.name))
- .then(service => Promise.all([
- // 1. Make a call to service.getCharacteristics, while the service is still
- // valid.
- assert_promise_rejects_with_message(service.getCharacteristics(), expected),
-
- // 2. disconnect() and connect before the initial call completes.
- // This is accomplished by making the calls without waiting for the
- // earlier promises to resolve.
- // connect() guarantees on OS-level connection, but disconnect()
- // only disconnects the current instance.
- // getHealthThermometerDeviceWithServicesDiscovered holds another
- // connection in an iframe, so disconnect() and connect() are certain to
- // reconnect. However, disconnect() will invalidate the service object so
- // the subsequent calls made to it will fail, even after reconnecting.
- device.gatt.disconnect(),
- device.gatt.connect()
- ])),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js
new file mode 100644
index 00000000000..a6d38805973
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js
@@ -0,0 +1,41 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'disconnect() and connect() called during ' +
+ 'getCharacteristics. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve characteristics. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(
+ () =>
+ getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: [health_thermometer.name]}],
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService(health_thermometer.name))
+ .then(service => Promise.all([
+ // 1. Make a call to service.getCharacteristics, while the service
+ // is still valid.
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(), expected),
+
+ // 2. disconnect() and connect before the initial call completes.
+ // This is accomplished by making the calls without waiting for
+ // the earlier promises to resolve. connect() guarantees on
+ // OS-level connection, but disconnect() only disconnects the
+ // current instance.
+ // getHealthThermometerDeviceWithServicesDiscovered holds another
+ // connection in an iframe, so disconnect() and connect() are
+ // certain to reconnect. However, disconnect() will invalidate
+ // the service object so the subsequent calls made to it will
+ // fail, even after reconnecting.
+ device.gatt.disconnect(), device.gatt.connect()
+ ])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html
deleted file mode 100644
index 62caaad12b5..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Service is removed before getCharacteristics call. ' +
- 'Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let service, fake_service, fake_peripheral;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(_ => ({service, fake_service, fake_peripheral} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- service.getCharacteristics('measurement_interval'),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js
new file mode 100644
index 00000000000..527eb765276
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Service is removed before getCharacteristics call. ' +
+ 'Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(_ => ({service, fake_service, fake_peripheral} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ expected, 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html
deleted file mode 100644
index 4868127465a..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-'use strict';
-const test_desc = 'Service is removed before getCharacteristics call. ' +
- 'Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
- 'InvalidStateError');
-let service, fake_service, fake_peripheral;
-
-bluetooth_test(() => getHealthThermometerService()
- .then(_ => ({service, fake_service, fake_peripheral} = _))
- .then(() => fake_service.remove())
- .then(() => fake_peripheral.simulateGATTServicesChanged())
- .then(() => assert_promise_rejects_with_message(
- service.getCharacteristics(),
- expected,
- 'Service got removed.')),
- test_desc);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js
new file mode 100644
index 00000000000..466503241ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/bluetooth/resources/bluetooth-helpers.js
+// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
+'use strict';
+const test_desc = 'Service is removed before getCharacteristics call. ' +
+ 'Reject with InvalidStateError.';
+const expected =
+ new DOMException('GATT Service no longer exists.', 'InvalidStateError');
+let service, fake_service, fake_peripheral;
+
+bluetooth_test(
+ () => getHealthThermometerService()
+ .then(_ => ({service, fake_service, fake_peripheral} = _))
+ .then(() => fake_service.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(
+ () => assert_promise_rejects_with_message(
+ service.getCharacteristics(), expected,
+ 'Service got removed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html
index 16df5100b59..92e8f17acd5 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html
@@ -10,7 +10,7 @@
document.addEventListener("securitypolicyviolation", t.unreached_func("Should not trigger a security policy violation"));
</script>
- <link nonce="nonceynonce" href="/content-security-policy/style-src/resources/style-src.css?pipe=sub" rel=stylesheet type=text/css>
+ <link nonce="nonceynonce" href="/content-security-policy/style-src/resources/style-src.css" rel=stylesheet type=text/css>
</head>
<body>
<div id='log'></div>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html
index a076eafd559..8a2e17ce8e7 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html
@@ -13,7 +13,7 @@
assert_equals("style-src-elem", e.violatedDirective);
}));
</script>
- <link nonce="not-nonceynonce" href="/content-security-policy/style-src/resources/style-src.css?pipe=sub" rel=stylesheet type=text/css>
+ <link nonce="not-nonceynonce" href="/content-security-policy/style-src/resources/style-src.css" rel=stylesheet type=text/css>
</head>
<body>
<div id='log'></div>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html
new file mode 100644
index 00000000000..bb727d8e4ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color">
+<meta name="test" content="background-color supports animation as a <color>">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ background-color: #eee;
+}
+.target {
+ width: 60px;
+ height: 60px;
+ display: inline-block;
+ border: 2px solid black;
+ margin-right: 2px;
+ color: rgba(0, 0, 255, 0.5);
+ background-color: black;
+}
+.expected {
+ margin-right: 15px;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'background-color',
+ from: neutralKeyframe,
+ to: 'green',
+}, [
+ {at: -0.3, expect: 'rgb(0, 0, 0)'},
+ {at: 0, expect: 'rgb(0, 0, 0)'},
+ {at: 0.3, expect: 'rgb(0, 38, 0)'},
+ {at: 0.6, expect: 'rgb(0, 77, 0)'},
+ {at: 1, expect: 'rgb(0, 128, 0)'},
+ {at: 1.5, expect: 'rgb(0, 192, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'initial',
+ to: 'green',
+}, [
+ {at: -0.3, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'},
+ {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'},
+ {at: 1, expect: 'rgb(0, 128, 0)'},
+ {at: 1.5, expect: 'rgb(0, 192, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'inherit',
+ to: 'green',
+}, [
+ {at: -0.3, expect: 'rgb(255, 255, 255)'},
+ {at: 0, expect: 'rgb(238, 238, 238)'},
+ {at: 0.3, expect: 'rgb(167, 205, 167)'},
+ {at: 0.6, expect: 'rgb(95, 172, 95)'},
+ {at: 1, expect: 'rgb(0, 128, 0)'},
+ {at: 1.5, expect: 'rgb(0, 73, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'unset',
+ to: 'green',
+}, [
+ {at: -0.3, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'},
+ {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'},
+ {at: 1, expect: 'rgb(0, 128, 0)'},
+ {at: 1.5, expect: 'rgb(0, 192, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'white',
+ to: 'orange',
+}, [
+ {at: -0.3, expect: 'white'},
+ {at: 0, expect: 'white'},
+ {at: 0.3, expect: 'rgb(255, 228, 179)'},
+ {at: 0.6, expect: 'rgb(255, 201, 102)'},
+ {at: 1, expect: 'orange'},
+ {at: 1.5, expect: 'rgb(255, 120, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'transparent',
+ to: 'green',
+}, [
+ {at: -0.3, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0, expect: 'rgba(0, 0, 0, 0)'},
+ {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'},
+ {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'},
+ {at: 1, expect: 'rgb(0, 128, 0)'},
+ {at: 1.5, expect: 'rgb(0, 192, 0)'},
+]);
+
+test_interpolation({
+ property: 'background-color',
+ from: 'currentcolor',
+ to: 'rgba(0, 255, 0, 0.75)',
+}, [
+ {at: -0.5, expect: 'rgba(0, 0, 255, 0.38)'},
+ {at: 0, expect: 'rgba(0, 0, 255, 0.5)'},
+ {at: 0.25, expect: 'rgba(0, 85, 170, 0.56)'},
+ {at: 0.5, expect: 'rgba(0, 153, 102, 0.63)'},
+ {at: 0.75, expect: 'rgba(0, 208, 47, 0.69)'},
+ {at: 1, expect: 'rgba(0, 255, 0, 0.75)'},
+ {at: 1.5, expect: 'rgba(0, 255, 0, 0.88)'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html
new file mode 100644
index 00000000000..35100fb3362
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-position">
+<meta name="test" content="background-position supports animation as a repeatable list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ background-position: 60px 60px;
+}
+.target {
+ width: 120px;
+ height: 120px;
+ display: inline-block;
+ border: 2px solid black;
+ background-repeat: no-repeat;
+ background-image: radial-gradient(20px circle at 20px 20px, red 18px, transparent),
+ radial-gradient(20px circle at 20px 20px, yellow 18px, transparent),
+ radial-gradient(20px circle at 20px 20px, lime 18px, transparent),
+ radial-gradient(20px circle at 20px 20px, blue 18px, transparent);
+ background-position: 40px 40px;
+}
+.expected {
+ margin-right: 10px;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'background-position',
+ from: neutralKeyframe,
+ to: '80px 80px, 80px 80px, 80px 80px, 80px 80px',
+}, [
+ {at: -0.25, expect: '30px 30px, 30px 30px, 30px 30px, 30px 30px'},
+ {at: 0, expect: '40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.25, expect: '50px 50px, 50px 50px, 50px 50px, 50px 50px'},
+ {at: 0.5, expect: '60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 0.75, expect: '70px 70px, 70px 70px, 70px 70px, 70px 70px'},
+ {at: 1, expect: '80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '90px 90px, 90px 90px, 90px 90px, 90px 90px'},
+]);
+
+test_interpolation({
+ property: 'background-position',
+ from: 'initial',
+ to: '80px 80px, 80px 80px, 80px 80px, 80px 80px',
+}, [
+ {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'},
+ {at: 0, expect: ' 0% 0% , 0% 0% , 0% 0% , 0% 0% '}, // TODO(alancutter): Should these be 0px?
+ {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'},
+ {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+]);
+
+test_interpolation({
+ property: 'background-position',
+ from: 'inherit',
+ to: '80px 80px, 80px 80px, 80px 80px, 80px 80px',
+}, [
+ {at: -0.25, expect: '55px 55px, 55px 55px, 55px 55px, 55px 55px'},
+ {at: 0, expect: '60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 0.25, expect: '65px 65px, 65px 65px, 65px 65px, 65px 65px'},
+ {at: 0.5, expect: '70px 70px, 70px 70px, 70px 70px, 70px 70px'},
+ {at: 0.75, expect: '75px 75px, 75px 75px, 75px 75px, 75px 75px'},
+ {at: 1, expect: '80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '85px 85px, 85px 85px, 85px 85px, 85px 85px'},
+]);
+
+test_interpolation({
+ property: 'background-position',
+ from: 'unset',
+ to: '80px 80px, 80px 80px, 80px 80px, 80px 80px',
+}, [
+ {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'},
+ {at: 0, expect: ' 0% 0% , 0% 0% , 0% 0% , 0% 0% '},
+ {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'},
+ {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+]);
+
+// Test equal number of position values as background images.
+test_interpolation({
+ property: 'background-position',
+ from: '0px 0px, 0px 0px, 0px 0px, 0px 0px',
+ to: '80px 80px, 80px 80px, 80px 80px, 80px 80px',
+}, [
+ {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'},
+ {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'},
+ {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+]);
+
+// Test single position value repeated over background images.
+test_interpolation({
+ property: 'background-position',
+ from: 'top 0px left 0px',
+ to: 'left 80px top 80px',
+}, [
+ {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'},
+ {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'},
+ {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+]);
+
+// Test mismatched numbers of position values.
+test_interpolation({
+ property: 'background-position',
+ from: '0px 0px, 80px 0px',
+ to: '40px 40px, 80px 80px, 0px 80px',
+}, [
+ {at: -0.25, expect: '-10px -10px, 80px -20px, 0px -20px, 90px -10px'},
+ {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'},
+ {at: 0.25, expect: ' 10px 10px, 80px 20px, 0px 20px, 70px 10px'},
+ {at: 0.5, expect: ' 20px 20px, 80px 40px, 0px 40px, 60px 20px'},
+ {at: 0.75, expect: ' 30px 30px, 80px 60px, 0px 60px, 50px 30px'},
+ {at: 1, expect: ' 40px 40px, 80px 80px, 0px 80px, 40px 40px'},
+ {at: 1.25, expect: ' 50px 50px, 80px 100px, 0px 100px, 30px 50px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html
new file mode 100644
index 00000000000..c6b84ca2aef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html
@@ -0,0 +1,217 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-position">
+<meta name="test" content="background-position animation handles origin parameters">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ background-position: 80px 80px;
+}
+.target {
+ border: 3px solid skyblue;
+ width: 100px;
+ height: 100px;
+ background-image: linear-gradient(to right, green, green);
+ background-size: 20px 20px;
+ background-repeat: no-repeat;
+ background-position: 10px 10px;
+ display: inline-block;
+}
+
+.actual {
+ background-image: linear-gradient(to right, red, red);
+}
+.expected {
+ margin-left: -106px;
+}
+</style>
+
+<body></body>
+
+<script>
+// neutral
+test_interpolation({
+ property: 'background-position',
+ from: neutralKeyframe,
+ to: 'left 20px top 20px',
+}, [
+ {at: 0, expect: '10px 10px'},
+ {at: 0.25, expect: '12.5px 12.5px'},
+ {at: 0.5, expect: '15px 15px'},
+ {at: 0.75, expect: '17.5px 17.5px'},
+ {at: 1, expect: '20px 20px'},
+]);
+
+// initial
+test_interpolation({
+ property: 'background-position',
+ from: 'initial',
+ to: 'left 20px top 20px',
+}, [
+ {at: 0, expect: '0% 0%'},
+ {at: 0.25, expect: '5px 5px'},
+ {at: 0.5, expect: '10px 10px'},
+ {at: 0.75, expect: '15px 15px'},
+ {at: 1, expect: '20px 20px'},
+]);
+
+// inherit
+test_interpolation({
+ property: 'background-position',
+ from: 'inherit',
+ to: 'left 20px top 20px',
+}, [
+ {at: 0, expect: '80px 80px'},
+ {at: 0.25, expect: '65px 65px'},
+ {at: 0.5, expect: '50px 50px'},
+ {at: 0.75, expect: '35px 35px'},
+ {at: 1, expect: '20px 20px'},
+]);
+
+// unset
+test_interpolation({
+ property: 'background-position',
+ from: 'unset',
+ to: 'left 20px top 20px',
+}, [
+ {at: 0, expect: '0% 0%'},
+ {at: 0.25, expect: '5px 5px'},
+ {at: 0.5, expect: '10px 10px'},
+ {at: 0.75, expect: '15px 15px'},
+ {at: 1, expect: '20px 20px'},
+]);
+
+// left-top
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'left 20px top 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(5px + 37.5%) calc(5px + 37.5%)'},
+ {at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'},
+ {at: 0.75, expect: 'calc(15px + 12.5%) calc(15px + 12.5%)'},
+ {at: 1, expect: '20px 20px'},
+]);
+
+// center-top
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'center top 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: '50% calc(5px + 37.5%)'},
+ {at: 0.5, expect: '50% calc(10px + 25%)'},
+ {at: 0.75, expect: '50% calc(15px + 12.5%)'},
+ {at: 1, expect: '50% 20px'},
+]);
+
+// right-top
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'right 20px top 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(-5px + 62.5%) calc(5px + 37.5%)'},
+ {at: 0.5, expect: 'calc(-10px + 75%) calc(10px + 25%)'},
+ {at: 0.75, expect: 'calc(-15px + 87.5%) calc(15px + 12.5%)'},
+ {at: 1, expect: 'calc(-20px + 100%) 20px'},
+]);
+
+// left-center
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'left 20px center',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(5px + 37.5%) 50%'},
+ {at: 0.5, expect: 'calc(10px + 25%) 50%'},
+ {at: 0.75, expect: 'calc(15px + 12.5%) 50%'},
+ {at: 1, expect: '20px 50%'},
+]);
+
+// center-center
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'center center',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: '50% 50%'},
+ {at: 0.5, expect: '50% 50%'},
+ {at: 0.75, expect: '50% 50%'},
+ {at: 1, expect: '50% 50%'},
+]);
+
+// right-center
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'right 20px center',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(-5px + 62.5%) 50%'},
+ {at: 0.5, expect: 'calc(-10px + 75%) 50%'},
+ {at: 0.75, expect: 'calc(-15px + 87.5%) 50%'},
+ {at: 1, expect: 'calc(-20px + 100%) 50%'},
+]);
+
+// left-bottom
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'left 20px bottom 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(5px + 37.5%) calc(-5px + 62.5%)'},
+ {at: 0.5, expect: 'calc(10px + 25%) calc(-10px + 75%)'},
+ {at: 0.75, expect: 'calc(15px + 12.5%) calc(-15px + 87.5%)'},
+ {at: 1, expect: '20px calc(-20px + 100%)'},
+]);
+
+// center-bottom
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'center bottom 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: '50% calc(-5px + 62.5%)'},
+ {at: 0.5, expect: '50% calc(-10px + 75%)'},
+ {at: 0.75, expect: '50% calc(-15px + 87.5%)'},
+ {at: 1, expect: '50% calc(-20px + 100%)'},
+]);
+
+// right-bottom
+test_interpolation({
+ property: 'background-position',
+ from: 'center center',
+ to: 'right 20px bottom 20px',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: 'calc(-5px + 62.5%) calc(-5px + 62.5%)'},
+ {at: 0.5, expect: 'calc(-10px + 75%) calc(-10px + 75%)'},
+ {at: 0.75, expect: 'calc(-15px + 87.5%) calc(-15px + 87.5%)'},
+ {at: 1, expect: 'calc(-20px + 100%) calc(-20px + 100%)'},
+]);
+
+// Single values
+test_interpolation({
+ property: 'background-position',
+ from: 'center',
+ to: 'bottom',
+}, [
+ {at: 0, expect: '50% 50%'},
+ {at: 0.25, expect: '50% 62.5%'},
+ {at: 0.5, expect: '50% 75%'},
+ {at: 0.75, expect: '50% 87.5%'},
+ {at: 1, expect: '50% 100%'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html
new file mode 100644
index 00000000000..f6a480c7bd2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-size">
+<meta name="test" content="background-size supports animation as a repeatable list">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ background-size: 100px 100px;
+}
+.target {
+ width: 80px;
+ height: 100px;
+ display: inline-block;
+ border: 10px solid black;
+ background-repeat: no-repeat;
+ background-image: url(../resources/stripes-100.png),
+ url(../resources/stripes-100.png),
+ url(../resources/blue-100.png),
+ url(../resources/green-100.png);
+ background-position: left top, right top, left bottom, right bottom;
+ background-size: 10px 10px;
+}
+.expected {
+ margin-right: 10px;
+ border-color: green;
+}
+</style>
+
+<body></body>
+
+<script>
+// neutral
+test_interpolation({
+ property: 'background-size',
+ from: neutralKeyframe,
+ to: '20px 20px, 0px 0px',
+}, [
+ {at: -0.25, expect: ' 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px'},
+ {at: 0, expect: '10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px'},
+ {at: 0.25, expect: '12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px'},
+ {at: 0.5, expect: '15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px'},
+ {at: 0.75, expect: '17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px'},
+ {at: 1, expect: '20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px'},
+ {at: 1.25, expect: '22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px'},
+]);
+
+// initial
+test_no_interpolation({
+ property: 'background-size',
+ from: 'initial',
+ to: '20px 20px, 0px 0px',
+});
+
+// inherit
+test_interpolation({
+ property: 'background-size',
+ from: 'inherit',
+ to: '20px 20px, 0px 0px',
+}, [
+ {at: -0.25, expect: '120px 120px, 125px 125px, 120px 120px, 125px 125px'},
+ {at: 0, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+ {at: 0.25, expect: ' 80px 80px, 75px 75px, 80px 80px, 75px 75px'},
+ {at: 0.5, expect: ' 60px 60px, 50px 50px, 60px 60px, 50px 50px'},
+ {at: 0.75, expect: ' 40px 40px, 25px 25px, 40px 40px, 25px 25px'},
+ {at: 1, expect: ' 20px 20px, 0px 0px, 20px 20px, 0px 0px'},
+ {at: 1.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+]);
+
+// unset
+test_no_interpolation({
+ property: 'background-size',
+ from: 'unset',
+ to: '20px 20px, 0px 0px',
+});
+
+// Matched keywords in size value list.
+test_interpolation({
+ property: 'background-size',
+ from: '0px auto, 0px 0px, contain, cover',
+ to: '40px auto, 40px 40px, contain, cover',
+}, [
+ {at: -0.25, expect: ' 0px auto, 0px 0px, contain, cover'},
+ {at: 0, expect: ' 0px auto, 0px 0px, contain, cover'},
+ {at: 0.25, expect: '10px auto, 10px 10px, contain, cover'},
+ {at: 0.5, expect: '20px auto, 20px 20px, contain, cover'},
+ {at: 0.75, expect: '30px auto, 30px 30px, contain, cover'},
+ {at: 1, expect: '40px auto, 40px 40px, contain, cover'},
+ {at: 1.25, expect: '50px auto, 50px 50px, contain, cover'},
+]);
+
+// Mismatched keywords in size value list.
+test_no_interpolation({
+ property: 'background-size',
+ from: '0px 0px, 0px 0px, contain, cover',
+ to: '40px 40px, 40px 40px, cover, contain',
+});
+
+test_no_interpolation({
+ property: 'background-size',
+ from: '0px auto, 0px 0px',
+ to: 'auto 40px, 40px 40px',
+});
+
+// Equal number of size values as background images.
+test_interpolation({
+ property: 'background-size',
+ from: '0px 0px, 0px 0px, 0px 0px, 0px 0px',
+ to: '20px 20px, 40px 40px, 60px 60px, 100px 100px',
+}, [
+ {at: -0.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0.25, expect: ' 5px 5px, 10px 10px, 15px 15px, 25px 25px'},
+ {at: 0.5, expect: '10px 10px, 20px 20px, 30px 30px, 50px 50px'},
+ {at: 0.75, expect: '15px 15px, 30px 30px, 45px 45px, 75px 75px'},
+ {at: 1, expect: '20px 20px, 40px 40px, 60px 60px, 100px 100px'},
+ {at: 1.25, expect: '25px 25px, 50px 50px, 75px 75px, 125px 125px'},
+]);
+
+// Single size value repeated over background images.
+test_interpolation({
+ property: 'background-size',
+ from: '0px 0px',
+ to: '80px 80px',
+}, [
+ {at: -0.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'},
+ {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'},
+ {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'},
+ {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'},
+ {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'},
+ {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'},
+]);
+
+test_interpolation({
+ property: 'background-size',
+ from: '0px',
+ to: '80px',
+}, [
+ {at: -0.25, expect: ' 0px, 0px, 0px, 0px'},
+ {at: 0, expect: ' 0px, 0px, 0px, 0px'},
+ {at: 0.25, expect: ' 20px, 20px, 20px, 20px'},
+ {at: 0.5, expect: ' 40px, 40px, 40px, 40px'},
+ {at: 0.75, expect: ' 60px, 60px, 60px, 60px'},
+ {at: 1, expect: ' 80px, 80px, 80px, 80px'},
+ {at: 1.25, expect: '100px, 100px, 100px, 100px'},
+]);
+
+// Mismatched numbers of size values.
+test_interpolation({
+ property: 'background-size',
+ from: '0px 0px, 80px 0px',
+ to: '40px 40px, 80px 80px, 0px 80px',
+}, [
+ {at: -0.25, expect: ' 0px 0px, 80px 0px, 0px 0px, 90px 0px'},
+ {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'},
+ {at: 0.25, expect: '10px 10px, 80px 20px, 0px 20px, 70px 10px'},
+ {at: 0.5, expect: '20px 20px, 80px 40px, 0px 40px, 60px 20px'},
+ {at: 0.75, expect: '30px 30px, 80px 60px, 0px 60px, 50px 30px'},
+ {at: 1, expect: '40px 40px, 80px 80px, 0px 80px, 40px 40px'},
+ {at: 1.25, expect: '50px 50px, 80px 100px, 0px 100px, 30px 50px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html
new file mode 100644
index 00000000000..389ee719196
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-position">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="match" href="reference/background-position-negative-percentage-comparison-ref.html">
+<style>
+.target {
+ margin: 50px;
+ width: 50px;
+ height: 50px;
+ border: 1px solid black;
+ background-image: url("support/100x100-blue-and-orange.png");
+ background-position: min(0%, 100%) max(0%, 100%);
+}
+</style>
+<div class="target"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html
new file mode 100644
index 00000000000..aa68e23fe09
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<style>
+.target {
+ margin: 50px;
+ width: 50px;
+ height: 50px;
+ border: 1px solid black;
+ background-image: url("../support/100x100-blue-and-orange.png");
+ background-position: right top;
+}
+</style>
+<div class="target"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html
index b80e605a32b..5c8e4f03706 100644
--- a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html
+++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html
@@ -1,10 +1,10 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Containment Test: Size containment on table</title>
+<title>CSS Containment Test: Size containment on display:table</title>
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
<link rel="match" href="reference/pass_if_pass_below_clipped.html">
-<meta name=assert content="Size containment doesn't apply to table elements.">
+<meta name=assert content="Size containment doesn't apply to table boxes.">
<style>
div {
display: table;
diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html
new file mode 100644
index 00000000000..e52f3457853
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Containment Test: Size containment on display:inline-table</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
+<link rel="match" href="reference/pass_if_pass_below_clipped.html">
+<meta name=assert content="Size containment doesn't apply to inline-table boxes.">
+<style>
+div {
+ display: inline-table;
+ contain: size;
+ overflow: hidden;
+}
+</style>
+
+<p>Test passes if there is the word "PASS" below.</p>
+<div>PASS</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html
new file mode 100644
index 00000000000..5d15e22c5eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+<link rel="author" title="Google LLC" href="http://www.google.com" />
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" />
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=992010" />
+<title>Tests that certain dynamic changes don't lead to a flex item being sized as shrink to fit when it should stretch in the cross axis</title>
+
+<style>
+#flex {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ position: absolute;
+ top: 20px;
+ width: 100px;
+}
+
+#it1 {
+ background: green;
+ flex: none;
+ height: 100px;
+ min-height: 0;
+ position: relative;
+}
+
+#child {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div style="position: relative;">
+ <div id="flex">
+ <div id="it1" style=""><div id="child"></div></div>
+ <div id="it2"></div>
+ </div>
+</div>
+
+<script>
+var flex = document.getElementById("flex");
+flex.offsetWidth;
+var it2 = document.getElementById("it2");
+it2.style.width = "50px";
+flex.offsetWidth;
+flex.style.top = "0px";
+var child = document.getElementById("child");
+child.style.top = "1px";
+flex.offsetWidth;
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html
new file mode 100644
index 00000000000..d10700d242a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="flags" content="" />
+<meta name="assert" content="A flex container's block cross size of min-content is treated as indefinite when setting fit-content on an item for flex base sizing">
+
+<style>
+x-flexbox {
+ display: flex;
+ height: min-content;
+}
+
+.fit-content-item {
+ background: green;
+ width: 100px;
+ writing-mode: vertical-lr;
+}
+
+.height-setting-item {
+ height: 100px;
+}
+
+</style>
+
+<!-- This has to be a row flexbox whose item stretches and has vertical writing
+ mode to trigger:
+ * a cross size is needed to determine the main size (row flexbox's cross size
+ is vertical, which is the item's inline size because it has a vertical
+ writing mode)
+ * the flex item’s cross size is [...] not definite (if the item didn't
+ stretch, the definiteness of the container's cross size wouldn't matter
+ because the cross size would never be definite and the item would always get
+ fit-content)
+-->
+
+<p>Test passes if there is a filled green square.</p>
+
+<x-flexbox>
+ <div class="fit-content-item"></div>
+ <div class="height-setting-item"></div>
+</x-flexbox>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html
new file mode 100644
index 00000000000..45905b16ce3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="flags" content="" />
+<meta name="assert" content="A flex container's block cross size of max-content is treated as indefinite when setting fit-content on an item for flex base sizing">
+
+<style>
+x-flexbox {
+ display: flex;
+ height: max-content;
+}
+
+.fit-content-item {
+ background: green;
+ width: 100px;
+ writing-mode: vertical-lr;
+}
+
+.height-setting-item {
+ height: 100px;
+}
+
+</style>
+
+<!-- This has to be a row flexbox whose item stretches and has vertical writing
+ mode to trigger:
+ * a cross size is needed to determine the main size (row flexbox's cross size
+ is vertical, which is the item's inline size because it has a vertical
+ writing mode)
+ * the flex item’s cross size is [...] not definite (if the item didn't
+ stretch, the definiteness of the container's cross size wouldn't matter
+ because the cross size would never be definite and the item would always get
+ fit-content)
+-->
+
+<p>Test passes if there is a filled green square.</p>
+
+<x-flexbox>
+ <div class="fit-content-item"></div>
+ <div class="height-setting-item"></div>
+</x-flexbox>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html
new file mode 100644
index 00000000000..b9318c2e180
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="flags" content="" />
+<meta name="assert" content="A flex container's block cross size of fit-content is treated as indefinite when setting fit-content on an item for flex base sizing">
+
+<style>
+x-flexbox {
+ display: flex;
+ height: fit-content;
+}
+
+.fit-content-item {
+ background: green;
+ width: 100px;
+ writing-mode: vertical-lr;
+}
+
+.height-setting-item {
+ height: 100px;
+}
+
+</style>
+
+<!-- This has to be a row flexbox whose item stretches and has vertical writing
+ mode to trigger:
+ * a cross size is needed to determine the main size (row flexbox's cross size
+ is vertical, which is the item's inline size because it has a vertical
+ writing mode)
+ * the flex item’s cross size is [...] not definite (if the item didn't
+ stretch, the definiteness of the container's cross size wouldn't matter
+ because the cross size would never be definite and the item would always get
+ fit-content)
+-->
+
+<p>Test passes if there is a filled green square.</p>
+
+<x-flexbox>
+ <div class="fit-content-item"></div>
+ <div class="height-setting-item"></div>
+</x-flexbox>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html
new file mode 100644
index 00000000000..09ef2eba0a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>flex base size and stretched items</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes" title="bullet #1">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="" />
+<meta name="assert" content="Item's stretched size is used for laying out descendants when determining flex base size." />
+<style>
+x-flexbox {
+ display: flex;
+ height: 100px;
+}
+
+x-item {
+ background: green;
+ writing-mode: vertical-lr;
+}
+
+x-item > div {
+ padding-right: 70%;
+ width: 30px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<x-flexbox>
+ <x-item>
+ <div></div>
+ </x-item>
+</x-flexbox>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html
new file mode 100644
index 00000000000..fd89da3b969
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-size-adjust interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size-adjust">
+<meta name="assert" content="font-size-adjust supports animation as a number">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style type="text/css">
+.container {
+ font-size: 20px;
+ line-height: 1;
+}
+
+.parent {
+ font-size-adjust: 3;
+}
+
+.target {
+ display: inline-block;
+ font-size-adjust: 1;
+}
+
+.expected {
+ color: green;
+ margin-right: 30px;
+}
+</style>
+
+<body>
+<template id="target-template">
+ <span class="container">
+ <div class="target">x</span>
+ </div>
+</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'font-size-adjust',
+ from: neutralKeyframe,
+ to: '2',
+}, [
+ {at: -2, expect: '0'},
+ {at: -0.3, expect: '0.7'},
+ {at: 0, expect: '1'},
+ {at: 0.3, expect: '1.3'},
+ {at: 0.6, expect: '1.6'},
+ {at: 1, expect: '2'},
+ {at: 1.5, expect: '2.5'},
+]);
+
+test_no_interpolation({
+ property: 'font-size-adjust',
+ from: 'initial',
+ to: '2',
+});
+
+test_interpolation({
+ property: 'font-size-adjust',
+ from: 'inherit',
+ to: '2',
+}, [
+ {at: -2, expect: '5'},
+ {at: -0.3, expect: '3.3'},
+ {at: 0, expect: '3'},
+ {at: 0.3, expect: '2.7'},
+ {at: 0.6, expect: '2.4'},
+ {at: 1, expect: '2'},
+ {at: 1.5, expect: '1.5'},
+]);
+
+test_interpolation({
+ property: 'font-size-adjust',
+ from: 'unset',
+ to: '2',
+}, [
+ {at: -2, expect: '5'},
+ {at: -0.3, expect: '3.3'},
+ {at: 0, expect: '3'},
+ {at: 0.3, expect: '2.7'},
+ {at: 0.6, expect: '2.4'},
+ {at: 1, expect: '2'},
+ {at: 1.5, expect: '1.5'},
+]);
+
+
+test_interpolation({
+ property: 'font-size-adjust',
+ from: '0',
+ to: '1.2'
+}, [
+ {at: -2, expect: '0'},
+ {at: -0.3, expect: '0'},
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '0.36'},
+ {at: 0.6, expect: '0.72'},
+ {at: 1, expect: '1.2'},
+ {at: 1.5, expect: '1.8'},
+]);
+
+test_no_interpolation({
+ property: 'font-size-adjust',
+ from: 'none',
+ to: '1.2'
+});
+
+test_interpolation({
+ property: 'font-size-adjust',
+ from: '0.2',
+ to: '1.2'
+}, [
+ {at: -2, expect: '0'}, // CSS font-size-adjust can't be negative.
+ {at: -0.3, expect: '0'},
+ {at: 0, expect: '0.2'},
+ {at: 0.3, expect: '0.5'},
+ {at: 0.6, expect: '0.8'},
+ {at: 1, expect: '1.2'},
+ {at: 1.5, expect: '1.7'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html
new file mode 100644
index 00000000000..0f60018c2e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-size interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size">
+<meta name="assert" content="font-size supports animation as length">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ font-size: 30px;
+}
+.target {
+ display: inline-block;
+ font: 10px sans-serif;
+}
+.expected {
+ color: green;
+ margin-right: 30px;
+}
+</style>
+
+<body>
+<template id="target-template">
+ <span>
+ <div class="target">Test Text</div>
+ </span>
+</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'font-size',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -2, expect: '0px'},
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_interpolation({
+ property: 'font-size',
+ from: 'initial',
+ to: '20px',
+}, [
+ {at: -2, expect: '8px'},
+ {at: -0.3, expect: '14.8px'},
+ {at: 0, expect: '16px'},
+ {at: 0.3, expect: '17.2px'},
+ {at: 0.6, expect: '18.4px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '22px'},
+]);
+
+test_interpolation({
+ property: 'font-size',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -2, expect: '50px'},
+ {at: -0.3, expect: '33px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+ property: 'font-size',
+ from: 'unset',
+ to: '20px',
+}, [
+ {at: -2, expect: '50px'},
+ {at: -0.3, expect: '33px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+ property: 'font-size',
+ from: '4px',
+ to: '14px'
+}, [
+ {at: -2, expect: '0px'}, // CSS font-size can't be negative.
+ {at: -0.3, expect: '1px'},
+ {at: 0, expect: '4px'},
+ {at: 0.3, expect: '7px'},
+ {at: 0.6, expect: '10px'},
+ {at: 1, expect: '14px'},
+ {at: 1.5, expect: '19px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html
new file mode 100644
index 00000000000..d6f2f19ab1e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-size interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size">
+<meta name="assert" content="font-size supports animation as length">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.container {
+ font-size: 10px;
+}
+.target {
+ display: inline-block;
+ font: 100px sans-serif;
+ font-size: 20px;
+}
+.expected {
+ color: green;
+ margin-right: 30px;
+}
+</style>
+
+<body>
+<template id="target-template">
+ <span class="container">
+ <div class="target">TT</div>
+ </span>
+</template>
+</body>
+
+<script>
+// Test the 'unset' case.
+test_interpolation({
+ property: 'font-size',
+ from: 'unset',
+ to: '20px'
+}, [
+ {at: -2, expect: '0px'}, // CSS font-size can't be negative.
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html
new file mode 100644
index 00000000000..d84ff7e5dfe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-size interpolation with zoom</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size">
+<meta name="assert" content="font-size supports animation as a length, respecting zoom">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.container {
+ zoom: 2;
+}
+.target {
+ display: inline-block;
+}
+.expected {
+ color: green;
+ margin-right: 30px;
+}
+</style>
+
+<body>
+<template id="target-template">
+ <span class="container">
+ <div class="target">TT</div>
+ </span>
+</template>
+</body>
+
+<script>
+// The container has zoom: 2 applied to it.
+test_interpolation({
+ property: 'font-size',
+ from: '10px',
+ to: '20px'
+}, [
+ {at: -2, expect: '0px'}, // CSS font-size can't be negative.
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html
new file mode 100644
index 00000000000..e11079cfc01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-variation-settings interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings">
+<meta name="assert" content="font-variation-settings supports animation pairwise by 'like' properties">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ font-variation-settings: "test" 30;
+}
+.target {
+ font-variation-settings: "test" 10;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'font-variation-settings',
+ from: neutralKeyframe,
+ to: '"test" 20',
+}, [
+ {at: -0.5, expect: "'test' 5"},
+ {at: 0, expect: "'test' 10"},
+ {at: 0.3, expect: "'test' 13"},
+ {at: 0.7, expect: "'test' 17"},
+ {at: 1, expect: "'test' 20"},
+ {at: 1.5, expect: "'test' 25"},
+]);
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: 'initial',
+ to: "'test' 50",
+});
+
+test_interpolation({
+ property: 'font-variation-settings',
+ from: 'inherit',
+ to: "'test' 20",
+}, [
+ {at: -0.5, expect: "'test' 35"},
+ {at: 0, expect: "'test' 30"},
+ {at: 0.3, expect: "'test' 27"},
+ {at: 0.7, expect: "'test' 23"},
+ {at: 1, expect: "'test' 20"},
+ {at: 1.5, expect: "'test' 15"},
+]);
+
+test_interpolation({
+ property: 'font-variation-settings',
+ from: 'unset',
+ to: "'test' 20",
+}, [
+ {at: -0.5, expect: "'test' 35"},
+ {at: 0, expect: "'test' 30"},
+ {at: 0.3, expect: "'test' 27"},
+ {at: 0.7, expect: "'test' 23"},
+ {at: 1, expect: "'test' 20"},
+ {at: 1.5, expect: "'test' 15"},
+]);
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: "'test' 20",
+ to: "normal",
+});
+
+test_interpolation({
+ property: 'font-variation-settings',
+ from: "'test' 20",
+ to: "'test' 30",
+}, [
+ {at: -0.5, expect: "'test' 15"},
+ {at: 0, expect: "'test' 20"},
+ {at: 0.3, expect: "'test' 23"},
+ {at: 0.7, expect: "'test' 27"},
+ {at: 1, expect: "'test' 30"},
+ {at: 1.5, expect: "'test' 35"},
+]);
+
+test_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
+ to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
+}, [
+ {at: -0.5, expect: "'aaaa' -5, 'bbbb' 5, 'cccc' 15"},
+ {at: 0, expect: "'aaaa' 0, 'bbbb' 10, 'cccc' 20"},
+ {at: 0.3, expect: "'aaaa' 3, 'bbbb' 13, 'cccc' 23"},
+ {at: 0.7, expect: "'aaaa' 7, 'bbbb' 17, 'cccc' 27"},
+ {at: 1, expect: "'aaaa' 10, 'bbbb' 20, 'cccc' 30"},
+ {at: 1.5, expect: "'aaaa' 15, 'bbbb' 25, 'cccc' 35"},
+]);
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 0, 'bbbb' 10",
+ to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
+});
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
+ to: "'aaaa' 0, 'bbbb' 10",
+});
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
+ to: "'cccc' 10, 'bbbb' 20, 'aaaa' 30",
+});
+
+test_no_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
+ to: "'dddd' 10, 'eeee' 20, 'ffff' 30",
+});
+
+// crbug.com/910118: Test that ApplyStandardPropertyValue doesn't overflow.
+test_interpolation({
+ property: 'font-variation-settings',
+ from: "'aaaa' 30, 'bbbb' 20",
+ to: "'aaaa' 20, 'bbbb' 30",
+}, [
+ {at: 3.40282e+38, expect: "'aaaa' -3.40282e+38, 'bbbb' 3.40282e+38"},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html b/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html
new file mode 100644
index 00000000000..167de888872
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-size-prop">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1572738">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1572451">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<script type="text/javascript" src="/resources/testharness.js"></script>
+<script type="text/javascript" src="/resources/testharnessreport.js"></script>
+<div style="font-family: something-non-default; font-size: calc(-100em + 1px);"></div>
+<div style="font-family: something-non-default; font-size: calc(1em - 100px);"></div>
+<script>
+test(function() {
+ for (const element of document.querySelectorAll("div"))
+ assert_equals(getComputedStyle(element).fontSize, "0px");
+}, "font-size computation isn't messed up when mixing positive and negatives when font-family changes and the parent has a keyword font-size");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html
new file mode 100644
index 00000000000..2a04f96e732
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<style>
+td { text-align: center; }
+
+.parent {
+ box-sizing: border-box;
+ width: 60px;
+ height: 60px;
+ border: solid;
+ border-width: 1px 2px 3px 4px;
+ padding: 0px 4px 8px 12px;
+ position: relative;
+}
+
+.child {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background: green;
+}
+
+.top-left {
+ top: 0;
+ left: 12px;
+}
+
+.top-right {
+ top: 0;
+ right: 4px;
+}
+
+.bottom-left {
+ bottom: 8px;
+ left: 12px;
+}
+
+.bottom-right {
+ bottom: 8px;
+ right: 4px;
+}
+</style>
+
+<table>
+ <tr>
+ <td></td>
+ <td colspan=2>LTR</td>
+ <td colspan=2>RTL</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>Y</td>
+ <td>X</td>
+ <td>Y</td>
+ <td>X</td>
+ </tr>
+ <tr>
+ <td>HTB</td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VRL</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VLR</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html
new file mode 100644
index 00000000000..e38d3666b87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="all-ref.html">
+<meta name="assert" content="This test checks that 'all' sizes are passed to the layout correctly." />
+<style>
+td { text-align: center; }
+
+.parent {
+ box-sizing: border-box;
+ width: 60px;
+ height: 60px;
+ border: solid;
+ border-width: 1px 2px 3px 4px;
+ padding: 0px 4px 8px 12px;
+ position: relative;
+ background: red;
+}
+
+@supports (display: layout(test)) {
+ .parent {
+ display: layout(test);
+ background: initial;
+ }
+}
+
+.child {
+ width: 10px;
+ height: 10px;
+ background: green;
+}
+</style>
+<!--
+ This test works by placing four children in each corner of the layout using the edges.
+ The reference to this test uses absolute positioning to achieve the same effect.
+-->
+<table>
+ <tr>
+ <td></td>
+ <td colspan=2>LTR</td>
+ <td colspan=2>RTL</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>Y</td>
+ <td>X</td>
+ <td>Y</td>
+ <td>X</td>
+ </tr>
+ <tr>
+ <td>HTB</td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VRL</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VLR</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+</table>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script id="code" type="text/worklet">
+registerLayout('test', class {
+ async intrinsicSizes() {}
+ async layout(children, edges, constraints) {
+ const topLeftFragment = await children[0].layoutNextFragment();
+ const topRightFragment = await children[1].layoutNextFragment();
+ const bottomLeftFragment = await children[2].layoutNextFragment();
+ const bottomRightFragment = await children[3].layoutNextFragment();
+
+ topLeftFragment.inlineOffset = edges.inlineStart;
+ topLeftFragment.blockOffset = edges.blockStart;
+
+ topRightFragment.inlineOffset =
+ constraints.fixedInlineSize - topRightFragment.inlineSize - edges.inlineEnd;
+ topRightFragment.blockOffset = edges.blockStart;
+
+ bottomLeftFragment.inlineOffset = edges.inlineStart;
+ bottomLeftFragment.blockOffset =
+ constraints.fixedBlockSize - bottomLeftFragment.blockSize - edges.blockEnd;
+
+ bottomRightFragment.inlineOffset =
+ constraints.fixedInlineSize - bottomRightFragment.inlineSize - edges.inlineEnd;
+ bottomRightFragment.blockOffset =
+ constraints.fixedBlockSize - bottomRightFragment.blockSize - edges.blockEnd;
+
+ return {childFragments: [
+ topLeftFragment,
+ topRightFragment,
+ bottomLeftFragment,
+ bottomRightFragment
+ ]};
+ }
+});
+</script>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, document.getElementById('code').textContent);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html
new file mode 100644
index 00000000000..cb200a76758
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: horizontal-tb;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ width: 100px;
+
+ --edges-inline-start-expected: 8;
+ --edges-inline-end-expected: 20;
+ --edges-block-start-expected: 10;
+ --edges-block-end-expected: 0;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html
new file mode 100644
index 00000000000..67a38588303
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: horizontal-tb;
+ background: red;
+ box-sizing: border-box;
+ width: 100px;
+
+ --edges-inline-start-expected: 20;
+ --edges-inline-end-expected: 8;
+ --edges-block-start-expected: 10;
+ --edges-block-end-expected: 0;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html
new file mode 100644
index 00000000000..8da84e9acc9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-lr;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 0;
+ --edges-inline-end-expected: 10;
+ --edges-block-start-expected: 20;
+ --edges-block-end-expected: 8;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html
new file mode 100644
index 00000000000..b514b2f22ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-lr;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 10;
+ --edges-inline-end-expected: 0;
+ --edges-block-start-expected: 20;
+ --edges-block-end-expected: 8;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html
new file mode 100644
index 00000000000..38c8c3f0463
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-rl;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 0;
+ --edges-inline-end-expected: 10;
+ --edges-block-start-expected: 8;
+ --edges-block-end-expected: 20;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html
new file mode 100644
index 00000000000..94c5353eb93
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-rl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 10;
+ --edges-inline-end-expected: 0;
+ --edges-block-start-expected: 8;
+ --edges-block-end-expected: 20;
+
+ font-size: 8px;
+
+ border-color: transparent;
+ border-style: solid;
+ border-width: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html
new file mode 100644
index 00000000000..dfbf2bc099d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: horizontal-tb;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ width: 100px;
+
+ --edges-inline-start-expected: 8;
+ --edges-inline-end-expected: 20;
+ --edges-block-start-expected: 10;
+ --edges-block-end-expected: 0;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html
new file mode 100644
index 00000000000..ebad66594c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: horizontal-tb;
+ background: red;
+ box-sizing: border-box;
+ width: 100px;
+
+ --edges-inline-start-expected: 20;
+ --edges-inline-end-expected: 8;
+ --edges-block-start-expected: 10;
+ --edges-block-end-expected: 0;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html
new file mode 100644
index 00000000000..86b0ca5425b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-lr;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 0;
+ --edges-inline-end-expected: 10;
+ --edges-block-start-expected: 20;
+ --edges-block-end-expected: 8;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html
new file mode 100644
index 00000000000..563884ade35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-lr;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 10;
+ --edges-inline-end-expected: 0;
+ --edges-block-start-expected: 20;
+ --edges-block-end-expected: 8;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html
new file mode 100644
index 00000000000..bda0a211442
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-rl;
+ direction: rtl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 0;
+ --edges-inline-end-expected: 10;
+ --edges-block-start-expected: 8;
+ --edges-block-end-expected: 20;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html
new file mode 100644
index 00000000000..a65ecad3115
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="../green-square-ref.html">
+<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." />
+<style>
+.test {
+ writing-mode: vertical-rl;
+ background: red;
+ box-sizing: border-box;
+ height: 100px;
+
+ --edges-inline-start-expected: 10;
+ --edges-inline-end-expected: 0;
+ --edges-block-start-expected: 8;
+ --edges-block-end-expected: 20;
+
+ font-size: 8px;
+
+ padding: 10px 1em 0 20px;
+}
+
+@supports (display: layout(test)) {
+ .test {
+ display: layout(test);
+ background: green;
+ }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html
new file mode 100644
index 00000000000..cc41754c082
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<style>
+td { text-align: center; }
+
+.parent {
+ box-sizing: border-box;
+ width: 50px;
+ height: 50px;
+ border: solid;
+ position: relative;
+}
+
+.child {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background: green;
+}
+
+.top-left {
+ top: 0;
+ left: 0;
+}
+
+.top-right {
+ top: 0;
+ right: 0;
+}
+
+.bottom-left {
+ bottom: 0;
+ left: 0;
+}
+
+.bottom-right {
+ bottom: 0;
+ right: 0;
+}
+</style>
+
+<table>
+ <tr>
+ <td></td>
+ <td colspan=2>LTR</td>
+ <td colspan=2>RTL</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>Y</td>
+ <td>X</td>
+ <td>Y</td>
+ <td>X</td>
+ </tr>
+ <tr>
+ <td>HTB</td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VRL</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VLR</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;">
+ <div class="child top-left"></div>
+ <div class="child top-right"></div>
+ <div class="child bottom-left"></div>
+ <div class="child bottom-right"></div>
+ </div>
+ </td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html
new file mode 100644
index 00000000000..76bbd4dccd0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges">
+<link rel="match" href="scrollbar-ref.html">
+<meta name="assert" content="This test checks that scrollbar sizes are passed to the layout correctly." />
+<style>
+td { text-align: center; }
+
+.parent {
+ box-sizing: border-box;
+ width: 50px;
+ height: 50px;
+ border: solid;
+ position: relative;
+ background: red;
+}
+
+@supports (display: layout(test)) {
+ .parent {
+ display: layout(test);
+ background: initial;
+ }
+}
+
+.child {
+ width: 10px;
+ height: 10px;
+ background: green;
+}
+</style>
+<!--
+ This test works by placing four children in each corner of the layout using the edges.
+ The reference to this test uses absolute positioning to achieve the same effect.
+-->
+<table>
+ <tr>
+ <td></td>
+ <td colspan=2>LTR</td>
+ <td colspan=2>RTL</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>Y</td>
+ <td>X</td>
+ <td>Y</td>
+ <td>X</td>
+ </tr>
+ <tr>
+ <td>HTB</td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VRL</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>VLR</td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ <td>
+ <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;">
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ <div class="child"></div>
+ </div>
+ </td>
+ </tr>
+</table>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script id="code" type="text/worklet">
+registerLayout('test', class {
+ async intrinsicSizes() {}
+ async layout(children, edges, constraints) {
+ const topLeftFragment = await children[0].layoutNextFragment();
+ const topRightFragment = await children[1].layoutNextFragment();
+ const bottomLeftFragment = await children[2].layoutNextFragment();
+ const bottomRightFragment = await children[3].layoutNextFragment();
+
+ topLeftFragment.inlineOffset = edges.inlineStart;
+ topLeftFragment.blockOffset = edges.blockStart;
+
+ topRightFragment.inlineOffset =
+ constraints.fixedInlineSize - topRightFragment.inlineSize - edges.inlineEnd;
+ topRightFragment.blockOffset = edges.blockStart;
+
+ bottomLeftFragment.inlineOffset = edges.inlineStart;
+ bottomLeftFragment.blockOffset =
+ constraints.fixedBlockSize - bottomLeftFragment.blockSize - edges.blockEnd;
+
+ bottomRightFragment.inlineOffset =
+ constraints.fixedInlineSize - bottomRightFragment.inlineSize - edges.inlineEnd;
+ bottomRightFragment.blockOffset =
+ constraints.fixedBlockSize - bottomRightFragment.blockSize - edges.blockEnd;
+
+ return {childFragments: [
+ topLeftFragment,
+ topRightFragment,
+ bottomLeftFragment,
+ bottomRightFragment
+ ]};
+ }
+});
+</script>
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, document.getElementById('code').textContent);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js b/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js
new file mode 100644
index 00000000000..b70a42f398c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js
@@ -0,0 +1,38 @@
+import {areArraysEqual} from '/common/arrays.js';
+
+function parseNumber(value) {
+ const num = parseInt(value.toString());
+ if (isNaN(num)) return 0;
+ return num;
+}
+
+registerLayout('test', class {
+ static get inputProperties() {
+ return [
+ '--edges-inline-start-expected',
+ '--edges-inline-end-expected',
+ '--edges-block-start-expected',
+ '--edges-block-end-expected',
+ ];
+ }
+
+ async intrinsicSizes() {}
+ async layout(children, edges, constraints, styleMap) {
+ const actual = this.constructor.inputProperties.map(
+ prop => parseNumber(styleMap.get(prop))
+ );
+
+ const expected = [
+ edges.inlineStart,
+ edges.inlineEnd,
+ edges.blockStart,
+ edges.blockEnd,
+ ];
+
+ if (!areArraysEqual(expected, actual)) {
+ return {autoBlockSize: 0, childFragments: []};
+ }
+
+ return {autoBlockSize: 100, childFragment: []};
+ }
+});
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html
new file mode 100644
index 00000000000..6ef52bda3b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedStyle().marginBlockStart etc.</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-margin-block">
+<link rel="help" href="https://drafts.csswg.org/cssom/#resolved-values">
+<meta name="assert" content="margin-block, margin-inline resolved values have absolute length.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #container {
+ will-change: transform; /* containing block for #target */
+ width: 200px;
+ }
+ #parent {
+ width: 0px;
+ }
+ #target {
+ position: absolute;
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="container">
+ <div id="parent">
+ <div id="target"></div>
+ </div>
+</div>
+<script>
+test_computed_value("margin-block-start", "10px");
+test_computed_value("margin-block-end", "10%", "20px");
+test_computed_value("margin-inline-start", "30px");
+test_computed_value("margin-inline-end", "1em", "40px");
+
+test_computed_value('margin-block-start', 'calc(10% + 40px)', '60px');
+test_computed_value('margin-block-end', 'calc(10px + 0.5em)', '30px');
+test_computed_value('margin-inline-start', 'calc(10px + 0.5em)', '30px');
+test_computed_value('margin-inline-end', 'calc(10% + 40px)', '60px');
+
+test_computed_value("margin-block", "10px");
+test_computed_value("margin-block", "10px 20px");
+test_computed_value("margin-inline", "30px");
+test_computed_value("margin-inline", "30px 40px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html
new file mode 100644
index 00000000000..230f18525a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedStyle().paddingBlockStart etc.</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-padding-block">
+<link rel="help" href="https://drafts.csswg.org/cssom/#resolved-values">
+<meta name="assert" content="padding-block, padding-inline resolved values have absolute length.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #container {
+ will-change: transform; /* containing block for #target */
+ width: 200px;
+ }
+ #parent {
+ width: 0px;
+ }
+ #target {
+ position: absolute;
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="container">
+ <div id="parent">
+ <div id="target"></div>
+ </div>
+</div>
+<script>
+test_computed_value("padding-block-start", "10px");
+test_computed_value("padding-block-end", "10%", "20px");
+test_computed_value("padding-inline-start", "30px");
+test_computed_value("padding-inline-end", "1em", "40px");
+
+test_computed_value('padding-block-start', 'calc(10% + 40px)', '60px');
+test_computed_value('padding-block-end', 'calc(10% - 40px)', '0px');
+test_computed_value('padding-inline-start', 'calc(10% - 40px)', '0px');
+test_computed_value('padding-inline-end', 'calc(10% + 40px)', '60px');
+
+test_computed_value('padding-block-start', 'calc(10px - 0.5em)', '0px');
+test_computed_value('padding-block-end', 'calc(10px + 0.5em)', '30px');
+test_computed_value('padding-inline-start', 'calc(10px + 0.5em)', '30px');
+test_computed_value('padding-inline-end', 'calc(10px - 0.5em)', '0px');
+
+test_computed_value("padding-block", "10px");
+test_computed_value("padding-block", "10px 20px");
+test_computed_value("padding-inline", "30px");
+test_computed_value("padding-inline", "30px 40px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html
index 6d7dbc63a1d..fe2a63a57a1 100644
--- a/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html
@@ -54,8 +54,6 @@ assert_valid("<percentage>", "-9.3e3%");
assert_valid("<length-percentage>", "-54%");
assert_valid("<length-percentage>", "0");
assert_valid("<length-percentage>", "calc(-11px + 10.4%)");
-assert_valid("<length>", "10vmin");
-assert_valid("<percentage> | <length>+", "calc(100vh - 10px) 30px");
assert_valid("<number>", "-109");
assert_valid("<number>", "2.3e4");
@@ -185,12 +183,14 @@ assert_invalid("<length>", "10%");
assert_invalid("<length>", "calc(5px + 10%)");
assert_invalid("<length>", "calc(5px * 3px / 6px)");
assert_invalid("<length>", "10em");
+assert_invalid("<length>", "10vmin");
assert_invalid("<length>", "calc(4px + 3em)");
assert_invalid("<length>", "calc(4px + calc(8 * 2em))");
assert_invalid("<length>+", "calc(2ex + 16px)");
assert_invalid("<length>+", "10px calc(20px + 4rem)");
assert_invalid("<length>+", "");
assert_invalid("<length>#", "");
+assert_invalid("<percentage> | <length>+", "calc(100vh - 10px) 30px");
assert_invalid("<length>", "10px;");
assert_invalid("<length-percentage>", "calc(2px + 10% + 7ex)");
assert_invalid("<percentage>", "0");
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html
new file mode 100644
index 00000000000..10ceed5b2cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>height interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-height">
+<meta name="assert" content="height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ height: 200px;
+}
+.target {
+ width: 100px;
+ height: 100px;
+ background-color: black;
+ display: inline-block;
+ margin-right: 5px;
+ height: 10px;
+}
+.expected {
+ background-color: green;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'height',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_no_interpolation({
+ property: 'height',
+ from: 'initial',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'height',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '254px'},
+ {at: 0, expect: '200px'},
+ {at: 0.3, expect: '146px'},
+ {at: 0.6, expect: '92px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '0px'},
+]);
+
+test_no_interpolation({
+ property: 'height',
+ from: 'unset',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'height',
+ from: '0px',
+ to: '100px',
+}, [
+ {at: -0.3, expect: '0px'}, // CSS height can't be negative.
+ {at: 0, expect: '0px'},
+ {at: 0.3, expect: '30px'},
+ {at: 0.6, expect: '60px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '150px'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html
new file mode 100644
index 00000000000..c4cab0e1cf4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>max-height interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height">
+<meta name="assert" content="max-height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ max-height: 30px;
+}
+.target {
+ width: 100px;
+ height: 100px;
+ background-color: black;
+ display: inline-block;
+ max-height: 10px;
+}
+.expected {
+ background-color: green;
+}
+
+</style>
+
+<body>
+<template id="target-template">
+ <div>
+ <div class="target"></div>
+ </div>
+</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'max-height',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.5, expect: '5px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_no_interpolation({
+ property: 'max-height',
+ from: 'initial',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'max-height',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.5, expect: '35px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_no_interpolation({
+ property: 'max-height',
+ from: 'unset',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'max-height',
+ from: '0px',
+ to: '100px',
+}, [
+ {at: -0.5, expect: '0'}, // CSS max-height can't be negative.
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '30px'},
+ {at: 0.6, expect: '60px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '150px'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html
new file mode 100644
index 00000000000..111199baa7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>max-width interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width">
+<meta name="assert" content="max-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ max-width: 100px;
+}
+.target {
+ width: 200px;
+ height: 10px;
+ background-color: black;
+ max-width: 10px;
+}
+.expected {
+ background-color: green;
+ margin-bottom: 10px;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'max-width',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.5, expect: '5px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_no_interpolation({
+ property: 'max-width',
+ from: 'initial',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'max-width',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.5, expect: '140px'},
+ {at: 0, expect: '100px'},
+ {at: 0.3, expect: '76px'},
+ {at: 0.6, expect: '52px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '0px'},
+]);
+
+test_no_interpolation({
+ property: 'max-width',
+ from: 'unset',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'max-width',
+ from: '0px',
+ to: '100px',
+}, [
+ {at: -0.5, expect: '0'}, // CSS max-width can't be negative.
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '30px'},
+ {at: 0.6, expect: '60px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '150px'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html
new file mode 100644
index 00000000000..6fd5b4e2f53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>min-height interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height">
+<meta name="assert" content="min-height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ min-height: 30px;
+}
+.target {
+ width: 10px;
+ height: 0px;
+ background-color: black;
+ display: inline-block;
+ min-height: 10px;
+}
+.expected {
+ background-color: green;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'min-height',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.5, expect: '5px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_no_interpolation({
+ property: 'min-height',
+ from: 'initial',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'min-height',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.5, expect: '35px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_no_interpolation({
+ property: 'min-height',
+ from: 'unset',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'min-height',
+ from: '0px',
+ to: '100px',
+}, [
+ {at: -0.5, expect: '0'}, // CSS min-height can't be negative.
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '30px'},
+ {at: 0.6, expect: '60px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '150px'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html
new file mode 100644
index 00000000000..d11fb3d5cb1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>min-width interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width">
+<meta name="assert" content="min-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ min-width: 30px;
+}
+.target {
+ width: 0px;
+ height: 10px;
+ background-color: black;
+ min-width: 10px;
+}
+.expected {
+ background-color: green;
+}
+</style>
+
+<body></body>
+
+<script>
+test_interpolation({
+ property: 'min-width',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.5, expect: '5px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_no_interpolation({
+ property: 'min-width',
+ from: 'initial',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'min-width',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.5, expect: '35px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_no_interpolation({
+ property: 'min-width',
+ from: 'unset',
+ to: '20px',
+});
+
+test_interpolation({
+ property: 'min-width',
+ from: '0px',
+ to: '100px'
+}, [
+ {at: -0.5, expect: '0'}, // CSS min-width can't be negative.
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '30px'},
+ {at: 0.6, expect: '60px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '150px'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html
index 33bc1b14c83..16b67c5ed66 100644
--- a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html
@@ -2,7 +2,7 @@
<meta charset="UTF-8">
<title>width interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-width">
-<meta name="assert" content="width supports animation by computed style.">
+<meta name="assert" content="width supports animation by computed value">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html
new file mode 100644
index 00000000000..c4c6703250d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().maxHeight</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height">
+<meta name="assert" content="max-height computed value is as specified, with <length-percentage> values computed">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("max-height", "none");
+test_computed_value("max-height", "min-content");
+test_computed_value("max-height", "max-content");
+
+test_computed_value("max-height", "10px");
+test_computed_value("max-height", "20%");
+
+test_computed_value('max-height', 'calc(10% + 40px)');
+test_computed_value('max-height', 'calc(10px - 0.5em)', '0px');
+test_computed_value('max-height', 'calc(10px + 0.5em)', '30px');
+
+// fit-content not yet tested
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html
new file mode 100644
index 00000000000..7e1c0fc2388
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().maxWidth</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width">
+<meta name="assert" content="max-width computed value is as specified, with <length-percentage> values computed">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("max-width", "none");
+test_computed_value("max-width", "min-content");
+test_computed_value("max-width", "max-content");
+
+test_computed_value("max-width", "10px");
+test_computed_value("max-width", "20%");
+
+test_computed_value('max-width', 'calc(10% + 40px)');
+test_computed_value('max-width', 'calc(10px - 0.5em)', '0px');
+test_computed_value('max-width', 'calc(10px + 0.5em)', '30px');
+
+// fit-content not yet tested
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html
new file mode 100644
index 00000000000..c15ee9de772
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().minHeight</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height">
+<meta name="assert" content="min-height computed value is as specified, with <length-percentage> values computed">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("min-height", "min-content");
+test_computed_value("min-height", "max-content");
+
+test_computed_value("min-height", "10px");
+test_computed_value("min-height", "20%");
+
+test_computed_value('min-height', 'calc(10% + 40px)');
+test_computed_value('min-height', 'calc(10px - 0.5em)', '0px');
+test_computed_value('min-height', 'calc(10px + 0.5em)', '30px');
+
+// fit-content not yet tested
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html
new file mode 100644
index 00000000000..0a69352ed77
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().minWidth</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width">
+<meta name="assert" content="min-width computed value is as specified, with <length-percentage> values computed">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("min-width", "min-content");
+test_computed_value("min-width", "max-content");
+
+test_computed_value("min-width", "10px");
+test_computed_value("min-width", "20%");
+
+test_computed_value('min-width', 'calc(10% + 40px)');
+test_computed_value('min-width', 'calc(10px - 0.5em)', '0px');
+test_computed_value('min-width', 'calc(10px + 0.5em)', '30px');
+
+// fit-content not yet tested
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html b/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html
index a12e1df5d84..f32e2dd39c0 100644
--- a/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html
+++ b/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html
@@ -60,47 +60,48 @@
xtd.parentNode.replaceChild(td,xtd);
}
- generate_tests(assert_equals, [
- [
- "Control test for table-cell padding and border-spacing, etc (width)",
- document.querySelector("x-table:nth-of-type(1)").offsetWidth,
- 100
- ],
- [
- "Control test for table-cell padding and border-spacing (height)",
- document.querySelector("x-table:nth-of-type(1)").offsetHeight,
- 100
- ],
- [
- "Anonymous consecutive columns spanned by the same set of cells are merged",
- document.querySelector("x-table:nth-of-type(2)").offsetWidth,
- 100
- ],
- [
- "Anonymous consecutive rows spanned by the same set of cells are merged",
- document.querySelector("x-table:nth-of-type(2)").offsetHeight,
- 100
- ],
- [
- "Explicitely-defined consecutive columns spanned by the same set of cells are not merged",
- document.querySelector("x-table:nth-of-type(3)").offsetWidth,
- 75
- ],
- [
- "Explicitely-defined consecutive rows spanned by the same set of cells are not merged",
- document.querySelector("x-table:nth-of-type(3)").offsetHeight,
- 75
- ],
- [
- "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing",
- document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width,
- 12.5
- ],
- [
- "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing",
- document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height,
- 12.5
- ],
- ])
-
+ document.body.onload = () => {
+ generate_tests(assert_equals, [
+ [
+ "Control test for table-cell padding and border-spacing, etc (width)",
+ document.querySelector("x-table:nth-of-type(1)").offsetWidth,
+ 100
+ ],
+ [
+ "Control test for table-cell padding and border-spacing (height)",
+ document.querySelector("x-table:nth-of-type(1)").offsetHeight,
+ 100
+ ],
+ [
+ "Anonymous consecutive columns spanned by the same set of cells are merged",
+ document.querySelector("x-table:nth-of-type(2)").offsetWidth,
+ 100
+ ],
+ [
+ "Anonymous consecutive rows spanned by the same set of cells are merged",
+ document.querySelector("x-table:nth-of-type(2)").offsetHeight,
+ 100
+ ],
+ [
+ "Explicitely-defined consecutive columns spanned by the same set of cells are not merged",
+ document.querySelector("x-table:nth-of-type(3)").offsetWidth,
+ 75
+ ],
+ [
+ "Explicitely-defined consecutive rows spanned by the same set of cells are not merged",
+ document.querySelector("x-table:nth-of-type(3)").offsetHeight,
+ 75
+ ],
+ [
+ "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing",
+ document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width,
+ 12.5
+ ],
+ [
+ "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing",
+ document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height,
+ 12.5
+ ],
+ ])
+ }
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html
new file mode 100644
index 00000000000..7d495811391
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property">
+<meta name="test" content="letter-spacing supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ letter-spacing: 2px;
+}
+.target {
+ font: 10px sans-serif;
+ font-weight: bold;
+ letter-spacing: 30px;
+}
+.expected {
+ color: green;
+ margin-right: 30px;
+}
+</style>
+
+<body>
+ <template id="target-template">TT</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'letter-spacing',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.3, expect: '33px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+ property: 'letter-spacing',
+ from: 'initial',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '-6px'},
+ {at: 0, expect: 'normal'},
+ {at: 0.3, expect: '6px'},
+ {at: 0.6, expect: '12px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '30px'},
+]);
+
+test_interpolation({
+ property: 'letter-spacing',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '-3.4px'},
+ {at: 0, expect: '2px'},
+ {at: 0.3, expect: '7.4px'},
+ {at: 0.6, expect: '12.8px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '29px'},
+]);
+
+test_interpolation({
+ property: 'letter-spacing',
+ from: 'unset',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '-3.4px'},
+ {at: 0, expect: '2px'},
+ {at: 0.3, expect: '7.4px'},
+ {at: 0.6, expect: '12.8px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '29px'},
+]);
+
+test_interpolation({
+ property: 'letter-spacing',
+ from: '-10px',
+ to: '10px',
+}, [
+ {at: -0.3, expect: '-16px'},
+ {at: 0, expect: '-10px'},
+ {at: 0.3, expect: '-4px'},
+ {at: 0.6, expect: '2px'},
+ {at: 1, expect: '10px'},
+ {at: 1.5, expect: '20px'},
+]);
+
+test_interpolation({
+ property: 'letter-spacing',
+ from: 'normal',
+ to: '10px',
+}, [
+ {at: -0.3, expect: '-3px'},
+ {at: 0, expect: 'normal'},
+ {at: 0.3, expect: '3px'},
+ {at: 0.6, expect: '6px'},
+ {at: 1, expect: '10px'},
+ {at: 1.5, expect: '15px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html
new file mode 100644
index 00000000000..2269fdfa5b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property">
+<meta name="test" content="text-indent supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ text-indent: 70px;
+}
+.target {
+ font: 10px sans-serif;
+ text-indent: 10px;
+ margin-left: 20px;
+}
+.expected {
+ color: green;
+}
+</style>
+
+<body>
+ <template id="target-template">T</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'text-indent',
+ from: neutralKeyframe,
+ to: '40px',
+}, [
+ {at: -0.3, expect: '1px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '19px'},
+ {at: 0.6, expect: '28px'},
+ {at: 1, expect: '40px'},
+ {at: 1.5, expect: '55px'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: 'initial',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '-6px'},
+ {at: 0, expect: '0px'},
+ {at: 0.3, expect: '6px'},
+ {at: 0.6, expect: '12px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '30px'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '85px'},
+ {at: 0, expect: '70px'},
+ {at: 0.3, expect: '55px'},
+ {at: 0.6, expect: '40px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '-5px'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: 'unset',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '85px'},
+ {at: 0, expect: '70px'},
+ {at: 0.3, expect: '55px'},
+ {at: 0.6, expect: '40px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '-5px'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: '0px',
+ to: '50px'
+}, [
+ {at: -0.3, expect: '-15px'},
+ {at: 0, expect: '0'},
+ {at: 0.3, expect: '15px'},
+ {at: 0.6, expect: '30px'},
+ {at: 1, expect: '50px'},
+ {at: 1.5, expect: '75px'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: '0px hanging',
+ to: '50px hanging',
+}, [
+ {at: -0.3, expect: '-15px hanging'},
+ {at: 0, expect: '0 hanging'},
+ {at: 0.3, expect: '15px hanging'},
+ {at: 0.6, expect: '30px hanging'},
+ {at: 1, expect: '50px hanging'},
+ {at: 1.5, expect: '75px hanging'},
+]);
+
+test_interpolation({
+ property: 'text-indent',
+ from: '0px hanging each-line',
+ to: '50px each-line hanging',
+}, [
+ {at: -0.3, expect: '-15px hanging each-line'},
+ {at: 0, expect: '0 hanging each-line'},
+ {at: 0.3, expect: '15px hanging each-line'},
+ {at: 0.6, expect: '30px hanging each-line'},
+ {at: 1, expect: '50px hanging each-line'},
+ {at: 1.5, expect: '75px hanging each-line'},
+]);
+
+test_no_interpolation({
+ property: 'text-indent',
+ from: '0px each-line',
+ to: '50px hanging',
+});
+
+test_no_interpolation({
+ property: 'text-indent',
+ from: '0px',
+ to: '50px each-line hanging',
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html
new file mode 100644
index 00000000000..ffd6bb476ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#word-spacing-property">
+<meta name="test" content="word-spacing supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+ word-spacing: 30px;
+}
+.target {
+ font: 10px sans-serif;
+ word-spacing: 10px;
+}
+.expected {
+ color: green;
+}
+</style>
+
+<body>
+ <template id="target-template">A B C D</template>
+</body>
+
+<script>
+test_interpolation({
+ property: 'word-spacing',
+ from: neutralKeyframe,
+ to: '20px',
+}, [
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+
+test_interpolation({
+ property: 'word-spacing',
+ from: 'initial',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '-6px'},
+ {at: 0, expect: '0px'},
+ {at: 0.3, expect: '6px'},
+ {at: 0.6, expect: '12px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '30px'},
+]);
+
+test_interpolation({
+ property: 'word-spacing',
+ from: 'inherit',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '33px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+ property: 'word-spacing',
+ from: 'unset',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '33px'},
+ {at: 0, expect: '30px'},
+ {at: 0.3, expect: '27px'},
+ {at: 0.6, expect: '24px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+ property: 'word-spacing',
+ from: '-10px',
+ to: '40px'
+}, [
+ {at: -0.3, expect: '-25px'},
+ {at: 0, expect: '-10px'},
+ {at: 0.3, expect: '5px'},
+ {at: 0.6, expect: '20px'},
+ {at: 1, expect: '40px'},
+ {at: 1.5, expect: '65px'},
+]);
+test_interpolation({
+ property: 'word-spacing',
+ from: 'normal',
+ to: '10px'
+}, [
+ {at: -0.3, expect: '-3px'},
+ {at: 0, expect: '0px'},
+ {at: 0.3, expect: '3px'},
+ {at: 0.6, expect: '6px'},
+ {at: 1, expect: '10px'},
+ {at: 1.5, expect: '15px'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html
index e6f10154cb6..18de33f8a7a 100644
--- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html
@@ -48,6 +48,12 @@ test_valid_value("transform", "skewY(0)", "skewY(0deg)");
test_valid_value("transform", "skewY(-90deg)");
test_valid_value("transform", "translate(1px, 2%) scale(3, 4) rotate(-90deg)");
+
+// Regression test for crbug.com/995038
+test_valid_value("transform", "translateX(2e80px)", "translateX(3.40282e+38px)");
+test_valid_value("transform", "rotate(2e80deg)", "rotate(3.40282e+38deg)");
+test_valid_value("transform", "scaleX(2e80)", "scaleX(3.40282e+38)");
+test_valid_value("transform", "skewX(2e80deg)", "skewX(3.40282e+38deg)");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html b/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html
new file mode 100644
index 00000000000..3f424589ba6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#angles">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
+<script>
+function test_valid_angle(value, expected) {
+ test_valid_value('transform', `rotate(${value})`, `rotate(${expected})`);
+}
+
+test_valid_angle('min(1deg)', 'min(1deg)');
+test_valid_angle('min(1rad)', 'min(1rad)');
+test_valid_angle('min(1turn)', 'min(1turn)');
+test_valid_angle('min(1grad)', 'min(1grad)');
+test_valid_angle('max(1deg)', 'max(1deg)');
+test_valid_angle('max(1rad)', 'max(1rad)');
+test_valid_angle('max(1turn)', 'max(1turn)');
+test_valid_angle('max(1grad)', 'max(1grad)');
+
+// TODO(crbug.com/978682): Complete this test suite
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html
new file mode 100644
index 00000000000..b3794acba9c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#integers">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-range">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/computed-testcommon.js"></script>
+<div id="target"></div>
+<div id="reference"></div>
+<script>
+const property = 'z-index';
+
+function test_integer_equals(value, expected) {
+ const reference = document.getElementById('reference');
+ reference.style[property] = '';
+ reference.style[property] = expected;
+ const computed = getComputedStyle(reference)[property];
+ test_computed_value(property, value, computed);
+}
+
+// Identity tests
+test_integer_equals('min(1)', '1');
+test_integer_equals('max(1)', '1');
+
+// Rounding
+test_integer_equals('min(0.4)', '0');
+test_integer_equals('min(0.6)', '1');
+test_integer_equals('max(0.4)', '0');
+test_integer_equals('max(0.6)', '1');
+
+// Rounding and nesting
+test_integer_equals('min(1.1, max(0.4, 0.6))', '1');
+test_integer_equals('max(0.3, min(1.1, 0.4))', '0');
+
+// No rounding at intermediate steps
+test_integer_equals('calc(min(0.3, 0.6) * 2)', '1');
+test_integer_equals('calc(max(0.3, 0.6) / 2)', '0');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html
new file mode 100644
index 00000000000..41088449546
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#lengths">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/computed-testcommon.js"></script>
+<div id="container" style="font-size: 20px">
+ <div id="target"></div>
+ <div id="reference"></div>
+</div>
+<script>
+const property = 'letter-spacing';
+
+function test_length_equals(value, expected) {
+ const reference = document.getElementById('reference');
+ reference.style[property] = '';
+ reference.style[property] = expected;
+ const computed = getComputedStyle(reference)[property];
+ test_computed_value(property, value, computed);
+}
+
+// Identity tests
+test_length_equals('min(1px)', '1px');
+test_length_equals('min(1cm)', '1cm');
+test_length_equals('min(1mm)', '1mm');
+test_length_equals('min(1Q)', '1Q');
+test_length_equals('min(1in)', '1in');
+test_length_equals('min(1pc)', '1pc');
+test_length_equals('min(1pt)', '1pt');
+test_length_equals('min(1em)', '1em');
+test_length_equals('min(1ex)', '1ex');
+test_length_equals('min(1ch)', '1ch');
+test_length_equals('min(1rem)', '1rem');
+test_length_equals('min(1vh)', '1vh');
+test_length_equals('min(1vw)', '1vw');
+test_length_equals('min(1vmin)', '1vmin');
+test_length_equals('min(1vmax)', '1vmax');
+test_length_equals('max(1px)', '1px');
+test_length_equals('max(1cm)', '1cm');
+test_length_equals('max(1mm)', '1mm');
+test_length_equals('max(1Q)', '1Q');
+test_length_equals('max(1in)', '1in');
+test_length_equals('max(1pc)', '1pc');
+test_length_equals('max(1pt)', '1pt');
+test_length_equals('max(1em)', '1em');
+test_length_equals('max(1ex)', '1ex');
+test_length_equals('max(1ch)', '1ch');
+test_length_equals('max(1rem)', '1rem');
+test_length_equals('max(1vh)', '1vh');
+test_length_equals('max(1vw)', '1vw');
+test_length_equals('max(1vmin)', '1vmin');
+test_length_equals('max(1vmax)', '1vmax');
+
+// Comparisons between same units
+test_length_equals('min(1px, 2px)', '1px');
+test_length_equals('min(1cm, 2cm)', '1cm');
+test_length_equals('min(1mm, 2mm)', '1mm');
+test_length_equals('min(1Q, 2Q)', '1Q');
+test_length_equals('min(1in, 2in)', '1in');
+test_length_equals('min(1pc, 2pc)', '1pc');
+test_length_equals('min(1pt, 2pt)', '1pt');
+test_length_equals('min(1em, 2em)', '1em');
+test_length_equals('min(1ex, 2ex)', '1ex');
+test_length_equals('min(1ch, 2ch)', '1ch');
+test_length_equals('min(1rem, 2rem)', '1rem');
+test_length_equals('min(1vh, 2vh)', '1vh');
+test_length_equals('min(1vw, 2vw)', '1vw');
+test_length_equals('min(1vmin, 2vmin)', '1vmin');
+test_length_equals('min(1vmax, 2vmax)', '1vmax');
+test_length_equals('max(1px, 2px)', '2px');
+test_length_equals('max(1cm, 2cm)', '2cm');
+test_length_equals('max(1mm, 2mm)', '2mm');
+test_length_equals('max(1Q, 2Q)', '2Q');
+test_length_equals('max(1in, 2in)', '2in');
+test_length_equals('max(1pc, 2pc)', '2pc');
+test_length_equals('max(1pt, 2pt)', '2pt');
+test_length_equals('max(1em, 2em)', '2em');
+test_length_equals('max(1ex, 2ex)', '2ex');
+test_length_equals('max(1ch, 2ch)', '2ch');
+test_length_equals('max(1rem, 2rem)', '2rem');
+test_length_equals('max(1vh, 2vh)', '2vh');
+test_length_equals('max(1vw, 2vw)', '2vw');
+test_length_equals('max(1vmin, 2vmin)', '2vmin');
+test_length_equals('max(1vmax, 2vmax)', '2vmax');
+
+// Comparisons between different absolute units
+test_length_equals('min(95px, 1in)', '95px');
+test_length_equals('max(95px, 1in)', '1in');
+
+// Comparisons between absolute and relative units
+test_length_equals('min(15px, 1em)', '15px');
+test_length_equals('min(25px, 1em)', '20px');
+test_length_equals('max(15px, 1em)', '20px');
+test_length_equals('max(25px, 1em)', '25px');
+
+document.getElementById('container').style.fontSize = '10px';
+test_length_equals('min(15px, 1em)', '10px');
+test_length_equals('max(15px, 2em)', '20px');
+
+document.getElementById('container').style.fontSize = '20px';
+
+// Nestings
+test_length_equals('min(25px, max(15px, 1em))', '20px');
+test_length_equals('max(15px, min(25px, 1em))', '20px');
+
+// General calculations
+test_length_equals('calc(min(1em, 21px) + 10px)', '30px');
+test_length_equals('calc(min(1em, 21px) - 10px)', '10px');
+test_length_equals('calc(min(1em, 21px) * 2', '40px');
+test_length_equals('calc(min(1em, 21px) / 2', '10px');
+test_length_equals('calc(max(1em, 19px) + 10px)', '30px');
+test_length_equals('calc(max(1em, 19px) - 10px)', '10px');
+test_length_equals('calc(max(1em, 19px) * 2', '40px');
+test_length_equals('calc(max(1em, 19px) / 2', '10px');
+test_length_equals('calc(min(1em, 21px) + max(0.9em, 20px))', '40px');
+test_length_equals('calc(min(1em, 21px) - max(0.9em, 20px))', '0px');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html
new file mode 100644
index 00000000000..1405c319812
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#lengths">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
+<script>
+function test_invalid_length(value) {
+ // 'letter-spacing' accepts <length> only, not <percentage> or any mixes.
+ test_invalid_value('letter-spacing', value);
+}
+
+// Syntax checking
+test_invalid_length('min()');
+test_invalid_length('min( )');
+test_invalid_length('min(,)');
+test_invalid_length('min(1py)');
+test_invalid_length('min(1px, )');
+test_invalid_length('min(, 1px)');
+test_invalid_length('min(1px + )');
+test_invalid_length('min(1px - )');
+test_invalid_length('min(1px * )');
+test_invalid_length('min(1px / )');
+test_invalid_length('min(1px 2px)');
+test_invalid_length('min(1px, , 2px)');
+test_invalid_length('max()');
+test_invalid_length('max( )');
+test_invalid_length('max(,)');
+test_invalid_length('max(1py)');
+test_invalid_length('max(1px, )');
+test_invalid_length('max(, 1px)');
+test_invalid_length('max(1px + )');
+test_invalid_length('max(1px - )');
+test_invalid_length('max(1px * )');
+test_invalid_length('max(1px / )');
+test_invalid_length('max(1px 2px)');
+test_invalid_length('max(1px, , 2px)');
+
+// Type checking
+test_invalid_length('min(0)');
+test_invalid_length('min(0%)');
+test_invalid_length('min(0s)');
+test_invalid_length('min(0Hz)');
+test_invalid_length('min(0dpi)');
+test_invalid_length('min(0fr)');
+test_invalid_length('min(1px, 0)');
+test_invalid_length('min(1px, 0%)');
+test_invalid_length('min(1px, 0s)');
+test_invalid_length('min(1px, 0Hz)');
+test_invalid_length('min(1px, 0dpi)');
+test_invalid_length('min(1px, 0fr)');
+test_invalid_length('max(0)');
+test_invalid_length('max(0%)');
+test_invalid_length('max(0s)');
+test_invalid_length('max(0Hz)');
+test_invalid_length('max(0dpi)');
+test_invalid_length('max(0fr)');
+test_invalid_length('max(1px, 0)');
+test_invalid_length('max(1px, 0%)');
+test_invalid_length('max(1px, 0s)');
+test_invalid_length('max(1px, 0Hz)');
+test_invalid_length('max(1px, 0dpi)');
+test_invalid_length('max(1px, 0fr)');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html
new file mode 100644
index 00000000000..c72c2766254
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#numbers">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/computed-testcommon.js"></script>
+<div id="target"></div>
+<div id="reference"></div>
+<script>
+const property = 'opacity';
+
+function test_number_equals(value, expected) {
+ const reference = document.getElementById('reference');
+ reference.style[property] = '';
+ reference.style[property] = expected;
+ const computed = getComputedStyle(reference)[property];
+ test_computed_value(property, value, computed);
+}
+
+// Identity tests
+test_number_equals('min(1)', '1');
+test_number_equals('max(1)', '1');
+
+// Nestings
+test_number_equals('min(0.2, max(0.1, 0.15))', '0.15');
+test_number_equals('max(0.1, min(0.2, 0.15))', '0.15');
+
+// General calculations
+test_number_equals('calc(min(0.1, 0.2) + 0.05)', '0.15');
+test_number_equals('calc(min(0.1, 0.2) - 0.05)', '0.05');
+test_number_equals('calc(min(0.1, 0.2) * 2)', '0.2');
+test_number_equals('calc(min(0.1, 0.2) / 2)', '0.05');
+test_number_equals('calc(max(0.1, 0.2) + 0.05)', '0.25');
+test_number_equals('calc(max(0.1, 0.2) - 0.05)', '0.15');
+test_number_equals('calc(max(0.1, 0.2) * 2)', '0.4');
+test_number_equals('calc(max(0.1, 0.2) / 2)', '0.1');
+test_number_equals('calc(min(0.1, 0.2) + max(0.1, 0.05))', '0.2');
+test_number_equals('calc(min(0.1, 0.2) - max(0.1, 0.05))', '0');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html
new file mode 100644
index 00000000000..3f34fde2f23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#numbers">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
+<script>
+function test_invalid_number(value) {
+ test_invalid_value('opacity', value);
+}
+
+// Syntax checking
+test_invalid_number('min()');
+test_invalid_number('min( )');
+test_invalid_number('min(,)');
+test_invalid_number('min(1, )');
+test_invalid_number('min(, 1)');
+test_invalid_number('min(1 + )');
+test_invalid_number('min(1 - )');
+test_invalid_number('min(1 * )');
+test_invalid_number('min(1 / )');
+test_invalid_number('min(1 2)');
+test_invalid_number('min(1, , 2)');
+test_invalid_number('max()');
+test_invalid_number('max( )');
+test_invalid_number('max(,)');
+test_invalid_number('max(1, )');
+test_invalid_number('max(, 1)');
+test_invalid_number('max(1 + )');
+test_invalid_number('max(1 - )');
+test_invalid_number('max(1 * )');
+test_invalid_number('max(1 / )');
+test_invalid_number('max(1 2)');
+test_invalid_number('max(1, , 2)');
+
+// Type checking
+test_invalid_number('min(0px)');
+test_invalid_number('min(0s)');
+test_invalid_number('min(0deg)');
+test_invalid_number('min(0Hz)');
+test_invalid_number('min(0dpi)');
+test_invalid_number('min(0fr)');
+test_invalid_number('min(1, 1%)');
+test_invalid_number('min(1, 0px)');
+test_invalid_number('min(1, 0s)');
+test_invalid_number('min(1, 0deg)');
+test_invalid_number('min(1, 0Hz)');
+test_invalid_number('min(1, 0dpi)');
+test_invalid_number('min(1, 0fr)');
+test_invalid_number('max(0px)');
+test_invalid_number('max(0s)');
+test_invalid_number('max(0deg)');
+test_invalid_number('max(0Hz)');
+test_invalid_number('max(0dpi)');
+test_invalid_number('max(0fr)');
+test_invalid_number('max(1, 1%)');
+test_invalid_number('max(1, 0px)');
+test_invalid_number('max(1, 0s)');
+test_invalid_number('max(1, 0deg)');
+test_invalid_number('max(1, 0Hz)');
+test_invalid_number('max(1, 0dpi)');
+test_invalid_number('max(1, 0fr)');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html
new file mode 100644
index 00000000000..9f9d0a59d12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#percentages">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/computed-testcommon.js"></script>
+<div id="container" style="width: 400px">
+ <div id="target"></div>
+ <div id="reference"></div>
+</div>
+<script>
+const property = 'margin-left';
+
+function test_percentage_equals(value, expected) {
+ const reference = document.getElementById('reference');
+ reference.style[property] = '';
+ reference.style[property] = expected;
+ const computed = getComputedStyle(reference)[property];
+ test_computed_value(property, value, computed);
+}
+
+// Identity tests
+test_percentage_equals('min(1%)', '1%');
+test_percentage_equals('max(1%)', '1%');
+
+// Nestings
+test_percentage_equals('min(20%, max(10%, 15%))', '15%');
+test_percentage_equals('max(10%, min(20%, 15%))', '15%');
+
+// General calculations
+test_percentage_equals('calc(min(10%, 20%) + 5%)', '15%');
+test_percentage_equals('calc(min(10%, 20%) - 5%)', '5%');
+test_percentage_equals('calc(min(10%, 20%) * 2)', '20%');
+test_percentage_equals('calc(min(10%, 20%) / 2)', '5%');
+test_percentage_equals('calc(max(10%, 20%) + 5%)', '25%');
+test_percentage_equals('calc(max(10%, 20%) - 5%)', '15%');
+test_percentage_equals('calc(max(10%, 20%) * 2)', '40%');
+test_percentage_equals('calc(max(10%, 20%) / 2)', '10%');
+test_percentage_equals('calc(min(10%, 20%) + max(10%, 5%))', '20%');
+test_percentage_equals('calc(min(10%, 20%) - max(10%, 5%))', '0%');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html
new file mode 100644
index 00000000000..48d2cdabec1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#percentages">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
+<script>
+function test_invalid_percentage(value) {
+ test_invalid_value('margin-left', value);
+}
+
+// Syntax checking
+test_invalid_percentage('min()');
+test_invalid_percentage('min( )');
+test_invalid_percentage('min(,)');
+test_invalid_percentage('min(1#)');
+test_invalid_percentage('min(%1)');
+test_invalid_percentage('min(1%, )');
+test_invalid_percentage('min(, 1%)');
+test_invalid_percentage('min(1% + )');
+test_invalid_percentage('min(1% - )');
+test_invalid_percentage('min(1% * )');
+test_invalid_percentage('min(1% / )');
+test_invalid_percentage('min(1% 2%)');
+test_invalid_percentage('min(1%, , 2%)');
+test_invalid_percentage('max()');
+test_invalid_percentage('max( )');
+test_invalid_percentage('max(,)');
+test_invalid_percentage('max(1#)');
+test_invalid_percentage('max(%1)');
+test_invalid_percentage('max(1%, )');
+test_invalid_percentage('max(, 1%)');
+test_invalid_percentage('max(1% + )');
+test_invalid_percentage('max(1% - )');
+test_invalid_percentage('max(1% * )');
+test_invalid_percentage('max(1% / )');
+test_invalid_percentage('max(1% 2%)');
+test_invalid_percentage('max(1%, , 2%)');
+
+// Type checking
+test_invalid_percentage('min(0s)');
+test_invalid_percentage('min(0deg)');
+test_invalid_percentage('min(0Hz)');
+test_invalid_percentage('min(0dpi)');
+test_invalid_percentage('min(0fr)');
+test_invalid_percentage('min(1%, 0)');
+test_invalid_percentage('min(1%, 0s)');
+test_invalid_percentage('min(1%, 0deg)');
+test_invalid_percentage('min(1%, 0Hz)');
+test_invalid_percentage('min(1%, 0dpi)');
+test_invalid_percentage('min(1%, 0fr)');
+test_invalid_percentage('max(0s)');
+test_invalid_percentage('max(0deg)');
+test_invalid_percentage('max(0Hz)');
+test_invalid_percentage('max(0dpi)');
+test_invalid_percentage('max(0fr)');
+test_invalid_percentage('max(1%, 0)');
+test_invalid_percentage('max(1%, 0s)');
+test_invalid_percentage('max(1%, 0deg)');
+test_invalid_percentage('max(1%, 0Hz)');
+test_invalid_percentage('max(1%, 0dpi)');
+test_invalid_percentage('max(1%, 0fr)');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html
new file mode 100644
index 00000000000..36bcf601eb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#time">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/computed-testcommon.js"></script>
+<div id="target"></div>
+<div id="reference"></div>
+<script>
+const property = 'transition-delay';
+
+function test_time_equals(value, expected) {
+ const reference = document.getElementById('reference');
+ reference.style[property] = '';
+ reference.style[property] = expected;
+ const computed = getComputedStyle(reference)[property];
+ test_computed_value(property, value, computed);
+}
+
+// Identity tests
+test_time_equals('min(1s)', '1s');
+test_time_equals('min(1ms)', '1ms');
+test_time_equals('max(1s)', '1s');
+test_time_equals('max(1ms)', '1ms');
+
+// Comparisons between same units
+test_time_equals('min(1s, 2s)', '1s');
+test_time_equals('min(1ms, 2ms)', '1ms');
+test_time_equals('max(1s, 2s)', '2s');
+test_time_equals('max(1ms, 2ms)', '2ms');
+
+// Comparisons between different units
+test_time_equals('min(1s, 1100ms)', '1s');
+test_time_equals('max(0.9s, 1000ms)', '1000ms');
+
+// Nestings
+test_time_equals('min(2s, max(1s, 1500ms))', '1500ms');
+test_time_equals('max(1000ms, min(2000ms, 1.5s))', '1.5s');
+
+// General calculations
+test_time_equals('calc(min(0.5s, 600ms) + 500ms)', '1s');
+test_time_equals('calc(min(0.5s, 600ms) - 500ms)', '0s');
+test_time_equals('calc(min(0.5s, 600ms) * 2)', '1s');
+test_time_equals('calc(min(0.5s, 600ms) / 2)', '0.25s');
+test_time_equals('calc(max(0.5s, 400ms) + 500ms)', '1s');
+test_time_equals('calc(max(0.5s, 400ms) - 500ms)', '0s');
+test_time_equals('calc(max(0.5s, 400ms) * 2)', '1s');
+test_time_equals('calc(max(0.5s, 400ms) / 2)', '0.25s');
+test_time_equals('calc(min(0.5s, 600ms) + max(500ms, 0.4s))', '1s');
+test_time_equals('calc(min(0.5s, 600ms) - max(500ms, 0.4s))', '0s');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html
new file mode 100644
index 00000000000..bebe674cd79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#time">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
+<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
+<script>
+function test_invalid_time(value) {
+ test_invalid_value('transition-delay', value);
+}
+
+// Syntax checking
+test_invalid_time('min()');
+test_invalid_time('min( )');
+test_invalid_time('min(,)');
+test_invalid_time('min(1mt)');
+test_invalid_time('min(1s, )');
+test_invalid_time('min(, 1s)');
+test_invalid_time('min(1s + )');
+test_invalid_time('min(1s - )');
+test_invalid_time('min(1s * )');
+test_invalid_time('min(1s / )');
+test_invalid_time('min(1s 2s)');
+test_invalid_time('min(1s, , 2s)');
+test_invalid_time('max()');
+test_invalid_time('max( )');
+test_invalid_time('max(,)');
+test_invalid_time('max(1dag)');
+test_invalid_time('max(1s, )');
+test_invalid_time('max(, 1s)');
+test_invalid_time('max(1s + )');
+test_invalid_time('max(1s - )');
+test_invalid_time('max(1s * )');
+test_invalid_time('max(1s / )');
+test_invalid_time('max(1s 2s)');
+test_invalid_time('max(1s, , 2s)');
+
+// Type checking
+test_invalid_time('min(0)');
+test_invalid_time('min(0%)');
+test_invalid_time('min(0px)');
+test_invalid_time('min(0deg)');
+test_invalid_time('min(0Hz)');
+test_invalid_time('min(0dpi)');
+test_invalid_time('min(0fr)');
+test_invalid_time('min(1s, 0)');
+test_invalid_time('min(1s, 0%)');
+test_invalid_time('min(1s, 0px)');
+test_invalid_time('min(1s, 0deg)');
+test_invalid_time('min(1s, 0Hz)');
+test_invalid_time('min(1s, 0dpi)');
+test_invalid_time('min(1s, 0fr)');
+test_invalid_time('max(0)');
+test_invalid_time('max(0%)');
+test_invalid_time('max(0px)');
+test_invalid_time('max(0deg)');
+test_invalid_time('max(0Hz)');
+test_invalid_time('max(0dpi)');
+test_invalid_time('max(0fr)');
+test_invalid_time('max(1s, 0)');
+test_invalid_time('max(1s, 0%)');
+test_invalid_time('max(1s, 0px)');
+test_invalid_time('max(1s, 0deg)');
+test_invalid_time('max(1s, 0Hz)');
+test_invalid_time('max(1s, 0dpi)');
+test_invalid_time('max(1s, 0fr)');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht b/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht
index 2af581d865c..0100a9098f5 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht
@@ -12,7 +12,7 @@
<link rel="match" href="abs-pos-non-replaced-vrl-004-ref.xht" />
<meta name="flags" content="ahem image" />
- <meta name="assert" content="When 'direction' is 'rtl' and 'width' is 'auto' and 'left' and 'right' are not 'auto' and 'writing-mode' is 'vertical-lr', then solve for 'left'." />
+ <meta name="assert" content="When 'direction' is 'rtl' and 'left' is 'auto' and 'right' and 'width' are not 'auto' and 'writing-mode' is 'vertical-lr', then solve for 'left'." />
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style type="text/css"><![CDATA[
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html
index 84252946946..d59cde45f6e 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html
@@ -10,6 +10,7 @@ body > div {
writing-mode: vertical-rl;
background: green;
border-top: 1ch solid white;
+ height: 1ch;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html
index 6fdbf9a2e34..ddebe938189 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html
@@ -9,6 +9,7 @@ body > div {
color: transparent;
writing-mode: vertical-rl;
background: green;
+ height: 1ch;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html
index a3878d148b2..a6ce755f712 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-lr, input type=text</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-lr will display an input field for text vertically, and with vertical text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html
index 751057dc77c..9f331a0ec87 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-lr, input type=text placeholder</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-lr will display an input field for text vertically, and with vertical placeholder text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html
index bf3d839ec40..624cd242cb5 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-lr, textarea</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-lr will display a textarea field vertically, and with vertical text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html
index 91f991f5285..ce11f1fcb62 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-lr, textarea placeholder</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-lr will display a textarea field vertically, and with vertical placeholder text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html
index 361f9dbec22..c2bf8bb00b4 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-lr, select, selected item</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-lr will display a select box vertically, and the selected item will be displayed vertically."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html
index 20dea4fbc36..6963541d38e 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-rl, input type=text</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-rl will display an input field for text vertically, and with vertical text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html
index 5d7db3e2a38..f7c1b0f69a6 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-rl, input type=text placeholder</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-rl will display an input field for text vertically, and with vertical placeholder text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html
index 3dfe1d61bf5..6e960b876f8 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-rl, textarea</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-rl will display a textarea field vertically, and with vertical text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html
index 074603d5811..bebdf9ca160 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-rl, textarea placeholder</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-rl will display a textarea field vertically, and with vertical placeholder text inside."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html
index 2ce63cd5664..dfad4e00f8b 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html
@@ -5,6 +5,7 @@
<title>writing mode:vertical-rl, select, selected item</title>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/>
<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/>
+<meta name="flags" content="should"/>
<meta name="assert" content="writing-mode:vertical-rl will display a select box vertically, and the selected item will be displayed vertically."/>
<style type="text/css">
@font-face {
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html
index 576c6b92630..d539a36c5a4 100644
--- a/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html
+++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html
@@ -9,8 +9,23 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
- body {
- color: blue;
+ .parent {
+ backdrop-filter: hue-rotate(30deg);
+ }
+ .target {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ background-color: green;
+ color: white;
+ margin-right: 2px;
+ backdrop-filter: hue-rotate(10deg);
+ }
+ .expected {
+ margin-right: 20px;
+ }
+ .test {
+ padding-bottom: 10px;
}
</style>
</head>
@@ -44,6 +59,114 @@
{at: 1, expect: 'hue-rotate(90deg) blur(10mm)'},
{at: 1.5, expect: 'hue-rotate(95deg) blur(12mm)'}
]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: neutralKeyframe,
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(5deg)'},
+ {at: 0, expect: 'hue-rotate(10deg)'},
+ {at: 0.3, expect: 'hue-rotate(13deg)'},
+ {at: 0.6, expect: 'hue-rotate(16deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(25deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'initial',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-10deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.3, expect: 'hue-rotate(6deg)'},
+ {at: 0.6, expect: 'hue-rotate(12deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(30deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'inherit',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(35deg)'},
+ {at: 0, expect: 'hue-rotate(30deg)'},
+ {at: 0.3, expect: 'hue-rotate(27deg)'},
+ {at: 0.6, expect: 'hue-rotate(24deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(15deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'unset',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-10deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.3, expect: 'hue-rotate(6deg)'},
+ {at: 0.6, expect: 'hue-rotate(12deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(30deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'none',
+ to: 'hue-rotate(180deg)'
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-90deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.25, expect: 'hue-rotate(45deg)'},
+ {at: 0.5, expect: 'hue-rotate(90deg)'},
+ {at: 1, expect: 'hue-rotate(180deg)'},
+ {at: 1.5, expect: 'hue-rotate(270deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'hue-rotate(180deg)',
+ to: 'none'
+ }, [
+ {at: -0.5, expect: 'hue-rotate(270deg)'},
+ {at: 0, expect: 'hue-rotate(180deg)'},
+ {at: 0.25, expect: 'hue-rotate(135deg)'},
+ {at: 0.5, expect: 'hue-rotate(90deg)'},
+ {at: 1, expect: 'hue-rotate(0deg)'},
+ {at: 1.5, expect: 'hue-rotate(-90deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'drop-shadow(0px 0px 0px currentcolor)',
+ to: 'drop-shadow(20px 10px green)'
+ }, [
+ {at: -1, expect: 'drop-shadow(-20px -10px white)'},
+ {at: 0, expect: 'drop-shadow(0px 0px 0px currentcolor)'},
+ {at: 0.5, expect: 'drop-shadow(10px 5px #80C080)'},
+ {at: 1, expect: 'drop-shadow(20px 10px green)'},
+ {at: 1.5, expect: 'drop-shadow(30px 15px #004100)'}
+ ]);
+
+ test_no_interpolation({
+ property: 'backdrop-filter',
+ from: 'url("#svgfilter")',
+ to: 'blur(5px)',
+ });
+
+ test_interpolation({
+ property: 'backdrop-filter',
+ from: 'initial', // lacuna is 0
+ to: 'sepia(1)'
+ }, [
+ {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed.
+ {at: 0, expect: 'sepia(0)'},
+ {at: 0.5, expect: 'sepia(0.5)'},
+ {at: 1, expect: 'sepia(1)'},
+ {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1.
+ ]);
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html
index b4a4b3f4bba..62fcbf0a5de 100644
--- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html
+++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html
@@ -9,8 +9,23 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
- body {
- color: blue;
+ .parent {
+ filter: hue-rotate(30deg);
+ }
+ .target {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ background-color: green;
+ color: white;
+ margin-right: 2px;
+ filter: hue-rotate(10deg);
+ }
+ .expected {
+ margin-right: 20px;
+ }
+ .test {
+ padding-bottom: 10px;
}
</style>
</head>
@@ -44,6 +59,58 @@
{at: 1, expect: 'hue-rotate(90deg) blur(10mm)'},
{at: 1.5, expect: 'hue-rotate(95deg) blur(12mm)'}
]);
+
+ test_interpolation({
+ property: 'filter',
+ from: neutralKeyframe,
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(5deg)'},
+ {at: 0, expect: 'hue-rotate(10deg)'},
+ {at: 0.3, expect: 'hue-rotate(13deg)'},
+ {at: 0.6, expect: 'hue-rotate(16deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(25deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'filter',
+ from: 'initial',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-10deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.3, expect: 'hue-rotate(6deg)'},
+ {at: 0.6, expect: 'hue-rotate(12deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(30deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'filter',
+ from: 'inherit',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(35deg)'},
+ {at: 0, expect: 'hue-rotate(30deg)'},
+ {at: 0.3, expect: 'hue-rotate(27deg)'},
+ {at: 0.6, expect: 'hue-rotate(24deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(15deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'filter',
+ from: 'unset',
+ to: 'hue-rotate(20deg)',
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-10deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.3, expect: 'hue-rotate(6deg)'},
+ {at: 0.6, expect: 'hue-rotate(12deg)'},
+ {at: 1, expect: 'hue-rotate(20deg)'},
+ {at: 1.5, expect: 'hue-rotate(30deg)'},
+ ]);
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html
index 1b66c2751d4..6ef25a7dafe 100644
--- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html
+++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html
@@ -9,8 +9,19 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
- body {
- color: blue;
+ .target {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ background-color: green;
+ color: white;
+ margin-right: 2px;
+ }
+ .expected {
+ margin-right: 20px;
+ }
+ .test {
+ padding-bottom: 10px;
}
</style>
</head>
@@ -24,6 +35,7 @@
to: 'opacity(0.5) hue-rotate(180deg)',
}, [
{at: -0.5, expect: 'opacity(1) hue-rotate(-90deg)'},
+ {at: 0, expect: 'opacity(1) hue-rotate(0deg)'},
{at: 0.25, expect: 'opacity(0.875) hue-rotate(45deg)'},
{at: 0.5, expect: 'opacity(0.75) hue-rotate(90deg)'},
{at: 1, expect: 'opacity(0.5) hue-rotate(180deg)'},
@@ -36,12 +48,60 @@
to: 'blur(10px) hue-rotate(180deg)'
}, [
{at: -0.5, expect: 'blur(4px) hue-rotate(-90deg)'},
+ {at: 0, expect: 'blur(6px) hue-rotate(0deg)'},
{at: 0.25, expect: 'blur(7px) hue-rotate(45deg)'},
{at: 0.5, expect: 'blur(8px) hue-rotate(90deg)'},
{at: 1, expect: 'blur(10px) hue-rotate(180deg)'},
{at: 1.5, expect: 'blur(12px) hue-rotate(270deg)'},
]);
+ test_interpolation({
+ property: 'filter',
+ from: 'none',
+ to: 'hue-rotate(180deg)'
+ }, [
+ {at: -0.5, expect: 'hue-rotate(-90deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
+ {at: 0.25, expect: 'hue-rotate(45deg)'},
+ {at: 0.5, expect: 'hue-rotate(90deg)'},
+ {at: 1, expect: 'hue-rotate(180deg)'},
+ {at: 1.5, expect: 'hue-rotate(270deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'filter',
+ from: 'hue-rotate(180deg)',
+ to: 'none'
+ }, [
+ {at: -0.5, expect: 'hue-rotate(270deg)'},
+ {at: 0, expect: 'hue-rotate(180deg)'},
+ {at: 0.25, expect: 'hue-rotate(135deg)'},
+ {at: 0.5, expect: 'hue-rotate(90deg)'},
+ {at: 1, expect: 'hue-rotate(0deg)'},
+ {at: 1.5, expect: 'hue-rotate(-90deg)'},
+ ]);
+
+ test_interpolation({
+ property: 'filter',
+ from: 'drop-shadow(0px 0px 0px currentcolor)',
+ to: 'drop-shadow(20px 10px green)'
+ }, [
+ {at: -1, expect: 'drop-shadow(-20px -10px white)'},
+ {at: 0, expect: 'drop-shadow(0px 0px 0px currentcolor)'},
+ {at: 0.5, expect: 'drop-shadow(10px 5px #80C080)'},
+ {at: 1, expect: 'drop-shadow(20px 10px green)'},
+ {at: 1.5, expect: 'drop-shadow(30px 15px #004100)'}
+ ]);
+
+ // crbug.com/904333: Test that ResolveInterpolableColor doesn't overflow.
+ test_interpolation({
+ property: 'filter',
+ from: 'drop-shadow(20px 10px blue)',
+ to: 'drop-shadow(20px 10px green)'
+ }, [
+ {at: 2147483648, expect: 'drop-shadow(20px 10px #00FF00'}
+ ]);
+
// Mismatched lists:
test_no_interpolation({
property: 'filter',
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html
index 5ca1229e297..1d512487de9 100644
--- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html
+++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html
@@ -9,8 +9,20 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
- body {
- color: blue;
+ .target {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ background-color: green;
+ color: white;
+ margin-right: 2px;
+ filter: hue-rotate(10deg);
+ }
+ .expected {
+ margin-right: 20px;
+ }
+ .test {
+ padding-bottom: 10px;
}
</style>
</head>
@@ -24,6 +36,7 @@
to: 'blur(10px)'
}, [
{at: -1, expect: 'blur(0px)'}, // Negative values are not allowed.
+ {at: 0, expect: 'blur(0px)'},
{at: 0.5, expect: 'blur(5px)'},
{at: 1, expect: 'blur(10px)'},
{at: 1.5, expect: 'blur(15px)'}
@@ -37,6 +50,7 @@
{at: -1, expect: 'brightness(0)'}, // Negative values are not allowed.
{at: 0, expect: 'brightness(0)'},
{at: 0.5, expect: 'brightness(0.5)'},
+ {at: 1, expect: 'brightness(1)'},
{at: 1.5, expect: 'brightness(1.5)'}
]);
@@ -48,6 +62,7 @@
{at: -1, expect: 'contrast(0)'}, // Negative values are not allowed.
{at: 0, expect: 'contrast(0)'},
{at: 0.5, expect: 'contrast(0.5)'},
+ {at: 1, expect: 'contrast(1)'},
{at: 1.5, expect: 'contrast(1.5)'}
]);
@@ -57,6 +72,7 @@
to: 'drop-shadow(20px 10px green)'
}, [
{at: -1, expect: 'drop-shadow(-20px -10px transparent)'},
+ {at: 0, expect: 'drop-shadow(0px 0px 0px transparent)'},
{at: 0.5, expect: 'drop-shadow(10px 5px rgba(0, 128, 0, 0.5))'},
{at: 1, expect: 'drop-shadow(20px 10px green)'},
{at: 1.5, expect: 'drop-shadow(30px 15px #00C000)'}
@@ -68,6 +84,7 @@
to: 'grayscale(1)'
}, [
{at: -1, expect: 'grayscale(0)'}, // Negative values are not allowed.
+ {at: 0, expect: 'grayscale(0)'},
{at: 0.5, expect: 'grayscale(0.5)'},
{at: 1, expect: 'grayscale(1)'},
{at: 1.5, expect: 'grayscale(1)'} // Should clamp values to 1.
@@ -79,6 +96,7 @@
to: 'hue-rotate(360deg)'
}, [
{at: -1, expect: 'hue-rotate(-360deg)'},
+ {at: 0, expect: 'hue-rotate(0deg)'},
{at: 0.5, expect: 'hue-rotate(180deg)'},
{at: 1, expect: 'hue-rotate(360deg)'},
{at: 1.5, expect: 'hue-rotate(540deg)'}
@@ -90,6 +108,7 @@
to: 'invert(1)'
}, [
{at: -1, expect: 'invert(0)'}, // Negative values are not allowed.
+ {at: 0, expect: 'invert(0)'},
{at: 0.5, expect: 'invert(0.5)'},
{at: 1, expect: 'invert(1)'},
{at: 1.5, expect: 'invert(1)'} // Should clamp values to 1.
@@ -103,6 +122,7 @@
{at: -1, expect: 'opacity(0)'}, // Negative values are not allowed.
{at: 0, expect: 'opacity(0)'},
{at: 0.5, expect: 'opacity(0.5)'},
+ {at: 1, expect: 'opacity(1)'},
{at: 1.5, expect: 'opacity(1)'} // Should clamp values to 1.
]);
@@ -114,6 +134,7 @@
{at: -1, expect: 'saturate(0)'}, // Negative values are not allowed.
{at: 0, expect: 'saturate(0)'},
{at: 0.5, expect: 'saturate(0.5)'},
+ {at: 1, expect: 'saturate(1)'},
{at: 1.5, expect: 'saturate(1.5)'}
]);
@@ -123,6 +144,7 @@
to: 'sepia(1)'
}, [
{at: -1, expect: 'sepia(0)'}, // Negative values are not allowed.
+ {at: 0, expect: 'sepia(0)'},
{at: 0.5, expect: 'sepia(0.5)'},
{at: 1, expect: 'sepia(1)'},
{at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1.
@@ -133,6 +155,24 @@
from: 'url("#svgfilter")',
to: 'none', // lacuna is not defined
});
+
+ test_no_interpolation({
+ property: 'filter',
+ from: 'url("#svgfilter")',
+ to: 'blur(5px)',
+ });
+
+ test_interpolation({
+ property: 'filter',
+ from: 'initial', // lacuna is 0
+ to: 'sepia(1)'
+ }, [
+ {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed.
+ {at: 0, expect: 'sepia(0)'}, // Equivalent to sepia(0)
+ {at: 0.5, expect: 'sepia(0.5)'},
+ {at: 1, expect: 'sepia(1)'},
+ {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1.
+ ]);
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml b/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml
index baf6bddef63..3b882debcc7 100644
--- a/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml
@@ -35,7 +35,7 @@
<test1><test1> </test1></test1>
<test2>green!</test2>
<test3>&gt;&lt;</test3>
- <test4>&#x2603;</test4>
+ <test4>&#x2211;</test4>
<test5><test5/></test5>
<test6> </test6>
<test7> <!-- --></test7>
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md b/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md
index a8ef3e07a0d..275c813355c 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md
@@ -100,6 +100,7 @@ This happens here in the same file:
```javascript
let pending_resolve = null;
let pending_reject = null;
+ let result = null;
window.addEventListener("message", function(event) {
const data = event.data;
@@ -112,7 +113,8 @@ This happens here in the same file:
}
if (data.status === "success") {
- pending_resolve();
+ result = JSON.parse(data.message).result
+ pending_resolve(result);
} else {
pending_reject();
}
@@ -315,5 +317,35 @@ run instead of testdriver-extra.js in browser-specific test environments. For ex
### What if I need to return a value from my testdriver API?
-We currently don't have this capability, but it is coming soon and will be documented. The bug is [here](https://github.com/web-platform-tests/wpt/issues/10716)
+You can return values from testdriver by just making your Action and Protocol classes use return statements. The data being returned will be serialized into JSON and passed
+back to the test on the resolving promise. The test can then deserialize the JSON to access the return values. Here is an example of a theoretical GetWindowRect API:
+
+```python
+class GetWindowRectAction(object):
+ def __call__(self, payload):
+ return self.protocol.get_window_rect.get_window_rect()
+```
+
+The WebDriver command will return a [WindowRect object](https://www.w3.org/TR/webdriver1/#dfn-window-rect), which is a dictionary with keys `x`, `y`, `width`, and `height`.
+```python
+class WebDriverGetWindowRectProtocolPart(GetWindowRectProtocolPart):
+ def get_window_rect(self):
+ return self.webdriver.get_window_rect()
+```
+
+Then a test can access the return value as follows:
+```html
+<script>
+async_test(t => {
+ test_driver.get_window_rect()
+ .then((result) => {
+ assert_equals(result.x, 0)
+ assert_equals(result.y, 10)
+ assert_equals(result.width, 800)
+ assert_equals(result.height, 600)
+ t.done();
+ })
+});
+</script>
+```
diff --git a/tests/wpt/web-platform-tests/dom/nodes/selectors.js b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
index 553e62f2587..c1680cedd70 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/selectors.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
@@ -237,10 +237,12 @@ var validSelectors = [
// - :enabled (Level 3)
{name: ":enabled pseudo-class selector, matching all enabled form controls", selector: "#pseudo-ui :enabled", expect: ["pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6",
"pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1"], level: 3, testType: TEST_QSA | TEST_MATCH},
+ {name: ":enabled pseudo-class selector, not matching link elements", selector: "#pseudo-link :enabled", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH},
// - :disabled (Level 3)
- {name: ":enabled pseudo-class selector, matching all disabled form controls", selector: "#pseudo-ui :disabled", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15",
+ {name: ":disabled pseudo-class selector, matching all disabled form controls", selector: "#pseudo-ui :disabled", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15",
"pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2"], level: 3, testType: TEST_QSA | TEST_MATCH},
+ {name: ":disabled pseudo-class selector, not matching link elements", selector: "#pseudo-link :disabled", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH},
// - :checked (Level 3)
{name: ":checked pseudo-class selector, matching checked radio buttons and checkboxes", selector: "#pseudo-ui :checked", expect: ["pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15"], level: 3, testType: TEST_QSA | TEST_MATCH},
@@ -619,10 +621,12 @@ var scopedSelectors = [
// - :enabled (Level 3)
{name: ":enabled pseudo-class selector, matching all enabled form controls (1)", selector: "#pseudo-ui :enabled", ctx: "", expect: ["pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6",
"pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1"], level: 3, testType: TEST_FIND | TEST_MATCH},
+ {name: ":enabled pseudo-class selector, not matching link elements (1)", selector: "#pseudo-link :enabled", ctx: "", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH},
// - :disabled (Level 3)
- {name: ":enabled pseudo-class selector, matching all disabled form controls (1)", selector: "#pseudo-ui :disabled", ctx: "", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15",
+ {name: ":disabled pseudo-class selector, matching all disabled form controls (1)", selector: "#pseudo-ui :disabled", ctx: "", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15",
"pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2"], level: 3, testType: TEST_FIND | TEST_MATCH},
+ {name: ":disabled pseudo-class selector, not matching link elements (1)", selector: "#pseudo-link :disabled", ctx: "", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH},
// - :checked (Level 3)
{name: ":checked pseudo-class selector, matching checked radio buttons and checkboxes (1)", selector: "#pseudo-ui :checked", ctx: "", expect: ["pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15"], level: 3, testType: TEST_FIND | TEST_MATCH},
diff --git a/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html b/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html
new file mode 100644
index 00000000000..ab8cdfde011
--- /dev/null
+++ b/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<body>
+<p>Text</p>
+<img src='/images/blue.png'/>
+</body>
diff --git a/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js b/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js
index 1f5dabd7b51..81f210eec89 100644
--- a/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js
+++ b/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js
@@ -15,18 +15,30 @@ cases.forEach(function(testCase) {
decoder.decode(bytes),
BOM + 'abc',
testCase.encoding + ': BOM should be present in decoded string if ignored');
+ assert_equals(
+ decoder.decode(bytes),
+ BOM + 'abc',
+ testCase.encoding + ': BOM should be present in decoded string if ignored by a reused decoder');
decoder = new TextDecoder(testCase.encoding, {ignoreBOM: false});
assert_equals(
decoder.decode(bytes),
'abc',
testCase.encoding + ': BOM should be absent from decoded string if not ignored');
+ assert_equals(
+ decoder.decode(bytes),
+ 'abc',
+ testCase.encoding + ': BOM should be absent from decoded string if not ignored by a reused decoder');
decoder = new TextDecoder(testCase.encoding);
assert_equals(
decoder.decode(bytes),
'abc',
testCase.encoding + ': BOM should be absent from decoded string by default');
+ assert_equals(
+ decoder.decode(bytes),
+ 'abc',
+ testCase.encoding + ': BOM should be absent from decoded string by default with a reused decoder');
}, 'BOM is ignored if ignoreBOM option is specified: ' + testCase.encoding);
});
diff --git a/tests/wpt/web-platform-tests/feature-policy/META.yml b/tests/wpt/web-platform-tests/feature-policy/META.yml
index a4136f77e3f..5fb6249c67a 100644
--- a/tests/wpt/web-platform-tests/feature-policy/META.yml
+++ b/tests/wpt/web-platform-tests/feature-policy/META.yml
@@ -1,3 +1,4 @@
spec: https://wicg.github.io/feature-policy/
suggested_reviewers:
- bakulf
+ - clelland
diff --git a/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js b/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js
index cbd0518ff21..c6bea817512 100644
--- a/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js
+++ b/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js
@@ -66,13 +66,15 @@ function wait_for_load(e) {
});
}
-window.reporting_observer_instance = new ReportingObserver((reports, observer) => {
- if (window.reporting_observer_callback) {
- reports.forEach(window.reporting_observer_callback);
- }
-}, {types: ["feature-policy-violation"]});
-window.reporting_observer_instance.observe();
-window.reporting_observer_callback = null;
+setup(() => {
+ window.reporting_observer_instance = new ReportingObserver((reports, observer) => {
+ if (window.reporting_observer_callback) {
+ reports.forEach(window.reporting_observer_callback);
+ }
+ }, {types: ["feature-policy-violation"]});
+ window.reporting_observer_instance.observe();
+ window.reporting_observer_callback = null;
+});
// Waits for a violation in |feature| and source file containing |file_name|.
function wait_for_violation_in_file(feature, file_name) {
diff --git a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html
index 0d30ef9e385..af898aa29f5 100644
--- a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html
+++ b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html
@@ -12,7 +12,7 @@
</head>
<body>
<script>
- service_worker_test("referrer-no-referrer.js?pipe=sub");
+ service_worker_test("referrer-no-referrer.js");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html
index 39a65b0e333..634877edae8 100644
--- a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html
+++ b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html
@@ -12,7 +12,7 @@
</head>
<body>
<script>
- service_worker_test("referrer-unsafe-url.js?pipe=sub");
+ service_worker_test("referrer-unsafe-url.js");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html
index 4b81c7c44f9..fec801e94ba 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html
@@ -18,9 +18,7 @@
function frameOnload() {
if (next) {
next();
- dump("next \n");
} else {
- dump("no next \n");
// The test does the following navigation steps for iframe
// 1. load page-with-fragment.html#fragment
// 2. load blank1
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js
new file mode 100644
index 00000000000..1b2d68a4626
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js
@@ -0,0 +1,12 @@
+async_test(t => {
+ const frame = document.createElement("iframe");
+ t.add_cleanup(() => frame.remove());
+ frame.name = "foo";
+ frame.src = "/common/blank.html";
+ frame.onload = t.step_func(() => {
+ frame.onload = t.unreached_func();
+ t.step_timeout(() => t.done(), 500);
+ assert_equals(window[0], window.open(undefined, "foo"));
+ });
+ document.body.append(frame);
+}, "window.open()'s url parameter default");
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html
new file mode 100644
index 00000000000..5298347fd9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+const SCOPE = new URL(location.href).pathname;
+const SCRIPT =
+ 'resources/sw.js?' +
+ `pipe=header(service-worker-allowed,${SCOPE})`;
+
+function remote(path) {
+ const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN;
+ return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/');
+}
+
+promise_test(async (t) => {
+ const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+ add_completion_callback(() => {
+ reg.unregister();
+ });
+ await new Promise(resolve => {
+ navigator.serviceWorker.addEventListener('controllerchange', resolve);
+ });
+}, 'setting up');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await fetch('/common/blank.html', {mode: 'no-cors'});
+}, 'making a same-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await fetch(remote('/common/blank.html'), {mode: 'no-cors'});
+}, 'making a cross-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'});
+}, 'making a cross-origin request for no CORP [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'}));
+}, 'making a cross-origin request with CORS without ACAO');
+
+promise_test(async (t) => {
+ const URL = remote(
+ '/common/blank.html?pipe=header(access-control-allow-origin,*');
+ await fetch(URL, {mode: 'cors'});
+}, 'making a cross-origin request with CORS');
+
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html
new file mode 100644
index 00000000000..1dec25fadad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+const SCOPE = new URL(location.href).pathname;
+const SCRIPT =
+ 'resources/sw.js?' +
+ `pipe=header(service-worker-allowed,${SCOPE})`;
+
+function remote(path) {
+ const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN;
+ return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/');
+}
+
+promise_test(async (t) => {
+ const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+ add_completion_callback(() => {
+ reg.unregister();
+ });
+ await new Promise(resolve => {
+ navigator.serviceWorker.addEventListener('controllerchange', resolve);
+ });
+}, 'setting up');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await fetch('/common/blank.html', {mode: 'no-cors'});
+}, 'making a same-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for no CORP [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'}));
+}, 'making a cross-origin request with CORS without ACAO');
+
+promise_test(async (t) => {
+ const URL = remote(
+ '/common/blank.html?pipe=header(access-control-allow-origin,*');
+ await fetch(URL, {mode: 'cors'});
+}, 'making a cross-origin request with CORS');
+
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers
new file mode 100644
index 00000000000..8df98474b58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers
@@ -0,0 +1 @@
+cross-origin-embedder-policy: require-corp
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html
new file mode 100644
index 00000000000..896ea46ff08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+const SCOPE = new URL(location.href).pathname;
+const SCRIPT =
+ 'resources/sw.js?' +
+ `pipe=header(service-worker-allowed,${SCOPE})|` +
+ 'header(cross-origin-embedder-policy,require-corp)';
+
+function remote(path) {
+ const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN;
+ return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/');
+}
+
+promise_test(async (t) => {
+ const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+ add_completion_callback(() => {
+ reg.unregister();
+ });
+ await new Promise(resolve => {
+ navigator.serviceWorker.addEventListener('controllerchange', resolve);
+ });
+}, 'setting up');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await fetch('/common/blank.html', {mode: 'no-cors'});
+}, 'making a same-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'});
+}, 'making a cross-origin request for no CORP [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'}));
+}, 'making a cross-origin request with CORS without ACAO');
+
+promise_test(async (t) => {
+ const URL = remote(
+ '/common/blank.html?pipe=header(access-control-allow-origin,*');
+ await fetch(URL, {mode: 'cors'});
+}, 'making a cross-origin request with CORS');
+
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html
new file mode 100644
index 00000000000..e62184b7b6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+const SCOPE = new URL(location.href).pathname;
+const SCRIPT =
+ 'resources/sw.js?' +
+ `pipe=header(service-worker-allowed,${SCOPE})|` +
+ 'header(cross-origin-embedder-policy,require-corp)';
+
+function remote(path) {
+ const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN;
+ return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/');
+}
+
+promise_test(async (t) => {
+ const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+ add_completion_callback(() => {
+ reg.unregister();
+ });
+ await new Promise(resolve => {
+ navigator.serviceWorker.addEventListener('controllerchange', resolve);
+ });
+}, 'setting up');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await fetch('/common/blank.html', {mode: 'no-cors'});
+}, 'making a same-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'});
+}, 'making a same-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for no CORP');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'}));
+}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(),
+ fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'}));
+}, 'making a cross-origin request for no CORP [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await fetch(
+ remote('resources/nothing-cross-origin-corp.txt?passthrough'),
+ {mode: 'no-cors'});
+}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]');
+
+promise_test(async (t) => {
+ await promise_rejects(
+ t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'}));
+}, 'making a cross-origin request with CORS without ACAO');
+
+promise_test(async (t) => {
+ const URL = remote(
+ '/common/blank.html?pipe=header(access-control-allow-origin,*');
+ await fetch(URL, {mode: 'cors'});
+}, 'making a cross-origin request with CORS');
+
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers
new file mode 100644
index 00000000000..8df98474b58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers
@@ -0,0 +1 @@
+cross-origin-embedder-policy: require-corp
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js
new file mode 100644
index 00000000000..57f0b41ba5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js
@@ -0,0 +1,12 @@
+self.addEventListener('activate', (e) => {
+ e.waitUntil(clients.claim());
+});
+
+self.addEventListener('fetch', (e) => {
+ const url = new URL(e.request.url);
+ if (url.searchParams.has('passthrough')) {
+ return;
+ }
+
+ e.respondWith(fetch(e.request));
+});
diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html
index 2d8c49c7f61..4a8a9a291a9 100644
--- a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html
+++ b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html
@@ -31,4 +31,4 @@ test(function () {
}, "The hasFocus() method must return false if the Document has no browsing context");
</script>
-<iframe id="fr" src="test.html" onload="frame_load()"></iframe>
+<iframe id="fr" src="support/test.html" onload="frame_load()"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/test.html b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html
index 90d63e51e93..90d63e51e93 100644
--- a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/test.html
+++ b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html
diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html
new file mode 100644
index 00000000000..e3aedea246e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>We'll grab a frame from this page to test its tabIndex</title>
+<frameset>
+ <frame></frame>
+</frameset>
diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html
new file mode 100644
index 00000000000..27a92f76ab7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTML Test: tabIndex getter return value for frames</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- <frame> elements are harder to test than the rest so they get their own file -->
+
+<body>
+
+<script>
+"use strict";
+test(() => {
+ const frame = document.createElement("frame");
+ assert_equals(frame.tabIndex, 0);
+}, "disconnected frame element .tabIndex should return 0 by default");
+
+for (const setValue of [-1, 0, 1]) {
+ test(() => {
+ const frame = document.createElement("frame");
+ frame.setAttribute("tabindex", setValue);
+ assert_equals(frame.tabIndex, setValue);
+ }, `disconnected frame element .tabIndex should return ${setValue} when set to ${setValue}`);
+}
+
+promise_test(async t => {
+ const frame = await getFrame(t);
+ assert_equals(frame.tabIndex, 0);
+}, "connected frame element inside frameset .tabIndex should return 0 by default");
+
+for (const setValue of [-1, 0, 1]) {
+ promise_test(async t => {
+ const frame = await getFrame(t);
+ frame.setAttribute("tabindex", setValue);
+ assert_equals(frame.tabIndex, setValue);
+ }, `connected frame element inside frameset .tabIndex should return ${setValue} when set to ${setValue}`);
+}
+
+
+function getFrame(t) {
+ return new Promise((resolve, reject) => {
+ const iframe = document.createElement("iframe");
+ t.add_cleanup(() => iframe.remove());
+
+ iframe.src = "resources/frameset-using-page.html";
+ iframe.onload = () => {
+ resolve(iframe.contentDocument.querySelector("frame"));
+ };
+ iframe.onerror = () => reject(new Error("Could not load frameset page"));
+
+ document.body.append(iframe);
+ });
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html b/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html
new file mode 100644
index 00000000000..8869808696e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<title>HTML: default style for 'appearance'</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+// namespaces
+const htmlns = 'http://www.w3.org/1999/xhtml';
+const svgns = 'http://www.w3.org/2000/svg';
+
+// auto
+testAppearance(htmlns, 'input', null, 'auto');
+testAppearance(htmlns, 'input', {type: 'text'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'TEXT'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'search'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'tel'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'url'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'email'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'password'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'date'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'month'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'week'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'time'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'datetime-local'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'number'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'range'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'color'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'checkbox'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'radio'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'submit'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'reset'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'button'}, 'auto');
+testAppearance(htmlns, 'input', {type: 'unknowntype'}, 'auto');
+testAppearance(htmlns, 'select', null, 'auto');
+testAppearance(htmlns, 'select', {multiple: ''}, 'auto');
+testAppearance(htmlns, 'select', {size: '2'}, 'auto');
+testAppearance(htmlns, 'button', null, 'auto');
+testAppearance(htmlns, 'textarea', null, 'auto');
+testAppearance(htmlns, 'meter', null, 'auto');
+testAppearance(htmlns, 'progress', null, 'auto');
+
+// none
+testAppearance(htmlns, 'input', {type: 'hidden'}, 'none');
+testAppearance(htmlns, 'input', {type: 'HIDDEN'}, 'none');
+testAppearance(htmlns, 'input', {type: 'file'}, 'none');
+testAppearance(htmlns, 'input', {type: 'image'}, 'none');
+testAppearance(htmlns, 'div', null, 'none');
+testAppearance(htmlns, 'details', null, 'none');
+testAppearance(htmlns, 'summary', null, 'none');
+testAppearance(htmlns, 'video', null, 'none');
+testAppearance(htmlns, 'video', {controls: ''}, 'none');
+testAppearance(htmlns, 'menuitem', null, 'none');
+testAppearance(htmlns, 'marquee', null, 'none');
+testAppearance(htmlns, 'keygen', null, 'none');
+testAppearance(null, 'input', null, 'none');
+testAppearance(svgns, 'input', null, 'none');
+
+test(t => {
+ assertAppearance(document.documentElement, 'none');
+}, 'The html element');
+
+test(t => {
+ assertAppearance(document.body, 'none');
+}, 'The body element');
+
+
+function testAppearance(ns, tag, attributes, expected) {
+ test(t => {
+ const elm = document.createElementNS(ns, tag);
+ for (const att in attributes) {
+ elm.setAttribute(att, attributes[att]);
+ }
+ document.body.appendChild(elm);
+ t.add_cleanup(() => elm.remove());
+ assertAppearance(elm, expected);
+ }, formatTestName(ns, tag, attributes));
+}
+
+function assertAppearance(elm, expected) {
+ const computedStyle = getComputedStyle(elm);
+ assert_equals(computedStyle.getPropertyValue('-webkit-appearance'), expected, '-webkit-appearance');
+ assert_equals(computedStyle.getPropertyValue('appearance'), expected, 'appearance (no prefix)');
+}
+
+function formatTestName(ns, tag, attributes) {
+ let s = `<${tag}`;
+ for (const att in attributes) {
+ s += ` ${att}="${attributes[att]}"`;
+ }
+ s += '>';
+ if (ns !== htmlns) {
+ s += ` (namespace: ${ns})`;
+ }
+ return s;
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js
new file mode 100644
index 00000000000..7c4e121b7c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js
@@ -0,0 +1,16 @@
+async_test(t => {
+ const img = new Image();
+ t.add_cleanup(() => img.remove());
+ img.onloadstart = img.onprogress = img.onloadend = t.unreached_func("progress event fired");
+ img.onload = t.step_func_done(e => {
+ assert_true(e instanceof Event);
+ assert_false(e instanceof ProgressEvent);
+ });
+ img.src = "/images/rrgg-256x256.png";
+ document.body.append(img);
+}, "<img> does not support ProgressEvent or loadstart/progress/loadend");
+
+test(t => {
+ assert_equals(document.body.onloadend, undefined);
+ assert_equals(window.onloadend, undefined);
+}, "onloadend is not exposed");
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html
index c564a5845d5..ab1b2b25091 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html
@@ -58,8 +58,6 @@
<img srcset='/images/green-1x1.png?e37a 50w, /images/green-16x16.png?e37a 51w' sizes='(min-width:0) min(1px, 100px)'>
<img srcset='/images/green-1x1.png?e37b 50w, /images/green-16x16.png?e37b 51w' sizes='(min-width:0) max(-100px, 1px)'>
<img srcset='/images/green-1x1.png?e38 50w, /images/green-16x16.png?e38 51w' sizes='(min-width:calc(0)) 1px'>
-<img srcset='/images/green-1x1.png?e38a 50w, /images/green-16x16.png?e38a 51w' sizes='(min-width:min(0, 200vw)) 1px'>
-<img srcset='/images/green-1x1.png?e38b 50w, /images/green-16x16.png?e38b 51w' sizes='(min-width:max(-200vw, 0)) 1px'>
<img srcset='/images/green-1x1.png?e39 50w, /images/green-16x16.png?e39 51w' sizes='(min-width:0) 1px, 100vw'>
<img srcset='/images/green-1x1.png?e40 50w, /images/green-16x16.png?e40 51w' sizes='(min-width:0) 1px, (min-width:0) 100vw, 100vw'>
<img srcset='/images/green-1x1.png?e41 50w, /images/green-16x16.png?e41 51w' sizes='(min-width:0) 1px'>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html b/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.html
index cc018814c92..c3974bd02a3 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.html
@@ -5,6 +5,7 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
</head>
<body>
<h1>Autofocus shouldn't work in cross-origin iframe.</h1>
@@ -36,7 +37,7 @@
}
}));
document.getElementById("child").src =
- "http://{{domains[www]}}:{{ports[http][0]}}/html/semantics/forms/autofocus/resources/child-autofocus.html";
+ get_host_info().HTTP_REMOTE_ORIGIN + "/html/semantics/forms/autofocus/resources/child-autofocus.html";
}, "Autofocus shouldn't work in cross-origin iframe");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js
index 398da56595f..dcbe60f2c2f 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js
@@ -3,12 +3,12 @@
for (const value of [null, true, false, "string"]) {
promise_test(async t => {
const result = await import(`./${value}.json`);
- assert_equals(result, value);
+ assert_equals(result.default, value);
}, `Non-object: ${value}`);
}
promise_test(async t => {
const result = await import("./array.json");
- assert_array_equals(result, ["en", "try"]);
+ assert_array_equals(result.default, ["en", "try"]);
}, "Non-object: array");
diff --git a/tests/wpt/web-platform-tests/idle-detection/mock.js b/tests/wpt/web-platform-tests/idle-detection/mock.js
index d88d1ad1c55..cb67ce02c31 100644
--- a/tests/wpt/web-platform-tests/idle-detection/mock.js
+++ b/tests/wpt/web-platform-tests/idle-detection/mock.js
@@ -64,7 +64,7 @@ function intercept() {
let result = new FakeIdleMonitor();
let binding = new mojo.Binding(blink.mojom.IdleManager, result);
- let interceptor = new MojoInterfaceInterceptor(blink.mojom.IdleManager.name);
+ let interceptor = new MojoInterfaceInterceptor(blink.mojom.IdleManager.name, "context", true);
interceptor.oninterfacerequest = (e) => {
binding.bind(e.handle);
}
diff --git a/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html
index 1c7172bf7c6..634948942ee 100644
--- a/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html
+++ b/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helper.js"></script>
diff --git a/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html
index 3f89e8f12df..280d02d8473 100644
--- a/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html
+++ b/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helper.js"></script>
diff --git a/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html
index 4cf3e18182a..3f4f2887da8 100644
--- a/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html
+++ b/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helper.js"></script>
diff --git a/tests/wpt/web-platform-tests/interfaces/appmanifest.idl b/tests/wpt/web-platform-tests/interfaces/appmanifest.idl
index fd26c9ba71e..ddfe82dc34d 100644
--- a/tests/wpt/web-platform-tests/interfaces/appmanifest.idl
+++ b/tests/wpt/web-platform-tests/interfaces/appmanifest.idl
@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Web App Manifest (https://w3c.github.io/manifest/)
-[Constructor(DOMString type, optional EventInit eventInitDict),
+[Constructor(DOMString type, optional EventInit eventInitDict = {}),
Exposed=Window]
interface BeforeInstallPromptEvent : Event {
Promise<PromptResponseObject> prompt();
diff --git a/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl b/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl
index 99d1155a3e3..9e35287696b 100644
--- a/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl
+++ b/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl
@@ -7,7 +7,7 @@ dictionary ClipboardEventInit : EventInit {
DataTransfer? clipboardData = null;
};
-[Constructor(DOMString type, optional ClipboardEventInit eventInitDict), Exposed=Window]
+[Constructor(DOMString type, optional ClipboardEventInit eventInitDict = {}), Exposed=Window]
interface ClipboardEvent : Event {
readonly attribute DataTransfer? clipboardData;
};
@@ -31,11 +31,11 @@ typedef Promise<ClipboardItemDataType> ClipboardItemData;
callback ClipboardItemDelayedCallback = ClipboardItemData ();
[Constructor(record<DOMString, ClipboardItemData> items,
- optional ClipboardItemOptions options),
+ optional ClipboardItemOptions options = {}),
Exposed=Window] interface ClipboardItem {
static ClipboardItem createDelayed(
record<DOMString, ClipboardItemDelayedCallback> items,
- optional ClipboardItemOptions options);
+ optional ClipboardItemOptions options = {});
readonly attribute PresentationStyle presentationStyle;
readonly attribute long long lastModified;
diff --git a/tests/wpt/web-platform-tests/interfaces/css-animations.idl b/tests/wpt/web-platform-tests/interfaces/css-animations.idl
index cd5f6016e53..f87015f6a87 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-animations.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-animations.idl
@@ -4,7 +4,7 @@
// Source: CSS Animations Level 1 (https://drafts.csswg.org/css-animations/)
[Exposed=Window,
- Constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict)]
+ Constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {})]
interface AnimationEvent : Event {
readonly attribute CSSOMString animationName;
readonly attribute double elapsedTime;
diff --git a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl
index 129f1463ed8..be5a635112b 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl
@@ -4,7 +4,7 @@
// Source: CSS Transitions (https://drafts.csswg.org/css-transitions/)
[Exposed=Window,
- Constructor(CSSOMString type, optional TransitionEventInit transitionEventInitDict)]
+ Constructor(CSSOMString type, optional TransitionEventInit transitionEventInitDict = {})]
interface TransitionEvent : Event {
readonly attribute CSSOMString propertyName;
readonly attribute double elapsedTime;
diff --git a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
index be2946bc20f..b54a16338ec 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
@@ -302,7 +302,7 @@ interface CSSPerspective : CSSTransformComponent {
};
[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet),
- Constructor(DOMMatrixReadOnly matrix, optional CSSMatrixComponentOptions options)]
+ Constructor(DOMMatrixReadOnly matrix, optional CSSMatrixComponentOptions options = {})]
interface CSSMatrixComponent : CSSTransformComponent {
attribute DOMMatrix matrix;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom-view.idl b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl
index 9567b134cf9..5d30ede1e40 100644
--- a/tests/wpt/web-platform-tests/interfaces/cssom-view.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl
@@ -32,11 +32,11 @@ partial interface Window {
[Replaceable] readonly attribute double pageXOffset;
[Replaceable] readonly attribute double scrollY;
[Replaceable] readonly attribute double pageYOffset;
- void scroll(optional ScrollToOptions options);
+ void scroll(optional ScrollToOptions options = {});
void scroll(unrestricted double x, unrestricted double y);
- void scrollTo(optional ScrollToOptions options);
+ void scrollTo(optional ScrollToOptions options = {});
void scrollTo(unrestricted double x, unrestricted double y);
- void scrollBy(optional ScrollToOptions options);
+ void scrollBy(optional ScrollToOptions options = {});
void scrollBy(unrestricted double x, unrestricted double y);
// client
@@ -59,7 +59,7 @@ interface MediaQueryList : EventTarget {
};
[Exposed=Window,
- Constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict)]
+ Constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict = {})]
interface MediaQueryListEvent : Event {
readonly attribute CSSOMString media;
readonly attribute boolean matches;
@@ -103,12 +103,12 @@ dictionary ScrollIntoViewOptions : ScrollOptions {
partial interface Element {
DOMRectList getClientRects();
[NewObject] DOMRect getBoundingClientRect();
- void scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg);
- void scroll(optional ScrollToOptions options);
+ void scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg = {});
+ void scroll(optional ScrollToOptions options = {});
void scroll(unrestricted double x, unrestricted double y);
- void scrollTo(optional ScrollToOptions options);
+ void scrollTo(optional ScrollToOptions options = {});
void scrollTo(unrestricted double x, unrestricted double y);
- void scrollBy(optional ScrollToOptions options);
+ void scrollBy(optional ScrollToOptions options = {});
void scrollBy(unrestricted double x, unrestricted double y);
attribute unrestricted double scrollTop;
attribute unrestricted double scrollLeft;
@@ -170,10 +170,10 @@ dictionary ConvertCoordinateOptions {
};
interface mixin GeometryUtils {
- sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options);
- DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options);
- DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options);
- DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options); // XXX z,w turns into 0
+ sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {});
+ DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options = {});
+ DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options = {});
+ DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options = {}); // XXX z,w turns into 0
};
Text includes GeometryUtils; // like Range
diff --git a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl
index 83b7f893552..0144f04e046 100644
--- a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl
@@ -5,7 +5,7 @@
[Exposed=(Window,Worker),
SecureContext,
- Constructor(optional FaceDetectorOptions faceDetectorOptions)]
+ Constructor(optional FaceDetectorOptions faceDetectorOptions = {})]
interface FaceDetector {
Promise<sequence<DetectedFace>> detect(ImageBitmapSource image);
};
@@ -36,7 +36,7 @@ enum LandmarkType {
[Exposed=(Window,Worker),
SecureContext,
- Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions)]
+ Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {})]
interface BarcodeDetector {
static Promise<sequence<BarcodeFormat>> getSupportedFormats();
diff --git a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
index 183f7732605..f515dda1a81 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
@@ -29,7 +29,7 @@ interface Bluetooth : EventTarget {
attribute EventHandler onavailabilitychanged;
[SameObject]
readonly attribute BluetoothDevice? referringDevice;
- Promise<BluetoothDevice> requestDevice(optional RequestDeviceOptions options);
+ Promise<BluetoothDevice> requestDevice(optional RequestDeviceOptions options = {});
};
Bluetooth includes BluetoothDeviceEventHandlers;
Bluetooth includes CharacteristicEventHandlers;
@@ -60,7 +60,7 @@ interface BluetoothPermissionResult : PermissionStatus {
[
Exposed=Window,
- Constructor(DOMString type, optional ValueEventInit initDict),
+ Constructor(DOMString type, optional ValueEventInit initDict = {}),
SecureContext
]
interface ValueEvent : Event {
diff --git a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
index 769eb7dd2f5..ff28d84de3d 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
@@ -21,9 +21,9 @@ interface NDEFRecord {
readonly attribute NDEFRecordType recordType;
readonly attribute USVString mediaType;
- USVString toText();
- [NewObject] ArrayBuffer toArrayBuffer();
- [NewObject] object toJSON();
+ USVString? toText();
+ [NewObject] ArrayBuffer? toArrayBuffer();
+ [NewObject] object? toJSON();
};
dictionary NDEFRecordInit {
@@ -37,18 +37,17 @@ typedef DOMString NDEFRecordType;
typedef (DOMString or ArrayBuffer or NDEFMessageInit) NDEFMessageSource;
-[Constructor(), SecureContext, Exposed=Window]
+[Constructor, SecureContext, Exposed=Window]
interface NFCWriter {
Promise<void> push(NDEFMessageSource message, optional NFCPushOptions options={});
};
-[Constructor(optional NFCReaderOptions options={}), SecureContext, Exposed=Window]
+[Constructor, SecureContext, Exposed=Window]
interface NFCReader : EventTarget {
attribute EventHandler onreading;
attribute EventHandler onerror;
- void start();
- void stop();
+ void scan(optional NFCScanOptions options={});
};
[Constructor(DOMString type, NFCReadingEventInit readingEventInitDict), SecureContext, Exposed=Window]
@@ -91,7 +90,8 @@ enum NFCPushTarget {
"any"
};
-dictionary NFCReaderOptions {
+dictionary NFCScanOptions {
+ AbortSignal? signal;
USVString url = "";
NDEFRecordType recordType;
USVString mediaType = "";
diff --git a/tests/wpt/web-platform-tests/interfaces/worklets.idl b/tests/wpt/web-platform-tests/interfaces/worklets.idl
index 22d04d15b06..16187664b3b 100644
--- a/tests/wpt/web-platform-tests/interfaces/worklets.idl
+++ b/tests/wpt/web-platform-tests/interfaces/worklets.idl
@@ -7,6 +7,7 @@
interface WorkletGlobalScope {
};
+[Exposed=Window]
interface Worklet {
[NewObject] Promise<void> addModule(USVString moduleURL, optional WorkletOptions options);
};
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html b/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html
new file mode 100644
index 00000000000..7cb23ddbd20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<head>
+<title>Largest Contentful Paint: do NOT observe elements from same-origin iframes</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ async_test((t) => {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ const observer = new PerformanceObserver(
+ t.step_func_done(entryList => {
+ assert_unreached("Should not have received an entry!");
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ // After a delay, assume that no entry was produced.
+ t.step_timeout(() => {
+ t.done();
+ }, 200);
+ }, 'Element in child iframe is not observed, even if same-origin.');
+</script>
+<iframe src='resources/iframe-with-content.html'></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html b/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html
new file mode 100644
index 00000000000..cd71f30ae45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<head>
+<title>Largest Contentful Paint: invisible images are not observable</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .opacity0 {
+ opacity: 0;
+ }
+ .visibilityHidden {
+ visibility: hidden;
+ }
+ .displayNone {
+ display: none;
+ }
+</style>
+</head>
+<body>
+<script>
+ async_test(t => {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ const observer = new PerformanceObserver(
+ t.step_func_done(entryList => {
+ // The images should not have caused an entry, so fail test.
+ assert_unreached('Should not have received an entry! Received one with id '
+ + entryList.getEntries()[0].id);
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ // Images have been added but should not cause entries to be dispatched.
+ // Wait for 500ms and end test, ensuring no entry was created.
+ t.step_timeout(() => {
+ t.done();
+ }, 500);
+ }, 'Images with opacity: 0, visibility: hidden, or display: none are not observable by LargestContentfulPaint.');
+</script>
+<img src='/images/blue.png' class='opacity0' id='opacity0'/>
+<img src='/images/green.png' class='visibilityHidden' id='visibilityHidden'/>
+<img src='/images/red.png' class='displayNone' id='displayNone'/>
+<div class='opacity0'><img src='/images/yellow.png' id='divOpacity0'/></div>
+<div class='visibilityHidden'><img src='/images/yellow.png' id='divVisibilityHidden'/></div>
+<div class='displayNone'><img src='/images/yellow.png' id='divDisplayNone'/></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html
new file mode 100644
index 00000000000..7ff38cf2be1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Largest Contentful Paint: largest image is reported.</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<!-- There is some text and some images. We care about blue.png being reported, as it is the largest. -->
+<p>This is some text! :)</p>
+<img src='/images/red.png' id='red'/>
+<img src='/images/blue.png' id='blue'/>
+<img src='/images/black-rectangle.png' id='black'/>
+<p>More text!</p>
+<script>
+ async_test(function (t) {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ const beforeRender = performance.now();
+ const observer = new PerformanceObserver(
+ t.step_func(entryList => {
+ entryList.getEntries().forEach(entry => {
+ // The text or other image could be reported as LCP if it is rendered before the blue image.
+ if (entry.id !== 'blue')
+ return;
+
+ assert_equals(entry.entryType, 'largest-contentful-paint');
+ assert_greater_than_equal(entry.renderTime, beforeRender,
+ 'The rendering timestamp should occur after script starts running.');
+ assert_greater_than_equal(performance.now(), entry.renderTime,
+ 'The rendering timestamp should occur before the entry is dispatched to the observer.');
+ assert_equals(entry.startTime, entry.renderTime, 'startTime should equal renderTime');
+ assert_equals(entry.duration, 0);
+ // blue.png is 133 x 106.
+ assert_equals(entry.size, 133 * 106);
+ assert_equals(entry.id, 'blue');
+ assert_equals(entry.url, window.location.origin + '/images/blue.png');
+ assert_greater_than(entry.loadTime, beforeRender,
+ 'The load timestamp should occur after script starts running.');
+ assert_less_than(entry.loadTime, entry.renderTime,
+ 'The load timestamp should occur before the render timestamp.')
+ assert_equals(entry.element, document.getElementById('blue'));
+ t.done();
+ })
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ }, 'Largest Contentful Paint: largest image is reported.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html
new file mode 100644
index 00000000000..973832ca6c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Largest Contentful Paint: largest text is reported.</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style type="text/css">
+#text2 {
+ position: absolute;
+ width: auto;
+ white-space: nowrap;
+}
+</style>
+<!-- There is some text and some tiny images. We care about the largest text. -->
+<img src='/images/green-1x1.png'/>
+<div id='text1'>This is some text.</div>
+<div id='text2'>This is more text so it will be the Largest Contentful Paint!</div>
+<img src='/images/green-2x2.png'/>
+<script>
+ async_test(function (t) {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ let beforeRender;
+ const observer = new PerformanceObserver(
+ t.step_func(entryList => {
+ entryList.getEntries().forEach(entry => {
+ // The tiny images or text1 could be reported as LCP if it is rendered before text2.
+ if (entry.id !== 'text2')
+ return;
+
+ assert_equals(entry.entryType, 'largest-contentful-paint');
+ assert_greater_than_equal(entry.renderTime, beforeRender);
+ assert_greater_than_equal(performance.now(), entry.renderTime);
+ assert_equals(entry.startTime, entry.renderTime, 'startTime should equal renderTime');
+ assert_equals(entry.duration, 0);
+ const div = document.getElementById('text2');
+ // The div styling makes it approximate the text size.
+ assert_greater_than_equal(entry.size, (div.clientHeight - 5) * (div.clientWidth - 5));
+ assert_less_than_equal(entry.size, (div.clientHeight + 1) * (div.clientWidth + 1));
+ assert_equals(entry.loadTime, 0);
+ assert_equals(entry.id, 'text2');
+ assert_equals(entry.url, '');
+ assert_equals(entry.element, div);
+ t.done();
+ })
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ beforeRender = performance.now();
+ }, 'Largest Contentful Paint: largest text is reported.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index 669038166ab..a6aa9466810 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -822,3 +822,11 @@ WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh
SET TIMEOUT: inert/inert-retargeting.tentative.html
SET TIMEOUT: inert/inert-retargeting-iframe.tentative.html
+
+# https://github.com/web-platform-tests/wpt/issues/16455
+MISSING DEPENDENCY: idle-detection/interceptor.https.html
+MISSING DEPENDENCY: sms/sms_provider.js
+MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js
+MISSING DEPENDENCY: shape-detection/resources/shapedetection-helpers.js
+MISSING DEPENDENCY: webxr/resources/webxr_util.js
+MISSING DEPENDENCY: contacts/resources/helpers.js
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html
new file mode 100644
index 00000000000..400c46a2456
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- Test displaystyle on mstyle -->
+ <math>
+ <mstyle displaystyle="true">
+ <munder><mo>O</mo><mo>O</mo></munder>
+ </mstyle>
+ <mstyle displaystyle="false">
+ <msub><mo>O</mo><mo>O</mo></munder>
+ </mstyle>
+ </math>
+
+ <!-- The mfrac element sets displaystyle to "false", or if it was already
+ false increments scriptlevel by 1, within numerator and denominator.
+ -->
+ <math>
+ <mstyle displaystyle="true">
+ <mfrac>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </mfrac>
+ </mstyle>
+ </math>
+
+ <!-- The mroot element increments scriptlevel by 2, and sets
+ displaystyle to "false", within index, but leaves both attributes
+ unchanged within base.
+ The msqrt element leaves both attributes unchanged within its
+ argument. -->
+ <math>
+ <mstyle displaystyle="true">
+ <mroot>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </mroot>
+ <msqrt>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ </msqrt>
+ </mstyle>
+ </math>
+
+<!--
+ The msub element [...] increments scriptlevel by 1, and sets displaystyle to
+ "false", within subscript, but leaves both attributes unchanged within base.
+
+ The msup element [...] increments scriptlevel by 1, and sets displaystyle to
+ "false", within superscript, but leaves both attributes unchanged within
+ base.
+
+ The msubsup element [...] increments scriptlevel by 1, and sets displaystyle
+ to "false", within subscript and superscript, but leaves both attributes
+ unchanged within base.
+
+ The mmultiscripts element increments scriptlevel by 1, and sets displaystyle
+ to "false", within each of its arguments except base, but leaves both
+ attributes unchanged within base.
+ -->
+ <math>
+ <mstyle displaystyle="true">
+ <msub>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </msub>
+ <msup>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </msup>
+ <msubsup>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </msubsup>
+ <mmultiscripts>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <mprescripts/>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </mmultiscripts>
+ </mstyle>
+ </math>
+
+<!--
+ The munder element [...] always sets displaystyle to "false" within the
+ underscript, but increments scriptlevel by 1 only when accentunder is
+ "false". Within base, it always leaves both attributes unchanged.
+
+ The mover element [...] always sets displaystyle to "false" within
+ overscript, but increments scriptlevel by 1 only when accent is "false".
+ Within base, it always leaves both attributes unchanged.
+
+ The munderover [..] always sets displaystyle to "false" within underscript
+ and overscript, but increments scriptlevel by 1 only when accentunder or
+ accent, respectively, are "false". Within base, it always leaves both
+ attributes unchanged.
+-->
+ <math>
+ <mstyle displaystyle="true">
+ <munder>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </munder>
+ <mover>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </mover>
+ <munderover>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </munderover>
+ </mstyle>
+ </math>
+
+<!--
+ The displaystyle attribute is allowed on the mtable element to set the
+ inherited value of the attribute. If the attribute is not present, the
+ mtable element sets displaystyle to "false" within the table elements.
+-->
+ <math>
+ <mstyle displaystyle="false">
+ <mtable displaystyle="true">
+ <mtr>
+ <mtd>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ </mtd>
+ </mtr>
+ </mtable>
+ </mstyle>
+ <mstyle displaystyle="true">
+ <mtable>
+ <mtr>
+ <mtd>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ </mtd>
+ </mtr>
+ </mtable>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html
new file mode 100644
index 00000000000..9a85a17dd0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#radicals-msqrt-mroot">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#subscripts-and-superscripts-msub-msup-msubsup">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#prescripts-and-tensor-indices-mmultiscripts">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#table-or-matrix-mtable">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo">
+ <link rel="match" href="displaystyle-011-ref.html"/>
+ <meta name="assert" content="Test the effect on displaystyle and movablelimits">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- Test displaystyle on mstyle -->
+ <math>
+ <mstyle displaystyle="true">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mstyle>
+ <mstyle displaystyle="false">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mstyle>
+ </math>
+
+ <!-- The mfrac element sets displaystyle to "false", or if it was already
+ false increments scriptlevel by 1, within numerator and denominator.
+ -->
+ <math>
+ <mstyle displaystyle="true">
+ <mfrac>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mfrac>
+ </mstyle>
+ </math>
+
+ <!-- The mroot element increments scriptlevel by 2, and sets
+ displaystyle to "false", within index, but leaves both attributes
+ unchanged within base.
+ The msqrt element leaves both attributes unchanged within its
+ argument. -->
+ <math>
+ <mstyle displaystyle="true">
+ <mroot>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mroot>
+ <msqrt>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </msqrt>
+ </mstyle>
+ </math>
+
+<!--
+ The msub element [...] increments scriptlevel by 1, and sets displaystyle to
+ "false", within subscript, but leaves both attributes unchanged within base.
+
+ The msup element [...] increments scriptlevel by 1, and sets displaystyle to
+ "false", within superscript, but leaves both attributes unchanged within
+ base.
+
+ The msubsup element [...] increments scriptlevel by 1, and sets displaystyle
+ to "false", within subscript and superscript, but leaves both attributes
+ unchanged within base.
+
+ The mmultiscripts element increments scriptlevel by 1, and sets displaystyle
+ to "false", within each of its arguments except base, but leaves both
+ attributes unchanged within base.
+ -->
+ <math>
+ <mstyle displaystyle="true">
+ <msub>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </msub>
+ <msup>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </msup>
+ <msubsup>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </msubsup>
+ <mmultiscripts>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mprescripts/>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mmultiscripts>
+ </mstyle>
+ </math>
+
+<!--
+ The munder element [...] always sets displaystyle to "false" within the
+ underscript, but increments scriptlevel by 1 only when accentunder is
+ "false". Within base, it always leaves both attributes unchanged.
+
+ The mover element [...] always sets displaystyle to "false" within
+ overscript, but increments scriptlevel by 1 only when accent is "false".
+ Within base, it always leaves both attributes unchanged.
+
+ The munderover [..] always sets displaystyle to "false" within underscript
+ and overscript, but increments scriptlevel by 1 only when accentunder or
+ accent, respectively, are "false". Within base, it always leaves both
+ attributes unchanged.
+-->
+ <math>
+ <mstyle displaystyle="true">
+ <munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </munder>
+ <mover>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mover>
+ <munderover>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </munderover>
+ </mstyle>
+ </math>
+
+<!--
+ The displaystyle attribute is allowed on the mtable element to set the
+ inherited value of the attribute. If the attribute is not present, the
+ mtable element sets displaystyle to "false" within the table elements.
+-->
+ <math>
+ <mstyle displaystyle="false">
+ <mtable displaystyle="true">
+ <mtr>
+ <mtd>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mtd>
+ </mtr>
+ </mtable>
+ </mstyle>
+ <mstyle displaystyle="true">
+ <mtable>
+ <mtr>
+ <mtd>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ </mtd>
+ </mtr>
+ </mtable>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html
new file mode 100644
index 00000000000..96042b696ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- Test the effect of displaystyle on munder, mover and munderover -->
+ <math>
+ <mstyle displaystyle="true">
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <mover><mo>O</mo><mo>O</mo></mover>
+ <munderover><mo>O</mo><mo>O</mo><mo>O</mo></munderover>
+ </mstyle>
+ <mstyle displaystyle="false">
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <msup><mo>O</mo><mo>O</mo></msup>
+ <msubsup><mo>O</mo><mo>O</mo><mo>O</mo></msubsup>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html
new file mode 100644
index 00000000000..150443f2527
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo">
+ <link rel="match" href="displaystyle-012-ref.html"/>
+ <meta name="assert" content="Test the effect on displaystyle on munder, mover and munderover">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <math>
+ <mstyle displaystyle="true">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mover><mo movablelimits="true">O</mo><mo>O</mo></mover>
+ <munderover><mo movablelimits="true">O</mo><mo>O</mo><mo>O</mo></munderover>
+ </mstyle>
+ <mstyle displaystyle="false">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mover><mo movablelimits="true">O</mo><mo>O</mo></mover>
+ <munderover><mo movablelimits="true">O</mo><mo>O</mo><mo>O</mo></munderover>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html
new file mode 100644
index 00000000000..9a580350de9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- Test dynamic change of displaystyle -->
+ <math id="m1" displaystyle="true">
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </math>
+ <math>
+ <mstyle id="m2" displaystyle="true">
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mstyle>
+ </math>
+ <math>
+ <mtable id="m3" displaystyle="true">
+ <mtr>
+ <mtd>
+ <munder><mo>O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mtd>
+ </mtr>
+ </mtable>
+ </math>
+ <math id="m4" displaystyle="false">
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </math>
+ <math>
+ <mstyle id="m5" displaystyle="false">
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mstyle>
+ </math>
+ <math>
+ <mtable id="m6" displaystyle="false">
+ <mtr>
+ <mtd>
+ <msub><mo>O</mo><mo>O</mo></msub>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mtd>
+ </mtr>
+ </mtable>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html
new file mode 100644
index 00000000000..60bc906452b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#table-or-matrix-mtable">
+ <link rel="match" href="displaystyle-013-ref.html"/>
+ <meta name="assert" content="Test dynamic change of displaystyle">
+ <script type="text/javascript">
+ function doTest() {
+ document.body.offsetTop; // Update layout
+ document.getElementById("m1").setAttribute("displaystyle", "true");
+ document.getElementById("m2").setAttribute("displaystyle", "true");
+ document.getElementById("m3").setAttribute("displaystyle", "true");
+ document.getElementById("m4").removeAttribute("displaystyle");
+ document.getElementById("m5").removeAttribute("displaystyle");
+ document.getElementById("m6").removeAttribute("displaystyle");
+ document.documentElement.removeAttribute("class");
+ }
+ window.addEventListener("load", function() {
+ // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+ requestAnimationFrame(() => { document.fonts.ready.then(doTest); });
+ });
+ </script>
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <math id="m1">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </math>
+ <math>
+ <mstyle id="m2">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mstyle>
+ </math>
+ <math>
+ <mtable id="m3">
+ <mtr>
+ <mtd>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mtd>
+ </mtr>
+ </mtable>
+ </math>
+ <math id="m4" displaystyle="true">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </math>
+ <math>
+ <mstyle id="m5" displaystyle="true">
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mstyle>
+ </math>
+ <math>
+ <mtable id="m6" displaystyle="true">
+ <mtr>
+ <mtd>
+ <munder><mo movablelimits="true">O</mo><mo>O</mo></munder>
+ <mfrac><mn>1</mn><mn>2</mn></mfrac>
+ </mtd>
+ </mtr>
+ </mtable>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html
new file mode 100644
index 00000000000..085e2c429da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- See https://bugzilla.mozilla.org/show_bug.cgi?id=832800 -->
+ <math>
+ <mstyle displaystyle="true">
+ <mfrac>
+ <mrow>
+ <mn>X</mn>
+ <mo id="mathOperator" mathbackground="red">+</mo>
+ <mfrac>
+ <mrow><mn>X</mn></mrow>
+ <mrow><mn>X</mn></mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mn>X</mn>
+ </mrow>
+ </mfrac>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html
new file mode 100644
index 00000000000..5f30f534e5e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <head>
+ <title>displaystyle</title>
+ <meta charset="utf-8">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+ <link rel="match" href="displaystyle-014-ref.html"/>
+ <meta name="assert" content="Test dynamic change of mathbackground on an operator does not interfer with its displaystyle">
+ <script type="text/javascript">
+ function doTest() {
+ document.body.offsetTop; // Update layout
+ document.getElementById('mathOperator').
+ setAttribute('mathbackground', 'red');
+ document.documentElement.removeAttribute("class");
+ }
+ window.addEventListener("load", function() {
+ // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+ requestAnimationFrame(() => { document.fonts.ready.then(doTest); });
+ });
+ </script>
+ <link rel="stylesheet" href="/fonts/ahem.css">
+ <style>
+ math {
+ font: 25px Ahem;
+ }
+ </style>
+ </head>
+ <body>
+
+ <!-- See https://bugzilla.mozilla.org/show_bug.cgi?id=832800 -->
+ <math>
+ <mstyle displaystyle="true">
+ <mfrac>
+ <mrow>
+ <mn>X</mn>
+ <mo id="mathOperator">+</mo>
+ <mfrac>
+ <mrow><mn>X</mn></mrow>
+ <mrow><mn>X</mn></mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mn>X</mn>
+ </mrow>
+ </mfrac>
+ </mstyle>
+ </math>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html
new file mode 100644
index 00000000000..2e375c68865
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>displaystyle and display</title>
+ </head>
+ <body>
+ <math>
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math display="inline" displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math display="block" displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math display="inline" displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ <math display="block" displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html
new file mode 100644
index 00000000000..df25171dbd6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>displaystyle and display</title>
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-top-level-math-element">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-dictionary">
+ <link rel="match" href="displaystyle-015-ref.html"/>
+ <meta name="assert" content="Test interaction of math@display and displaystyle on an operator with movablelimits">
+ </head>
+ <body>
+ <math>
+ <mstyle displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math display="inline">
+ <mstyle displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math display="block">
+ <mstyle displaystyle="true">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math display="inline">
+ <mstyle displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ <math display="block">
+ <mstyle displaystyle="false">
+ <munderover>
+ <mo>∑</mo>
+ <mi>b</mi>
+ <mi>c</mi>
+ </munderover>
+ </mstyle>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html
new file mode 100644
index 00000000000..65e2781c5e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mrow (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow mathbackground="green">
+ <mtext>□■□■□■□</mtext>
+ </mrow>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html
new file mode 100644
index 00000000000..48318bc6c6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mrow</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#horizontally-group-sub-expressions-mrow">
+<link rel="mismatch" href="mathbackground-001-notref.html"/>
+<meta name="assert" content="mathbackground on a mrow has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow mathbackground="red">
+ <mtext>□■□■□■□</mtext>
+ </mrow>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html
new file mode 100644
index 00000000000..8c984c26191
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mstyle (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mstyle mathbackground="green">
+ <mtext>□■□■□■□</mtext>
+ </mstyle>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html
new file mode 100644
index 00000000000..425488132c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mstyle</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+<link rel="mismatch" href="mathbackground-002-notref.html"/>
+<meta name="assert" content="mathbackground on a mstyle has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mstyle mathbackground="red">
+ <mtext>□■□■□■□</mtext>
+ </mstyle>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html
new file mode 100644
index 00000000000..b6adaa8d4e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mtext (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mtext mathbackground="green">□■□■□■□</mtext>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html
new file mode 100644
index 00000000000..780fdc4a7b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on mtext</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="mismatch" href="mathbackground-003-notref.html"/>
+<meta name="assert" content="mathbackground on a mtext has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mtext mathbackground="red">□■□■□■□</mtext>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html
new file mode 100644
index 00000000000..75465a6c382
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on semantics (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <semantics mathbackground="red">
+ <mtext>□■□■□■□</mtext>
+ </semantics>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html
new file mode 100644
index 00000000000..3af50856015
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathbackground on semantics</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#semantics-and-presentation">
+<link rel="mismatch" href="mathbackground-004-notref.html"/>
+<meta name="assert" content="mathbackground on a semantics has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <semantics mathbackground="green">
+ <mtext>□■□■□■□</mtext>
+ </semantics>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html
new file mode 100644
index 00000000000..9bc1ba54363
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mrow (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow mathcolor="green">
+ <mtext>□■□■□■□</mtext>
+ </mrow>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html
new file mode 100644
index 00000000000..5c23ff4f4a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mrow</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#horizontally-group-sub-expressions-mrow">
+<link rel="mismatch" href="mathcolor-001-notref.html"/>
+<meta name="assert" content="mathcolor on a mrow has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow mathcolor="red">
+ <mtext>□■□■□■□</mtext>
+ </mrow>
+</math>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html
new file mode 100644
index 00000000000..5f9fd2bb9b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mstyle (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mstyle mathcolor="green">
+ <mtext>□■□■□■□</mtext>
+ </mstyle>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html
new file mode 100644
index 00000000000..e0c1f3883a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mstyle</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle">
+<link rel="mismatch" href="mathcolor-002-notref.html"/>
+<meta name="assert" content="mathcolor on a mstyle has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mstyle mathcolor="red">
+ <mtext>□■□■□■□</mtext>
+ </mstyle>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html
new file mode 100644
index 00000000000..11e018ebc17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mtext (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mtext mathcolor="green">□■□■□■□</mtext>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html
new file mode 100644
index 00000000000..8b1ed83d6cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on mtext</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="mismatch" href="mathcolor-003-notref.html"/>
+<meta name="assert" content="mathcolor on a mtext has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mtext mathcolor="red">□■□■□■□</mtext>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html
new file mode 100644
index 00000000000..67a45249e52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on semantics (reference)</title>
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <semantics mathcolor="red">
+ <mtext>□■□■□■□</mtext>
+ </semantics>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html
new file mode 100644
index 00000000000..36ce0a4252e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>mathcolor on semantics</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#semantics-and-presentation">
+<link rel="mismatch" href="mathcolor-004-notref.html"/>
+<meta name="assert" content="mathcolor on a semantics has a visual effect.">
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <semantics mathcolor="green">
+ <mtext>□■□■□■□</mtext>
+ </semantics>
+</math>
+
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html
new file mode 100644
index 00000000000..d24fbf041af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>mathsize and css keywords</title>
+ </head>
+ <body>
+ <p>Test passes if you see ten "A" of equal size:</p>
+ <math>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ <mtext>A</mtext>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html
new file mode 100644
index 00000000000..9b3852d0b37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>mathsize and css keywords</title>
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#css-styling">
+ <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+ <meta name="assert" content="Verify that CSS font-size keywords are invalid for the mathsize attribute.">
+ <link rel="match" href="mathsize-attribute-css-keywords-ref.html">
+ </head>
+ <body>
+ <p>Test passes if you see ten "A" of equal size:</p>
+ <math>
+ <mtext>A</mtext>
+ <mtext mathsize="xx-small">A</mtext>
+ <mtext mathsize="x-small">A</mtext>
+ <mtext mathsize="small">A</mtext>
+ <mtext mathsize="medium">A</mtext>
+ <mtext mathsize="large">A</mtext>
+ <mtext mathsize="x-large">A</mtext>
+ <mtext mathsize="xx-large">A</mtext>
+ <mtext mathsize="larger">A</mtext>
+ <mtext mathsize="smaller">A</mtext>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
index a4eb2871104..fd2ff888e37 100644
--- a/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
@@ -44,19 +44,19 @@ promise_test(async t => {
promise_test(async t => {
const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
const dir = await createDirectory(t, 'dir', root);
- await promise_rejects(t, 'NotFoundError', dir.removeEntry(""));
+ await promise_rejects(t, new TypeError(), dir.removeEntry(""));
}, 'removeEntry() with empty name should fail');
promise_test(async t => {
const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
const dir = await createDirectory(t, 'dir', root);
- await promise_rejects(t, 'SecurityError', dir.removeEntry(kCurrentDirectory));
+ await promise_rejects(t, new TypeError(), dir.removeEntry(kCurrentDirectory));
}, `removeEntry() with "${kCurrentDirectory}" name should fail`);
promise_test(async t => {
const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
const dir = await createDirectory(t, 'dir', root);
- await promise_rejects(t, 'SecurityError', dir.removeEntry(kParentDirectory));
+ await promise_rejects(t, new TypeError(), dir.removeEntry(kParentDirectory));
}, `removeEntry() with "${kParentDirectory}" name should fail`);
promise_test(async t => {
@@ -70,7 +70,7 @@ promise_test(async t => {
for (let i = 0; i < kPathSeparators.length; ++i) {
const path_with_separator = `${dir_name}${kPathSeparators[i]}${file_name}`;
- await promise_rejects(t, 'SecurityError', root.removeEntry(path_with_separator),
+ await promise_rejects(t, new TypeError(), root.removeEntry(path_with_separator),
`removeEntry() must reject names containing "${kPathSeparators[i]}"`);
}
}, 'removeEntry() with a path separator should fail.');
diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
index 2064fc46f05..79154b058ff 100644
--- a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
@@ -58,22 +58,22 @@ promise_test(async t => {
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
- await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: true }));
- await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: false }));
+ await promise_rejects(t, new TypeError(), dir.getDirectory("", { create: true }));
+ await promise_rejects(t, new TypeError(), dir.getDirectory("", { create: false }));
}, 'getDirectory() with empty name');
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
- await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory));
- await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory, { create: true }));
+ await promise_rejects(t, new TypeError(), dir.getDirectory(kCurrentDirectory));
+ await promise_rejects(t, new TypeError(), dir.getDirectory(kCurrentDirectory, { create: true }));
}, `getDirectory() with "${kCurrentDirectory}" name`);
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir);
- await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory));
- await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory, { create: true }));
+ await promise_rejects(t, new TypeError(), subdir.getDirectory(kParentDirectory));
+ await promise_rejects(t, new TypeError(), subdir.getDirectory(kParentDirectory, { create: true }));
}, `getDirectory() with "${kParentDirectory}" name`);
promise_test(async t => {
@@ -87,7 +87,7 @@ promise_test(async t => {
for (let i = 0; i < kPathSeparators.length; ++i) {
const path_with_separator = `${first_subdir_name}${kPathSeparators[i]}${second_subdir_name}`;
- await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator),
+ await promise_rejects(t, new TypeError(), dir.getDirectory(path_with_separator),
`getDirectory() must reject names containing "${kPathSeparators[i]}"`);
}
}, 'getDirectory(create=false) with a path separator when the directory exists');
@@ -100,7 +100,7 @@ promise_test(async t => {
for (let i = 0; i < kPathSeparators.length; ++i) {
const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`;
- await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator, { create: true }),
+ await promise_rejects(t, new TypeError(), dir.getDirectory(path_with_separator, { create: true }),
`getDirectory(true) must reject names containing "${kPathSeparators[i]}"`);
}
}, 'getDirectory(create=true) with a path separator');
diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
index 473cad4c9c3..fa38abbc544 100644
--- a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
@@ -63,22 +63,22 @@ promise_test(async t => {
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
- await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: true }));
- await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: false }));
+ await promise_rejects(t, new TypeError(), dir.getFile("", { create: true }));
+ await promise_rejects(t, new TypeError(), dir.getFile("", { create: false }));
}, 'getFile() with empty name');
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
- await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory));
- await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory, { create: true }));
+ await promise_rejects(t, new TypeError(), dir.getFile(kCurrentDirectory));
+ await promise_rejects(t, new TypeError(), dir.getFile(kCurrentDirectory, { create: true }));
}, `getFile() with "${kCurrentDirectory}" name`);
promise_test(async t => {
const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' });
const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir);
- await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory));
- await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory, { create: true }));
+ await promise_rejects(t, new TypeError(), subdir.getFile(kParentDirectory));
+ await promise_rejects(t, new TypeError(), subdir.getFile(kParentDirectory, { create: true }));
}, `getFile() with "${kParentDirectory}" name`);
promise_test(async t => {
@@ -92,7 +92,7 @@ promise_test(async t => {
for (let i = 0; i < kPathSeparators.length; ++i) {
const path_with_separator = `${subdir_name}${kPathSeparators[i]}${file_name}`;
- await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator),
+ await promise_rejects(t, new TypeError(), dir.getFile(path_with_separator),
`getFile() must reject names containing "${kPathSeparators[i]}"`);
}
}, 'getFile(create=false) with a path separator when the file exists.');
@@ -105,7 +105,7 @@ promise_test(async t => {
for (let i = 0; i < kPathSeparators.length; ++i) {
const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`;
- await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator, { create: true }),
+ await promise_rejects(t, new TypeError(), dir.getFile(path_with_separator, { create: true }),
`getFile(true) must reject names containing "${kPathSeparators[i]}"`);
}
}, 'getFile(create=true) with a path separator');
diff --git a/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html b/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html
index 2978226f3cc..da30fef0019 100644
--- a/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html
@@ -80,6 +80,20 @@ test(() => {
}, "Relative validationURLs use the document as the base.");
test(() => {
+ const validationURL = "pass";
+ const base = document.createElement("base");
+ base.href = "https://pass.com";
+ document.head.append(base);
+ const event = new MerchantValidationEvent("test", { validationURL });
+ try {
+ assert_idl_attribute(event, "validationURL");
+ assert_equals(event.validationURL, "https://pass.com/pass");
+ } finally {
+ base.remove();
+ }
+}, "Relative validationURLs use the document.baseURI as the base.");
+
+test(() => {
const methodName = "https://pass.com";
const event = new MerchantValidationEvent("test", { methodName });
assert_idl_attribute(event, "methodName");
diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
index 83bd6b8a0de..9722f8ee570 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
@@ -273,13 +273,11 @@ var WebNFCTest = (() => {
this.watchers_.push({id: id, options: options});
// Triggers onWatch if the new watcher matches existing messages
- if (this.reading_messages_.length !== 0) {
- for(let message of this.reading_messages_) {
- if (matchesWatchOptions(message.message,
- message.compatibility, options)) {
- this.client_.onWatch([id], fake_tag_serial_number,
- toMojoNDEFMessage(message.message));
- }
+ for (let message of this.reading_messages_) {
+ if (matchesWatchOptions(
+ message.message, message.compatibility, options)) {
+ this.client_.onWatch(
+ [id], fake_tag_serial_number, toMojoNDEFMessage(message.message));
}
}
@@ -362,13 +360,12 @@ var WebNFCTest = (() => {
this.reading_messages_.push({message: message,
compatibility: toMojoNDEFCompatibility(compatibility)});
// Triggers onWatch if the new message matches existing watchers
- if (this.watchers_.length !== 0) {
- for (let watcher of this.watchers_) {
- if (matchesWatchOptions(message,
- message.compatibility, watcher.options)) {
- this.client_.onWatch([watcher.id], fake_tag_serial_number,
- toMojoNDEFMessage(message.message));
- }
+ for (let watcher of this.watchers_) {
+ if (matchesWatchOptions(
+ message, message.compatibility, watcher.options)) {
+ this.client_.onWatch(
+ [watcher.id], fake_tag_serial_number,
+ toMojoNDEFMessage(message.message));
}
}
}
diff --git a/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js b/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js
index 4c89463dcd2..ee8f082b874 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js
@@ -82,6 +82,7 @@ class FakeBluetooth {
this.fake_bluetooth_ptr_ = new bluetooth.mojom.FakeBluetoothPtr();
Mojo.bindInterface(bluetooth.mojom.FakeBluetooth.name,
mojo.makeRequest(this.fake_bluetooth_ptr_).handle, 'process');
+ this.fake_central_ = null;
}
// Set it to indicate whether the platform supports BLE. For example,
@@ -105,12 +106,16 @@ class FakeBluetooth {
// See Bluetooth 4.2 Vol 3 Part C 2.2.2 "Roles when Operating over an
// LE Physical Transport".
async simulateCentral({state}) {
+ if (this.fake_central_)
+ throw 'simulateCentral() should only be called once';
+
await this.setLESupported(true);
let {fakeCentral: fake_central_ptr} =
await this.fake_bluetooth_ptr_.simulateCentral(
toMojoCentralState(state));
- return new FakeCentral(fake_central_ptr);
+ this.fake_central_ = new FakeCentral(fake_central_ptr);
+ return this.fake_central_;
}
// Returns true if there are no pending responses.
@@ -202,6 +207,16 @@ class FakeCentral {
return this.fetchOrCreatePeripheral_(scanResult.deviceAddress);
}
+ // Simulates a change in the central device described by |state|. For example,
+ // setState('powered-off') can be used to simulate the central device powering
+ // off.
+ //
+ // This method should be used for any central state changes after
+ // simulateCentral() has been called to create a FakeCentral object.
+ async setState(state) {
+ await this.fake_central_ptr_.setState(toMojoCentralState(state));
+ }
+
// Create a fake_peripheral object from the given address.
fetchOrCreatePeripheral_(address) {
let peripheral = this.peripherals_.get(address);
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
index 19b207ff428..bb6b0c1be55 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
@@ -116,7 +116,6 @@ class MockVRService {
if (index >= 0) {
this.runtimes_.splice(index, 1);
if (this.client_) {
- console.error("Notifying client");
this.client_.onDeviceChanged();
}
}
@@ -153,7 +152,7 @@ class MockVRService {
// If there were no successful results, returns a null session.
return {
result: {
- failureReason : device.mojom.RequestSessionResult.NO_RUNTIME_FOUND,
+ failureReason : device.mojom.RequestSessionError.NO_RUNTIME_FOUND,
$tag : 1
}
};
@@ -224,6 +223,9 @@ class MockRuntime {
this.setBoundsGeometry(fakeDeviceInit.boundsCoordinates);
this.setViews(fakeDeviceInit.views);
+
+ // Need to support webVR which doesn't have a notion of features
+ this.setFeatures(fakeDeviceInit.supportedFeatures || []);
}
// Test API methods.
@@ -421,6 +423,34 @@ class MockRuntime {
};
}
+ setFeatures(supportedFeatures) {
+ function convertFeatureToMojom(feature) {
+ switch (feature) {
+ case "viewer":
+ return device.mojom.XRSessionFeature.REF_SPACE_VIEWER;
+ case "local":
+ return device.mojom.XRSessionFeature.REF_SPACE_LOCAL;
+ case "local-floor":
+ return device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR;
+ case "bounded-floor":
+ return device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR;
+ case "unbounded":
+ return device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED;
+ default:
+ return device.mojom.XRSessionFeature.INVALID;
+ }
+ }
+
+ this.supportedFeatures_ = [];
+
+ for (let i = 0; i < supportedFeatures.length; i++) {
+ let feature = convertFeatureToMojom(supportedFeatures[i]);
+ if (feature !== device.mojom.XRSessionFeature.INVALID) {
+ this.supportedFeatures_.push(feature);
+ }
+ }
+ }
+
// These methods are intended to be used by MockXRInputSource only.
addInputSource(source) {
let index = this.input_sources_.indexOf(source);
@@ -525,12 +555,28 @@ class MockRuntime {
let clientRequest = mojo.makeRequest(this.sessionClient_);
+ let enabled_features = [];
+ for(let i = 0; i < sessionOptions.requiredFeatures.length; i++) {
+ if (this.supportedFeatures_.indexOf(sessionOptions.requiredFeatures[i]) !== -1) {
+ enabled_features.push(sessionOptions.requiredFeatures[i]);
+ } else {
+ return Promise.resolve({session: null});
+ }
+ }
+
+ for (let i =0; i < sessionOptions.optionalFeatures.length; i++) {
+ if (this.supportedFeatures_.indexOf(sessionOptions.optionalFeatures[i]) !== -1) {
+ enabled_features.push(sessionOptions.optionalFeatures[i]);
+ }
+ }
+
return Promise.resolve({
session: {
submitFrameSink: submit_frame_sink,
dataProvider: dataProviderPtr,
clientRequest: clientRequest,
- displayInfo: this.displayInfo_
+ displayInfo: this.displayInfo_,
+ enabledFeatures: enabled_features,
}
});
} else {
diff --git a/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html
new file mode 100644
index 00000000000..724132fab29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>Navigating to a text fragment anchor</title>
+<script>
+function checkScroll() {
+ let bc = new BroadcastChannel('scroll-to-text-fragment');
+ bc.postMessage({ didScrollToTarget: window.scrollY > 0 });
+ bc.close();
+ window.close();
+}
+</script>
+<style>
+ body {
+ height: 3200px;
+ }
+ p {
+ position: absolute;
+ top: 3000px;
+ }
+</style>
+<body onload="checkScroll()">
+ <p id="text">This is a test page</p>
+</body>
diff --git a/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html
new file mode 100644
index 00000000000..eaab1843706
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<title>Navigating to a text fragment anchor</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+let test_cases = [
+ { fragment: '#', expect_scroll: false },
+ { fragment: '##targetText=test', expect_scroll: true },
+ { fragment: '##targetText=this,page', expect_scroll: true },
+ { fragment: '##targetText=this-,is,test', expect_scroll: true },
+ { fragment: '##targetText=this-,is,test,-page', expect_scroll: true },
+ { fragment: '##targetText=this-,is,page,-none', expect_scroll: false },
+ { fragment: '##targetText=this,test,-page', expect_scroll: true },
+ { fragment: '##targetText=this%20is%20a%20test%20page', expect_scroll: true },
+ { fragment: '##targetText=this&targetText=test,page', expect_scroll: true },
+ { fragment: '#pagestate##targetText=test', expect_scroll: true },
+ { fragment: '#pagestate##targetText=nomatch', expect_scroll: false },
+];
+
+for (const test_case of test_cases) {
+ promise_test(t => new Promise(resolve => {
+ let channel = new BroadcastChannel('scroll-to-text-fragment');
+ channel.addEventListener("message", e => {
+ resolve(e.data.didScrollToTarget);
+ }, {once: true});
+
+ test_driver.bless('Open a URL with a text fragment anchor', () => {
+ window.open('scroll-to-text-fragment-target.html' + test_case.fragment, '_blank', 'noopener');
+ });
+ }).then(scroll => {
+ assert_equals(scroll, test_case.expect_scroll,
+ 'Expected ' + test_case.fragment + (test_case.expect_scroll ? ' to scroll.' : ' to not scroll.'));
+ }), 'Test navigation with text fragment anchor ' + test_case.fragment);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html b/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html
new file mode 100644
index 00000000000..985be73b5ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<title>Can serialize a range which starts at the end of an element</title>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1571517">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<table>
+ <tr>
+ <td id="left">Foo</td>
+ <td id="right">Hello</td>
+ </tr>
+</table>
+<script>
+test(function() {
+ let s = getSelection();
+ let r = new Range();
+ r.setStart(document.getElementById("left"), 1);
+ r.setEnd(document.getElementById("right").firstChild, 4);
+ s.addRange(r);
+ assert_equals(s.toString().trim(), "Hell");
+}, "Can serialize a range which starts at the end of an element");
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html
new file mode 100644
index 00000000000..ef27ac3d372
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<title>Service Worker: Clients.matchAll</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+var scope = 'resources/clients-frame-freeze.html';
+var windows = [];
+var expected_window_1 =
+ {visibilityState: 'visible', focused: false, lifecycleState: "frozen", url: new URL(scope + '#1', location).toString(), type: 'window', frameType: 'top-level'};
+var expected_window_2 =
+ {visibilityState: 'visible', focused: false, lifecycleState: "active", url: new URL(scope + '#2', location).toString(), type: 'window', frameType: 'top-level'};
+function with_window(url, name) {
+ return new Promise(function(resolve) {
+ var child = window.open(url, name);
+ window.onmessage = () => {resolve(child)};
+ });
+}
+
+promise_test(function(t) {
+ return service_worker_unregister_and_register(
+ t, 'resources/clients-matchall-worker.js', scope)
+ .then(function(registration) {
+ t.add_cleanup(function() {
+ return service_worker_unregister(t, scope);
+ });
+
+ return wait_for_state(t, registration.installing, 'activated');
+ })
+ .then(function() { return with_window(scope + '#1', 'Child 1'); })
+ .then(function(window1) {
+ windows.push(window1);
+ return with_window(scope + '#2', 'Child 2');
+ })
+ .then(function(window2) {
+ windows.push(window2);
+ return new Promise(function(resolve) {
+ window.onmessage = resolve;
+ windows[0].postMessage('freeze');
+ });
+ })
+ .then(function() {
+ var channel = new MessageChannel();
+
+ return new Promise(function(resolve) {
+ channel.port1.onmessage = resolve;
+ windows[1].navigator.serviceWorker.controller.postMessage(
+ {port:channel.port2, includeLifecycleState: true}, [channel.port2]);
+ });
+ })
+ .then(function(e) {
+ assert_equals(e.data.length, 1);
+ assert_object_equals(e.data[0], expected_window_2);
+ })
+ .then(function() {
+ var channel = new MessageChannel();
+
+ return new Promise(function(resolve) {
+ channel.port1.onmessage = resolve;
+ windows[1].navigator.serviceWorker.controller.postMessage(
+ {port:channel.port2, options: {lifecycleState: "all"}, includeLifecycleState: true}, [channel.port2]);
+ });
+ })
+ .then(function(e) {
+ assert_equals(e.data.length, 2);
+ // No specific order is required, so support inversion.
+ if (e.data[0][3] == new URL(scope + '#2', location)) {
+ assert_object_equals(e.data[0], expected_window_2);
+ assert_object_equals(e.data[1], expected_window_1);
+ } else {
+ assert_object_equals(e.data[0], expected_window_1);
+ assert_object_equals(e.data[1], expected_window_2);
+ }
+ })
+ .then(function() {
+ var channel = new MessageChannel();
+
+ return new Promise(function(resolve) {
+ channel.port1.onmessage = resolve;
+ windows[1].navigator.serviceWorker.controller.postMessage(
+ {port:channel.port2, options: {lifecycleState: "frozen"}, includeLifecycleState: true}, [channel.port2]);
+ });
+ })
+ .then(function(e) {
+ assert_equals(e.data.length, 1);
+ assert_object_equals(e.data[0], expected_window_1);
+ })
+ .then(function() {
+ var channel = new MessageChannel();
+
+ return new Promise(function(resolve) {
+ channel.port1.onmessage = resolve;
+ windows[1].navigator.serviceWorker.controller.postMessage(
+ {port:channel.port2, options: {lifecycleState: "active"}, includeLifecycleState: true}, [channel.port2]);
+ });
+ })
+ .then(function(e) {
+ assert_equals(e.data.length, 1);
+ assert_object_equals(e.data[0], expected_window_2);
+ });
+}, 'Test Clients.matchAll()');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html
new file mode 100644
index 00000000000..7468a660e90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+ document.addEventListener('freeze', () => {
+ opener.postMessage('frozen', "*");
+ });
+
+ window.onmessage = (e) => {
+ if (e.data == 'freeze') {
+ test_driver.freeze();
+ }
+ };
+ opener.postMessage('loaded', '*');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js
index d6634f4d40e..13e111a2f91 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js
@@ -13,11 +13,20 @@ self.onmessage = function(e) {
// In that case, just pretend it's top-level!
frame_type = 'top-level';
}
- message.push([client.visibilityState,
- client.focused,
- client.url,
- client.type,
- frame_type]);
+ if (e.data.includeLifecycleState) {
+ message.push({visibilityState: client.visibilityState,
+ focused: client.focused,
+ url: client.url,
+ lifecycleState: client.lifecycleState,
+ type: client.type,
+ frameType: frame_type});
+ } else {
+ message.push([client.visibilityState,
+ client.focused,
+ client.url,
+ client.type,
+ frame_type]);
+ }
});
// Sort by url
if (!e.data.disableSort) {
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index 062c6a42d0f..7397de7fb89 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -389,6 +389,7 @@ regexps = [item() for item in # type: ignore
rules.GenerateTestsRegexp,
rules.PrintRegexp,
rules.LayoutTestsRegexp,
+ rules.MissingDepsRegexp,
rules.SpecialPowersRegexp]]
def check_regexp_line(repo_root, path, f):
diff --git a/tests/wpt/web-platform-tests/tools/lint/rules.py b/tests/wpt/web-platform-tests/tools/lint/rules.py
index 9b78f3495b2..f354a33fa49 100644
--- a/tests/wpt/web-platform-tests/tools/lint/rules.py
+++ b/tests/wpt/web-platform-tests/tools/lint/rules.py
@@ -350,6 +350,13 @@ class LayoutTestsRegexp(Regexp):
file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
description = "eventSender/testRunner/internals used; these are LayoutTests-specific APIs (WebKit/Blink)"
+class MissingDepsRegexp(Regexp):
+ pattern = br"[^\w]/gen/"
+ name = "MISSING DEPENDENCY"
+ file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
+ description = "Chromium-specific content referenced"
+ to_fix = "Reimplement the test to use well-documented testing interfaces"
+
class SpecialPowersRegexp(Regexp):
pattern = b"SpecialPowers"
name = "SPECIALPOWERS API"
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
index 31456ae8bbc..b3a83fe5f30 100644
--- a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
@@ -203,6 +203,36 @@ def test_internals():
1)]
+def test_missing_deps():
+ error_map = check_with_files(b"<script src='/gen/foo.js'></script>")
+
+ for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
+ if kind == "python":
+ assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)]
+ else:
+ assert errors == [('MISSING DEPENDENCY',
+ 'Chromium-specific content referenced',
+ filename,
+ 1)]
+
+
+def test_no_missing_deps():
+ error_map = check_with_files(b"""<head>
+<script src='/foo/gen/foo.js'></script>
+<script src='/gens/foo.js'></script>
+</head>""")
+
+ for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
+ if kind == "python":
+ assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)]
+ else:
+ assert errors == []
+
+
def test_meta_timeout():
code = b"""
<html xmlns="http://www.w3.org/1999/xhtml">
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index 0943ee9f3d7..b905379c754 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -581,25 +581,25 @@ class Chrome(Browser):
return m.group(1)
-class ChromeAndroid(Browser):
- """Chrome-specific interface for Android.
+class ChromeAndroidBase(Browser):
+ """A base class for ChromeAndroid and AndroidWebView.
+ On Android, WebView is based on Chromium open source project, and on some
+ versions of Android we share the library with Chrome. Therefore, we have
+ a very similar WPT runner implementation.
Includes webdriver installation.
"""
-
- product = "chrome_android"
- requirements = "requirements_chrome_android.txt"
+ __metaclass__ = ABCMeta # This is an abstract class.
def __init__(self, logger):
- super(ChromeAndroid, self).__init__(logger)
+ super(ChromeAndroidBase, self).__init__(logger)
def install(self, dest=None, channel=None):
raise NotImplementedError
+ @abstractmethod
def find_binary(self, venv_path=None, channel=None):
- if channel in ("beta", "dev", "canary"):
- return "com.chrome." + channel
- return "com.android.chrome"
+ raise NotImplementedError
def find_webdriver(self, channel=None):
return find_executable("chromedriver")
@@ -629,6 +629,49 @@ class ChromeAndroid(Browser):
return match.group(1)
+class ChromeAndroid(ChromeAndroidBase):
+ """Chrome-specific interface for Android.
+ """
+
+ product = "chrome_android"
+ requirements = "requirements_chrome_android.txt"
+
+ def find_binary(self, venv_path=None, channel=None):
+ if channel in ("beta", "dev", "canary"):
+ return "com.chrome." + channel
+ return "com.android.chrome"
+
+
+class AndroidWebview(ChromeAndroidBase):
+ """Webview-specific interface for Android.
+
+ Design doc:
+ https://docs.google.com/document/d/19cGz31lzCBdpbtSC92svXlhlhn68hrsVwSB7cfZt54o/view
+ """
+
+ product = "android_webview"
+ requirements = "requirements_android_webview.txt"
+
+ def find_binary(self, venv_path=None, channel=None):
+ # Just get the current package name of the WebView provider.
+ # For WebView, it is not trivial to change the WebView provider, so
+ # we will just grab whatever is available.
+ # https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/channels.md
+ command = ['adb', 'shell', 'dumpsys', 'webviewupdate']
+ try:
+ output = call(*command)
+ except (subprocess.CalledProcessError, OSError):
+ self.logger.warning("Failed to call %s" % " ".join(command))
+ return None
+ m = re.search(r'^\s*Current WebView package \(name, version\): \((.*), ([0-9.]*)\)$',
+ output, re.M)
+ if m is None:
+ self.logger.warning("Unable to find current WebView package in dumpsys output")
+ return None
+ self.logger.warning("Final package name: " + m.group(1))
+ return m.group(1)
+
+
class ChromeiOS(Browser):
"""Chrome-specific interface for iOS.
"""
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
index 617ea7282b8..181d6bfdea9 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -341,6 +341,29 @@ class ChromeiOS(BrowserSetup):
raise WptrunError("Unable to locate or install chromedriver binary")
+class AndroidWebview(BrowserSetup):
+ name = "android_webview"
+ browser_cls = browser.AndroidWebview
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["webdriver_binary"] is None:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ install = self.prompt_install("chromedriver")
+
+ if install:
+ logger.info("Downloading chromedriver")
+ webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
+ else:
+ logger.info("Using webdriver binary %s" % webdriver_binary)
+
+ if webdriver_binary:
+ kwargs["webdriver_binary"] = webdriver_binary
+ else:
+ raise WptrunError("Unable to locate or install chromedriver binary")
+
+
class Opera(BrowserSetup):
name = "opera"
browser_cls = browser.Opera
@@ -532,6 +555,7 @@ class Epiphany(BrowserSetup):
product_setup = {
+ "android_webview": AndroidWebview,
"firefox": Firefox,
"firefox_android": FirefoxAndroid,
"chrome": Chrome,
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt
new file mode 100644
index 00000000000..470aaf9a939
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt
@@ -0,0 +1 @@
+mozprocess==1.0.0
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
index 18434e499dc..75ec775658c 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -22,7 +22,8 @@ All classes and functions named in the above dict must be imported into the
module global scope.
"""
-product_list = ["chrome",
+product_list = ["android_webview",
+ "chrome",
"chrome_android",
"chrome_ios",
"edgechromium",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py
new file mode 100644
index 00000000000..42ae8b64b14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py
@@ -0,0 +1,124 @@
+import subprocess
+
+from .base import Browser, ExecutorBrowser, require_arg
+from .base import get_timeout_multiplier # noqa: F401
+from .chrome import executor_kwargs as chrome_executor_kwargs
+from ..webdriver_server import ChromeDriverServer
+from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
+ WebDriverRefTestExecutor) # noqa: F401
+from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
+
+
+__wptrunner__ = {"product": "android_webview",
+ "check_args": "check_args",
+ "browser": "SystemWebViewShell",
+ "executor": {"testharness": "WebDriverTestharnessExecutor",
+ "reftest": "WebDriverRefTestExecutor",
+ "wdspec": "ChromeDriverWdspecExecutor"},
+ "browser_kwargs": "browser_kwargs",
+ "executor_kwargs": "executor_kwargs",
+ "env_extras": "env_extras",
+ "env_options": "env_options",
+ "timeout_multiplier": "get_timeout_multiplier"}
+
+_wptserve_ports = set()
+
+
+def check_args(**kwargs):
+ require_arg(kwargs, "webdriver_binary")
+
+
+def browser_kwargs(test_type, run_info_data, config, **kwargs):
+ return {"binary": kwargs["binary"],
+ "webdriver_binary": kwargs["webdriver_binary"],
+ "webdriver_args": kwargs.get("webdriver_args")}
+
+
+def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
+ **kwargs):
+ # Use update() to modify the global list in place.
+ _wptserve_ports.update(set(
+ server_config['ports']['http'] + server_config['ports']['https'] +
+ server_config['ports']['ws'] + server_config['ports']['wss']
+ ))
+
+ executor_kwargs = chrome_executor_kwargs(test_type, server_config,
+ cache_manager, run_info_data,
+ **kwargs)
+ del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"]
+ del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"]
+ capabilities = executor_kwargs["capabilities"]
+ # Note that for WebView, we launch a test shell and have the test shell use WebView.
+ # https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/webview-shell.md
+ capabilities["goog:chromeOptions"]["androidPackage"] = \
+ "org.chromium.webview_shell"
+ capabilities["goog:chromeOptions"]["androidActivity"] = ".WebPlatformTestsActivity"
+
+ # Workaround: driver.quit() cannot quit SystemWebViewShell.
+ executor_kwargs["pause_after_test"] = False
+ # Workaround: driver.close() is not supported.
+ executor_kwargs["restart_after_test"] = True
+ executor_kwargs["close_after_done"] = False
+ return executor_kwargs
+
+
+def env_extras(**kwargs):
+ return []
+
+
+def env_options():
+ return {}
+
+
+#TODO: refactor common elements of SystemWebViewShell and ChromeAndroidBrowser
+class SystemWebViewShell(Browser):
+ """Chrome is backed by chromedriver, which is supplied through
+ ``wptrunner.webdriver.ChromeDriverServer``.
+ """
+
+ def __init__(self, logger, binary, webdriver_binary="chromedriver",
+ webdriver_args=None):
+ """Creates a new representation of Chrome. The `binary` argument gives
+ the browser binary to use for testing."""
+ Browser.__init__(self, logger)
+ self.binary = binary
+ self.server = ChromeDriverServer(self.logger,
+ binary=webdriver_binary,
+ args=webdriver_args)
+ self.setup_adb_reverse()
+
+ def _adb_run(self, args):
+ self.logger.info('adb ' + ' '.join(args))
+ subprocess.check_call(['adb'] + args)
+
+ def setup_adb_reverse(self):
+ self._adb_run(['wait-for-device'])
+ self._adb_run(['forward', '--remove-all'])
+ self._adb_run(['reverse', '--remove-all'])
+ # "adb reverse" basically forwards network connection from device to
+ # host.
+ for port in _wptserve_ports:
+ self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
+
+ def start(self, **kwargs):
+ self.server.start(block=False)
+
+ def stop(self, force=False):
+ self.server.stop(force=force)
+
+ def pid(self):
+ return self.server.pid
+
+ def is_alive(self):
+ # TODO(ato): This only indicates the driver is alive,
+ # and doesn't say anything about whether a browser session
+ # is active.
+ return self.server.is_alive()
+
+ def cleanup(self):
+ self.stop()
+ self._adb_run(['forward', '--remove-all'])
+ self._adb_run(['reverse', '--remove-all'])
+
+ def executor_browser(self):
+ return ExecutorBrowser, {"webdriver_url": self.server.url}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
index 588e0b2fad6..b1e86ff1fd0 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
@@ -2,6 +2,7 @@ import base64
import hashlib
from six.moves.http_client import HTTPConnection
import io
+import json
import os
import threading
import traceback
@@ -615,15 +616,16 @@ class CallbackHandler(object):
except KeyError:
raise ValueError("Unknown action %s" % action)
try:
- action_handler(payload)
+ result = action_handler(payload)
except Exception:
self.logger.warning("Action %s failed" % action)
self.logger.warning(traceback.format_exc())
self._send_message("complete", "error")
raise
else:
- self.logger.debug("Action %s completed" % action)
- self._send_message("complete", "success")
+ self.logger.debug("Action %s completed with result %s" % (action, result))
+ return_message = {"result": result}
+ self._send_message("complete", "success", json.dumps(return_message))
return False, None
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js
index e23073dece1..9f97fac9a0c 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -3,6 +3,7 @@
(function(){
let pending_resolve = null;
let pending_reject = null;
+ let result = null;
window.addEventListener("message", function(event) {
const data = event.data;
@@ -15,7 +16,8 @@
}
if (data.status === "success") {
- pending_resolve();
+ result = JSON.parse(data.message).result
+ pending_resolve(result);
} else {
pending_reject();
}
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html
deleted file mode 100644
index e671c6fb61d..00000000000
--- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js" ></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support/helper.sub.js"></script>
-
-<meta http-equiv="Content-Security-Policy" content="trusted-types *">
-<body>
-<script>
- // Not exposed policy test
- test(t => {
- let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } );
- assert_equals(window.TrustedTypes.getExposedPolicy('SomeName'), null);
- }, "Null is returned when policy is not exposed - by default");
-
- // Non-existent policy test
- test(t => {
- assert_equals(window.TrustedTypes.getExposedPolicy('JustAName'), null);
- }, "Null is returned when policy is non-existent.");
-
- // Exposed policy test
- test(t => {
- let policy = window.TrustedTypes.createPolicy('SomeOtherName', { createHTML: s => s }, true );
- assert_equals(window.TrustedTypes.getExposedPolicy('SomeOtherName'), policy);
- }, "Policy is returned when exposed == true.");
-</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html
deleted file mode 100644
index a6dd2d1317a..00000000000
--- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js" ></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support/helper.sub.js"></script>
-<body>
-<script>
- //Policy name test
- test(t => {
- assert_throws("InvalidStateError", _ => {
- let policy = window.TrustedTypes.createPolicy('default', { createHTML: s => s } );
- });
- }, "default policy has to be exposed");
-</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html
deleted file mode 100644
index 137d0f54c82..00000000000
--- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js" ></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support/helper.sub.js"></script>
-
-<meta http-equiv="Content-Security-Policy" content="trusted-types *">
-<body>
-<script>
- // Not exposed policy test
- test(t => {
- let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } );
- assert_equals(window.TrustedTypes.getExposedPolicy('SomeName'), null);
- }, "Null is returned when policy is not exposed - by default");
-
- // Non-existent policy test
- test(t => {
- let policy = window.TrustedTypes.createPolicy('SomeOtherName', { createHTML: s => s } );
- assert_equals(window.TrustedTypes.getExposedPolicy('JustAName'), null);
- }, "Null is returned when policy is non-existent.");
-
- // Exposed policy test
- test(t => {
- let policy = window.TrustedTypes.createPolicy('EvenSomeOtherName', { createHTML: s => s }, true );
- assert_equals(window.TrustedTypes.getExposedPolicy('EvenSomeOtherName'), policy);
- }, "Policy is returned when exposed == true.");
-</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html
new file mode 100644
index 00000000000..ea00566854d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js" ></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<body>
+<script>
+ test(t => {
+ assert_equals(window.TrustedTypes.defaultPolicy, null);
+ }, "defaultPolicy with no default created is not an error");
+
+ test(t => {
+ let policy = window.TrustedTypes.createPolicy('default', { createHTML: s => s } );
+ assert_true(policy instanceof TrustedTypePolicy);
+ assert_equals(policy, window.TrustedTypes.defaultPolicy);
+ }, "defaultPolicy returns the correct default policy");
+
+ test(t => {
+ let foo_policy = window.TrustedTypes.createPolicy('foo', { createHTML: s => s } );
+ let default_policy = window.TrustedTypes.defaultPolicy;
+ window.TrustedTypes.defaultPolicy = foo_policy;
+ assert_equals(window.TrustedTypes.defaultPolicy, default_policy);
+ assert_not_equals(window.TrustedTypes.defaultPolicy, foo_policy);
+ }, "defaultPolicy is a read-only property");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html b/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html
index 8dda8b23c8f..16e6d2a7d8d 100644
--- a/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html
+++ b/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html
@@ -93,11 +93,14 @@
return p;
}, "Trusted Type violation report: creating a report-only-forbidden policy.");
+ // policy_one is set below, and used in several tests further down.
+ let policy_one = null;
+
promise_test(t => {
let p = Promise.resolve()
.then(promise_violation("trusted-types two"))
.then(promise_flush());
- TrustedTypes.createPolicy("one", a_policy, {exposed: true});
+ policy_one = TrustedTypes.createPolicy("one", a_policy);
flush();
return p;
}, "Trusted Type violation report: creating a forbidden-but-not-reported policy.");
@@ -114,25 +117,16 @@
return p;
}, "Trusted Type violation report: assign string to html");
- // In the following tests, we rely on the previous tests to have successfully
- // created an exposed, no-op policy "one". Let's briefly test that.
- promise_test(t => {
- assert_true(!!TrustedTypes.getExposedPolicy("one"));
- return Promise.resolve();
- }, "By now, the \"one\" policy should have been created.");
-
promise_test(t => {
let p = promise_flush()();
- document.getElementById("anchor").href =
- TrustedTypes.getExposedPolicy("one").createURL("#");
+ document.getElementById("anchor").href = policy_one.createURL("#");
flush();
return p;
}, "Trusted Type violation report: assign trusted URL to url; no report");
promise_test(t => {
let p = promise_flush()();
- document.getElementById("div").innerHTML =
- TrustedTypes.getExposedPolicy("one").createHTML("abc");
+ document.getElementById("div").innerHTML = policy_one.createHTML("abc");
flush();
return p;
}, "Trusted Type violation report: assign trusted HTML to html; no report");
diff --git a/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js
index a1d65030f02..a1d65030f02 100755..100644
--- a/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js
+++ b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html
index 97c7214ac75..5383b520bb4 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html
@@ -66,7 +66,7 @@ promise_test(async t => {
await animation.ready;
// If the current time was updated using the new playback rate it will jump
// back to 25s but if we correctly used the old playback rate the current time
- // will be >50s.
+ // will be > 50s.
assert_greater_than(animation.currentTime, 50 * MS_PER_SEC);
}, 'A pause-pending animation maintains the current time when applying a'
+ ' pending playback rate');
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
index 24d5046f483..6515a7fdd02 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
@@ -28,8 +28,8 @@
'toText() contains the same text content');
assert_equals(message.records[0].toArrayBuffer(), null,
'toArrayBuffer() returns null');
- assert_equals(message.records[0].toJSON(), undefined,
- 'toJSON() returns undefined');
+ assert_equals(message.records[0].toJSON(), null,
+ 'toJSON() returns null');
}, 'NDEFMessage constructor with a text record');
</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
index 2264815780b..4d6ec956eac 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
@@ -15,9 +15,9 @@
const record = new NDEFRecord(null);
assert_equals(record.recordType.length, 0, 'empty recordType');
assert_equals(record.mediaType.length, 0, 'empty mediaType');
- assert_equals(record.toText().length, 0, 'toText() gets an empty string');
+ assert_equals(record.toText(), null, 'toText() returns null');
assert_equals(record.toArrayBuffer(), null, 'toArrayBuffer() returns null');
- assert_equals(record.toJSON(), undefined, 'toJSON() returns undefined');
+ assert_equals(record.toJSON(), null, 'toJSON() returns null');
}, 'NDEFRecord constructor with null init dict');
test(() => {
diff --git a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js
index 76c878ae094..02f348ddf27 100644
--- a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js
+++ b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js
@@ -165,8 +165,8 @@ function assertWebNDEFMessagesEqual(message, expectedMessage) {
expectedJson = expectedRecord.toJSON();
} catch (e) {
}
- if (json === undefined)
- assert_equals(expectedJson, undefined);
+ if (json === undefined || json === null)
+ assert_equals(json, expectedJson);
else
assert_object_equals(json, expectedJson);
}
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html
new file mode 100644
index 00000000000..bcd2dd2942c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Reference for WebVTT rendering, set explicit 'line' and 'position', which will force 'snap-to-line' to false</title>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+html { overflow:hidden }
+body { margin:0 }
+.video {
+ display: inline-block;
+ width: 320px;
+ height: 180px;
+ position: relative;
+}
+.cue {
+ position: absolute;
+ top: 90px;
+ left: 160px;
+ text-align: center;
+ font: 20px/1 Ahem;
+}
+.cueText {
+ background: rgba(0,0,0,0.8);
+ color: green;
+}
+</style>
+<div class=video>
+ <div class="cue">
+ <span class="cueText">foo</span>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html
new file mode 100644
index 00000000000..f3705a1879b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>WebVTT rendering, set explicit 'line' and 'position', which will force 'snap-to-line' to false</title>
+<link rel="match" href="snap-to-line-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+html { overflow:hidden }
+body { margin:0 }
+::cue {
+ font: 20px/1 Ahem;
+ color: green;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+ <track src="support/snap-to-line.vtt">
+ <script>
+ document.getElementsByTagName('track')[0].track.mode = 'showing';
+ </script>
+</video>
+</html>
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt
new file mode 100644
index 00000000000..2d102812eeb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt
@@ -0,0 +1,5 @@
+WEBVTT
+
+NOTE set line as percentage would make 'snap-to-line' to false
+00:00:00.000 --> 00:00:05.000 align:start position:50%,line-left line:50%,start
+foo
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js
index a0b0e278a87..e0330b80f53 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js
@@ -112,16 +112,26 @@ const NON_IMMERSIVE_VIEWS = [{
}
];
+const ALL_FEATURES = [
+ "viewer",
+ "local",
+ "local-floor",
+ "bounded-floor",
+ "unbounded",
+];
+
const TRACKED_IMMERSIVE_DEVICE = {
supportsImmersive: true,
views: VALID_VIEWS,
- viewerOrigin: IDENTITY_TRANSFORM
+ viewerOrigin: IDENTITY_TRANSFORM,
+ supportedFeatures: ALL_FEATURES
};
const VALID_NON_IMMERSIVE_DEVICE = {
supportsImmersive: false,
views: NON_IMMERSIVE_VIEWS,
- viewerOrigin: IDENTITY_TRANSFORM
+ viewerOrigin: IDENTITY_TRANSFORM,
+ supportedFeatures: ALL_FEATURES
};
const VALID_CONTROLLER = {
diff --git a/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html b/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html
index 1d7ad93695a..812acf457c1 100644
--- a/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html
@@ -14,7 +14,8 @@ let fakeDeviceInitParams = {
supportsImmersive: true,
views: VALID_VIEWS,
viewerOrigin: IDENTITY_TRANSFORM,
- floorOrigin: VALID_FLOOR_ORIGIN
+ floorOrigin: VALID_FLOOR_ORIGIN,
+ supportedFeatures: ALL_FEATURES
};
let testFunction = function(session, fakeDeviceController, t) {
diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
index 516df836b1b..fd5fa68e1fc 100644
--- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
@@ -29,7 +29,8 @@ const VIEWS_WITH_OFFSET = [{
let fakeDeviceInitParams = {
supportsImmersive: true,
viewerOrigin: VALID_POSE_TRANSFORM,
- views: VIEWS_WITH_OFFSET
+ views: VIEWS_WITH_OFFSET,
+ supportedFeatures: ALL_FEATURES
};
let testFunction =
diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
index d0f91a4630d..5e2bd39d2de 100644
--- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
@@ -37,6 +37,7 @@ const fakeDeviceInitParams = {
views: VIEWS_WITH_OFFSET,
viewerOrigin: IDENTITY_TRANSFORM,
floorOrigin: FLOOR_TRANSFORM,
+ supportedFeatures: ALL_FEATURES,
boundsCoordinates: [
{ x: 1, z: -1.5 },
{ x: 1, z: 1.5 },
diff --git a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html
index d014fe6fb56..57c7ef1853e 100644
--- a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html
@@ -22,11 +22,14 @@ let testFunction =
let position = transform.position;
let orientation = transform.orientation;
+ let matrix = transform.matrix;
t.step(() => {
assert_equals(position, transform.position,
"XRRigidTransform.position returns the same object.");
assert_equals(orientation, transform.orientation,
"XRRigidTransform.orientation returns the same object.");
+ assert_equals(matrix, transform.matrix,
+ "XRRigidTransform.matrix returns the same object.");
});
resolve();
diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html
new file mode 100644
index 00000000000..45a68c9df2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<body>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<canvas></canvas>
+<script>
+
+ let testName =
+ "Immersive XRSession requests with no supported device should reject";
+
+ let fakeDeviceInitParams = {
+ supportsImmersive: true,
+ views: VALID_VIEWS,
+ viewerOrigin: IDENTITY_TRANSFORM,
+ supportedFeatures: [
+ "viewer",
+ "local",
+ "local-floor"]
+ };
+
+ xr_promise_test(testName,
+ (t) => {
+ function session_resolves(sessionMode, sessionInit) {
+ return navigator.xr.requestSession(sessionMode, sessionInit)
+ .then((session) => {
+ return session.end();
+ });
+ }
+
+ return navigator.xr.test.simulateDeviceConnection(fakeDeviceInitParams)
+ .then((controller) => new Promise((resolve, reject) => {
+ navigator.xr.test.simulateUserActivation(() => {
+ // Attempting to request required features that aren't supported by
+ // the device should reject.
+ promise_rejects(t, "NotSupportedError",
+ navigator.xr.requestSession("immersive-vr", {
+ requiredFeatures: ['bounded-floor']
+ }))
+ .then(() => {
+ // Attempting to request with an unsupported feature as optional
+ // should succeed
+ return session_resolves("immersive-vr", {
+ optionalFeatures: ['bounded-floor']
+ });
+ })
+ .then(() => {
+ // Attempting to request with supported features only should succeed.
+ return session_resolves("immersive-vr", {
+ requiredFeatures: ['local', 'local-floor']
+ })
+ .then(() => {
+ resolve();
+ }).catch((err) => {
+ reject(err);
+ });;
+ });
+ });
+ }));
+ });
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
index 9ddc36e95b3..70e9d6e6e59 100644
--- a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
@@ -16,7 +16,8 @@
let fakeDeviceInitParams = {
supportsImmersive: true,
- views: VALID_VIEWS
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES
};
// A valid pose matrix/transform for when we don't care about specific values
diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html
new file mode 100644
index 00000000000..686859166fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<body>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<canvas></canvas>
+<script>
+
+ let testName =
+ "Inline viewer support wtih no device";
+
+ // Purposefully not connecting a device to ensure that viewer is always
+ // supported if that is the only feature requested.
+ xr_promise_test(testName,
+ (t) => {
+ function session_resolves(sessionMode, sessionInit) {
+ return navigator.xr.requestSession(sessionMode, sessionInit)
+ .then((session) => {
+ return session.end();
+ });
+ }
+
+ // RequestSession with explicit request for the viewer space should succeed.
+ return session_resolves('inline', {
+ requiredFeatures: ['viewer']
+ })
+ .then(() => {
+ // RequestSession with no requirements should succeed.
+ return session_resolves('inline', {});
+ })
+ .then(() => {
+ // RequestSession with unsupported optional features should succeed.
+ return session_resolves('inline', {
+ requiredFeatures: ['viewer'],
+ optionalFeatures: ['local']
+ })
+ })
+ .then(() => {
+ // Request with unsupported required features should reject.
+ return promise_rejects(t, "NotSupportedError",
+ navigator.xr.requestSession('inline', {
+ requiredFeatures: ['local']
+ }));
+ });
+ });
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webxr/xrView_match.https.html b/tests/wpt/web-platform-tests/webxr/xrView_match.https.html
index 142f272d36f..9ccad9518b9 100644
--- a/tests/wpt/web-platform-tests/webxr/xrView_match.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrView_match.https.html
@@ -26,7 +26,8 @@ const fakeViews = [{
let fakeDeviceInitParams = {
supportsImmersive: true,
views: fakeViews,
- viewerOrigin: IDENTITY_TRANSFORM
+ viewerOrigin: IDENTITY_TRANSFORM,
+ supportedFeatures: ALL_FEATURES
};
let testFunction = function(session, fakeDeviceController, t) {
diff --git a/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html b/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html
index 9404fcb8aaf..4386433788c 100644
--- a/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html
@@ -27,7 +27,8 @@ const fakeViews = [{
let fakeDeviceInitParams = {
supportsImmersive: true,
views: fakeViews,
- viewerOrigin: IDENTITY_TRANSFORM
+ viewerOrigin: IDENTITY_TRANSFORM,
+ supportedFeatures: ALL_FEATURES
};
let testFunction = function(session, fakeDeviceController, t) {