aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWPT Sync Bot <josh+wptsync@joshmatthews.net>2020-04-25 08:18:23 +0000
committerWPT Sync Bot <josh+wptsync@joshmatthews.net>2020-04-25 11:14:57 +0000
commit55139554bae383d85dfe2f96a09d91af2e01da77 (patch)
treec10628dce8f4f330373c081c3bf1602cde88d422
parent537e575d3da0fff914f99e4c25026d119e8b6f90 (diff)
downloadservo-55139554bae383d85dfe2f96a09d91af2e01da77.tar.gz
servo-55139554bae383d85dfe2f96a09d91af2e01da77.zip
Update web-platform-tests to revision 78eae724c61bb01d858a01a324363e997ac66851
-rw-r--r--tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini33
-rw-r--r--tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini33
-rw-r--r--tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini13
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-011.html.ini (renamed from tests/wpt/metadata/css/css-transforms/transform-box/fill-box.html.ini)2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini547
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini13
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini (renamed from tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini)2
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini (renamed from tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini)2
-rw-r--r--tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini3503
-rw-r--r--tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini5
-rw-r--r--tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini226
-rw-r--r--tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini73
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini24
-rw-r--r--tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini6
-rw-r--r--tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini2
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json1699
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini33
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini33
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini13
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini4
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-011.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-012.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-013.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-014.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-015.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/gap-016.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini36
-rw-r--r--tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini13
-rw-r--r--tests/wpt/metadata/fetch/content-type/script.window.js.ini4
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini4
-rw-r--r--tests/wpt/metadata/html/dom/idlharness.https.html.ini9
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini7
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini5
-rw-r--r--tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini226
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini73
-rw-r--r--tests/wpt/metadata/webxr/idlharness.https.window.js.ini24
-rw-r--r--tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini4
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini6
-rw-r--r--tests/wpt/web-platform-tests/.taskcluster.yml2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html37
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html10
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js62
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js50
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js42
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html12
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html11
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/README.md11
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js5
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js5
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js5
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js991
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js1022
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js2
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js384
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js3
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py2
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py2
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js59
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py19
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py19
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html19
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html19
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html108
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html64
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html280
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-001.html (renamed from tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html28
-rw-r--r--tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html38
-rw-r--r--tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html16
-rw-r--r--tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html16
-rw-r--r--tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html16
-rw-r--r--tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js81
-rw-r--r--tests/wpt/web-platform-tests/event-timing/timingconditions.html6
-rw-r--r--tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html4
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/hr-time/idlharness.any.js1
-rw-r--r--tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html7
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl116
-rw-r--r--tests/wpt/web-platform-tests/interfaces/pointerevents.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl54
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webxr.idl6
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/resources/util.js1
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/sources.html38
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist9
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html25
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js1
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js1
-rw-r--r--tests/wpt/web-platform-tests/origin-policy/idlharness.any.js1
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js1
-rw-r--r--tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js1
-rw-r--r--tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html1
-rw-r--r--tests/wpt/web-platform-tests/resources/idlharness.js34
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html11
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html144
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html52
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html66
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/testcommon.js2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py20
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js3
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html61
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html93
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-basic.tentative.html (renamed from tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom.tentative.html)19
-rw-r--r--tests/wpt/web-platform-tests/storage/idlharness.https.any.js1
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg10
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/run_tc.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml4
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/Dockerfile2
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/README.md11
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/rules.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py64
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py3
-rw-r--r--tests/wpt/web-platform-tests/vibration/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js13
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js10
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js10
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js10
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js10
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html95
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js10
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html20
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html4
-rw-r--r--tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js1
-rw-r--r--tests/wpt/web-platform-tests/webxr/hit-test/idlharness.https.html (renamed from tests/wpt/web-platform-tests/hit-test/idlharness.https.html)0
-rw-r--r--tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html8
-rw-r--r--tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js4
-rw-r--r--tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm27
-rw-r--r--tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini3
366 files changed, 10282 insertions, 1999 deletions
diff --git a/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini b/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini
new file mode 100644
index 00000000000..3ba71c8de11
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini
@@ -0,0 +1,2 @@
+[drawImage-from-blob.tentative.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
index 3605e8f3fc9..76b44d9e9cf 100644
--- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -4,7 +4,7 @@
expected: TIMEOUT
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: TIMEOUT
+ expected: FAIL
[Fetching a blob URL immediately before revoking it works in an iframe.]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini
new file mode 100644
index 00000000000..ff201e24186
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini
@@ -0,0 +1,33 @@
+[class-string-interface.any.html]
+ [Object.prototype.toString applied to the prototype]
+ expected: FAIL
+
+ [Object.prototype.toString applied to a null-prototype instance]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying the prototype's @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists on the prototype with the appropriate descriptor]
+ expected: FAIL
+
+
+[class-string-interface.any.worker.html]
+ [Object.prototype.toString applied to the prototype]
+ expected: FAIL
+
+ [Object.prototype.toString applied to a null-prototype instance]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying the prototype's @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists on the prototype with the appropriate descriptor]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini
new file mode 100644
index 00000000000..0d1aec4f066
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini
@@ -0,0 +1,33 @@
+[class-string-iterator-prototype-object.any.html]
+ [Object.prototype.toString]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after nulling the prototype]
+ expected: FAIL
+
+
+[class-string-iterator-prototype-object.any.worker.html]
+ [Object.prototype.toString]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after nulling the prototype]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini
new file mode 100644
index 00000000000..353805a5a06
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini
@@ -0,0 +1,13 @@
+[class-string-named-properties-object.window.html]
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini
new file mode 100644
index 00000000000..f64b45fea6b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-002.html]
+ [Hit test float]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini
new file mode 100644
index 00000000000..f29da48a2a0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-003.html]
+ [Miss float below something else]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini
new file mode 100644
index 00000000000..d0b3bc98be7
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-iframe-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini
new file mode 100644
index 00000000000..c69b7cbb3b0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini
new file mode 100644
index 00000000000..25f76c60b9b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-transformed-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-011.html.ini
index 536029e626b..20e1b790822 100644
--- a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-011.html.ini
@@ -1,2 +1,2 @@
-[fill-box.html]
+[gap-011.html]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini
new file mode 100644
index 00000000000..9f3e416efc5
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini
@@ -0,0 +1,2 @@
+[gap-012.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini
new file mode 100644
index 00000000000..856975d6f05
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini
@@ -0,0 +1,2 @@
+[gap-013.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini
new file mode 100644
index 00000000000..f5e7fbecd47
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini
@@ -0,0 +1,2 @@
+[gap-014.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini
new file mode 100644
index 00000000000..660a042cb7f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini
@@ -0,0 +1,2 @@
+[gap-015.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini
new file mode 100644
index 00000000000..d1071378ed9
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini
@@ -0,0 +1,2 @@
+[gap-016.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini
new file mode 100644
index 00000000000..1569c50b18c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini
@@ -0,0 +1,2 @@
+[backface-visibility-hidden-animated.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini
new file mode 100644
index 00000000000..8e9e7b13e49
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini
@@ -0,0 +1,2 @@
+[fill-box-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini
new file mode 100644
index 00000000000..3f1877d85ad
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini
@@ -0,0 +1,2 @@
+[fill-box-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini
new file mode 100644
index 00000000000..d48f67c6c1f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini
@@ -0,0 +1,2 @@
+[transform-percent-010.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini
index f8e7e539aae..4a1e8110f6f 100644
--- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini
@@ -2,6 +2,3 @@
[Hit test intersecting scaled box]
expected: FAIL
- [Hit test within unscaled box]
- expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini
new file mode 100644
index 00000000000..338baf702a2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini
@@ -0,0 +1,547 @@
+[properties-value-inherit-002.html]
+ [outline-width length(px) / values]
+ expected: FAIL
+
+ [border-left-width length(em) / values]
+ expected: FAIL
+
+ [background-position length(pt) / values]
+ expected: FAIL
+
+ [background-position length(pt) / events]
+ expected: FAIL
+
+ [border-bottom-width length(px) / values]
+ expected: FAIL
+
+ [border-top-width length(em) / values]
+ expected: FAIL
+
+ [line-height number(decimal) / values]
+ expected: FAIL
+
+ [word-spacing length(mm) / values]
+ expected: FAIL
+
+ [text-indent length(pc) / values]
+ expected: FAIL
+
+ [opacity number[0,1\](zero-to-one) / values]
+ expected: FAIL
+
+ [line-height number(integer) / values]
+ expected: FAIL
+
+ [outline-offset length(px) / values]
+ expected: FAIL
+
+ [font-size length(pt) / values]
+ expected: FAIL
+
+ [max-height length(px) / values]
+ expected: FAIL
+
+ [vertical-align length(in) / values]
+ expected: FAIL
+
+ [right length(pc) / values]
+ expected: FAIL
+
+ [top length(pt) / values]
+ expected: FAIL
+
+ [max-height percentage(%) / values]
+ expected: FAIL
+
+ [background-position length(px) / values]
+ expected: FAIL
+
+ [min-width length(px) / values]
+ expected: FAIL
+
+ [border-top-color color(rgba) / values]
+ expected: FAIL
+
+ [background-position length(cm) / events]
+ expected: FAIL
+
+ [border-right-color color(rgba) / values]
+ expected: FAIL
+
+ [top length(pc) / values]
+ expected: FAIL
+
+ [font-size length(ex) / values]
+ expected: FAIL
+
+ [min-height length(pc) / values]
+ expected: FAIL
+
+ [background-position length(mm) / values]
+ expected: FAIL
+
+ [line-height length(px) / values]
+ expected: FAIL
+
+ [word-spacing length(px) / values]
+ expected: FAIL
+
+ [vertical-align percentage(%) / values]
+ expected: FAIL
+
+ [background-position length(in) / events]
+ expected: FAIL
+
+ [border-right-width length(pc) / values]
+ expected: FAIL
+
+ [line-height length(ex) / values]
+ expected: FAIL
+
+ [color color(rgba) / values]
+ expected: FAIL
+
+ [font-size length(in) / values]
+ expected: FAIL
+
+ [text-indent length(ex) / values]
+ expected: FAIL
+
+ [font-size length(em) / values]
+ expected: FAIL
+
+ [border-left-width length(mm) / values]
+ expected: FAIL
+
+ [vertical-align length(em) / values]
+ expected: FAIL
+
+ [text-indent length(px) / values]
+ expected: FAIL
+
+ [clip rectangle(rectangle) / values]
+ expected: FAIL
+
+ [word-spacing length(em) / values]
+ expected: FAIL
+
+ [border-right-width length(ex) / values]
+ expected: FAIL
+
+ [border-top-width length(cm) / values]
+ expected: FAIL
+
+ [right length(px) / values]
+ expected: FAIL
+
+ [max-width length(em) / values]
+ expected: FAIL
+
+ [background-position length(em) / events]
+ expected: FAIL
+
+ [font-size length(cm) / values]
+ expected: FAIL
+
+ [border-right-width length(cm) / values]
+ expected: FAIL
+
+ [top length(px) / values]
+ expected: FAIL
+
+ [outline-offset length(ex) / values]
+ expected: FAIL
+
+ [min-width length(cm) / values]
+ expected: FAIL
+
+ [min-height length(px) / values]
+ expected: FAIL
+
+ [min-width length(mm) / values]
+ expected: FAIL
+
+ [border-bottom-width length(in) / values]
+ expected: FAIL
+
+ [vertical-align length(pc) / values]
+ expected: FAIL
+
+ [vertical-align length(cm) / values]
+ expected: FAIL
+
+ [max-height length(ex) / values]
+ expected: FAIL
+
+ [vertical-align length(ex) / values]
+ expected: FAIL
+
+ [min-height percentage(%) / values]
+ expected: FAIL
+
+ [top percentage(%) / values]
+ expected: FAIL
+
+ [max-height length(pt) / values]
+ expected: FAIL
+
+ [outline-offset length(mm) / values]
+ expected: FAIL
+
+ [font-weight font-weight(keyword) / values]
+ expected: FAIL
+
+ [max-height length(mm) / values]
+ expected: FAIL
+
+ [outline-offset length(pt) / values]
+ expected: FAIL
+
+ [line-height length(mm) / values]
+ expected: FAIL
+
+ [line-height length(cm) / values]
+ expected: FAIL
+
+ [border-top-width length(mm) / values]
+ expected: FAIL
+
+ [letter-spacing length(in) / values]
+ expected: FAIL
+
+ [border-bottom-color color(rgba) / values]
+ expected: FAIL
+
+ [min-width percentage(%) / values]
+ expected: FAIL
+
+ [min-height length(cm) / values]
+ expected: FAIL
+
+ [letter-spacing length(mm) / values]
+ expected: FAIL
+
+ [font-size percentage(%) / values]
+ expected: FAIL
+
+ [letter-spacing length(cm) / values]
+ expected: FAIL
+
+ [vertical-align length(pt) / values]
+ expected: FAIL
+
+ [border-left-color color(rgba) / values]
+ expected: FAIL
+
+ [letter-spacing length(pc) / values]
+ expected: FAIL
+
+ [letter-spacing length(pt) / values]
+ expected: FAIL
+
+ [word-spacing length(ex) / values]
+ expected: FAIL
+
+ [line-height length(pt) / values]
+ expected: FAIL
+
+ [top length(em) / values]
+ expected: FAIL
+
+ [border-top-width length(px) / values]
+ expected: FAIL
+
+ [min-width length(pt) / values]
+ expected: FAIL
+
+ [border-bottom-width length(mm) / values]
+ expected: FAIL
+
+ [border-bottom-width length(cm) / values]
+ expected: FAIL
+
+ [min-width length(em) / values]
+ expected: FAIL
+
+ [min-height length(em) / values]
+ expected: FAIL
+
+ [max-width length(mm) / values]
+ expected: FAIL
+
+ [min-height length(ex) / values]
+ expected: FAIL
+
+ [background-position length(ex) / values]
+ expected: FAIL
+
+ [max-width length(px) / values]
+ expected: FAIL
+
+ [text-indent length(mm) / values]
+ expected: FAIL
+
+ [font-size length(mm) / values]
+ expected: FAIL
+
+ [min-width length(pc) / values]
+ expected: FAIL
+
+ [letter-spacing length(em) / values]
+ expected: FAIL
+
+ [background-position length(cm) / values]
+ expected: FAIL
+
+ [top length(in) / values]
+ expected: FAIL
+
+ [line-height length(em) / values]
+ expected: FAIL
+
+ [border-bottom-width length(pt) / values]
+ expected: FAIL
+
+ [word-spacing length(pc) / values]
+ expected: FAIL
+
+ [outline-offset length(in) / values]
+ expected: FAIL
+
+ [word-spacing length(in) / values]
+ expected: FAIL
+
+ [outline-width length(pt) / values]
+ expected: FAIL
+
+ [border-top-width length(pc) / values]
+ expected: FAIL
+
+ [border-left-width length(px) / values]
+ expected: FAIL
+
+ [font-size length(px) / values]
+ expected: FAIL
+
+ [border-left-width length(cm) / values]
+ expected: FAIL
+
+ [border-right-width length(px) / values]
+ expected: FAIL
+
+ [outline-width length(in) / values]
+ expected: FAIL
+
+ [word-spacing length(pt) / values]
+ expected: FAIL
+
+ [text-indent length(cm) / values]
+ expected: FAIL
+
+ [border-right-width length(mm) / values]
+ expected: FAIL
+
+ [max-width length(in) / values]
+ expected: FAIL
+
+ [outline-color color(rgba) / values]
+ expected: FAIL
+
+ [background-position length(ex) / events]
+ expected: FAIL
+
+ [text-indent length(pt) / values]
+ expected: FAIL
+
+ [border-right-width length(pt) / values]
+ expected: FAIL
+
+ [border-left-width length(in) / values]
+ expected: FAIL
+
+ [text-shadow shadow(shadow) / values]
+ expected: FAIL
+
+ [background-position length(pc) / events]
+ expected: FAIL
+
+ [max-height length(in) / values]
+ expected: FAIL
+
+ [line-height length(in) / values]
+ expected: FAIL
+
+ [border-bottom-width length(em) / values]
+ expected: FAIL
+
+ [outline-width length(ex) / values]
+ expected: FAIL
+
+ [font-size length(pc) / values]
+ expected: FAIL
+
+ [background-position length(in) / values]
+ expected: FAIL
+
+ [min-width length(in) / values]
+ expected: FAIL
+
+ [top length(cm) / values]
+ expected: FAIL
+
+ [outline-width length(cm) / values]
+ expected: FAIL
+
+ [max-width percentage(%) / values]
+ expected: FAIL
+
+ [max-width length(ex) / values]
+ expected: FAIL
+
+ [top length(mm) / values]
+ expected: FAIL
+
+ [letter-spacing length(ex) / values]
+ expected: FAIL
+
+ [border-left-width length(ex) / values]
+ expected: FAIL
+
+ [outline-width length(mm) / values]
+ expected: FAIL
+
+ [border-left-width length(pc) / values]
+ expected: FAIL
+
+ [outline-width length(pc) / values]
+ expected: FAIL
+
+ [word-spacing percentage(%) / values]
+ expected: FAIL
+
+ [font-weight font-weight(numeric) / values]
+ expected: FAIL
+
+ [vertical-align length(px) / values]
+ expected: FAIL
+
+ [letter-spacing length(px) / values]
+ expected: FAIL
+
+ [max-width length(pt) / values]
+ expected: FAIL
+
+ [line-height percentage(%) / values]
+ expected: FAIL
+
+ [text-indent length(in) / values]
+ expected: FAIL
+
+ [text-indent length(em) / values]
+ expected: FAIL
+
+ [border-top-width length(pt) / values]
+ expected: FAIL
+
+ [min-height length(mm) / values]
+ expected: FAIL
+
+ [background-position length(pc) / values]
+ expected: FAIL
+
+ [background-position percentage(%) / values]
+ expected: FAIL
+
+ [max-height length(cm) / values]
+ expected: FAIL
+
+ [top length(ex) / values]
+ expected: FAIL
+
+ [outline-width length(em) / values]
+ expected: FAIL
+
+ [border-right-width length(em) / values]
+ expected: FAIL
+
+ [max-height length(em) / values]
+ expected: FAIL
+
+ [max-width length(cm) / values]
+ expected: FAIL
+
+ [outline-offset length(em) / values]
+ expected: FAIL
+
+ [outline-offset length(cm) / values]
+ expected: FAIL
+
+ [background-position length(mm) / events]
+ expected: FAIL
+
+ [border-top-width length(ex) / values]
+ expected: FAIL
+
+ [border-right-width length(in) / values]
+ expected: FAIL
+
+ [z-index integer(integer) / values]
+ expected: FAIL
+
+ [border-left-width length(pt) / values]
+ expected: FAIL
+
+ [vertical-align length(mm) / values]
+ expected: FAIL
+
+ [border-bottom-width length(pc) / values]
+ expected: FAIL
+
+ [text-indent percentage(%) / values]
+ expected: FAIL
+
+ [line-height length(pc) / values]
+ expected: FAIL
+
+ [right length(pt) / values]
+ expected: FAIL
+
+ [background-position length(em) / values]
+ expected: FAIL
+
+ [border-top-width length(in) / values]
+ expected: FAIL
+
+ [border-bottom-width length(ex) / values]
+ expected: FAIL
+
+ [min-height length(in) / values]
+ expected: FAIL
+
+ [outline-offset length(pc) / values]
+ expected: FAIL
+
+ [max-height length(pc) / values]
+ expected: FAIL
+
+ [background-color color(rgba) / values]
+ expected: FAIL
+
+ [min-height length(pt) / values]
+ expected: FAIL
+
+ [word-spacing length(cm) / values]
+ expected: FAIL
+
+ [background-position percentage(%) / events]
+ expected: FAIL
+
+ [max-width length(pc) / values]
+ expected: FAIL
+
+ [background-position length(px) / events]
+ expected: FAIL
+
+ [min-width length(ex) / values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
index 628b1fab770..c884dc82eab 100644
--- a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
@@ -2,3 +2,6 @@
[listeners are called when <iframe> is resized]
expected: FAIL
+ [listeners are called correct number of times]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
deleted file mode 100644
index e181af5397f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[elementsFromPoint-invalid-cases.html]
- [The root element is the last element returned for otherwise empty queries within the viewport]
- expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
index 834b2440fbd..75d0a21d9dd 100644
--- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
@@ -318,9 +318,18 @@
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;x=" text/plain]
+ [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini
index ac4cbcba706..279734168dc 100644
--- a/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini
@@ -53,9 +53,9 @@
[combined text/javascript ]
expected: FAIL
- [separate text/javascript;charset=windows-1252 error text/javascript]
+ [separate text/javascript x/x]
expected: FAIL
- [separate text/javascript x/x]
+ [separate text/javascript;charset=windows-1252 text/javascript]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
index 87c807a49ff..a63e414f43a 100644
--- a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,3 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
+ [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
index dc2e45516de..75d75b4cda2 100644
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_5.html]
+[traverse_the_history_2.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
index dc2e45516de..51f8272a6de 100644
--- a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_5.html]
+[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini
new file mode 100644
index 00000000000..8621ae89f18
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini
@@ -0,0 +1,3503 @@
+[idlharness.https.html?exclude=(Document|Window|HTML.*)]
+ [DataTransferItem interface: operation getAsFile()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute filter]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondrop]
+ expected: FAIL
+
+ [SVGElement interface: attribute onreset]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation getLineDash()]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragend]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onprogress]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fill(optional CanvasFillRule)]
+ expected: FAIL
+
+ [BarProp interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [SharedWorker interface: existence and properties of interface object]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmouseleave]
+ expected: FAIL
+
+ [DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ApplicationCache interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [DataTransferItemList interface: operation add(File)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onloadstart]
+ expected: FAIL
+
+ [External interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ApplicationCache must be primary interface of window.applicationCache]
+ expected: FAIL
+
+ [SVGElement interface: attribute onended]
+ expected: FAIL
+
+ [ElementInternals interface object length]
+ expected: FAIL
+
+ [ElementInternals interface: operation reportValidity()]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onbeforeprint]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation scrollPathIntoView()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowColor]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwebkitanimationend]
+ expected: FAIL
+
+ [DragEvent interface: attribute dataTransfer]
+ expected: FAIL
+
+ [DataTransfer interface: operation clearData(optional DOMString)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation convertToBlob(optional ImageEncodeOptions)]
+ expected: FAIL
+
+ [ElementInternals interface: operation setValidity(ValidityStateFlags, optional DOMString, optional HTMLElement)]
+ expected: FAIL
+
+ [DOMStringList interface: calling item(unsigned long) on location.ancestorOrigins with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [DataTransferItemList interface: operation clear()]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragstart]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpageshow]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onauxclick]
+ expected: FAIL
+
+ [SVGElement interface: attribute ontoggle]
+ expected: FAIL
+
+ [SVGElement interface: attribute onload]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onunload]
+ expected: FAIL
+
+ [SVGElement interface: attribute onplay]
+ expected: FAIL
+
+ [DataTransferItem interface object length]
+ expected: FAIL
+
+ [SVGElement interface: attribute onselect]
+ expected: FAIL
+
+ [DataTransfer interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setLineDash(sequence<unrestricted double>)]
+ expected: FAIL
+
+ [ApplicationCache interface: constant UNCACHED on interface object]
+ expected: FAIL
+
+ [DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpagehide]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute oninvalid]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onstorage]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute strokeStyle]
+ expected: FAIL
+
+ [ElementInternals interface: attribute labels]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncopy]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation commit()]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation setLineDash(sequence<unrestricted double>)]
+ expected: FAIL
+
+ [DataTransferItemList interface object name]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onunhandledrejection]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragenter]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncut]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, optional any)]
+ expected: FAIL
+
+ [SVGElement interface: attribute oninput]
+ expected: FAIL
+
+ [SVGElement interface: attribute onsubmit]
+ expected: FAIL
+
+ [DataTransferItemList interface: attribute length]
+ expected: FAIL
+
+ [DataTransfer interface: operation getData(DOMString)]
+ expected: FAIL
+
+ [Path2D interface: operation closePath()]
+ expected: FAIL
+
+ [Path2D interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [History interface: attribute scrollRestoration]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute direction]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwebkitanimationstart]
+ expected: FAIL
+
+ [Navigator interface: operation registerProtocolHandler(DOMString, USVString)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onclose]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type]
+ expected: FAIL
+
+ [External interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute status]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [External interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [SVGElement interface: attribute onchange]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineWidth]
+ expected: FAIL
+
+ [BarProp interface: attribute visible]
+ expected: FAIL
+
+ [ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute canvas]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onsuspend]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)]
+ expected: FAIL
+
+ [SharedWorker interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncuechange]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onloadeddata]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation closePath()]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute ononline]
+ expected: FAIL
+
+ [SVGElement interface: attribute onemptied]
+ expected: FAIL
+
+ [SVGElement interface: attribute onkeyup]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondblclick]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [Stringification of window.external]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type]
+ expected: FAIL
+
+ [ElementInternals interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash(sequence<unrestricted double>)" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncanplaythrough]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncontextmenu]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute lineDashOffset]
+ expected: FAIL
+
+ [BarProp interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [History interface: window.history must inherit property "scrollRestoration" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: constant UPDATEREADY on interface prototype object]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "onLine" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [BarProp interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [SharedWorker interface: attribute port]
+ expected: FAIL
+
+ [ApplicationCache interface: constant OBSOLETE on interface prototype object]
+ expected: FAIL
+
+ [SVGElement interface: attribute onclick]
+ expected: FAIL
+
+ [DragEvent interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)]
+ expected: FAIL
+
+ [DataTransfer interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute fillStyle]
+ expected: FAIL
+
+ [Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [ElementInternals interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondurationchange]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
+ expected: FAIL
+
+ [External interface: window.external must inherit property "AddSearchProvider()" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface object length]
+ expected: FAIL
+
+ [SVGElement interface: attribute onsecuritypolicyviolation]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation resetTransform()]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [DataTransferItem interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality]
+ expected: FAIL
+
+ [SVGElement interface: attribute onprogress]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, optional CanvasFillRule)]
+ expected: FAIL
+
+ [ApplicationCache interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute imageSmoothingQuality]
+ expected: FAIL
+
+ [DOMStringList interface: calling contains(DOMString) on location.ancestorOrigins with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Navigator interface: attribute hardwareConcurrency]
+ expected: FAIL
+
+ [ApplicationCache interface: constant CHECKING on interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineJoin]
+ expected: FAIL
+
+ [WebSocket interface: attribute extensions]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncanplay]
+ expected: FAIL
+
+ [Stringification of window.applicationCache]
+ expected: FAIL
+
+ [Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [ElementInternals interface: attribute validationMessage]
+ expected: FAIL
+
+ [DataTransfer interface: attribute dropEffect]
+ expected: FAIL
+
+ [SharedWorker interface: attribute onerror]
+ expected: FAIL
+
+ [OffscreenCanvas interface: attribute height]
+ expected: FAIL
+
+ [Stringification of location.ancestorOrigins]
+ expected: FAIL
+
+ [External interface: operation IsSearchProviderInstalled()]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwheel]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type]
+ expected: FAIL
+
+ [DataTransferItemList interface object length]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute oncached]
+ expected: FAIL
+
+ [DataTransferItemList interface: operation remove(unsigned long)]
+ expected: FAIL
+
+ [BarProp interface object length]
+ expected: FAIL
+
+ [SVGElement interface: attribute onstalled]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onbeforeunload]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface object name]
+ expected: FAIL
+
+ [Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)]
+ expected: FAIL
+
+ [External interface: operation AddSearchProvider()]
+ expected: FAIL
+
+ [BarProp interface object name]
+ expected: FAIL
+
+ [ApplicationCache interface: constant IDLE on interface prototype object]
+ expected: FAIL
+
+ [DOMStringList must be primary interface of location.ancestorOrigins]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)]
+ expected: FAIL
+
+ [DataTransfer interface: operation setDragImage(Element, long, long)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onpaste]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute font]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "oscpu" with the proper type]
+ expected: FAIL
+
+ [Location interface: window.location must have own property "ancestorOrigins"]
+ expected: FAIL
+
+ [CanvasPattern interface: operation setTransform(optional DOMMatrix2DInit)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onscroll]
+ expected: FAIL
+
+ [DOMStringList interface: location.ancestorOrigins must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: constant UNCACHED on interface prototype object]
+ expected: FAIL
+
+ [Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute textBaseline]
+ expected: FAIL
+
+ [SVGElement interface: attribute dataset]
+ expected: FAIL
+
+ [DataTransferItemList interface: operation add(DOMString, DOMString)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwebkittransitionend]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onoffline]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type]
+ expected: FAIL
+
+ [Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [SVGElement interface: attribute autofocus]
+ expected: FAIL
+
+ [External interface object length]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute filter]
+ expected: FAIL
+
+ [SVGElement interface: attribute ontimeupdate]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmouseover]
+ expected: FAIL
+
+ [Path2D interface: operation addPath(Path2D, optional DOMMatrix2DInit)]
+ expected: FAIL
+
+ [BarProp interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ApplicationCache interface: operation abort()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clip(optional CanvasFillRule)]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragover]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "languages" with the proper type]
+ expected: FAIL
+
+ [DragEvent interface object name]
+ expected: FAIL
+
+ [ApplicationCache interface: operation swapCache()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute globalAlpha]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface object]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation getContextAttributes()]
+ expected: FAIL
+
+ [Navigator interface: attribute oscpu]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [DataTransfer interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)]
+ expected: FAIL
+
+ [SharedWorker interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onnoupdate]
+ expected: FAIL
+
+ [Path2D interface: existence and properties of interface object]
+ expected: FAIL
+
+ [External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation beginPath()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, optional CanvasFillRule)]
+ expected: FAIL
+
+ [SVGElement interface: attribute tabIndex]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondrag]
+ expected: FAIL
+
+ [SVGElement interface: attribute onerror]
+ expected: FAIL
+
+ [SVGElement interface: attribute onplaying]
+ expected: FAIL
+
+ [DataTransfer interface: attribute items]
+ expected: FAIL
+
+ [External must be primary interface of window.external]
+ expected: FAIL
+
+ [Path2D interface object name]
+ expected: FAIL
+
+ [ApplicationCache interface: constant OBSOLETE on interface object]
+ expected: FAIL
+
+ [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onchecking]
+ expected: FAIL
+
+ [DataTransferItemList interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [DataTransferItem interface: attribute kind]
+ expected: FAIL
+
+ [External interface object name]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwebkitanimationiteration]
+ expected: FAIL
+
+ [Path2D interface object length]
+ expected: FAIL
+
+ [Path2D interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [DragEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineCap]
+ expected: FAIL
+
+ [OffscreenCanvas interface: attribute width]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowBlur]
+ expected: FAIL
+
+ [ApplicationCache interface: constant DOWNLOADING on interface object]
+ expected: FAIL
+
+ [DataTransferItem interface: attribute type]
+ expected: FAIL
+
+ [Navigator interface: attribute languages]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute direction]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpopstate]
+ expected: FAIL
+
+ [DOMStringList interface: location.ancestorOrigins must inherit property "contains(DOMString)" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [DOMStringList interface: location.ancestorOrigins must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface object name]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getTransform()]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmouseenter]
+ expected: FAIL
+
+ [Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)]
+ expected: FAIL
+
+ [SharedWorker interface object length]
+ expected: FAIL
+
+ [Path2D interface: operation lineTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)]
+ expected: FAIL
+
+ [CustomElementRegistry interface: operation whenDefined(DOMString)]
+ expected: FAIL
+
+ [DragEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type]
+ expected: FAIL
+
+ [ElementInternals interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
+ expected: FAIL
+
+ [ElementInternals interface: attribute willValidate]
+ expected: FAIL
+
+ [OffscreenCanvas interface object length]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [DataTransferItem interface: operation getAsString(FunctionStringCallback?)]
+ expected: FAIL
+
+ [SVGElement interface: attribute nonce]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)]
+ expected: FAIL
+
+ [ImageBitmap interface: operation close()]
+ expected: FAIL
+
+ [DataTransfer interface: attribute files]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [ElementInternals interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvas interface object name]
+ expected: FAIL
+
+ [SVGElement interface: attribute onresize]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmousemove]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onafterprint]
+ expected: FAIL
+
+ [External interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute textAlign]
+ expected: FAIL
+
+ [ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onvolumechange]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [DataTransfer interface: attribute effectAllowed]
+ expected: FAIL
+
+ [SharedWorker interface object name]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: attribute canvas]
+ expected: FAIL
+
+ [Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onslotchange]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface object length]
+ expected: FAIL
+
+ [DataTransfer interface object name]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragexit]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmousedown]
+ expected: FAIL
+
+ [SVGElement interface: attribute onpause]
+ expected: FAIL
+
+ [SVGElement interface: attribute onformdata]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap?)]
+ expected: FAIL
+
+ [DragEvent interface object length]
+ expected: FAIL
+
+ [ApplicationCache interface: constant UPDATEREADY on interface object]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmouseout]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: attribute onLine]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface object length]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getLineDash()]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onmessage]
+ expected: FAIL
+
+ [ElementInternals interface object name]
+ expected: FAIL
+
+ [SVGElement interface: attribute onmouseup]
+ expected: FAIL
+
+ [SVGElement interface: attribute onblur]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, optional CanvasFillRule)]
+ expected: FAIL
+
+ [ElementInternals interface: attribute validity]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute textAlign]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation restore()]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type]
+ expected: FAIL
+
+ [DataTransferItem interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ElementInternals interface: operation checkValidity()]
+ expected: FAIL
+
+ [Location interface: stringifier]
+ expected: FAIL
+
+ [SVGElement interface: attribute onkeypress]
+ expected: FAIL
+
+ [DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [SVGElement interface: attribute oncancel]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onupdateready]
+ expected: FAIL
+
+ [SVGElement interface: operation focus(optional FocusOptions)]
+ expected: FAIL
+
+ [ApplicationCache interface object name]
+ expected: FAIL
+
+ [DataTransferItemList interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onerror]
+ expected: FAIL
+
+ [ApplicationCache interface: constant DOWNLOADING on interface prototype object]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onmessageerror]
+ expected: FAIL
+
+ [TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type]
+ expected: FAIL
+
+ [WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onhashchange]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling setLineDash(sequence<unrestricted double>) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: attribute promise]
+ expected: FAIL
+
+ [SharedWorker interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ApplicationCache interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [ApplicationCache interface: constant CHECKING on interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation stroke()]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface object]
+ expected: FAIL
+
+ [TextTrack interface: attribute inBandMetadataTrackDispatchType]
+ expected: FAIL
+
+ [DataTransferItem interface object name]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute ondownloading]
+ expected: FAIL
+
+ [Navigator interface: calling registerProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SVGElement interface: operation blur()]
+ expected: FAIL
+
+ [DataTransfer interface: operation setData(DOMString, DOMString)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute miterLimit]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, optional CanvasFillRule)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onseeked]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onlanguagechange]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onabort]
+ expected: FAIL
+
+ [DataTransferItem interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onrejectionhandled]
+ expected: FAIL
+
+ [ElementInternals interface: attribute form]
+ expected: FAIL
+
+ [SVGElement interface: attribute onratechange]
+ expected: FAIL
+
+ [Path2D interface: operation moveTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [DragEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation setTransform(optional DOMMatrix2DInit)]
+ expected: FAIL
+
+ [ApplicationCache interface: operation update()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute font]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)]
+ expected: FAIL
+
+ [SVGElement interface: attribute onwaiting]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute ondragleave]
+ expected: FAIL
+
+ [DataTransfer interface object length]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SVGElement interface: attribute onfocus]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setTransform(optional DOMMatrix2DInit)]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation transferToImageBitmap()]
+ expected: FAIL
+
+ [SVGElement interface: attribute onseeking]
+ expected: FAIL
+
+ [DataTransfer interface: attribute types]
+ expected: FAIL
+
+ [SVGElement interface: attribute onloadedmetadata]
+ expected: FAIL
+
+ [SVGElement interface: attribute onkeydown]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: attribute textBaseline]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: constant IDLE on interface object]
+ expected: FAIL
+
+ [DataTransfer interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation save()]
+ expected: FAIL
+
+ [ApplicationCache interface: attribute onobsolete]
+ expected: FAIL
+
+ [ElementInternals interface: operation setFormValue((File or USVString or FormData)?, optional (File or USVString or FormData)?)]
+ expected: FAIL
+
+
+[idlharness.https.html?include=(Document|Window)]
+ [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "external" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute onwebkitanimationstart]
+ expected: FAIL
+
+ [Window interface: window must inherit property "statusbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onwebkittransitionend" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandEnabled(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: operation createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions)]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onwebkitanimationstart" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandIndeterm(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onwebkitanimationend" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "dir" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onwebkitanimationiteration" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute onsecuritypolicyviolation]
+ expected: FAIL
+
+ [Window interface: window must inherit property "applicationCache" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onauxclick]
+ expected: FAIL
+
+ [Window interface: window must inherit property "menubar" with the proper type]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onwebkitanimationiteration" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandSupported(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: attribute designMode]
+ expected: FAIL
+
+ [Document interface: attribute dir]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "designMode" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions)" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute locationbar]
+ expected: FAIL
+
+ [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: attribute onwebkitanimationiteration]
+ expected: FAIL
+
+ [Document interface: operation queryCommandEnabled(DOMString)]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [Window interface: operation print()]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "vlinkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute all]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [Window interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: operation focus()]
+ expected: FAIL
+
+ [Window interface: attribute scrollbars]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onslotchange" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "alinkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "dir" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onslotchange" with the proper type]
+ expected: FAIL
+
+ [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique]
+ expected: FAIL
+
+ [Window interface: attribute applicationCache]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onwebkitanimationstart" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onslotchange]
+ expected: FAIL
+
+ [Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onwebkitanimationiteration" with the proper type]
+ expected: FAIL
+
+ [Document interface: operation queryCommandSupported(DOMString)]
+ expected: FAIL
+
+ [Document interface: attribute onwebkittransitionend]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "all" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute linkColor]
+ expected: FAIL
+
+ [Window interface: attribute onwebkitanimationiteration]
+ expected: FAIL
+
+ [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions)" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "scrollbars" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute personalbar]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "designMode" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onwebkitanimationiteration" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute toolbar]
+ expected: FAIL
+
+ [Window interface: attribute statusbar]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onwebkittransitionend" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "linkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute alinkColor]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute onwebkittransitionend]
+ expected: FAIL
+
+ [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onslotchange" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "designMode" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "queryCommandValue(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: operation queryCommandValue(DOMString)]
+ expected: FAIL
+
+ [Window interface: window must inherit property "personalbar" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onwebkitanimationend]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "dir" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "blur()" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: operation execCommand(DOMString, optional boolean, optional DOMString)]
+ expected: FAIL
+
+ [Document interface: attribute onsecuritypolicyviolation]
+ expected: FAIL
+
+ [Window interface: attribute menubar]
+ expected: FAIL
+
+ [Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: operation queryCommandState(DOMString)]
+ expected: FAIL
+
+ [Document interface: attribute vlinkColor]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: operation blur()]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "alinkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: attribute onslotchange]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "all" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "all" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "print()" with the proper type]
+ expected: FAIL
+
+ [Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions)]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "focus()" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onwebkitanimationstart" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onwebkitanimationstart]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandValue(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: attribute external]
+ expected: FAIL
+
+ [Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: attribute onauxclick]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "queryCommandSupported(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onwebkitanimationend" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "toolbar" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "linkColor" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onwebkitanimationend" with the proper type]
+ expected: FAIL
+
+ [Document interface: operation queryCommandIndeterm(DOMString)]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onwebkittransitionend" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: attribute onwebkitanimationend]
+ expected: FAIL
+
+ [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "queryCommandState(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onwebkittransitionend" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "vlinkColor" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "locationbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onwebkitanimationstart" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling queryCommandState(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
+ expected: FAIL
+
+
+[idlharness.https.html?include=HTML.*]
+ [HTMLFormElement interface: calling requestSubmit(optional HTMLElement?) on document.createElement("form") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "getSVGDocument()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: calling assignedNodes(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute ping]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute marginHeight]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: operation attachInternals()]
+ expected: FAIL
+
+ [HTMLVideoElement interface: attribute playsInline]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: operation toBlob(BlobCallback, optional DOMString, optional any)]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: attribute seekable]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute codeBase]
+ expected: FAIL
+
+ [HTMLSlotElement interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute src]
+ expected: FAIL
+
+ [HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(optional AssignedNodesOptions)" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: attribute ch]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute loop]
+ expected: FAIL
+
+ [HTMLAllCollection interface: operation namedItem(DOMString)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: attribute cols]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute accessKey]
+ expected: FAIL
+
+ [HTMLFormElement interface: attribute rel]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type]
+ expected: FAIL
+
+ [HTMLHRElement interface: attribute size]
+ expected: FAIL
+
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute sizes]
+ expected: FAIL
+
+ [HTMLParamElement interface: attribute value]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface object length]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLAllCollection interface object length]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: attribute chOff]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: attribute length]
+ expected: FAIL
+
+ [HTMLLegendElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute hspace]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute vspace]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute vAlign]
+ expected: FAIL
+
+ [HTMLQuoteElement interface: attribute cite]
+ expected: FAIL
+
+ [HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type]
+ expected: FAIL
+
+ [HTMLMapElement interface: attribute name]
+ expected: FAIL
+
+ [HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute ch]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute value]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute marginWidth]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type]
+ expected: FAIL
+
+ [Stringification of document.createElement("marquee")]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute protocol]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: attribute vAlign]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLFieldSetElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLOListElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: operation getSVGDocument()]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute longDesc]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute decoding]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute vAlign]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLStyleElement interface: attribute media]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: operation getSVGDocument()]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "autocapitalize" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onsecuritypolicyviolation]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: attribute selectedOptions]
+ expected: FAIL
+
+ [HTMLBodyElement interface: attribute aLink]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute noResize]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute noWrap]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: stringifier]
+ expected: FAIL
+
+ [HTMLSlotElement interface: existence and properties of interface object]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type]
+ expected: FAIL
+
+ [HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute name]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type]
+ expected: FAIL
+
+ [HTMLHeadingElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: operation play()]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface object name]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute border]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "decoding" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onwebkitanimationiteration]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onslotchange]
+ expected: FAIL
+
+ [HTMLVideoElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute marginWidth]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute low]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLElement interface: attribute autofocus]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLDirectoryElement interface: attribute compact]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLAudioElement interface: named constructor without 'new']
+ expected: FAIL
+
+ [HTMLSlotElement interface: calling assignedElements(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute name]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute contentDocument]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute onstart]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: attribute position]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute shape]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute vspace]
+ expected: FAIL
+
+ [HTMLSlotElement must be primary interface of document.createElement("slot")]
+ expected: FAIL
+
+ [HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onwebkitanimationend]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute axis]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute files]
+ expected: FAIL
+
+ [Stringification of document.all]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type]
+ expected: FAIL
+
+ [HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute frame]
+ expected: FAIL
+
+ [HTMLParamElement interface: attribute valueType]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute summary]
+ expected: FAIL
+
+ [HTMLDialogElement interface: operation show()]
+ expected: FAIL
+
+ [HTMLUListElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute longDesc]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute abbr]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute scrollDelay]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: calling toBlob(BlobCallback, optional DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: document.all must inherit property "item(optional DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute ch]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLBodyElement interface: attribute vLink]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: operation requestSubmit(optional HTMLElement?)]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: operation decode()]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute contentWindow]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute lowsrc]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type]
+ expected: FAIL
+
+ [HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLElement interface: attribute enterKeyHint]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute optimum]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: attribute relList]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [HTMLParagraphElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute ping]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute hreflang]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute cellSpacing]
+ expected: FAIL
+
+ [HTMLMarqueeElement must be primary interface of document.createElement("marquee")]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute marginHeight]
+ expected: FAIL
+
+ [HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLScriptElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute tabIndex]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onwebkitanimationstart]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "loading" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: operation stop()]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute frameBorder]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute rel]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "decode()" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute bgColor]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute data]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: operation transferControlToOffscreen()]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface object name]
+ expected: FAIL
+
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLUListElement interface: attribute compact]
+ expected: FAIL
+
+ [HTMLOListElement interface: attribute compact]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute high]
+ expected: FAIL
+
+ [HTMLProgressElement interface: attribute max]
+ expected: FAIL
+
+ [HTMLBRElement interface: attribute clear]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type]
+ expected: FAIL
+
+ [HTMLHtmlElement interface: attribute version]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute download]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute max]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute trueSpeed]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute loading]
+ expected: FAIL
+
+ [HTMLBodyElement interface: attribute link]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute download]
+ expected: FAIL
+
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute rules]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute origin]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: attribute chOff]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute hash]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [HTMLAllCollection interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface object name]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: document.all must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type]
+ expected: FAIL
+
+ [HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute inputMode]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute behavior]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationend" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type]
+ expected: FAIL
+
+ [HTMLLIElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute scope]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute href]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: attribute ch]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute chOff]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLOListElement interface: attribute reversed]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute headers]
+ expected: FAIL
+
+ [HTMLModElement interface: attribute cite]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLVideoElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: calling item(optional DOMString) on document.all with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLAllCollection interface: operation item(optional DOMString)]
+ expected: FAIL
+
+ [HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute password]
+ expected: FAIL
+
+ [HTMLMapElement interface: attribute areas]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute as]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: named constructor without 'new']
+ expected: FAIL
+
+ [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLPreElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute declare]
+ expected: FAIL
+
+ [HTMLMetaElement interface: attribute scheme]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute imageSizes]
+ expected: FAIL
+
+ [HTMLTableCaptionElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute alt]
+ expected: FAIL
+
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute contentWindow]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLParamElement interface: attribute name]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute accessKeyLabel]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLDialogElement interface: operation showModal()]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: attribute height]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute referrerPolicy]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: document.createElement("form") must inherit property "requestSubmit(optional HTMLElement?)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLAnchorElement interface: attribute charset]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute coords]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute useMap]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute spellcheck]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute archive]
+ expected: FAIL
+
+ [HTMLMetaElement interface: attribute httpEquiv]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute noHref]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: attribute vAlign]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute onfinish]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, optional DOMString, optional any)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onauxclick]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute useMap]
+ expected: FAIL
+
+ [HTMLElement interface: attribute draggable]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute direction]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute border]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: attribute autocomplete]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute port]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: attribute name]
+ expected: FAIL
+
+ [Stringification of document.createElement("slot")]
+ expected: FAIL
+
+ [HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute hostname]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute span]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute codeType]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute src]
+ expected: FAIL
+
+ [HTMLAllCollection interface: existence and properties of interface object]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: operation getSVGDocument()]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute allowPaymentRequest]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: operation assignedElements(optional AssignedNodesOptions)]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute host]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute code]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type]
+ expected: FAIL
+
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLOListElement interface: attribute start]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute sizes]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLBaseElement interface: attribute target]
+ expected: FAIL
+
+ [HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: attribute htmlFor]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute standby]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [HTMLParamElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: operation start()]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute name]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute search]
+ expected: FAIL
+
+ [HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "decode()" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "loading" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: operation getStartDate()]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onwebkittransitionend]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type]
+ expected: FAIL
+
+ [HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type]
+ expected: FAIL
+
+ [HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute width]
+ expected: FAIL
+
+ [HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "decoding" with the proper type]
+ expected: FAIL
+
+ [HTMLAllCollection interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [HTMLImageElement interface: named constructor without 'new']
+ expected: FAIL
+
+ [HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface object length]
+ expected: FAIL
+
+ [HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: attribute autocomplete]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute align]
+ expected: FAIL
+
+ [HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute username]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: attribute nonce]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute autocomplete]
+ expected: FAIL
+
+ [HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: attribute hspace]
+ expected: FAIL
+
+ [HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(optional AssignedNodesOptions)" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLTableElement interface: attribute cellPadding]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" with the proper type]
+ expected: FAIL
+
+ [HTMLStyleElement interface: attribute type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: attribute min]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute contentDocument]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: existence and properties of interface object]
+ expected: FAIL
+
+ [HTMLElement interface: attribute autocapitalize]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: attribute rows]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute imageSrcset]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLTableColElement interface: attribute chOff]
+ expected: FAIL
+
+ [HTMLFrameElement interface: attribute scrolling]
+ expected: FAIL
+
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute onbounce]
+ expected: FAIL
+
+ [HTMLModElement interface: attribute dateTime]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: attribute scrollAmount]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute scrolling]
+ expected: FAIL
+
+ [HTMLDListElement interface: attribute compact]
+ expected: FAIL
+
+ [HTMLHRElement interface: attribute noShade]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLIFrameElement interface: attribute allow]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: attribute value]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type]
+ expected: FAIL
+
+ [HTMLAreaElement interface: attribute pathname]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type]
+ expected: FAIL
+
+ [HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLOptGroupElement interface: attribute label]
+ expected: FAIL
+
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: operation assignedNodes(optional AssignedNodesOptions)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index af14e19a466..d81ae5a4949 100644
--- a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -7,14 +7,11 @@
expected: NOTRUN
[Element with tabindex should support autofocus]
- expected: TIMEOUT
+ expected: FAIL
[Area element should support autofocus]
expected: NOTRUN
[Host element with delegatesFocus should support autofocus]
- expected: NOTRUN
-
- [Non-HTMLElement should not support autofocus]
- expected: NOTRUN
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index d913fcbb129..3080be9afc0 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-1.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index 0407f0cc2b7..9eb581fcf1f 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-2.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
index a1effd5f801..5ddb9bfeff6 100644
--- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
@@ -1,9 +1,10 @@
[promise-job-entry.html]
+ expected: TIMEOUT
[Fulfillment handler on fulfilled promise]
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: FAIL
+ expected: TIMEOUT
[Sanity check: this all works as expected with no promises involved]
expected: FAIL
@@ -15,5 +16,5 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini b/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini
new file mode 100644
index 00000000000..4af6bc07bbf
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini
@@ -0,0 +1,226 @@
+[proto-from-ctor-realm.html]
+ [WebAssembly.Table: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
index 77e81d04bc6..939fce46e68 100644
--- a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
+++ b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
@@ -98,3 +98,6 @@
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 39026.\n\t[39026\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
expected: FAIL
+ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 40530 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 29020.\n\t[29020\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini
new file mode 100644
index 00000000000..ba041c725fd
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini
@@ -0,0 +1,73 @@
+[idlharness.https.html]
+ [XRTransientInputHitTestSource interface object length]
+ expected: FAIL
+
+ [XRFrame interface: operation getHitTestResultsForTransientInput(XRTransientInputHitTestSource)]
+ expected: FAIL
+
+ [XRRay interface: new XRRay() must inherit property "matrix" with the proper type]
+ expected: FAIL
+
+ [XRSession interface: operation requestHitTestSource(XRHitTestOptionsInit)]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface object name]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface object name]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [XRSession interface: calling requestHitTestSource(XRHitTestOptionsInit) on xrSession with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: attribute results]
+ expected: FAIL
+
+ [XRSession interface: calling requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit) on xrSession with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: attribute inputSource]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)" with the proper type]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [idl_test setup]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "requestHitTestSource(XRHitTestOptionsInit)" with the proper type]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: operation cancel()]
+ expected: FAIL
+
+ [XRSession interface: operation requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface object length]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
index fd188fe15cb..9450b890385 100644
--- a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
@@ -278,3 +278,27 @@
[XRSession interface: operation end()]
expected: FAIL
+ [XRLayer interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRLayer interface object name]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [XRWebGLLayer interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRWebGLLayer interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRLayer interface object length]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini
deleted file mode 100644
index fe8654e447c..00000000000
--- a/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[WorkerGlobalScope-close.html]
- [Test sending a message after closing.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini
new file mode 100644
index 00000000000..80f9a4f15b8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini
@@ -0,0 +1,2 @@
+[Worker-constructor.html]
+ expected: ERROR
diff --git a/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini b/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini
index ea90f546c38..a97490ae566 100644
--- a/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini
+++ b/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini
@@ -26,3 +26,9 @@
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (308 FOO with string and explicit Content-Type multipart/form-data)]
expected: FAIL
+ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (302 POST with string and explicit Content-Type)]
+ expected: FAIL
+
+ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (301 POST with string and explicit Content-Type)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini
new file mode 100644
index 00000000000..3ba71c8de11
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini
@@ -0,0 +1,2 @@
+[drawImage-from-blob.tentative.html]
+ expected: TIMEOUT
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 faa00f45ecf..d4f62ed7113 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: TIMEOUT
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index adb68e3e2e5..9056496675b 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -23821,6 +23821,19 @@
{}
]
],
+ "drawImage-from-blob.tentative.html": [
+ "633f7e4f7e3e8b5e36129f54fe7a0fb46642144a",
+ [
+ null,
+ [
+ [
+ "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"drawImage-from-element-orientation-none.tentative.html": [
"e18beb9e3cd78cd6bc575f06e5904cc8d21ee63e",
[
@@ -118357,6 +118370,45 @@
{}
]
],
+ "background-margin-iframe-root.html": [
+ "08464fc9eb408f892a9a9922c3d923c380e82d26",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/background-margin-iframe-root-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "background-margin-root.html": [
+ "cbba6c012d0efd79fd18430d32d93554b11932d0",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/background-margin-root-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "background-margin-transformed-root.html": [
+ "87129f38184deb949cbdfb07e42ca5f35237f410",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/background-margin-transformed-root-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"background-origin-002.html": [
"e86311f799f442c9fe634763408dfe4623977891",
[
@@ -136859,6 +136911,84 @@
{}
]
],
+ "gap-011.html": [
+ "d1d579e30b8779634d94d4bfc5cfdcfd6200e9f6",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gap-012.html": [
+ "19b39b9a783d0aef9db8a0bef2c04c489a62bf21",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gap-013.html": [
+ "30e4c43e7193525ab6c7ea88b472d6b05b8204da",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gap-014.html": [
+ "c600478c73cd6436ddfd6e025612f1b74d401699",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gap-015.html": [
+ "e54598e2000f727b0b5bf6091bc002b635779d4e",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gap-016.html": [
+ "a54417725678f99e77773805dc8a70b86eb77c9e",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"image-items-flake-001.html": [
"90319f1ad83d26d414d8ddcd4a9ab59042a4bd62",
[
@@ -178162,6 +178292,19 @@
{}
]
],
+ "backface-visibility-hidden-animated.html": [
+ "6cdefad6620eef19e3bb61f2b590cbc4597e76c9",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/backface-visibility-hidden-animated-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"composited-under-rotateY-180deg-clip-perspective.html": [
"c694adf71d16cdfe365756ae05ec1818c61c9a32",
[
@@ -182432,8 +182575,8 @@
]
],
"transform-box": {
- "fill-box-mutation-001.html": [
- "1f0dfd01bb9ab6acf183721f23f8590293e9e32f",
+ "fill-box-001.html": [
+ "7e9b133aead426b36702e5377c3cd1347e36ff5f",
[
null,
[
@@ -182445,8 +182588,8 @@
{}
]
],
- "fill-box-mutation-002.html": [
- "676d5cdd03b25ce2c5d25df03237819196fa1a66",
+ "fill-box-002.html": [
+ "9044048e387ec7e0a35c053ea1c425d964d4f6c2",
[
null,
[
@@ -182458,8 +182601,21 @@
{}
]
],
- "fill-box.html": [
- "7e9b133aead426b36702e5377c3cd1347e36ff5f",
+ "fill-box-mutation-001.html": [
+ "1f0dfd01bb9ab6acf183721f23f8590293e9e32f",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/transform-box/reference/greensquare200x200.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "fill-box-mutation-002.html": [
+ "676d5cdd03b25ce2c5d25df03237819196fa1a66",
[
null,
[
@@ -184924,6 +185080,19 @@
{}
]
],
+ "transform-percent-010.html": [
+ "92ebe78c1d504ed19e941f4522f5b6f42d2c3107",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/transform-box/reference/greensquare200x200.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"transform-propagate-inherit-boolean-001.html": [
"1e27e76862f6e25e15544e1c2d7e1785aa7ce719",
[
@@ -235635,6 +235804,19 @@
{}
]
],
+ "url-reference-local-textpath.svg": [
+ "c90cfb317f474e5d0d8a53d2b869637fe64fba5b",
+ [
+ null,
+ [
+ [
+ "/svg/linking/reftests/reference/green-100x100.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"use-descendant-combinator-001.html": [
"5619e0ba6902656eacab0e69da808eb352247aa2",
[
@@ -240812,7 +240994,7 @@
[]
],
".taskcluster.yml": [
- "556b9914d5b53f72010dd59831c710623a64ed57",
+ "7f794e8c2b0a4f042df6c5e9669db8f5b6a035fc",
[]
],
".well-known": {
@@ -241157,6 +241339,10 @@
"e945762eac716c5278eca8a0d1a6815a372f97b7",
[]
],
+ "drawImage-from-blob-ref.html": [
+ "72bd98fa2528eb9c420311287491a27d3301934c",
+ []
+ ],
"drawImage-from-element-orientation-none-ref.html": [
"b1e0c0849235cc13010f67ee26c58114c08c960a",
[]
@@ -244521,7 +244707,7 @@
[]
],
"README.md": [
- "e7997c9fa26d86cb614bb5ad0dc5fdaa11d21f41",
+ "abe277712bc41d1d5f70a08d09e2e09945a156ab",
[]
],
"generate.py": [
@@ -244533,12 +244719,16 @@
[]
],
"resources": {
- "bluetooth-helpers.js": [
- "2d863b16037b3c1bcd5a222409cd7398d1fe078b",
+ "bluetooth-fake-devices.js": [
+ "3bbcc6b322e435a4d8d5b70d59b43d29ccc3bf71",
[]
],
"bluetooth-scanning-helpers.js": [
- "9b173e6367ce2173336299e4ea005668ca53a03f",
+ "f474c9c3066f247f8f28558284e4de5d6326ff79",
+ []
+ ],
+ "bluetooth-test.js": [
+ "d2c6bcbdb73061d704eb5bc9ddf1b135e68ed9e8",
[]
],
"health-thermometer-iframe.html": [
@@ -244548,7 +244738,7 @@
},
"script-tests": {
"base_test_js.template": [
- "c0fa4aed552db72575b8344c7e495680eac84916",
+ "e677f00f087d2d4bb4071543a2cee9a7da0ae851",
[]
],
"characteristic": {
@@ -244752,8 +244942,16 @@
[]
],
"resources": {
+ "accept-ch-and-redir-to-do-not-expect.py": [
+ "eaca03fe76d474264226061ce639eb421dd28c94",
+ []
+ ],
+ "accept-ch-and-redir-to-expect.py": [
+ "835ef396b8bae0294088bc0231422c8c0f446a45",
+ []
+ ],
"accept-ch-test.js": [
- "46b499a5e4180f0ec1548f37ed2230af3eb7c5a8",
+ "5275057c3e5b4b8b4eeee81942b8bdfefa79233e",
[]
],
"accept-ch.html": [
@@ -244776,6 +244974,10 @@
"147206b26aeb8fe3f4813e4b1f68d7a59b658c46",
[]
],
+ "do-not-expect-received.py": [
+ "6b0e61af9dbaef571a1373c4d1020105bf38459e",
+ []
+ ],
"echo-client-hints-received.py": [
"be712293be3c749d98d328dd2fec7334da4ad9b2",
[]
@@ -244784,6 +244986,10 @@
"cda1f81978d9a8dbc7dd12286d8885f16007b9e0",
[]
],
+ "expect-received.py": [
+ "5aab578ae3482dc32da85658bac0d7fcb4b0bc87",
+ []
+ ],
"feature-policy-with-cross-origin-subresource.html": [
"88d1ac826fe773b8c20a0e1fb00520c0192d7037",
[]
@@ -284745,6 +284951,18 @@
"f52cd963ad25238bafc2081b7024aa5375614f5a",
[]
],
+ "background-margin-iframe-root-ref.html": [
+ "e7f00b00e8c1229592f8dde05b5252d91e0ebff2",
+ []
+ ],
+ "background-margin-root-ref.html": [
+ "2e5ec36ec086386addbb802bfb295cf76cb2c583",
+ []
+ ],
+ "background-margin-transformed-root-ref.html": [
+ "2e5ec36ec086386addbb802bfb295cf76cb2c583",
+ []
+ ],
"background-origin": {
"list.txt": [
"a6fdedde542b154bbd33a090981da966ce5e6197",
@@ -287764,7 +287982,7 @@
[]
],
"gap-001-lr-ref.html": [
- "d772748564f855ae26a97c10fd495170758f0a63",
+ "25c0c5cb357793ff8b9361684868a3a48505ea19",
[]
],
"gap-001-ltr-ref.html": [
@@ -287772,15 +287990,15 @@
[]
],
"gap-001-rl-ref.html": [
- "66d104a86d1c637da6e535e172580b591bef6720",
+ "5aac91817f3fb458d8b11d814818dedb98bbe49f",
[]
],
"gap-001-rtl-ref.html": [
- "7556857e052e715070257629c93158943d8fb254",
+ "bb0cf3c0eb07ad1889c3a706f5853801ce92bcea",
[]
],
"gap-002-lr-ref.html": [
- "f9c0c55eaafc9053a5491e1b25a559d20aaf5f17",
+ "8d761c6dfbcf00e0111a09f0787a09a12c4f819f",
[]
],
"gap-002-ltr-ref.html": [
@@ -287788,7 +288006,7 @@
[]
],
"gap-002-rl-ref.html": [
- "c9148e2976a5d5969d8d0352be4236241a30c5cd",
+ "9310e9ae4884706b4712e1497b26e5a7b0f3cea7",
[]
],
"gap-002-rtl-ref.html": [
@@ -303819,6 +304037,10 @@
"a6d5672c9dfe95c990c538f5596094eb2a9615bc",
[]
],
+ "backface-visibility-hidden-animated-ref.html": [
+ "3441050a59dd521aa2ad061ea514c8a4e90dc244",
+ []
+ ],
"composited-under-rotateY-180deg-clip-perspective-ref.html": [
"ebd2d860cec74ba0d535637934aca8dadf90571d",
[]
@@ -317382,7 +317604,7 @@
[]
],
"event-timing-test-utils.js": [
- "cc824d9cba6e795865aeb7efb5b9f173d1fb670b",
+ "bceaa5053d55efb8d86d5d70acb5b872bfbaf45a",
[]
],
"slow-image.py": [
@@ -330725,7 +330947,7 @@
[]
],
"cssom.idl": [
- "f102510db4792b726ef853d140565486e21d0e87",
+ "b7d9c33d596c3882e14ffa2fa1dee99e087ecedf",
[]
],
"dom.idl": [
@@ -330805,7 +331027,7 @@
[]
],
"html.idl": [
- "a8b9b423301d1d7aadd5d88ec472dcd5c888b9ec",
+ "c9018f1b63decf799cef7274c3f402d56b47fbef",
[]
],
"image-capture.idl": [
@@ -330957,7 +331179,7 @@
[]
],
"pointerevents.idl": [
- "728fff98d919cc8134f2dd6148cefcc439ff4e39",
+ "8a42b5a8446b843c01f6a76c824bdf022b36b646",
[]
],
"pointerlock.idl": [
@@ -331145,7 +331367,7 @@
[]
],
"webrtc-stats.idl": [
- "e3c2da8d2abc7ba27ea9ce673ebc3fa0d673c505",
+ "24b76ad0fe64505d637d441ca182321f0c7479a2",
[]
],
"webrtc-svc.idl": [
@@ -331173,7 +331395,7 @@
[]
],
"webxr.idl": [
- "5f5320c205598b2c8cec340326686f6589d14984",
+ "2d83277526ddc70f14226a25d9b4523d6a19b90b",
[]
],
"worklets.idl": [
@@ -331312,7 +331534,7 @@
[]
],
"util.js": [
- "515914e11fadc9c1f5e0b44994c52a9374eca1c6",
+ "2ef971ddb79166bbf8c6593c4d57ca3a5feca83b",
[]
]
}
@@ -331358,7 +331580,7 @@
]
},
"lint.whitelist": [
- "42102299396167fb05a9dbba5d48b0c1ae55ff8b",
+ "726b64c56acfa5800899c9366caa21f3b26fc8c2",
[]
],
"loading": {
@@ -336235,7 +336457,7 @@
]
},
"idlharness.js": [
- "d01da49c2d58959178bac9594d974eb729c0efa7",
+ "a5e2ca0b25ab698fad527074e72166797c218d5e",
[]
],
"idlharness.js.headers": [
@@ -336777,7 +336999,7 @@
]
},
"testcommon.js": [
- "2a89d8e022f2ee5f90c33c5097f199c92f3906e8",
+ "733b5f9f643ee47e14d7706f35c79a60eb007491",
[]
]
},
@@ -337853,6 +338075,10 @@
"f30e5ed274dd560b4c5a33ddab364221ef644a13",
[]
],
+ "cookie.py": [
+ "60688d943823ad57d7d31e40f0c6aca404aaae45",
+ []
+ ],
"empty-preload-response-body-scope.html": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
@@ -337869,6 +338095,10 @@
"86f0c0916ec99f0cc519f05da0d4702afb5ef1f4",
[]
],
+ "navigation-preload-worker.js": [
+ "6e1ab232907fe3c1e976057bf0ebb1cc79b0648b",
+ []
+ ],
"redirect-redirected.html": [
"f9bfce5e895379fc6944185eab35a2007a7dbc75",
[]
@@ -340918,7 +341148,7 @@
[]
],
"run_tc.py": [
- "e8dfa6163e55054e5a18743cb89d94925f92f405",
+ "a5a8ca7db29ab484fe397475f9b5cfc412d6517f",
[]
],
"taskcluster-run.py": [
@@ -340948,7 +341178,7 @@
],
"tasks": {
"test.yml": [
- "562239c31e3a5a0592160a3186279316e0b306dc",
+ "d2d76df13a753643e0e32d4237ad19b9823e1742",
[]
]
},
@@ -341010,11 +341240,11 @@
[]
],
"Dockerfile": [
- "0a842de1ab857d1f655b9365df61f3fa978e31be",
+ "f3927fd0d71ccf292d9699d597a479945a8e5114",
[]
],
"README.md": [
- "8b0737359ea5fa64f4a8c1c7536705951166bc18",
+ "9342aded298bdd0e5daac12289c78163d1d5bec5",
[]
],
"__init__.py": [
@@ -341082,11 +341312,11 @@
[]
],
"lint.py": [
- "2cfd41e967ec70f0e750dbf4fd9e617314d2fabf",
+ "1762049d1982069c58cf76fd30e2187a8f1e9070",
[]
],
"rules.py": [
- "b36681d092af15c6484bf2525443cbafe27b1592",
+ "6fbdc1c360dddc498a30a797eed029abee133a69",
[]
],
"tests": {
@@ -347082,12 +347312,12 @@
[]
],
"chromium.py": [
- "62ed53865d7825da8fd81608cf7e1302cf0650bc",
+ "086560b6a873cdc9fefd3b8b8b7a53b0173b3870",
[]
],
"tests": {
"test_chromium.py": [
- "cb6f1ad370f2faafaa8311b82e9126ce9afd327d",
+ "2a5d3e79280cb5563747becdda4afe188d3b60e0",
[]
]
},
@@ -347333,7 +347563,7 @@
[]
],
"wpttest.py": [
- "1e27f90d91a5cd907a1de1701fbb571c517ef16b",
+ "8f828ff43abf72c9e3332e7e1eb0bf09f5caaf88",
[]
]
},
@@ -348317,6 +348547,10 @@
"afd41936d3e0459b77f4e7fd4cda6b1754b9d4da",
[]
],
+ "error-interfaces-no-symbol-tostringtag.js": [
+ "572db0c01b620dd317f2079df6d0ea7cff6333fe",
+ []
+ ],
"instanceTestFactory.js": [
"c81672f208b1505430dd1ee909afaf12d9b2db20",
[]
@@ -353304,7 +353538,7 @@
[]
],
"WorkerNavigator.js": [
- "eec2f6884a10562a0d21ab076b90e099dbb8891a",
+ "88e994959b3ae0202ffe77fd7e43204620085998",
[]
],
"WorkerSendingPerformanceNow.js": [
@@ -371103,6 +371337,35 @@
]
],
"ecmascript-binding": {
+ "class-string-interface.any.js": [
+ "ee792d5368389b4f855474bd8077b8d7afd93b19",
+ [
+ "WebIDL/ecmascript-binding/class-string-interface.any.html",
+ {}
+ ],
+ [
+ "WebIDL/ecmascript-binding/class-string-interface.any.worker.html",
+ {}
+ ]
+ ],
+ "class-string-iterator-prototype-object.any.js": [
+ "2185ae0bb7bac6aec4d69c9cbf364eb4754427bd",
+ [
+ "WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.html",
+ {}
+ ],
+ [
+ "WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.worker.html",
+ {}
+ ]
+ ],
+ "class-string-named-properties-object.window.js": [
+ "ad466188baed439ab46dd60a157789c0c95db980",
+ [
+ "WebIDL/ecmascript-binding/class-string-named-properties-object.window.html",
+ {}
+ ]
+ ],
"constructors.html": [
"61993a6200ed56f3664ef72c74839b2d1feaa3b1",
[
@@ -371248,7 +371511,7 @@
]
],
"interface-prototype-object.html": [
- "03ada7aa0d4d43811652fc679a00a41b9653013d",
+ "d2d43eda9a94688ffd707a3ed8f89c28e74324c4",
[
null,
{}
@@ -371262,7 +371525,7 @@
]
],
"iterator-prototype-object.html": [
- "466973dc08f0e309ef847283d7fd4fb46a528d0b",
+ "7859c1e46ac46463f070bf2b48a38f54d2e8a8cd",
[
null,
{}
@@ -372431,7 +372694,7 @@
"bluetooth": {
"adapter": {
"adapter-absent-getAvailability.https.window.js": [
- "a9f540ecd34331271e27b99f74e155f40b41f6ec",
+ "55f4a675da158ac8cd116ea4346c39ff11195f21",
[
"bluetooth/adapter/adapter-absent-getAvailability.https.window.html",
{
@@ -372446,14 +372709,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"adapter-added-getAvailability.https.window.js": [
- "30c47201f072206e548cc5ea3417c91383fffcc7",
+ "f8e25b2ac2fc48b865ce7f9e3702a7688f89dbc3",
[
"bluetooth/adapter/adapter-added-getAvailability.https.window.html",
{
@@ -372468,14 +372735,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"adapter-powered-off-getAvailability.https.window.js": [
- "b760d4bc2728212a025b7d8fd1a34c002e62840b",
+ "1ffcd3bb096cebd80c34d5c57cadc8c00a128d2a",
[
"bluetooth/adapter/adapter-powered-off-getAvailability.https.window.html",
{
@@ -372490,14 +372761,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"adapter-powered-on-getAvailability.https.window.js": [
- "f98a88eea9e1d2e0adb21d616802931af09c2481",
+ "84c7982d2146b8660d098e21c1c30496a189549a",
[
"bluetooth/adapter/adapter-powered-on-getAvailability.https.window.html",
{
@@ -372512,14 +372787,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"adapter-powered-on-off-on-getAvailability.https.window.js": [
- "ac664a8981267007ada522bfd610209995dbfe16",
+ "c4ba9b5f3a9b13eaba51a3d29cfa62405816753e",
[
"bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.html",
{
@@ -372534,14 +372813,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"adapter-removed-getAvailability.https.window.js": [
- "00425aa56f25fb208503c46cb12a2f422ee141f5",
+ "ca0b51f47dc6807b79a861d85ea5a7f2549e691a",
[
"bluetooth/adapter/adapter-removed-getAvailability.https.window.html",
{
@@ -372556,14 +372839,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"cross-origin-iframe-getAvailability.sub.https.window.js": [
- "ce633c63f981921cbb9ea2ab5f2f71a839cb8acb",
+ "54abfbb5cefcb364be4c01f34e40a62ca49156d7",
[
"bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.html",
{
@@ -372578,7 +372865,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372587,7 +372878,7 @@
},
"characteristic": {
"characteristicProperties.https.window.js": [
- "5239accab97942ea1ff8e1cccd3bc383977e915d",
+ "f7a57a9c4b8922249976d4f980c3e07555b05969",
[
"bluetooth/characteristic/characteristicProperties.https.window.html",
{
@@ -372602,7 +372893,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372610,7 +372905,7 @@
],
"getDescriptor": {
"gen-characteristic-is-removed.https.window.js": [
- "eb91e972c4e537f6eea30c844358ef4a30d911eb",
+ "7789f4b7c4693a89c8f9a41e5d3c613ff43ba12a",
[
"bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.html",
{
@@ -372625,14 +372920,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-descriptor-get-same-object.https.window.js": [
- "4cff64bbdad180314b76784ea4f0720ba6df83fd",
+ "01d4e8f30f82d7f87af7ee6ae5168e36d87bafcf",
[
"bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.html",
{
@@ -372647,14 +372946,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed.https.window.js": [
- "f5d1761994abc3800dbc6e62ee4357fbceeb26f5",
+ "16b34dc09124ea7be5777fbd5040eb96b84171c7",
[
"bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.html",
{
@@ -372669,7 +372972,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372678,7 +372985,7 @@
},
"getDescriptors": {
"gen-characteristic-is-removed-with-uuid.https.window.js": [
- "7405a8ee6e3a5fc4a78061b30f98608b2946f545",
+ "b924f052d37dc4ba1a91d41fa7605862543d2dc8",
[
"bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.html",
{
@@ -372693,14 +373000,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-characteristic-is-removed.https.window.js": [
- "470f7043be314bf6e7c0678806c948cb0591e2ed",
+ "ae8127c87b3c41f5dae6f3793e6ebdf5b5e05fcd",
[
"bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.html",
{
@@ -372715,14 +373026,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-descriptor-get-same-object.https.window.js": [
- "1dc58aea155206df60f567bbba3560887d6f24a0",
+ "11dd8bee80a77d132cc15c4662d81270fe1e513c",
[
"bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.html",
{
@@ -372737,14 +373052,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed-with-uuid.https.window.js": [
- "5ee7e0d24943bc939ee2a2b9bbf7940d212d1218",
+ "13e2e3751a8843ca5054f48192aa92abf2a153c4",
[
"bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.html",
{
@@ -372759,14 +373078,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed.https.window.js": [
- "24a2087e938fed32a63c9b0fed8ca20b437be6b4",
+ "99056cf209a78f34732a64299b6feb871864a66b",
[
"bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.html",
{
@@ -372781,7 +373104,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372790,7 +373117,7 @@
},
"notifications": {
"characteristic-is-removed.https.window.js": [
- "2ab165d9044520d62f4d4fb334b4f148c865ecab",
+ "9641ad71e970aeb8b4b53b6b7f1415cc28e889e6",
[
"bluetooth/characteristic/notifications/characteristic-is-removed.https.window.html",
{
@@ -372805,14 +373132,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"service-is-removed.https.window.js": [
- "d2456934d83dc75720dff84429932a157094cf56",
+ "a5851fc473323741f9f2a3a6f793287e4b2cd1ab",
[
"bluetooth/characteristic/notifications/service-is-removed.https.window.html",
{
@@ -372827,7 +373158,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372836,7 +373171,7 @@
},
"readValue": {
"add-multiple-event-listeners.https.window.js": [
- "13709ea941ed5ca54f6b2e38d4017afa3c9995c2",
+ "0eeafd0b79ba30fe7325c48727c13c3cf4fc3fab",
[
"bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.html",
{
@@ -372851,14 +373186,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"characteristic-is-removed.https.window.js": [
- "269f2cb4a1f010a972a156090763ebb152fcb5c2",
+ "e97b94f73664bb2e1639715827c8ba870021f4e6",
[
"bluetooth/characteristic/readValue/characteristic-is-removed.https.window.html",
{
@@ -372873,14 +373212,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"event-is-fired.https.window.js": [
- "03b8f2b4cee8ec0c77630d15dbb7df711921f6c4",
+ "52b70e7a080e870c27bf86d9ba591292f0b273bb",
[
"bluetooth/characteristic/readValue/event-is-fired.https.window.html",
{
@@ -372895,14 +373238,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-characteristic-is-removed.https.window.js": [
- "26efe8b306b4a99e7ac4a34f153c1b909f029cf7",
+ "e2599a16faec6c9cdcfa3b27a206f6488e1909d1",
[
"bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.html",
{
@@ -372917,14 +373264,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"read-succeeds.https.window.js": [
- "82be128f31242ccc55a761c09a992a1132064faa",
+ "e5ddfb81696c009743622929d3c490a6469e4c4b",
[
"bluetooth/characteristic/readValue/read-succeeds.https.window.html",
{
@@ -372939,14 +373290,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"read-updates-value.https.window.js": [
- "34da455ddff4a91ee16f969b096f7821fb2d00bc",
+ "bb98aeb18f2dcd068735d8d492dc604ead3970e4",
[
"bluetooth/characteristic/readValue/read-updates-value.https.window.html",
{
@@ -372961,14 +373316,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"service-is-removed.https.window.js": [
- "20dd4ba1c05e5850f16234d693c32dab0350bd4e",
+ "1f699ca25eebcd35e0dc76be4be735d7dfd801b6",
[
"bluetooth/characteristic/readValue/service-is-removed.https.window.html",
{
@@ -372983,7 +373342,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -372991,7 +373354,7 @@
]
},
"service-same-from-2-characteristics.https.window.js": [
- "b34b3b9216abec77727dcda84a83e07f3eedb210",
+ "dafd755fd1d49b48bcd0a2623a07a5f6855a8164",
[
"bluetooth/characteristic/service-same-from-2-characteristics.https.window.html",
{
@@ -373006,14 +373369,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"service-same-object.https.window.js": [
- "b58902ae51957b91ee63eb4f53acd1c0e353f7ef",
+ "01b3a25e35e4a8c2e8a1626e12de90e625dda0a8",
[
"bluetooth/characteristic/service-same-object.https.window.html",
{
@@ -373028,7 +373395,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373036,7 +373407,7 @@
],
"startNotifications": {
"gen-characteristic-is-removed.https.window.js": [
- "af27f933d8f10207caf1574befa6d9f64767fc45",
+ "62d0d15d10b57992bdf2f60c5582cdb06e8f1673",
[
"bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.html",
{
@@ -373051,7 +373422,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373060,7 +373435,7 @@
},
"writeValue": {
"buffer-is-detached.https.window.js": [
- "d900632c4b509099b272007861d513f2f8e16388",
+ "5d707775e11663579793f1a639ef1029e9f89d71",
[
"bluetooth/characteristic/writeValue/buffer-is-detached.https.window.html",
{
@@ -373075,14 +373450,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"characteristic-is-removed.https.window.js": [
- "c0f5a3e6509c91efb5dae8cb9a3b07875ab6051b",
+ "6e9da8802c7adf343d0dd9683c2b03afe11d28e2",
[
"bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.html",
{
@@ -373097,14 +373476,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-characteristic-is-removed.https.window.js": [
- "d5ac10fc611443cdde02761448e6f479390bf790",
+ "2ceeabdb145db08b4ad481eb3dbff94e36f3b6d0",
[
"bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.html",
{
@@ -373119,14 +373502,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"service-is-removed.https.window.js": [
- "e7a2837c389a1076b548dc5256fe78eaa1059162",
+ "89c3112475012de82ca637ec09fbd372f76516fc",
[
"bluetooth/characteristic/writeValue/service-is-removed.https.window.html",
{
@@ -373141,14 +373528,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"write-succeeds.https.window.js": [
- "cdda9cec345b81297966b74ab2152f02010ec6b7",
+ "d5c173c47aefe80bb0eed42f2942694d3546ee7b",
[
"bluetooth/characteristic/writeValue/write-succeeds.https.window.html",
{
@@ -373163,7 +373554,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373174,7 +373569,7 @@
"descriptor": {
"readValue": {
"gen-service-is-removed.https.window.js": [
- "aa95687094b50340503d8cc5bcdeaec7e5bf3bdf",
+ "2c46b99fd1de291992ca8f4d13364bfad9f43b02",
[
"bluetooth/descriptor/readValue/gen-service-is-removed.https.window.html",
{
@@ -373189,14 +373584,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"read-succeeds.https.window.js": [
- "fc1facaf58e37550c4fb9a4d5b66f2180072cbe8",
+ "d81db2f8c0ddb54042a6178677df309a7c6248ef",
[
"bluetooth/descriptor/readValue/read-succeeds.https.window.html",
{
@@ -373211,7 +373610,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373220,7 +373623,7 @@
},
"writeValue": {
"buffer-is-detached.https.window.js": [
- "4fd3d661f7d9ac2e97f5d215e41410fd027f7b52",
+ "49daf7cf86d16104536d7e50bc6401f81006da45",
[
"bluetooth/descriptor/writeValue/buffer-is-detached.https.window.html",
{
@@ -373235,14 +373638,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed.https.window.js": [
- "a486819b55a114e9e4bbde31b709cf00c7aae1c5",
+ "c681bcee419b33c6faa52ea40fc8ccf86c3f4113",
[
"bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.html",
{
@@ -373257,7 +373664,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373268,7 +373679,7 @@
"device": {
"gattserverdisconnected-event": {
"disconnected.https.window.js": [
- "dab54d5da2961eae72d6bd05eb15023dd8a2a46a",
+ "43a11a88cbf655ee4aab6ac70215ae3fb5f9a541",
[
"bluetooth/device/gattserverdisconnected-event/disconnected.https.window.html",
{
@@ -373283,14 +373694,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"disconnected_gc.https.window.js": [
- "a15cc943f4e1180ea092e24db9112658b40c5b99",
+ "a2c20ea4620aa620b0b12cbef642a785f32285f2",
[
"bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.html",
{
@@ -373305,14 +373720,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"one-event-per-disconnection.https.window.js": [
- "f5e45f99755dbd05f24cbca9584d67e5e6654c32",
+ "ab273adbc88bcd4d03c9bf5309a34cb30cf3246a",
[
"bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.html",
{
@@ -373327,14 +373746,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"reconnect-during-disconnected-event.https.window.js": [
- "8f264c7b02524a84ac67e6fbe343045ae8eb07a6",
+ "bdaf47c66198ce70f9a1951358f27b38dcfac4ca",
[
"bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.html",
{
@@ -373349,7 +373772,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373359,7 +373786,7 @@
},
"getDevices": {
"granted-devices-with-services.https.window.js": [
- "34b5912315ab843ec9c49dbf9ec41912325da2ca",
+ "3228543617decdc9a213883d650ba33ffd9b90c1",
[
"bluetooth/getDevices/granted-devices-with-services.https.window.html",
{
@@ -373374,14 +373801,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"no-granted-devices.https.window.js": [
- "d945c3ff242c069027e5b6558c3c1fed9286e7b2",
+ "304aa3820d5b80bff80928feabc982b8b156b591",
[
"bluetooth/getDevices/no-granted-devices.https.window.html",
{
@@ -373396,14 +373827,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"returns-same-bluetooth-device-object.https.window.js": [
- "7c80703d5f5bb825b8d94f9c3a7fd7f2a7a6c7da",
+ "81c0f6a97e947c9a469ca74a180d595f493561e2",
[
"bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.html",
{
@@ -373418,7 +373853,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -373434,7 +373873,7 @@
]
],
"idl-BluetoothDevice.https.html": [
- "6030d4e5acdcda0ac80d63100c8e6573c6194ae2",
+ "ef2863dc27403a02bfa03cbb531b5e7c6c4b2ed4",
[
null,
{
@@ -373485,7 +373924,7 @@
"requestDevice": {
"acceptAllDevices": {
"device-with-empty-name.https.html": [
- "7b68acf1471bb7777cfd510a7ae38c3b4cf0612a",
+ "a47ee603f84287a0f0d22f1c9101ebf0c0bc718c",
[
null,
{
@@ -373494,7 +373933,7 @@
]
],
"device-with-name.https.html": [
- "3c2dcb7f8a66e173c180608e785f3b27bce6fb25",
+ "a69b313b51e92474338fc17aaa86b6e65096efc0",
[
null,
{
@@ -373503,7 +373942,7 @@
]
],
"optional-services-missing.https.html": [
- "d4c2677130565f4e497d2a5a7127c22aa5a2e9a0",
+ "5d1fec3342ef7c68dcf743e49bd94bc739c6603a",
[
null,
{
@@ -373512,7 +373951,7 @@
]
],
"optional-services-present.https.html": [
- "86377c289f6579555be5c6b3598cbe68a9e958e6",
+ "06897f809929db1a2a8d52742126d7e4a8b38d93",
[
null,
{
@@ -373522,7 +373961,7 @@
]
},
"blocklisted-service-in-filter.https.html": [
- "630548d68460ed6493f85928ec3ac1db2af713f6",
+ "cb2f989a47778b8b8387e3d7fe3316b9c7b0f40e",
[
null,
{
@@ -373531,7 +373970,7 @@
]
],
"blocklisted-service-in-optionalServices.https.html": [
- "5c176b82b7f2e8629786c9cce79ab8ea2155699f",
+ "3f435f9ff183a22abb8979cb62820d4f2407e964",
[
null,
{
@@ -373541,7 +373980,7 @@
],
"canonicalizeFilter": {
"device-name-longer-than-29-bytes.https.html": [
- "5ca358a0e1ab753e6199a31c5abe7b88271fe91c",
+ "28f614bcbf29ef7194086732e264da9b3c6c2950",
[
null,
{
@@ -373550,7 +373989,7 @@
]
],
"empty-filter.https.html": [
- "788d9f8036109e6c1bb6a6bb9f021fd920012631",
+ "4beb5266b680b4a75d13a4b81aa2e5e6fcfd2d66",
[
null,
{
@@ -373559,7 +373998,7 @@
]
],
"empty-filters-member.https.html": [
- "65bfc6443a4592b7774a76aca651331c81bfc49f",
+ "2a6a0daa35f41986a384e55c1fed6167a8b16d79",
[
null,
{
@@ -373568,7 +374007,7 @@
]
],
"empty-namePrefix.https.html": [
- "549f0d4059c723aad70e86944a0ca82c401f95de",
+ "3e490e17d993c4cb2390b640cf1e8f715dfa3f41",
[
null,
{
@@ -373577,7 +374016,7 @@
]
],
"empty-services-member.https.html": [
- "b70a8a32087858aee74743df909200a749972bbc",
+ "3a485878be13293463b4d86d10edbcc033536065",
[
null,
{
@@ -373586,7 +374025,7 @@
]
],
"filters-xor-acceptAllDevices.https.html": [
- "d3f6e5ccb1333a001e37448abf7a7f7cdde4715c",
+ "d6177caf7f8197cb2c9f5b88128a1cc191b6e28b",
[
null,
{
@@ -373595,7 +374034,7 @@
]
],
"max-length-exceeded-name-unicode.https.html": [
- "5e1397dbd9a332cb3b8f6c1bd607654b42b9bb96",
+ "4ec036695bd990aa419a48506861841b559971b9",
[
null,
{
@@ -373604,7 +374043,7 @@
]
],
"max-length-exceeded-name.https.html": [
- "a270cac43311bdf59422586c98b9e40fd00085d9",
+ "0fac15ec65d5e1a9295fddb9ca3e6fd2a806d031",
[
null,
{
@@ -373613,7 +374052,7 @@
]
],
"max-length-exceeded-namePrefix-unicode.https.html": [
- "05a9bd31300fa0dacebcd5d346b52b62f9c92eee",
+ "d622da56df564da1d5ecf0ff0693cfe38fb686aa",
[
null,
{
@@ -373622,7 +374061,7 @@
]
],
"max-length-exceeded-namePrefix.https.html": [
- "a31e4b398e7cda5d8c28032e1541695b2ce3540b",
+ "8251935be160db8190a97b9ee0951f07c2215306",
[
null,
{
@@ -373631,7 +374070,7 @@
]
],
"max-length-name-unicode.https.html": [
- "dca018b49540be7e466cd38e680b5206c4da561f",
+ "c7cb0aa25e267dc0647850ec5da9135fcabe4d02",
[
null,
{
@@ -373640,7 +374079,7 @@
]
],
"max-length-name.https.html": [
- "7244910afa4b1dd6299b26bdd4155c3128379872",
+ "4b57e4b0ac84fdcde4eb2f6f82f7ea7c14d5e62d",
[
null,
{
@@ -373649,7 +374088,7 @@
]
],
"max-length-namePrefix-unicode.https.html": [
- "ba4bdf94c633627b5cc3739268645c28e136df28",
+ "72faac6de8b58131f8d9a17c00f5ee6a192bd396",
[
null,
{
@@ -373658,7 +374097,7 @@
]
],
"max-length-namePrefix.https.html": [
- "ced34793355e05ef592b7ffd7daee83d4ad4f0fb",
+ "bf751501bfb836a399cb16e7f24d629fcbc033f7",
[
null,
{
@@ -373667,7 +374106,7 @@
]
],
"no-arguments.https.html": [
- "33f933ad09c882d95ef4a6e61f8d65e87dce6848",
+ "a1cc4e5b4225faa9fbc50030ccda854c6ec3459a",
[
null,
{
@@ -373676,7 +374115,7 @@
]
],
"unicode-valid-length-name-name.https.html": [
- "787f34d5c688b61a682984f8089c82716b08c5d6",
+ "70b284a2738d5fa1fd85183f8c8c50d2e9084018",
[
null,
{
@@ -373685,7 +374124,7 @@
]
],
"unicode-valid-length-name-namePrefix.https.html": [
- "bafb36d710cadd495e4c79ede4a5fcac5ffa1517",
+ "726e293580fecb9389f5aef9cd50b3e2a8abbac7",
[
null,
{
@@ -373694,7 +374133,7 @@
]
],
"wrong-service-in-optionalServices-member.https.html": [
- "e4880b6f57d0f87ff84b6acf1c4b6a27b76ae735",
+ "07187b4b7599b555dd28a8574645767ec5bf80a3",
[
null,
{
@@ -373703,7 +374142,7 @@
]
],
"wrong-service-in-services-member.https.html": [
- "9d31b951be7b6ebdb7ed05571841561e9dec2f52",
+ "a78d75e6b4d662d5c52068af13a2ce7682bf92f3",
[
null,
{
@@ -373713,7 +374152,7 @@
]
},
"cross-origin-iframe.sub.https.html": [
- "d5cf382f664cfb7fb105a49707cdf7652a9b9a62",
+ "543c8a586e9148c4c7462f437a3d914ee23d1942",
[
null,
{
@@ -373722,7 +374161,7 @@
]
],
"discovery-succeeds.https.html": [
- "5bd7ff1246b3628882b0c49e7f094ef706cbec99",
+ "7bed9e0acb53d465cdfbea27c1ed8aa580bd273e",
[
null,
{
@@ -373731,7 +374170,7 @@
]
],
"doesnt-consume-user-gesture.https.html": [
- "19ac36f80add1ee98e1c26b1b7968c7d5381aae0",
+ "d439bf79c9d985bb29a7cdd596d94b198c046f63",
[
null,
{
@@ -373740,7 +374179,7 @@
]
],
"filter-matches.https.html": [
- "1aeae776f0691d2c0c2603a4fda75e8487e1fc7e",
+ "1c42d779216f138a1b271dda875c770e98390e8a",
[
null,
{
@@ -373749,7 +374188,7 @@
]
],
"le-not-supported.https.html": [
- "3da9abeb773a7f7401b6378022c5737f17e41655",
+ "e130fe92e63c69db7a78281ae7dca02dc5c98a15",
[
null,
{
@@ -373758,7 +374197,7 @@
]
],
"name-empty-device-from-name-empty-filter.https.html": [
- "944befdfe8344d3cdc42aa68889de6581e35bc8f",
+ "6d707a13850be317685783961dbecbd126d80b69",
[
null,
{
@@ -373767,7 +374206,7 @@
]
],
"not-processing-user-gesture.https.html": [
- "f74540db958c2b5bc924be0f909e34196c937999",
+ "6795ae430154d81a6182adff6ba520d59d544821",
[
null,
{
@@ -373776,7 +374215,7 @@
]
],
"radio-not-present.https.html": [
- "929af8ffb776ef9fc2763976883dbacc1af20a32",
+ "9494fa572a3ac7250e6c357048f5b3a60e289241",
[
null,
{
@@ -373785,7 +374224,7 @@
]
],
"request-from-iframe.https.html": [
- "64ad3d592d1e09f02d533f6f1203cff0fd7f18b5",
+ "484a35b79be7f67af25f61d008720d4d82074273",
[
null,
{
@@ -373794,7 +374233,7 @@
]
],
"request-from-sandboxed-iframe.https.html": [
- "4c4a5707e8ebfd9bf7ef16525a70e8e0fb75d483",
+ "26291b3b4c1589cb40ecc54a3a363e2594a650c1",
[
null,
{
@@ -373803,7 +374242,7 @@
]
],
"same-device.https.html": [
- "b96af439973a21af7bd19d917533e195fdc39c1f",
+ "c0e83cc9c742824d85199068cb1bd9203883d1f6",
[
null,
{
@@ -373812,7 +374251,7 @@
]
],
"single-filter-single-service.https.html": [
- "9c0d621c2374057fb42b44b424b25e017131a4fc",
+ "8873a45e31dfd785376dfc7e55f811948847be86",
[
null,
{
@@ -373824,7 +374263,7 @@
"server": {
"connect": {
"connection-succeeds.https.html": [
- "aebd681c2add13d7aebe0ad3c97f118f94fd19fa",
+ "1326b073879e554e141390dd9c42c12f64681165",
[
null,
{
@@ -373833,7 +374272,7 @@
]
],
"garbage-collection-ran-during-success.https.html": [
- "f70befcb4b4e1a2369d9c59c70fd587704763c80",
+ "d9c07b64bc05512ca9e45a69aeba6c8b65c73f0c",
[
null,
{
@@ -373842,7 +374281,7 @@
]
],
"get-same-gatt-server.https.html": [
- "c3e35532835c11b9dba1aa17592d861a9c7d4000",
+ "5e9383851f39a316582d2e672cb5afa0c11b27ab",
[
null,
{
@@ -373852,7 +374291,7 @@
]
},
"device-same-object.https.html": [
- "63624961ec7b11757fc04a5684dc702db4c3169c",
+ "b861040b2366aa98aca067b80218f030cb9c94d0",
[
null,
{
@@ -373862,7 +374301,7 @@
],
"disconnect": {
"connect-disconnect-twice.https.html": [
- "e0d8439ab66c0a4ffd29e51aa23de9ecd11a833b",
+ "7ed2cb946035c7a8a828b2830c60ded5eca0290f",
[
null,
{
@@ -373871,7 +374310,7 @@
]
],
"detach-gc.https.html": [
- "8b1459db192d21f67d6185fb15dade72723c00ad",
+ "c1863e923227a6f80763e5c374d480a6169b6bf0",
[
null,
{
@@ -373880,7 +374319,7 @@
]
],
"disconnect-twice-in-a-row.https.html": [
- "5dada7a9c9918e45620f685225e4cb9bb562a5e2",
+ "d4d6e2fca782eb4a23c92d9966d6235b19632440",
[
null,
{
@@ -373889,7 +374328,7 @@
]
],
"gc-detach.https.html": [
- "04ccedeb5e9781923fe02d598a25218d3f59179e",
+ "41d2b151d33c6535241299b2cb3e55ffa40cafec",
[
null,
{
@@ -373900,7 +374339,7 @@
},
"getPrimaryService": {
"gen-disconnect-called-before.https.window.js": [
- "4a1baf3ebc2d89f541b7ad5e057d980317902a09",
+ "6f4f076110a8824c5bc1d5ce84f98b879d589e7e",
[
"bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.html",
{
@@ -373915,14 +374354,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-error.https.window.js": [
- "c7c80244193016db84dbbf8e9f3441e2a4937b96",
+ "24184ea8ba48ca281b86931f5c5c51317bb1662b",
[
"bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.html",
{
@@ -373937,14 +374380,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-success.https.window.js": [
- "5655d8ee41cd1765f105772f42dcacfcf0a27e6f",
+ "8a8714bca579698346b6eb26694c30e343c98aac",
[
"bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.html",
{
@@ -373959,14 +374406,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-invalidates-objects.https.window.js": [
- "0d3e5cf18a4c708d0f9620148819150deeb7f682",
+ "52699ee0a089ac5529164ca9ceedcb4016404da7",
[
"bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.html",
{
@@ -373981,14 +374432,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnected-device.https.window.js": [
- "7bb1ef5cb634c5af76ae835247f967a51845f04e",
+ "e0a31f6136e46a0d7bcbd7cf4d52255caa0d0950",
[
"bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.html",
{
@@ -374003,14 +374458,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-discovery-complete-no-permission-absent-service.https.window.js": [
- "ee3cf97f4db9f68cffac91c55bf282ab54b8906b",
+ "52875b185489c50adb8c39fa78f8b4a694470258",
[
"bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.html",
{
@@ -374025,14 +374484,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-discovery-complete-service-not-found.https.window.js": [
- "5bf720cd48eb0eeec5f89488384f078ce37c9cd6",
+ "56362f20bfc38d7012e87bd5e2b29274ec5f3452",
[
"bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.html",
{
@@ -374047,14 +374510,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error.https.window.js": [
- "4c3111720c2c69d8e5e867bf4a3288ea1aba8115",
+ "06d6a31eeb5ffc8b4bc9ff08cae550ee9fc17e87",
[
"bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.html",
{
@@ -374069,14 +374536,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-success.https.window.js": [
- "fe7d749063d8d75da9c389fffbe9dc68af9a30a2",
+ "cd4a0d39f28ab582cf8dfca727f58cb2dd7b78f3",
[
"bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.html",
{
@@ -374091,14 +374562,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-different-service-after-reconnection.https.window.js": [
- "301658c73bb8e4db78433c4072b83aa5f99d629a",
+ "6cd60732879a502b147c0f3e1a835ea22e2d4ba8",
[
"bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.html",
{
@@ -374113,14 +374588,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object.https.window.js": [
- "c46a1a52c031373b16718d3687a013109f45da62",
+ "f05adce27b1e877223684e00fce45bdbf5c92361",
[
"bluetooth/server/getPrimaryService/gen-get-same-object.https.window.html",
{
@@ -374135,14 +374614,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-invalid-service-name.https.window.js": [
- "704ab8bb2dac944d1a3e2a33b57c225edc994225",
+ "b30e4cc48f443d72e680ecc5420fe25eb1571758",
[
"bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.html",
{
@@ -374157,14 +374640,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-absent-service.https.window.js": [
- "8daab29eaf94bbae9e28a921a5a650f858ccdd7a",
+ "6df58222e0aec9623433e9939295161a55d41362",
[
"bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.html",
{
@@ -374179,14 +374666,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-for-any-service.https.window.js": [
- "d55dee753cf8b000089f1d8a5a21f383587427cd",
+ "d6ae0b6dc8f001c95155024244d9db607722d196",
[
"bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.html",
{
@@ -374201,14 +374692,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-present-service.https.window.js": [
- "d357a214dfd68723571c014d29f8f2e65773a245",
+ "e11ed9e41e210216b16412dd06e203dd557ef1bd",
[
"bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.html",
{
@@ -374223,14 +374718,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-not-found.https.window.js": [
- "32350e779dce890573bcf519ac74023818296f3e",
+ "0b8419a8042b0706c941e259ae7c2eb6b85acb35",
[
"bluetooth/server/getPrimaryService/gen-service-not-found.https.window.html",
{
@@ -374245,14 +374744,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"service-found.https.html": [
- "6fccff1813f01d17b68c8c11570008d00ed0a368",
+ "6484b8227d27bc474bdfa7d156d7d3acedd30f3e",
[
null,
{
@@ -374261,7 +374764,7 @@
]
],
"two-iframes-from-same-origin.https.html": [
- "eb20225e4bad0f774aad0ef0e997cdfa4c55135e",
+ "064d8d2e3b4ca216179f912327f019f3f61d02df",
[
null,
{
@@ -374272,7 +374775,7 @@
},
"getPrimaryServices": {
"blocklisted-services-with-uuid.https.html": [
- "6ed24fda403b6d6fa305bcfff433b4154438e45c",
+ "90d776c77ee3ccc8c265ec82fff80423b9f392ba",
[
null,
{
@@ -374281,7 +374784,7 @@
]
],
"blocklisted-services.https.html": [
- "2a34e0bf50a7b182ff15602dc40c484ea6d7d124",
+ "df83dfe193fe40b55f37aa0c1e1b4e204c7b340f",
[
null,
{
@@ -374290,7 +374793,7 @@
]
],
"correct-services.https.html": [
- "9fffbd5d00e3c5d41e43e1b722d87f53933ea1a3",
+ "9672d50a2bc2291003823c2da1cdcde77f6edbae",
[
null,
{
@@ -374299,7 +374802,7 @@
]
],
"gen-disconnect-called-before-with-uuid.https.window.js": [
- "8bc12f3c474441514a568c27d7f63c1883c99d1e",
+ "ea0c16160508aacf9845f45264c3e58ee6b9a895",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.html",
{
@@ -374314,14 +374817,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-before.https.window.js": [
- "1c77e4e710ae766e72bf13b82d290309ebe30bb0",
+ "04dc61083b87c0297b79d012575738e8c335954d",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.html",
{
@@ -374336,14 +374843,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-error-with-uuid.https.window.js": [
- "230325a8c76169a545010fb784999599e77463ad",
+ "3223049d2a8625ca0c10814053364371b3cfd05f",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.html",
{
@@ -374358,14 +374869,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-error.https.window.js": [
- "dce13c5d0065b26c082d042cb92c0cc2ac01f63e",
+ "646db21586fe6d237ac6e7431695af4346391c15",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.html",
{
@@ -374380,14 +374895,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-success-with-uuid.https.window.js": [
- "8e2e32ba4fddc843378c901e0ce933c54105a539",
+ "472eb991ece339dc64c59d7a100e50f2863b4de3",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.html",
{
@@ -374402,14 +374921,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-called-during-success.https.window.js": [
- "78dcffdcbb1861df8cfd7dc6108b40bbb9f57d1e",
+ "86d56889325b2a139e624f60e94eac0a3f46e873",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.html",
{
@@ -374424,14 +374947,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-invalidates-objects-with-uuid.https.window.js": [
- "c226d2dc65ea69f19116906104a5d1fe5da750ac",
+ "0a5e07310faf9efbf0eb1f2b2f05c3974d9662c7",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.html",
{
@@ -374446,14 +374973,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnect-invalidates-objects.https.window.js": [
- "d69f6c5d5c27377958becb16fd660961e4e3c5e2",
+ "e87339d59d07470f98eac4feb2d54619769119ba",
[
"bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.html",
{
@@ -374468,14 +374999,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnected-device-with-uuid.https.window.js": [
- "a35984f85115ad27eb9903c1aeded5e627308365",
+ "bb440a7caa2d309468bb72eb9b27cd37b60986f0",
[
"bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.html",
{
@@ -374490,14 +375025,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-disconnected-device.https.window.js": [
- "36d7e64d5551cae9020834e49f5876e2a42bc7ca",
+ "26f3269a0c96d3fc029499adb952dff5dae38598",
[
"bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.html",
{
@@ -374512,14 +375051,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [
- "130657d228f4c7cada6d27a2ad8ff7fee403d9e0",
+ "b52dac0385f47c463d2302838e57425d0e8fc5c4",
[
"bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html",
{
@@ -374534,14 +375077,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-discovery-complete-service-not-found-with-uuid.https.window.js": [
- "3817a1a5a38723ce08e1650155c5fcd81ff54bdb",
+ "f944f72583ff6a9f4fbf1876246face6538486d9",
[
"bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.html",
{
@@ -374556,14 +375103,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
- "c986835ce31dcf5049e54bf553c3b12dac7151d5",
+ "455bd47a040727ceed3f435a6fc6b469c892c539",
[
"bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.html",
{
@@ -374578,14 +375129,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error.https.window.js": [
- "bd438db09e350a0d7ee330a6c3eaa54f1fea02ba",
+ "2e832d89e175d46c78d8468ddf6d3fb29bd0524a",
[
"bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.html",
{
@@ -374600,14 +375155,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [
- "3b441cedeff36c6b854bc4ea4e7952eac6284d1a",
+ "4555242ae823060dfcc56ea8965eb93b0af92242",
[
"bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.html",
{
@@ -374622,14 +375181,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-success.https.window.js": [
- "1b3302a1ba6ffe049e44228280c652bf74310a50",
+ "0eb78ba1b32de808f10450c04061254b397ab86b",
[
"bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.html",
{
@@ -374644,14 +375207,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-different-service-after-reconnection-with-uuid.https.window.js": [
- "378ade0c90b5d7c49c31bb58efaa835b4c502d95",
+ "11671cbf7b3aae978cd943485aa2197b1b560876",
[
"bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.html",
{
@@ -374666,14 +375233,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-different-service-after-reconnection.https.window.js": [
- "bdef5aa2f20ae4971784a566135ecc6b71fc03ca",
+ "efda6cf4a4150ea58f895671d0e286105d7af883",
[
"bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.html",
{
@@ -374688,14 +375259,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object-with-uuid.https.window.js": [
- "aca34e58ff06dd92d15b0bb1d09f81aa8c77402c",
+ "d84ca0aa7fc9b98dd3621d203b4d9e1050ffec23",
[
"bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.html",
{
@@ -374710,14 +375285,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object.https.window.js": [
- "0ea805e339d4dff1dea445e99cc8d661a7f8404a",
+ "3f876f5b76b29df00b85a5ec1e44a2d74e8ff249",
[
"bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.html",
{
@@ -374732,14 +375311,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-invalid-service-name.https.window.js": [
- "eeb6dd4dcf867345ff4cfad28b19a9ffa3fb509b",
+ "d26c0aa20a6f48073d71b2b63c252acbffbfdaee",
[
"bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.html",
{
@@ -374754,14 +375337,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-absent-service-with-uuid.https.window.js": [
- "c755dd7129df5ac3825e07d7c7b3d11e2a227f12",
+ "4aefb9955b384f6d5a762a2b6d09e1685a1f58a7",
[
"bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.html",
{
@@ -374776,14 +375363,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-for-any-service-with-uuid.https.window.js": [
- "03b7f2329c8d90fb326bf851c5275f42d2dc2007",
+ "a5006e6da846c599297638ca0cfc04b9d8c7c91f",
[
"bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.html",
{
@@ -374798,14 +375389,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-for-any-service.https.window.js": [
- "e50c6d56128489fdde8475979ff8868f41d365a1",
+ "e7d20bd3f230b3e69d0d2720edb168ddf1f478f1",
[
"bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.html",
{
@@ -374820,14 +375415,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-no-permission-present-service-with-uuid.https.window.js": [
- "c703d0a936394d951a84d03ace7bc0b4d80abc7c",
+ "8f4811fe08b2f12c5cb5a03c7dda72787e9f5373",
[
"bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.html",
{
@@ -374842,14 +375441,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-not-found-with-uuid.https.window.js": [
- "9dc1877f9f2753862d106c4dad9830fddd6898f4",
+ "8bf9d8c0b6b43a13773a24d261ea60881cdc6b79",
[
"bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.html",
{
@@ -374864,14 +375467,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"services-found-with-uuid.https.html": [
- "6face0acfae82068d6dbf4a76a396e3cac533584",
+ "92ca4ea6a6e583d236381bbaaa97470d40e4be10",
[
null,
{
@@ -374880,7 +375487,7 @@
]
],
"services-found.https.html": [
- "6edb1118c2a9b13b4c57acfbfc90254c3373aadd",
+ "d39c69fc7f1fd1d8213367bcfb1f4b7e11e65a4f",
[
null,
{
@@ -374889,7 +375496,7 @@
]
],
"services-not-found.https.html": [
- "2632ec6e7fea2fc83c201733b60e565b306daf7b",
+ "4c78ad19d0ea8a8a3f2b38dc75e0a15f5ed3d083",
[
null,
{
@@ -374901,7 +375508,7 @@
},
"service": {
"device-same-from-2-services.https.html": [
- "0d5ab6496837d5aa13fa53c62ffe7a343caa0176",
+ "4c479dda90b3d5685e7e340fefa5204877e82e9c",
[
null,
{
@@ -374910,7 +375517,7 @@
]
],
"device-same-object.https.html": [
- "de57c2e37607b453d76e867012dbd1079049197d",
+ "d9590b17dc23fe67a7aed39e1bae7eb6a25e4f45",
[
null,
{
@@ -374920,7 +375527,7 @@
],
"getCharacteristic": {
"characteristic-found.https.html": [
- "9746f4b058ca73a508a875d5749175a782b752bb",
+ "0fb2ff3532f050f41b5929ed65357233fa1e6744",
[
null,
{
@@ -374929,7 +375536,7 @@
]
],
"gen-blocklisted-characteristic.https.window.js": [
- "72b9bac63a437b7367f10e772f4f598d491b2823",
+ "fb96df568ff19eb786ff92b39fb05e8e85c24f92",
[
"bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.html",
{
@@ -374944,14 +375551,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-characteristic-not-found.https.window.js": [
- "a8b2ef892c768476675c79f70fb3d546d019c4b1",
+ "c0987c68f5924f07442c52993487695935706ffd",
[
"bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.html",
{
@@ -374966,14 +375577,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error.https.window.js": [
- "7457161faa09235acfdc609df7e8e4d39fa4ebf7",
+ "1c429fc49451473332704f5a4b8863bf37bf5a76",
[
"bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.html",
{
@@ -374988,14 +375603,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object.https.window.js": [
- "54ab061deb9eb522dbed1f3d95d1ad485a26ea04",
+ "636ba9de773a39cf033e04c4efe719278204e071",
[
"bluetooth/service/getCharacteristic/gen-get-same-object.https.window.html",
{
@@ -375010,14 +375629,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-invalid-characteristic-name.https.window.js": [
- "8f44ecb08be4ff6ec2cc563b32038622dfc8f26d",
+ "2331f86c4ae418cdd9cc0a49ea5b4ef2cfb2c164",
[
"bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.html",
{
@@ -375032,14 +375655,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-reconnect-during.https.window.js": [
- "da5462a8bfa53a7a124a87c46fe9d30c7aedb83b",
+ "bc96ce5eefd6b66a23cf2cdda03c5cdb3e0fb449",
[
"bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.html",
{
@@ -375054,14 +375681,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed.https.window.js": [
- "0fe5b01146ebbc57172435dfe49e887ac6ad2d1b",
+ "d04967e3a8c611c1f6941770d1cac6986adbc449",
[
"bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.html",
{
@@ -375076,7 +375707,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -375085,7 +375720,7 @@
},
"getCharacteristics": {
"blocklisted-characteristics.https.html": [
- "5620f2c9245f6fa57ef5c388f56def6939eb56a9",
+ "3298f5fd3d054c6bcdace31db0fdcf13e3214f89",
[
null,
{
@@ -375094,7 +375729,7 @@
]
],
"characteristics-found-with-uuid.https.html": [
- "9139ae10f898c0021f8562f330728d032c85b321",
+ "6188adbafb9d66574e444daa8c6e296c559b5b4b",
[
null,
{
@@ -375103,7 +375738,7 @@
]
],
"characteristics-found.https.html": [
- "952e3e6b5e985ef91837dbbeb9a7c8e5d1f665b8",
+ "6812cd977f2e5439b1fc135ec7ede321489cbe33",
[
null,
{
@@ -375112,7 +375747,7 @@
]
],
"characteristics-not-found.https.html": [
- "6401740681a66b8581120671edcb70f5663621a3",
+ "a629b5e1c11bf35ea44af510b643953674973573",
[
null,
{
@@ -375121,7 +375756,7 @@
]
],
"gen-blocklisted-characteristic-with-uuid.https.window.js": [
- "cd8a6fa380aade14eb256fb8440d15b6e7352ca2",
+ "c39a29c845bf59d68a4c8754e0c34217ba259972",
[
"bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.html",
{
@@ -375136,14 +375771,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-characteristic-not-found-with-uuid.https.window.js": [
- "fff2bd038a82698748acadaa3e85047bd77c79f1",
+ "ccaa7388e7e339bc223f57d90603fa1aa3fa512b",
[
"bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.html",
{
@@ -375158,14 +375797,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [
- "925786c74deab9ad66080391652b60eba00598ee",
+ "ad4ab9f3f5067b8b042c3ec8a9225c39382beb57",
[
"bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.html",
{
@@ -375180,14 +375823,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-garbage-collection-ran-during-error.https.window.js": [
- "d0ecff89f706b1bb4251232a369ea45b70e2e517",
+ "844814508f927f91b46f2035c365737220eab62e",
[
"bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.html",
{
@@ -375202,14 +375849,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object-with-uuid.https.window.js": [
- "fb3346dc4e4c1ca8cb601c41e8f120ccfdb149c3",
+ "35d277e3839c8375190f7e65dd60214bdc2a6fef",
[
"bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.html",
{
@@ -375224,14 +375875,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-get-same-object.https.window.js": [
- "576e0831501faa8b838081a96ef437abda2ed668",
+ "4326ee29079606daef6b6e1dda1eff08dec6c449",
[
"bluetooth/service/getCharacteristics/gen-get-same-object.https.window.html",
{
@@ -375246,14 +375901,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-invalid-characteristic-name.https.window.js": [
- "5b2bd39d3e052cb689bc2f668e87515563d4fa33",
+ "14b2e509be4f4941bc96f40cb6da3d3b08879765",
[
"bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.html",
{
@@ -375268,14 +375927,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-reconnect-during-with-uuid.https.window.js": [
- "95f22b11fcf8a5237c7bf0c2b3c40a3d2932b5be",
+ "34207a2f60d2af6dcb74e0e43f4c486d00f92226",
[
"bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.html",
{
@@ -375290,14 +375953,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-reconnect-during.https.window.js": [
- "184632f1d0581e76aed99bcb9a645c837b88af1f",
+ "4354cfc0671e4f008c1702f8f727ee22cae47fdb",
[
"bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.html",
{
@@ -375312,14 +375979,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed-with-uuid.https.window.js": [
- "6ff7b4f3631e669cf192e3864fe5bbef1d27f23c",
+ "8d0e7c2fc333c58b5fbbf3f25daad08a35208a8e",
[
"bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.html",
{
@@ -375334,14 +376005,18 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
]
],
"gen-service-is-removed.https.window.js": [
- "b4492885b83016d719161f705a33f7ada8a6d9c2",
+ "dff0d3d93975b31f3698bf3c004f92e387489438",
[
"bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.html",
{
@@ -375356,7 +376031,11 @@
],
[
"script",
- "/bluetooth/resources/bluetooth-helpers.js"
+ "/bluetooth/resources/bluetooth-test.js"
+ ],
+ [
+ "script",
+ "/bluetooth/resources/bluetooth-fake-devices.js"
]
]
}
@@ -375582,6 +376261,15 @@
}
]
],
+ "same-origin-navigation-redirect.https.html": [
+ "2ab128f2d8273841d53dcd301e032879f685693e",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"same-origin-navigation.https.html": [
"e35cbdcedd0f30e31834764cb23a574ce75feed5",
[
@@ -375591,6 +376279,15 @@
}
]
],
+ "same-origin-subresource-redirect.https.html": [
+ "4a8233bc3e5a8850680775b930dd57ab9ceec3e3",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"same-origin-subresource.https.html": [
"0b7151a2cca08d941d313e014e41769c08c350cc",
[
@@ -375639,10 +376336,12 @@
},
"clipboard-apis": {
"async-idlharness.https.html": [
- "06b777fbe328a191fc9625fe85e4f05eb751ed52",
+ "a1a51c98690f1c83679c3ae71f3bafe99824f025",
[
null,
- {}
+ {
+ "timeout": "long"
+ }
]
],
"async-navigator-clipboard-basics.https.html": [
@@ -381858,10 +382557,12 @@
"linebox": {
"animations": {
"line-height-interpolation.html": [
- "db71ca0262ca3fcf88178d1b7e2a42c6513cc1fb",
+ "a0570f82a905af0ba601932b0447c92b28cbf303",
[
null,
- {}
+ {
+ "timeout": "long"
+ }
]
]
},
@@ -392991,7 +393692,7 @@
},
"css-properties-values-api": {
"at-property-animation.html": [
- "c0688870818493dae01121aa0b9332db6b0b2a1d",
+ "89ed671fdf1d838ee4a5c7f87e02b6bf1c6e4470",
[
null,
{}
@@ -393018,6 +393719,13 @@
{}
]
],
+ "at-property-typedom.html": [
+ "04c40c8be0f7fa9fe2ba025a359ebe3f0b93ff70",
+ [
+ null,
+ {}
+ ]
+ ],
"at-property.html": [
"e9945056aad87be835c2471bbe7ec78c425aa4f0",
[
@@ -393033,7 +393741,7 @@
]
],
"determine-registration.html": [
- "9a68be51d793f537486a33edf0eb43462ca1f39e",
+ "e6bbbec9640ce5f567b372c7d5ef181961cedbec",
[
null,
{}
@@ -423594,6 +424302,15 @@
]
},
"event-timing": {
+ "buffered-and-duration-threshold.html": [
+ "cf5d63b02a1d3ccd8444f47f9fc3a56535594f45",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"buffered-flag.html": [
"7ee152be9388fa8593c3c2a85981a7cb0ed7492a",
[
@@ -423746,6 +424463,33 @@
}
]
],
+ "large-duration-threshold.html": [
+ "5665d42d3345742f5364b085b2c137156652e212",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "medium-duration-threshold.html": [
+ "a827f2211b12550fee8d0f5d1258dfbe29c830d9",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "min-duration-threshold.html": [
+ "443b38a27833377e4ebbbe307290addd439eb508",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"only-observe-firstInput.html": [
"54a6036f91adb89c7b6528e40850937d70520b77",
[
@@ -423791,7 +424535,7 @@
]
],
"timingconditions.html": [
- "12280cb894a8767b9b3bc7ba1df61b4e9e8630d5",
+ "e7763c40dc09289149da15b00370385cc6271eb7",
[
null,
{
@@ -428636,7 +429380,7 @@
]
],
"fetch.html": [
- "41ece6826ed8b5a2e9b2a0df092b75f4c67f4edb",
+ "c28708019fa4658a45e6637f045077585bb05605",
[
null,
{}
@@ -428799,7 +429543,7 @@
]
},
"idlharness.window.js": [
- "a60b7fe838eba4c7ba4fc7970940debbf37b702f",
+ "ddcc59c4034afa38f826bd1984bac1e64c1ad47b",
[
"fullscreen/idlharness.window.html",
{
@@ -428811,8 +429555,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -429151,15 +429900,6 @@
]
]
},
- "hit-test": {
- "idlharness.https.html": [
- "b7f67845470efa9730bcc754c098b5457e089f34",
- [
- null,
- {}
- ]
- ]
- },
"hr-time": {
"basic.any.js": [
"364dd81a3448188bd76f6ff410807bfcca93177d",
@@ -429173,7 +429913,7 @@
]
],
"idlharness.any.js": [
- "4e266c09e3358034e6fac6fb282bbeb138e4278a",
+ "6676b001a8b81671d0c4645841407fc58a59b8f2",
[
"hr-time/idlharness.any.html",
{
@@ -429189,8 +429929,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -429208,8 +429953,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -429227,8 +429977,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -429246,8 +430001,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -431570,7 +432330,7 @@
]
],
"window-prototype-chain.html": [
- "d29a8e11f43c2979d7fc67f37d3a8b862bf11cbb",
+ "4cad94830036759260eebe3ca5ab957ff1392cd9",
[
null,
{}
@@ -441531,7 +442291,7 @@
]
],
"type-change-state.html": [
- "a10ea1d285830c79feba57c8e0753a05016fafb7",
+ "35f151b12d682a367ebcbbcc6dcf64f42fba0f97",
[
null,
{}
@@ -449235,7 +449995,7 @@
]
],
"navigator_user_agent.https.html": [
- "9409dd08e4d0e7a351de45419c310cdcccc97c86",
+ "9a22728ec7edf54cd5de0cf65208e59858e778d2",
[
null,
{}
@@ -449366,7 +450126,7 @@
]
],
"idlharness.window.js": [
- "50faf83514fdccf0a0c1d2b82c89b74649af5724",
+ "d4d739ae8ebcd3ac12645b4a877f35649a72c5f4",
[
"html-media-capture/idlharness.window.html",
{
@@ -449378,8 +450138,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
]
@@ -451545,6 +452310,13 @@
{}
]
],
+ "sources.html": [
+ "599a5c471b38d53481d347f4053dd67fe58607ee",
+ [
+ null,
+ {}
+ ]
+ ],
"supported-layout-type.html": [
"3ba209f50a427965b651c92701a62f9006b8a2b1",
[
@@ -453573,7 +454345,7 @@
]
],
"MediaDevices-enumerateDevices.https.html": [
- "efb460731690df01e3b53d15eb4d097f2d16b106",
+ "92512eef0129bbc6d4791ad82287b5c7ce67fd56",
[
null,
{}
@@ -455443,7 +456215,7 @@
},
"native-file-system": {
"idlharness.https.any.js": [
- "567912ddd7788b871b00a2929f17dc47280dd2d7",
+ "98b27fd9e3842845771563b45f4161f766bad559",
[
"native-file-system/idlharness.https.any.html",
{
@@ -455455,8 +456227,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -455470,8 +456247,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -456666,7 +457448,7 @@
]
],
"idlharness.window.js": [
- "504453b9aff1e7b497c64955a98dc384817f1ba6",
+ "530a9058faa334aab29b8a6e87ca0a44d1286e18",
[
"navigation-timing/idlharness.window.html",
{
@@ -456678,8 +457460,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -468429,7 +469216,7 @@
]
],
"idlharness.https.window.js": [
- "55cfed9276b480d7f70c616fa8d815f6ec925d66",
+ "ba816bb87cf715fd860745d3b80ca30da688c430",
[
"orientation-event/idlharness.https.window.html",
{
@@ -468441,8 +469228,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -468922,7 +469714,7 @@
]
},
"idlharness.any.js": [
- "c8ee8a326d1325ab38cae686c4647a81ec12e517",
+ "d239c29b47e86911e02584fdb1f49ad378f9e622",
[
"origin-policy/idlharness.any.html",
{
@@ -468938,8 +469730,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -468957,8 +469754,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -468976,8 +469778,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -468995,8 +469802,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -469072,7 +469884,7 @@
},
"page-visibility": {
"idlharness.window.js": [
- "8cc2f83095c1ce7ad04a06406a0d79b876aee32b",
+ "7af89b6ddf2076256c00a5af702189ead85eccbb",
[
"page-visibility/idlharness.window.html",
{
@@ -469084,8 +469896,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -469515,7 +470332,7 @@
]
],
"idlharness.https.any.js": [
- "878114ec7ed878d3e754341cbffa138092fee129",
+ "dfb0190abacb96c61cf5c125c68a1ad346f60205",
[
"payment-handler/idlharness.https.any.html",
{
@@ -469535,8 +470352,13 @@
[
"script",
"/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -469558,8 +470380,13 @@
[
"script",
"/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -469581,8 +470408,13 @@
[
"script",
"/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -469604,8 +470436,13 @@
[
"script",
"/service-workers/service-worker/resources/test-helpers.sub.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -470632,7 +471469,7 @@
},
"permissions-revoke": {
"idlharness.any.js": [
- "53f36db7d9ed8f51b724571500cc279f712cc23e",
+ "51c63aadefcd800139041232df3cf03386e3bc53",
[
"permissions-revoke/idlharness.any.html",
{
@@ -470644,8 +471481,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -470659,8 +471501,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
]
@@ -472477,10 +473324,12 @@
]
],
"no-quirks.html": [
- "cd192029df4907dc8fd959828e8d4accb6ddf01b",
+ "82036f9a617062b3fc11755a894f7266021f8097",
[
null,
- {}
+ {
+ "timeout": "long"
+ }
]
],
"quirks.html": [
@@ -483831,7 +484680,7 @@
]
],
"element-based-offset.html": [
- "1c7d99822855e619a3e53084a608a104970ccf27",
+ "064ab4c5f3ae43c4ea4476997a85c3836a1419ee",
[
null,
{}
@@ -483855,8 +484704,15 @@
}
]
],
+ "scroll-animation-inactive-timeline.html": [
+ "07dae95692eb58d1b0079ecf5b8f5048875ad3a9",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-animation.html": [
- "901549e7a44545e1ffe1ec1a4b00df1f605aac35",
+ "cb270d52f7c406523cc7705433267bdf33ede5cc",
[
null,
{}
@@ -483877,7 +484733,7 @@
]
],
"setting-current-time.html": [
- "0b7dcc60034d16207b9e88f8da34bddeb044b23d",
+ "d46206d8257702d443e3b1e620bf9bad4f327ee3",
[
null,
{}
@@ -485819,6 +486675,15 @@
null,
{}
]
+ ],
+ "samesite-cookies.https.html": [
+ "a860d9545662138570ef59808c465b33b7261b48",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
]
},
"navigation-redirect-body.https.html": [
@@ -486598,8 +487463,15 @@
{}
]
],
- "declarative-shadow-dom.tentative.html": [
- "792d4bf4b3ecd0b8a611cccdae5bc2e726486f25",
+ "declarative-shadow-dom-attachment.tentative.html": [
+ "0acdeb812ec7fa4fac541ef3bc19e1da2f455d64",
+ [
+ null,
+ {}
+ ]
+ ],
+ "declarative-shadow-dom-basic.tentative.html": [
+ "c8a00f59bc8981488b30553bb531f50c2abdc100",
[
null,
{}
@@ -488287,7 +489159,7 @@
]
],
"idlharness.https.any.js": [
- "0ce4d5a0c8fccf07f6908a7a9ac9ac5ab5df6624",
+ "773fac4e4a8cabb09b6c3f838a83aac7c3b43f54",
[
"storage/idlharness.https.any.html",
{
@@ -488299,8 +489171,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -488314,8 +489191,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -500090,7 +500972,7 @@
]
],
"idlharness.window.js": [
- "fbe14daa6119a8213ca58e2233345af015353a1b",
+ "a3cfbc11e03f18c741e779af8ed5ce59b2e18385",
[
"vibration/idlharness.window.html",
{
@@ -500102,8 +500984,13 @@
[
"script",
"/resources/idlharness.js"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -500651,7 +501538,7 @@
]
],
"toString.any.js": [
- "ca025576c2b49604f053c83002f3a9cc8ef41a7b",
+ "5f64d72de9d9df4a99e482cded5a30ac1c8a343c",
[
null,
{
@@ -501037,7 +501924,7 @@
]
],
"toString.any.js": [
- "ccd665eb285379d1c4de00ae19a8dc3693b22d40",
+ "701ec8f9bad998bc26310e74a8a7e23f2cbf5c4d",
[
null,
{
@@ -501260,7 +502147,7 @@
]
],
"toString.any.js": [
- "4e15d75ea20f1ebfeba5dc7c8a9a52c253dd01bf",
+ "bb9081d18617e1af72424ea700d30e5cb0efd98d",
[
null,
{
@@ -501507,7 +502394,7 @@
]
],
"toString.any.js": [
- "2db2002ffd2ea51a8684e4b52c24b8b18010f0cd",
+ "7dd85a1c4ac6e525e1e4c0f9bacc3295e7eda7fc",
[
null,
{
@@ -501556,6 +502443,13 @@
]
]
},
+ "proto-from-ctor-realm.html": [
+ "72931cca77cf2af6e06616af32b4608fb02d38c0",
+ [
+ null,
+ {}
+ ]
+ ],
"table": {
"constructor.any.js": [
"5c9a6f13d91eba098ab59e893145222375e1b6cc",
@@ -501827,7 +502721,7 @@
]
],
"toString.any.js": [
- "e576477910ad3198b446b4addf89ba9a571d020b",
+ "708c17b3acadfde2c9abda300c2d57e61f5a70ce",
[
null,
{
@@ -502972,7 +503866,7 @@
]
],
"pending.html": [
- "fe7efe05aafa9a68327df513b1f5dc51fc6ad4b3",
+ "c200f9e97739e802488d416b79fc5f6084655c6c",
[
null,
{}
@@ -503270,7 +504164,7 @@
]
],
"setting-the-timeline-of-an-animation.html": [
- "dd8617503951aafd71015d591914a1b54e3907a7",
+ "7e98ef4260f778c4257203f92db39a6bdaa92871",
[
null,
{}
@@ -503519,7 +504413,7 @@
]
],
"idlharness.tentative.https.any.js": [
- "1ad570370e5cdf49fe1c457fc0d37eb44eeedada",
+ "2df7831c3405720f62428eb2c8722c7d172f743e",
[
"web-locks/idlharness.tentative.https.any.html",
{
@@ -503535,8 +504429,13 @@
[
"global",
"window,dedicatedworker,sharedworker,serviceworker"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -503554,8 +504453,13 @@
[
"global",
"window,dedicatedworker,sharedworker,serviceworker"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -503573,8 +504477,13 @@
[
"global",
"window,dedicatedworker,sharedworker,serviceworker"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
],
[
@@ -503592,8 +504501,13 @@
[
"global",
"window,dedicatedworker,sharedworker,serviceworker"
+ ],
+ [
+ "timeout",
+ "long"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
@@ -514081,6 +514995,13 @@
{}
]
],
+ "idlharness.https.html": [
+ "b7f67845470efa9730bcc754c098b5457e089f34",
+ [
+ null,
+ {}
+ ]
+ ],
"xrRay_constructor.https.html": [
"56b39313410b46bc1ab468fa00fedeb516b57b5d",
[
@@ -515296,14 +516217,14 @@
]
],
"WorkerNavigator_userAgentData.http.html": [
- "e47e7e7ceba638eda3d946b420d817a7013aa217",
+ "4e8ca34eebccd53d0e00e39008d2da7f29945a68",
[
null,
{}
]
],
"WorkerNavigator_userAgentData.https.html": [
- "91a63966c01fa30832b72bb16ce4c8926db716f9",
+ "c93cd1ed34598ac0dc4450b116f3e791f9be72e8",
[
null,
{}
@@ -516459,7 +517380,7 @@
]
],
"dedicated-worker-parse-error-failure.html": [
- "e7cb1c476231f0cc8b19021548772caba14a3740",
+ "343bfe289f30c27509118741ace57db19b6b270f",
[
null,
{}
@@ -519905,7 +520826,7 @@
]
],
"send-redirect-to-cors.htm": [
- "43bbe4b6d79079d623783fe15e15a8b7dd285e36",
+ "54d7eb550df7510a58c18bf57e6b1614e76e00e2",
[
null,
{}
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini
new file mode 100644
index 00000000000..ff201e24186
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini
@@ -0,0 +1,33 @@
+[class-string-interface.any.html]
+ [Object.prototype.toString applied to the prototype]
+ expected: FAIL
+
+ [Object.prototype.toString applied to a null-prototype instance]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying the prototype's @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists on the prototype with the appropriate descriptor]
+ expected: FAIL
+
+
+[class-string-interface.any.worker.html]
+ [Object.prototype.toString applied to the prototype]
+ expected: FAIL
+
+ [Object.prototype.toString applied to a null-prototype instance]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying the prototype's @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists on the prototype with the appropriate descriptor]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini
new file mode 100644
index 00000000000..0d1aec4f066
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini
@@ -0,0 +1,33 @@
+[class-string-iterator-prototype-object.any.html]
+ [Object.prototype.toString]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after nulling the prototype]
+ expected: FAIL
+
+
+[class-string-iterator-prototype-object.any.worker.html]
+ [Object.prototype.toString]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after nulling the prototype]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini
new file mode 100644
index 00000000000..353805a5a06
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini
@@ -0,0 +1,13 @@
+[class-string-named-properties-object.window.html]
+ [Object.prototype.toString applied after modifying @@toStringTag]
+ expected: FAIL
+
+ [Object.prototype.toString applied after deleting @@toStringTag]
+ expected: FAIL
+
+ [@@toStringTag exists with the appropriate descriptor]
+ expected: FAIL
+
+ [Object.prototype.toString]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
new file mode 100644
index 00000000000..f64b45fea6b
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-002.html]
+ [Hit test float]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini
new file mode 100644
index 00000000000..f29da48a2a0
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-003.html]
+ [Miss float below something else]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini
new file mode 100644
index 00000000000..d0b3bc98be7
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-iframe-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini
new file mode 100644
index 00000000000..c69b7cbb3b0
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini
new file mode 100644
index 00000000000..25f76c60b9b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini
@@ -0,0 +1,2 @@
+[background-margin-transformed-root.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini
new file mode 100644
index 00000000000..20e1b790822
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini
@@ -0,0 +1,2 @@
+[gap-011.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini
new file mode 100644
index 00000000000..9f3e416efc5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini
@@ -0,0 +1,2 @@
+[gap-012.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini
new file mode 100644
index 00000000000..856975d6f05
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini
@@ -0,0 +1,2 @@
+[gap-013.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini
new file mode 100644
index 00000000000..f5e7fbecd47
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini
@@ -0,0 +1,2 @@
+[gap-014.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini
new file mode 100644
index 00000000000..660a042cb7f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini
@@ -0,0 +1,2 @@
+[gap-015.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini
new file mode 100644
index 00000000000..d1071378ed9
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini
@@ -0,0 +1,2 @@
+[gap-016.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini b/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini
new file mode 100644
index 00000000000..1569c50b18c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini
@@ -0,0 +1,2 @@
+[backface-visibility-hidden-animated.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini
new file mode 100644
index 00000000000..8e9e7b13e49
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini
@@ -0,0 +1,2 @@
+[fill-box-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini
new file mode 100644
index 00000000000..3f1877d85ad
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini
@@ -0,0 +1,2 @@
+[fill-box-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini b/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini
new file mode 100644
index 00000000000..d48f67c6c1f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini
@@ -0,0 +1,2 @@
+[transform-percent-010.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
index f8e7e539aae..4a1e8110f6f 100644
--- a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
+++ b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
@@ -2,6 +2,3 @@
[Hit test intersecting scaled box]
expected: FAIL
- [Hit test within unscaled box]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini
index 42f61e8ed49..2dffa903119 100644
--- a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini
+++ b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini
@@ -509,3 +509,39 @@
[border-left-width length(pt) / values]
expected: FAIL
+ [right length(pc) / values]
+ expected: FAIL
+
+ [top length(pt) / values]
+ expected: FAIL
+
+ [top length(pc) / values]
+ expected: FAIL
+
+ [right length(px) / values]
+ expected: FAIL
+
+ [top length(px) / values]
+ expected: FAIL
+
+ [top percentage(%) / values]
+ expected: FAIL
+
+ [top length(em) / values]
+ expected: FAIL
+
+ [top length(in) / values]
+ expected: FAIL
+
+ [top length(cm) / values]
+ expected: FAIL
+
+ [top length(mm) / values]
+ expected: FAIL
+
+ [top length(ex) / values]
+ expected: FAIL
+
+ [right length(pt) / values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
index 628b1fab770..c884dc82eab 100644
--- a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
@@ -2,3 +2,6 @@
[listeners are called when <iframe> is resized]
expected: FAIL
+ [listeners are called correct number of times]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
deleted file mode 100644
index e181af5397f..00000000000
--- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[elementsFromPoint-invalid-cases.html]
- [The root element is the last element returned for otherwise empty queries within the viewport]
- 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 a5926d41b90..221f0bc51f8 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -318,9 +318,18 @@
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;x=" text/plain]
+ [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
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 ac4cbcba706..279734168dc 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -53,9 +53,9 @@
[combined text/javascript ]
expected: FAIL
- [separate text/javascript;charset=windows-1252 error text/javascript]
+ [separate text/javascript x/x]
expected: FAIL
- [separate text/javascript x/x]
+ [separate text/javascript;charset=windows-1252 text/javascript]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index 30e1b851fd4..61682d248e2 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,3 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
+ [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
new file mode 100644
index 00000000000..75d75b4cda2
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_2.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
new file mode 100644
index 00000000000..51f8272a6de
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_3.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
index e3b55e1876a..328448ca87a 100644
--- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
@@ -1379,6 +1379,15 @@
[ElementInternals interface: operation setFormValue((File or USVString or FormData)?, optional (File or USVString or FormData)?)]
expected: FAIL
+ [Navigator interface: operation registerProtocolHandler(DOMString, USVString)]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: calling registerProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index 8b743f36e1d..dab21cae5d8 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -4,7 +4,7 @@
expected: FAIL
[Element with tabindex should support autofocus]
- expected: TIMEOUT
+ expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
expected: NOTRUN
@@ -13,8 +13,5 @@
expected: NOTRUN
[Host element with delegatesFocus should support autofocus]
- expected: NOTRUN
-
- [Non-HTMLElement should not support autofocus]
- expected: NOTRUN
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index 9df1ac56f2a..963d4cd20ef 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index d43f38b40cd..45d8be1c898 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
index a1effd5f801..5ddb9bfeff6 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
@@ -1,9 +1,10 @@
[promise-job-entry.html]
+ expected: TIMEOUT
[Fulfillment handler on fulfilled promise]
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: FAIL
+ expected: TIMEOUT
[Sanity check: this all works as expected with no promises involved]
expected: FAIL
@@ -15,5 +16,5 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini b/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini
new file mode 100644
index 00000000000..4af6bc07bbf
--- /dev/null
+++ b/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini
@@ -0,0 +1,226 @@
+[proto-from-ctor-realm.html]
+ [WebAssembly.Table: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: cross-realm NewTarget with `""` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Instance: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `"str"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Global: Proxy of Proxy of cross-realm NewTarget with `-0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: cross-realm NewTarget with `-1` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `0` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound Proxy of cross-realm NewTarget with `false` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: bound bound cross-realm NewTarget with `null` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `undefined` prototype]
+ expected: FAIL
+
+ [WebAssembly.Memory: Proxy of bound cross-realm NewTarget with `NaN` prototype]
+ expected: FAIL
+
+ [WebAssembly.Module: cross-realm NewTarget with `symbol "Symbol()"` prototype]
+ expected: FAIL
+
+ [WebAssembly.Table: cross-realm NewTarget with `true` prototype]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
index ef453d9ebcc..fb97f37983e 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
@@ -167,3 +167,6 @@
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 39026.\n\t[39026\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
expected: FAIL
+ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 40530 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 29020.\n\t[29020\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini b/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini
new file mode 100644
index 00000000000..ba041c725fd
--- /dev/null
+++ b/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini
@@ -0,0 +1,73 @@
+[idlharness.https.html]
+ [XRTransientInputHitTestSource interface object length]
+ expected: FAIL
+
+ [XRFrame interface: operation getHitTestResultsForTransientInput(XRTransientInputHitTestSource)]
+ expected: FAIL
+
+ [XRRay interface: new XRRay() must inherit property "matrix" with the proper type]
+ expected: FAIL
+
+ [XRSession interface: operation requestHitTestSource(XRHitTestOptionsInit)]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface object name]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface object name]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [XRSession interface: calling requestHitTestSource(XRHitTestOptionsInit) on xrSession with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: attribute results]
+ expected: FAIL
+
+ [XRSession interface: calling requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit) on xrSession with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: attribute inputSource]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)" with the proper type]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [idl_test setup]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "requestHitTestSource(XRHitTestOptionsInit)" with the proper type]
+ expected: FAIL
+
+ [XRTransientInputHitTestSource interface: operation cancel()]
+ expected: FAIL
+
+ [XRSession interface: operation requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)]
+ expected: FAIL
+
+ [XRTransientInputHitTestResult interface object length]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
index 14e1efa1e84..c71f54ddc07 100644
--- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
@@ -338,3 +338,27 @@
[Stringification of xrInputSourceArray]
expected: FAIL
+ [XRLayer interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRLayer interface object name]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [XRWebGLLayer interface: existence and properties of interface object]
+ expected: FAIL
+
+ [XRWebGLLayer interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [XRLayer interface object length]
+ expected: FAIL
+
+ [XRLayer interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini
deleted file mode 100644
index fe8654e447c..00000000000
--- a/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[WorkerGlobalScope-close.html]
- [Test sending a message after closing.]
- 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/metadata/xhr/send-redirect-to-cors.htm.ini b/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini
index 83385f509bb..fcc36e00a53 100644
--- a/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini
+++ b/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini
@@ -27,3 +27,9 @@
[XMLHttpRequest: send() - Redirect to CORS-enabled resource (303 FOO with string and explicit Content-Type safelisted)]
expected: FAIL
+ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (302 POST with string and explicit Content-Type)]
+ expected: FAIL
+
+ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (301 POST with string and explicit Content-Type)]
+ expected: FAIL
+
diff --git a/tests/wpt/web-platform-tests/.taskcluster.yml b/tests/wpt/web-platform-tests/.taskcluster.yml
index 556b9914d5b..7f794e8c2b0 100644
--- a/tests/wpt/web-platform-tests/.taskcluster.yml
+++ b/tests/wpt/web-platform-tests/.taskcluster.yml
@@ -56,7 +56,7 @@ tasks:
owner: ${owner}
source: ${event.repository.clone_url}
payload:
- image: hexcles/web-platform-tests:0.35
+ image: webplatformtests/wpt:0.36
maxRunTime: 7200
artifacts:
public/results:
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html
new file mode 100644
index 00000000000..633f7e4f7e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>createImageBitmap and drawImage from a blob with image orientation: from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/drawImage-from-blob-ref.html">
+ <script>
+ function makeBlob() {
+ return new Promise(function(resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", '/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg');
+ xhr.responseType = 'blob';
+ xhr.send();
+ xhr.onload = function() {
+ resolve(xhr.response);
+ };
+ });
+ }
+
+ window.onload = function() {
+ var cfb = document.getElementById("canvasWithFileBitmap");
+ makeBlob().then(function(blob){createImageBitmap(blob).then(bitmap => {
+ cfb.getContext("2d").drawImage(bitmap, 0, 0);
+ window.requestAnimationFrame(() => {
+ document.documentElement.removeAttribute("class");
+ });
+ });
+ });
+ }
+</script>
+</head>
+<body>
+ <canvas id="canvasWithFileBitmap" width="300" height="300"></canvas>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html
new file mode 100644
index 00000000000..72bd98fa252
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>createImageBitmap and drawImage from a blob with image orientation: from-image, reference</title>
+</head>
+<body>
+ <img id="img-element" src="../../../../css/css-images/image-orientation/support/exif-orientation-3-lr.jpg">
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js
new file mode 100644
index 00000000000..ee792d53683
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js
@@ -0,0 +1,62 @@
+"use strict";
+
+test(() => {
+ assert_own_property(Blob.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(Blob.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "Blob", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
+
+test(() => {
+ assert_not_own_property(new Blob(), Symbol.toStringTag);
+}, "@@toStringTag must not exist on the instance");
+
+test(() => {
+ assert_equals(Object.prototype.toString.call(Blob.prototype), "[object Blob]");
+}, "Object.prototype.toString applied to the prototype");
+
+test(() => {
+ assert_equals(Object.prototype.toString.call(new Blob()), "[object Blob]");
+}, "Object.prototype.toString applied to an instance");
+
+test(t => {
+ assert_own_property(Blob.prototype, Symbol.toStringTag, "Precondition for this test: @@toStringTag on the prototype");
+
+ t.add_cleanup(() => {
+ Object.defineProperty(Blob.prototype, Symbol.toStringTag, { value: "Blob" });
+ });
+
+ Object.defineProperty(Blob.prototype, Symbol.toStringTag, { value: "NotABlob" });
+ assert_equals(Object.prototype.toString.call(Blob.prototype), "[object NotABlob]", "prototype");
+ assert_equals(Object.prototype.toString.call(new Blob()), "[object NotABlob]", "instance");
+}, "Object.prototype.toString applied after modifying the prototype's @@toStringTag");
+
+test(t => {
+ const instance = new Blob();
+ assert_not_own_property(instance, Symbol.toStringTag, "Precondition for this test: no @@toStringTag on the instance");
+
+ Object.defineProperty(instance, Symbol.toStringTag, { value: "NotABlob" });
+ assert_equals(Object.prototype.toString.call(instance), "[object NotABlob]");
+}, "Object.prototype.toString applied to the instance after modifying the instance's @@toStringTag");
+
+// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there
+// was no @@toStringTag in the prototype, it would fall back to a magic class string. This tests
+// that the bug is fixed.
+
+test(() => {
+ const instance = new Blob();
+ Object.setPrototypeOf(instance, null);
+
+ assert_equals(Object.prototype.toString.call(instance), "[object Object]");
+}, "Object.prototype.toString applied to a null-prototype instance");
+
+// This test must be last.
+test(() => {
+ delete Blob.prototype[Symbol.toStringTag];
+
+ assert_equals(Object.prototype.toString.call(Blob.prototype), "[object Object]", "prototype");
+ assert_equals(Object.prototype.toString.call(new Blob()), "[object Object]", "instance");
+}, "Object.prototype.toString applied after deleting @@toStringTag");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js
new file mode 100644
index 00000000000..2185ae0bb7b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js
@@ -0,0 +1,50 @@
+"use strict";
+
+const iteratorProto = Object.getPrototypeOf((new URLSearchParams()).entries());
+
+test(() => {
+ assert_own_property(iteratorProto, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(iteratorProto, Symbol.toStringTag);
+ assert_equals(propDesc.value, "URLSearchParams Iterator", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists with the appropriate descriptor");
+
+test(() => {
+ assert_equals(Object.prototype.toString.call(iteratorProto), "[object URLSearchParams Iterator]");
+}, "Object.prototype.toString");
+
+test(t => {
+ assert_own_property(iteratorProto, Symbol.toStringTag, "Precondition for this test: @@toStringTag exists");
+
+ t.add_cleanup(() => {
+ Object.defineProperty(iteratorProto, Symbol.toStringTag, { value: "URLSearchParams Iterator" });
+ });
+
+ Object.defineProperty(iteratorProto, Symbol.toStringTag, { value: "Not URLSearchParams Iterator" });
+ assert_equals(Object.prototype.toString.call(iteratorProto), "[object Not URLSearchParams Iterator]");
+}, "Object.prototype.toString applied after modifying @@toStringTag");
+
+// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there
+// was no @@toStringTag, it would fall back to a magic class string. This tests that the bug is
+// fixed.
+
+test(t => {
+ const proto = Object.getPrototypeOf(iteratorProto);
+ t.add_cleanup(() => {
+ Object.setPrototypeOf(iteratorProto, proto);
+ });
+
+ Object.setPrototypeOf(iteratorProto, null);
+
+ assert_equals(Object.prototype.toString.call(iteratorProto), "[object Object]");
+}, "Object.prototype.toString applied after nulling the prototype");
+
+// This test must be last.
+test(() => {
+ delete iteratorProto[Symbol.toStringTag];
+
+ assert_equals(Object.prototype.toString.call(iteratorProto), "[object Object]", "prototype");
+}, "Object.prototype.toString applied after deleting @@toStringTag");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js
new file mode 100644
index 00000000000..ad466188bae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js
@@ -0,0 +1,42 @@
+"use strict";
+
+const namedPropertiesObject = Object.getPrototypeOf(Window.prototype);
+
+test(() => {
+ assert_own_property(namedPropertiesObject, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(namedPropertiesObject, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WindowProperties", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists with the appropriate descriptor");
+
+test(() => {
+ assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object WindowProperties]");
+}, "Object.prototype.toString");
+
+test(t => {
+ assert_own_property(namedPropertiesObject, Symbol.toStringTag, "Precondition for this test: @@toStringTag exists");
+
+ t.add_cleanup(() => {
+ Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "WindowProperties" });
+ });
+
+ Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "NotWindowProperties" });
+ assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object NotWindowProperties]");
+}, "Object.prototype.toString applied after modifying @@toStringTag");
+
+// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there
+// was no @@toStringTag, it would fall back to a magic class string. This tests that the bug is
+// fixed.
+
+// Note: we cannot null out the prototype of the named properties object per
+// https://heycam.github.io/webidl/#named-properties-object-setprototypeof so we don't have a test that does that.
+
+// This test must be last.
+test(() => {
+ delete namedPropertiesObject[Symbol.toStringTag];
+
+ assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object EventTarget]", "prototype");
+}, "Object.prototype.toString applied after deleting @@toStringTag");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html
index 03ada7aa0d4..d2d43eda9a9 100644
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html
@@ -5,18 +5,6 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
-// A specification issue was raised for this behavior.
-// https://www.w3.org/Bugs/Public/show_bug.cgi?id=28244
-test(function() {
- // Checks toString() behavior.
- assert_class_string(Document.prototype, "DocumentPrototype");
-
- assert_true(Document.prototype.hasOwnProperty(Symbol.toStringTag),
- "An interface prototype object should have toStringTag property.");
- assert_equals(Document.prototype[Symbol.toStringTag], "DocumentPrototype");
-}, "The class string of an interface prototype object is the concatenation of " +
- "the interface's identifier and the string 'Prototype'.");
-
test(function() {
// https://heycam.github.io/webidl/#create-an-interface-prototype-object
assert_own_property(Element.prototype, Symbol.unscopables, "Element.prototype has @@unscopables.");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html
index 466973dc08f..7859c1e46ac 100644
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html
@@ -37,16 +37,7 @@ test(() => {
});
}, "next() throws TypeError when called on ineligible receiver");
-test(() => {
- const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
- assert_equals(Object.prototype.toString.call(iteratorProto), "[object URLSearchParams Iterator]");
-}, "Object.prototype.toString returns correct value");
-
-test(() => {
- const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
- assert_equals(Object.getOwnPropertyDescriptor(iteratorProto, Symbol.toStringTag).value, "URLSearchParams Iterator");
- // Property attributes have not yet been fully spec'd.
-}, "@@toStringTag has correct value");
+// class string behavior tested in a dedicated file
test(() => {
const iteratorProto1 = Object.getPrototypeOf(new URLSearchParams().entries());
diff --git a/tests/wpt/web-platform-tests/bluetooth/README.md b/tests/wpt/web-platform-tests/bluetooth/README.md
index e7997c9fa26..abe277712bc 100644
--- a/tests/wpt/web-platform-tests/bluetooth/README.md
+++ b/tests/wpt/web-platform-tests/bluetooth/README.md
@@ -10,10 +10,11 @@ Testing] test API which must be provided by browsers under test.
TODO([#485]): Update the links to [FakeBluetooth][Web Bluetooth Testing] to
point to the [Testing Web Bluetooth specification].
-In this test suite `resources/bluetooth-helpers.js` detects and triggers
-the API to be loaded as needed. This file also contains several helper methods
-that are used in the tests to set up fake Bluetooth devices and to assert that
-specific Bluetooth events happened.
+In this test suite `resources/bluetooth-test.js` detects and triggers
+the API to be loaded as needed. This file also contains test helper methods,
+such as for asserting that Bluetooth events are fired in a specific order.
+The `resources/bluetooth-fake-devices.js` contains several helper methods that set
+up fake Bluetooth devices.
[Web Bluetooth specification]: https://WebBluetoothCG.github.io/web-bluetooth
[Web Bluetooth Testing]:
@@ -115,4 +116,4 @@ Bug tracker: [Blink>Bluetooth]
* [Web Bluetooth Service README]
-[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2 \ No newline at end of file
+[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2
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
index a9f540ecd34..55f4a675da1 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false if the system does ' +
'not have an adapter.';
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
index 30c47201f07..f8e25b2ac2f 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true after adapter is ' +
'inserted into a system with a platform that supports Bluetooth LE.';
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
index b760d4bc272..1ffcd3bb096 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
'radio is powered off, but the platform that supports Bluetooth LE.';
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
index f98a88eea9e..84c7982d214 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
'radio is powered on and the platform supports Bluetooth LE.';
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
index ac664a89812..c4ba9b5f3a9 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() is not affected by the powered state of ' +
'the adapter.';
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
index 00425aa56f2..ca0b51f47dc 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false after the powered ' +
'on adapter is removed.';
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
index ce633c63f98..54abfbb5cef 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false if called from a ' +
'unique origin';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js
index 5239accab97..f7a57a9c4b8 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'HeartRate device properties';
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
index eb91e972c4e..7789f4b7c46 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
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
index 4cff64bbdad..01d4e8f30f8 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getDescriptor should return the same object.';
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
index f5d1761994a..16b34dc0912 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.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.
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
index 7405a8ee6e3..b924f052d37 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
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
index 470f7043be3..ae8127c87b3 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
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
index 1dc58aea155..11dd8bee80a 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getDescriptors should return the same object.';
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
index 5ee7e0d2494..13e2e3751a8 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.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.
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
index 24a2087e938..99056cf209a 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.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.
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js
index 2ab165d9044..9641ad71e97 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic is removed. Reject with InvalidStateError.';
const expected = new DOMException(
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js
index d2456934d83..a5851fc4733 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service is removed. Reject with InvalidStateError.';
const expected =
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js
index 13709ea941e..0eeafd0b79b 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Add multiple event listeners then readValue().';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js
index 269f2cb4a1f..e97b94f7366 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
const expected = new DOMException(
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js
index 03b8f2b4cee..52b70e7a080 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Reading a characteristic should fire an event.';
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
index 26efe8b306b..e2599a16fae 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js
index 82be128f312..e5ddfb81696 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A read request succeeds and returns the characteristic\'s ' +
'value.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js
index 34da455ddff..bb98aeb18f2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
const test_desc = 'Succesful read should update characteristic.value';
const EXPECTED_VALUE = [0, 1, 2];
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js
index 20dd4ba1c05..1f699ca25ee 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
const expected =
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js
index b34b3b9216a..dafd755fd1d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Same parent service returned from multiple characteristics.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js
index b58902ae519..01b3a25e35e 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = '[SameObject] test for BluetoothRemoteGATTCharacteristic ' +
'service.';
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
index af27f933d8f..62d0d15d10b 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js
index d900632c4b5..5d707775e11 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'writeValue() fails when passed a detached buffer';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js
index c0f5a3e6509..6e9da8802c7 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
const expected = new DOMException(
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
index d5ac10fc611..2ceeabdb145 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js
index e7a2837c389..89c31124750 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
const expected =
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js
index cdda9cec345..d5c173c47ae 100644
--- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A regular write request to a writable characteristic ' +
'should succeed.';
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
index aa95687094b..2c46b99fd1d 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
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
index fc1facaf58e..d81db2f8c0d 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = `A read request succeeds and returns the descriptor's value.`;
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
index 4fd3d661f7d..49daf7cf86d 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'writeValue() fails when passed a detached buffer';
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
index a486819b55a..c681bcee419 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
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
index dab54d5da29..43a11a88cbf 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device disconnecting while connected should fire the ' +
'gattserverdisconnected event.';
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
index a15cc943f4e..a2c20ea4620 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device disconnecting after the BluetoothDevice object ' +
'has been GC\'ed should not access freed memory.';
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
index f5e45f99755..ab273adbc88 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.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 ' +
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
index 8f264c7b025..bdaf47c6619 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device that reconnects during the ' +
'gattserverdisconnected event should still receive ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js
index 34b5912315a..3228543617d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getDevices() resolves with permitted devices that can be ' +
'GATT connected to.';
@@ -68,4 +69,4 @@ bluetooth_test(async () => {
} catch (err) {
assert_unreached(`${err.name}: ${err.message}`);
}
-}, test_desc); \ No newline at end of file
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js
index d945c3ff242..304aa3820d5 100644
--- a/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getDevices() resolves with empty array if no device ' +
'permissions have been granted.';
@@ -11,4 +12,4 @@ bluetooth_test(async () => {
assert_equals(
0, devices.length, 'getDevices() should resolve with an empty array');
-}, test_desc); \ No newline at end of file
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js
index 7c80703d5f5..81c0f6a97e9 100644
--- a/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js
+++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'multiple calls to getDevices() resolves with the same' +
'BluetoothDevice objects for each granted Bluetooth device.';
@@ -19,4 +20,4 @@ bluetooth_test(async () => {
firstDevices[0], secondDevices[0],
'getDevices() should produce the same BluetoothDevice objects for a ' +
'given Bluetooth device.');
-}, test_desc); \ No newline at end of file
+}, test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html b/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html
index 6030d4e5acd..ef2863dc274 100644
--- a/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc_idl = 'BluetoothDevice IDL test.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html
index 7b68acf1471..a47ee603f84 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Device with empty name and no UUIDs nearby. Should be ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html
index 3c2dcb7f8a6..a69b313b51e 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
const test_desc =
'A device with name and no UUIDs nearby. Should be found if ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html
index d4c26771305..5d1fec3342e 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice called with acceptAllDevices: true and ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html
index 86377c289f6..06897f80992 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice called with acceptAllDevices: true and with ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html
index 630548d6846..cb2f989a477 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with SecurityError if requesting a blocklisted ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html
index 5c176b82b7f..3f435f9ff18 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Blocklisted UUID in optionalServices is removed and ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html
index 5ca358a0e1a..28f614bcbf2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name between 29 and 248 bytes is valid.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html
index 788d9f80361..4beb5266b68 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A filter must restrict the devices in some way.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html
index 65bfc6443a4..2a6a0daa35f 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'An empty |filters| member should result in a TypeError';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html
index 549f0d4059c..3e490e17d99 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice with empty namePrefix. ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html
index b70a8a32087..3a485878be1 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Services member must contain at least one service.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html
index d3f6e5ccb13..d6177caf7f8 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'RequestDeviceOptions should have exactly one of ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html
index 5e1397dbd9a..4ec036695bd 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Unicode string with utf8 representation longer than 248 ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html
index a270cac4331..0fac15ec65d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name longer than 248 must reject.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html
index 05a9bd31300..d622da56df5 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Unicode string with utf8 representation longer than 248 ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html
index a31e4b398e7..8251935be16 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name prefix longer than 248 must reject.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html
index dca018b4954..c7cb0aa25e2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A unicode device name of 248 bytes is valid.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html
index 7244910afa4..4b57e4b0ac8 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name of 248 bytes is valid.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html
index ba4bdf94c63..72faac6de8b 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A unicode device namePrefix of 248 bytes is valid.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html
index ced34793355..bf751501bfb 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device namePrefix of 248 bytes is valid.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html
index 33f933ad09c..a1cc4e5b422 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html
@@ -4,7 +4,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice() requires an argument.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html
index 787f34d5c68..70b284a2738 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A name containing unicode characters whose utf8 length ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html
index bafb36d710c..726e293580f 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A namePrefix containing unicode characters whose utf8 ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html
index e4880b6f57d..07187b4b759 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Invalid optional service must reject the promise.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html
index 9d31b951be7..a78d75e6b4d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Invalid service must reject the promise.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html
index d5cf382f664..543c8a586e9 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html
index 5bd7ff1246b..7bed9e0acb5 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Discover a device using alias, name, or UUID.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html
index 19ac36f80ad..d439bf79c9d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice calls do not consume user gestures.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html
index 1aeae776f06..1c42d779216 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Matches a filter if all present members match.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html
index 3da9abeb773..e130fe92e63 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if Bluetooth is not supported.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html
index 944befdfe83..6d707a13850 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'An empty name device can be obtained by empty name filter.'
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html
index f74540db958..6795ae43015 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Requires a user gesture.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html
index 929af8ffb77..9494fa572a3 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if there is no BT radio present.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html
index 64ad3d592d1..484a35b79be 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Concurrent requestDevice calls in iframes work.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html
index 4c4a5707e8e..26291b3b4c1 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html
index b96af439973..c0e83cc9c74 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Returned device should always be the same.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html
index 9c0d621c237..8873a45e31d 100644
--- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Simple filter selects matching device.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js
new file mode 100644
index 00000000000..3bbcc6b322e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js
@@ -0,0 +1,991 @@
+'use strict';
+
+/* Bluetooth Constants */
+
+/**
+ * HCI Error Codes.
+ * Used for simulateGATT{Dis}ConnectionResponse. For a complete list of
+ * possible error codes see BT 4.2 Vol 2 Part D 1.3 List Of Error Codes.
+ */
+const HCI_SUCCESS = 0x0000;
+const HCI_CONNECTION_TIMEOUT = 0x0008;
+
+/**
+ * GATT Error codes.
+ * Used for GATT operations responses. BT 4.2 Vol 3 Part F 3.4.1.1 Error
+ * Response
+ */
+const GATT_SUCCESS = 0x0000;
+const GATT_INVALID_HANDLE = 0x0001;
+
+/* Bluetooth UUID Constants */
+
+/* Service UUIDs */
+var blocklist_test_service_uuid = '611c954a-263b-4f4a-aab6-01ddb953f985';
+var request_disconnection_service_uuid = '01d7d889-7451-419f-aeb8-d65e7b9277af';
+
+/* Characteristic UUIDs */
+var blocklist_exclude_reads_characteristic_uuid =
+ 'bad1c9a2-9a5b-4015-8b60-1579bbbf2135';
+var request_disconnection_characteristic_uuid =
+ '01d7d88a-7451-419f-aeb8-d65e7b9277af';
+
+/* Descriptor UUIDs */
+var blocklist_test_descriptor_uuid = 'bad2ddcf-60db-45cd-bef9-fd72b153cf7c';
+var blocklist_exclude_reads_descriptor_uuid =
+ 'bad3ec61-3cc3-4954-9702-7977df514114';
+
+/**
+ * Helper objects that associate Bluetooth names, aliases, and UUIDs. These are
+ * useful for tests that check that the same result is produces when using all
+ * three methods of referring to a Bluetooth UUID.
+ */
+var generic_access = {
+ alias: 0x1800,
+ name: 'generic_access',
+ uuid: '00001800-0000-1000-8000-00805f9b34fb'
+};
+var device_name = {
+ alias: 0x2a00,
+ name: 'gap.device_name',
+ uuid: '00002a00-0000-1000-8000-00805f9b34fb'
+};
+var reconnection_address = {
+ alias: 0x2a03,
+ name: 'gap.reconnection_address',
+ uuid: '00002a03-0000-1000-8000-00805f9b34fb'
+};
+var heart_rate = {
+ alias: 0x180d,
+ name: 'heart_rate',
+ uuid: '0000180d-0000-1000-8000-00805f9b34fb'
+};
+var health_thermometer = {
+ alias: 0x1809,
+ name: 'health_thermometer',
+ uuid: '00001809-0000-1000-8000-00805f9b34fb'
+};
+var body_sensor_location = {
+ alias: 0x2a38,
+ name: 'body_sensor_location',
+ uuid: '00002a38-0000-1000-8000-00805f9b34fb'
+};
+var glucose = {
+ alias: 0x1808,
+ name: 'glucose',
+ uuid: '00001808-0000-1000-8000-00805f9b34fb'
+};
+var battery_service = {
+ alias: 0x180f,
+ name: 'battery_service',
+ uuid: '0000180f-0000-1000-8000-00805f9b34fb'
+};
+var battery_level = {
+ alias: 0x2A19,
+ name: 'battery_level',
+ uuid: '00002a19-0000-1000-8000-00805f9b34fb'
+};
+var user_description = {
+ alias: 0x2901,
+ name: 'gatt.characteristic_user_description',
+ uuid: '00002901-0000-1000-8000-00805f9b34fb'
+};
+var client_characteristic_configuration = {
+ alias: 0x2902,
+ name: 'gatt.client_characteristic_configuration',
+ uuid: '00002902-0000-1000-8000-00805f9b34fb'
+};
+var measurement_interval = {
+ alias: 0x2a21,
+ name: 'measurement_interval',
+ uuid: '00002a21-0000-1000-8000-00805f9b34fb'
+};
+
+/**
+ * An advertisement packet object that simulates a device.
+ * @type {ScanResult}
+ */
+const health_thermometer_ad_packet = {
+ deviceAddress: '09:09:09:09:09:09',
+ rssi: -10,
+ scanRecord: {
+ name: 'Health Thermometer',
+ uuids: [health_thermometer.uuid],
+ },
+};
+
+/** Bluetooth Helpers */
+
+/**
+ * Helper class to create a BluetoothCharacteristicProperties object using an
+ * array of strings corresponding to the property bit to set.
+ */
+class TestCharacteristicProperties {
+ /** @param {Array<string>} properties */
+ constructor(properties) {
+ this.broadcast = false;
+ this.read = false;
+ this.writeWithoutResponse = false;
+ this.write = false;
+ this.notify = false;
+ this.indicate = false;
+ this.authenticatedSignedWrites = false;
+ this.reliableWrite = false;
+ this.writableAuxiliaries = false;
+
+ properties.forEach(val => {
+ if (this.hasOwnProperty(val))
+ this[val] = true;
+ else
+ throw `Invalid member '${val}'`;
+ });
+ }
+}
+
+/**
+ * Produces an array of BluetoothLEScanFilterInit objects containing the list of
+ * services in |services| and various permutations of the other
+ * BluetoothLEScanFilterInit properties. This method is used to test that the
+ * |services| are valid so the other properties do not matter.
+ * @param {BluetoothServiceUUID} services
+ * @returns {Array<RequestDeviceOptions>} A list of options containing
+ * |services| and various permutations of other options.
+ */
+function generateRequestDeviceArgsWithServices(services = ['heart_rate']) {
+ return [
+ {filters: [{services: services}]},
+ {filters: [{services: services, name: 'Name'}]},
+ {filters: [{services: services, namePrefix: 'Pre'}]},
+ {filters: [{services: services, name: 'Name', namePrefix: 'Pre'}]},
+ {filters: [{services: services}], optionalServices: ['heart_rate']}, {
+ filters: [{services: services, name: 'Name'}],
+ optionalServices: ['heart_rate']
+ },
+ {
+ filters: [{services: services, namePrefix: 'Pre'}],
+ optionalServices: ['heart_rate']
+ },
+ {
+ filters: [{services: services, name: 'Name', namePrefix: 'Pre'}],
+ optionalServices: ['heart_rate']
+ }
+ ];
+}
+
+/**
+ * Causes |fake_peripheral| to disconnect and returns a promise that resolves
+ * once `gattserverdisconnected` has been fired on |device|.
+ * @param {BluetoothDevice} device The device to check if the
+ * `gattserverdisconnected` promise was fired.
+ * @param {FakePeripheral} fake_peripheral The device fake that represents
+ * |device|.
+ * @returns {Promise<Array<Object>>} A promise that resolves when the device has
+ * successfully disconnected.
+ */
+function simulateGATTDisconnectionAndWait(device, fake_peripheral) {
+ return Promise.all([
+ eventPromise(device, 'gattserverdisconnected'),
+ fake_peripheral.simulateGATTDisconnection(),
+ ]);
+}
+
+/**
+ * Returns an array containing two FakePeripherals corresponding
+ * to the simulated devices.
+ * @returns {Promise<Array<FakePeripheral>>} The fake devices are initialized as
+ * Health Thermometer and Heart Rate devices.
+ */
+function setUpHealthThermometerAndHeartRateDevices() {
+ return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
+ .then(fake_central => Promise.all([
+ fake_central.simulatePreconnectedPeripheral({
+ address: '09:09:09:09:09:09',
+ name: 'Health Thermometer',
+ knownServiceUUIDs: ['generic_access', 'health_thermometer'],
+ }),
+ fake_central.simulatePreconnectedPeripheral({
+ address: '08:08:08:08:08:08',
+ name: 'Heart Rate',
+ knownServiceUUIDs: ['generic_access', 'heart_rate'],
+ })
+ ]));
+}
+
+/**
+ * Simulates a pre-connected device with |address|, |name| and
+ * |knownServiceUUIDs|.
+ * @param {string} address The device MAC address.
+ * @param {string} name The device name.
+ * @param {Array<string>} knownServiceUUIDs An array of GATT service UUIDs to
+ * set up the fake with.
+ * @returns {Promise<FakePeripheral>} The fake devices are initialized with the
+ * parameter values.
+ */
+function setUpPreconnectedDevice({
+ address = '00:00:00:00:00:00',
+ name = 'LE Device',
+ knownServiceUUIDs = []
+}) {
+ return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
+ .then(fake_central => fake_central.simulatePreconnectedPeripheral({
+ address: address,
+ name: name,
+ knownServiceUUIDs: knownServiceUUIDs,
+ }));
+}
+
+/** Blocklisted GATT Device Helper Methods */
+
+/**
+ * Returns an object containing a BluetoothDevice discovered using |options|,
+ * its corresponding FakePeripheral and FakeRemoteGATTServices.
+ * The simulated device is called 'Blocklist Device' and it has one known
+ * service UUID |blocklist_test_service_uuid|. The |blocklist_test_service_uuid|
+ * service contains two characteristics:
+ * - |blocklist_exclude_reads_characteristic_uuid| (read, write)
+ * - 'gap.peripheral_privacy_flag' (read, write)
+ * The 'gap.peripheral_privacy_flag' characteristic contains three descriptors:
+ * - |blocklist_test_descriptor_uuid|
+ * - |blocklist_exclude_reads_descriptor_uuid|
+ * - 'gatt.client_characteristic_configuration'
+ * These are special UUIDs that have been added to the blocklist found at
+ * https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
+ * There are also test UUIDs that have been added to the test environment which
+ * other implementations should add as test UUIDs as well.
+ * The device has been connected to and its attributes are ready to be
+ * discovered.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor}>} An
+ * object containing the BluetoothDevice object and its corresponding
+ * GATT fake objects.
+ */
+function getBlocklistDevice(options = {
+ filters: [{services: [blocklist_test_service_uuid]}]
+}) {
+ let device, fake_peripheral, fake_blocklist_test_service,
+ fake_blocklist_exclude_reads_characteristic,
+ fake_blocklist_exclude_writes_characteristic, fake_blocklist_descriptor,
+ fake_blocklist_exclude_reads_descriptor,
+ fake_blocklist_exclude_writes_descriptor;
+ return setUpPreconnectedDevice({
+ address: '11:11:11:11:11:11',
+ name: 'Blocklist Device',
+ knownServiceUUIDs: ['generic_access', blocklist_test_service_uuid],
+ })
+ .then(_ => fake_peripheral = _)
+ .then(() => requestDeviceWithTrustedClick(options))
+ .then(_ => device = _)
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => device.gatt.connect())
+ .then(() => fake_peripheral.addFakeService({
+ uuid: blocklist_test_service_uuid,
+ }))
+ .then(_ => fake_blocklist_test_service = _)
+ .then(() => fake_blocklist_test_service.addFakeCharacteristic({
+ uuid: blocklist_exclude_reads_characteristic_uuid,
+ properties: ['read', 'write'],
+ }))
+ .then(_ => fake_blocklist_exclude_reads_characteristic = _)
+ .then(() => fake_blocklist_test_service.addFakeCharacteristic({
+ uuid: 'gap.peripheral_privacy_flag',
+ properties: ['read', 'write'],
+ }))
+ .then(_ => fake_blocklist_exclude_writes_characteristic = _)
+ .then(
+ () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
+ {uuid: blocklist_test_descriptor_uuid}))
+ .then(_ => fake_blocklist_descriptor = _)
+ .then(
+ () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
+ {uuid: blocklist_exclude_reads_descriptor_uuid}))
+ .then(_ => fake_blocklist_exclude_reads_descriptor = _)
+ .then(
+ () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
+ {uuid: 'gatt.client_characteristic_configuration'}))
+ .then(_ => fake_blocklist_exclude_writes_descriptor = _)
+ .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => ({
+ device,
+ fake_peripheral,
+ fake_blocklist_test_service,
+ fake_blocklist_exclude_reads_characteristic,
+ fake_blocklist_exclude_writes_characteristic,
+ fake_blocklist_descriptor,
+ fake_blocklist_exclude_reads_descriptor,
+ fake_blocklist_exclude_writes_descriptor,
+ }));
+}
+
+/**
+ * Returns an object containing a Blocklist Test BluetoothRemoveGattService and
+ * its corresponding FakeRemoteGATTService.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeBluetoothRemoteGATTService}>} An object containing the
+ * BluetoothDevice object and its corresponding GATT fake objects.
+ */
+function getBlocklistTestService() {
+ let result;
+ return getBlocklistDevice()
+ .then(_ => result = _)
+ .then(
+ () =>
+ result.device.gatt.getPrimaryService(blocklist_test_service_uuid))
+ .then(service => Object.assign(result, {
+ service,
+ fake_service: result.fake_blocklist_test_service,
+ }));
+}
+
+/**
+ * Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
+ * that excludes reads and its corresponding FakeRemoteGATTCharacteristic.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeBluetoothRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object
+ * containing the BluetoothDevice object and its corresponding GATT fake
+ * objects.
+ */
+function getBlocklistExcludeReadsCharacteristic() {
+ let result, fake_characteristic;
+ return getBlocklistTestService()
+ .then(_ => result = _)
+ .then(
+ () => result.service.getCharacteristic(
+ blocklist_exclude_reads_characteristic_uuid))
+ .then(characteristic => Object.assign(result, {
+ characteristic,
+ fake_characteristic: result.fake_blocklist_exclude_reads_characteristic
+ }));
+}
+
+/**
+ * Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
+ * that excludes writes and its corresponding FakeRemoteGATTCharacteristic.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeBluetoothRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object
+ * containing the BluetoothDevice object and its corresponding GATT fake
+ * objects.
+ */
+function getBlocklistExcludeWritesCharacteristic() {
+ let result, fake_characteristic;
+ return getBlocklistTestService()
+ .then(_ => result = _)
+ .then(
+ () => result.service.getCharacteristic('gap.peripheral_privacy_flag'))
+ .then(characteristic => Object.assign(result, {
+ characteristic,
+ fake_characteristic: result.fake_blocklist_exclude_writes_characteristic
+ }));
+}
+
+/**
+ * Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
+ * excludes reads and its corresponding FakeRemoteGATTDescriptor.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeBluetoothRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic,
+ * descriptor: BluetoothRemoteGATTDescriptor,
+ * fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object
+ * containing the BluetoothDevice object and its corresponding GATT fake
+ * objects.
+ */
+function getBlocklistExcludeReadsDescriptor() {
+ let result;
+ return getBlocklistExcludeWritesCharacteristic()
+ .then(_ => result = _)
+ .then(
+ () => result.characteristic.getDescriptor(
+ blocklist_exclude_reads_descriptor_uuid))
+ .then(descriptor => Object.assign(result, {
+ descriptor,
+ fake_descriptor: result.fake_blocklist_exclude_reads_descriptor
+ }));
+}
+
+/**
+ * Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
+ * excludes writes and its corresponding FakeRemoteGATTDescriptor.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_blocklist_test_service: FakeRemoteGATTService,
+ * fake_blocklist_exclude_reads_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_exclude_writes_characteristic:
+ * FakeRemoteGATTCharacteristic,
+ * fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
+ * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeBluetoothRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic,
+ * descriptor: BluetoothRemoteGATTDescriptor,
+ * fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object
+ * containing the BluetoothDevice object and its corresponding GATT fake
+ * objects.
+ */
+function getBlocklistExcludeWritesDescriptor() {
+ let result;
+ return getBlocklistExcludeWritesCharacteristic()
+ .then(_ => result = _)
+ .then(
+ () => result.characteristic.getDescriptor(
+ 'gatt.client_characteristic_configuration'))
+ .then(descriptor => Object.assign(result, {
+ descriptor: descriptor,
+ fake_descriptor: result.fake_blocklist_exclude_writes_descriptor,
+ }));
+}
+
+/** Bluetooth HID Device Helper Methods */
+
+/**
+ * Similar to getHealthThermometerDevice except the GATT discovery
+ * response has not been set yet so more attributes can still be added.
+ * TODO(crbug.com/719816): Add descriptors.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
+ * containing a requested BluetoothDevice and its fake counter part.
+ */
+function getConnectedHIDDevice(options) {
+ let device, fake_peripheral;
+ return setUpPreconnectedDevice({
+ address: '10:10:10:10:10:10',
+ name: 'HID Device',
+ knownServiceUUIDs: [
+ 'generic_access',
+ 'device_information',
+ 'human_interface_device',
+ ],
+ })
+ .then(_ => (fake_peripheral = _))
+ .then(() => requestDeviceWithTrustedClick(options))
+ .then(_ => (device = _))
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => device.gatt.connect())
+ .then(() => fake_peripheral.addFakeService({
+ uuid: 'generic_access',
+ }))
+ .then(() => fake_peripheral.addFakeService({
+ uuid: 'device_information',
+ }))
+ // Blocklisted Characteristic:
+ // https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
+ .then(dev_info => dev_info.addFakeCharacteristic({
+ uuid: 'serial_number_string',
+ properties: ['read'],
+ }))
+ .then(() => fake_peripheral.addFakeService({
+ uuid: 'human_interface_device',
+ }))
+ .then(() => ({device, fake_peripheral}));
+}
+
+/**
+ * Returns a BluetoothDevice discovered using |options| and its
+ * corresponding FakePeripheral.
+ * The simulated device is called 'HID Device' it has three known service
+ * UUIDs: 'generic_access', 'device_information', 'human_interface_device'.
+ * The primary service with 'device_information' UUID has a characteristics
+ * with UUID 'serial_number_string'. The device has been connected to and its
+ * attributes are ready to be discovered.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
+ * containing a requested BluetoothDevice and its fake counter part.
+ */
+function getHIDDevice(options) {
+ let device, fake_peripheral;
+ return getConnectedHIDDevice(options)
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => ({device, fake_peripheral}));
+}
+
+/** Health Thermometer Bluetooth Device Helper Methods */
+
+/**
+ * Returns a FakePeripheral that corresponds to a simulated pre-connected device
+ * called 'Health Thermometer'. The device has two known serviceUUIDs:
+ * 'generic_access' and 'health_thermometer'.
+ * @returns {FakePeripheral} The device fake initialized as a Health
+ * Thermometer device.
+ */
+function setUpHealthThermometerDevice() {
+ return setUpPreconnectedDevice({
+ address: '09:09:09:09:09:09',
+ name: 'Health Thermometer',
+ knownServiceUUIDs: ['generic_access', 'health_thermometer'],
+ });
+}
+
+/**
+ * Returns the same fake peripheral as setUpHealthThermometerDevice() except
+ * that connecting to the peripheral will succeed.
+ * @returns {Promise<FakePeripheral>} The device fake initialized as a
+ * connectable Health Thermometer device.
+ */
+function setUpConnectableHealthThermometerDevice() {
+ let fake_peripheral;
+ return setUpHealthThermometerDevice()
+ .then(_ => fake_peripheral = _)
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => fake_peripheral);
+}
+
+/**
+ * Populates a fake_peripheral with various fakes appropriate for a health
+ * thermometer. This resolves to an associative array composed of the fakes,
+ * including the |fake_peripheral|.
+ * @param {FakePeripheral} fake_peripheral The Bluetooth fake to populate GATT
+ * services, characteristics, and descriptors on.
+ * @returns {Promise<{fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic}>} The FakePeripheral
+ * passed into this method along with the fake GATT services, characteristics,
+ * and descriptors added to it.
+ */
+function populateHealthThermometerFakes(fake_peripheral) {
+ let fake_generic_access, fake_health_thermometer, fake_measurement_interval,
+ fake_user_description, fake_cccd, fake_temperature_measurement,
+ fake_temperature_type;
+ return fake_peripheral.addFakeService({uuid: 'generic_access'})
+ .then(_ => fake_generic_access = _)
+ .then(() => fake_peripheral.addFakeService({
+ uuid: 'health_thermometer',
+ }))
+ .then(_ => fake_health_thermometer = _)
+ .then(() => fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'measurement_interval',
+ properties: ['read', 'write', 'indicate'],
+ }))
+ .then(_ => fake_measurement_interval = _)
+ .then(() => fake_measurement_interval.addFakeDescriptor({
+ uuid: 'gatt.characteristic_user_description',
+ }))
+ .then(_ => fake_user_description = _)
+ .then(() => fake_measurement_interval.addFakeDescriptor({
+ uuid: 'gatt.client_characteristic_configuration',
+ }))
+ .then(_ => fake_cccd = _)
+ .then(() => fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'temperature_measurement',
+ properties: ['indicate'],
+ }))
+ .then(_ => fake_temperature_measurement = _)
+ .then(() => fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'temperature_type',
+ properties: ['read'],
+ }))
+ .then(_ => fake_temperature_type = _)
+ .then(() => ({
+ fake_peripheral,
+ fake_generic_access,
+ fake_health_thermometer,
+ fake_measurement_interval,
+ fake_cccd,
+ fake_user_description,
+ fake_temperature_measurement,
+ fake_temperature_type,
+ }));
+}
+
+/**
+ * Returns the same device and fake peripheral as getHealthThermometerDevice()
+ * after another frame (an iframe we insert) discovered the device,
+ * connected to it and discovered its services.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getHealthThermometerDeviceWithServicesDiscovered(options) {
+ let device, fake_peripheral, fakes;
+ let iframe = document.createElement('iframe');
+ return setUpConnectableHealthThermometerDevice()
+ .then(_ => fake_peripheral = _)
+ .then(() => populateHealthThermometerFakes(fake_peripheral))
+ .then(_ => fakes = _)
+ .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(
+ () => new Promise(resolve => {
+ let src = '/bluetooth/resources/health-thermometer-iframe.html';
+ // TODO(509038): Can be removed once LayoutTests/bluetooth/* that
+ // use health-thermometer-iframe.html have been moved to
+ // LayoutTests/external/wpt/bluetooth/*
+ if (window.location.pathname.includes('/LayoutTests/')) {
+ src =
+ '../../../external/wpt/bluetooth/resources/health-thermometer-iframe.html';
+ }
+ iframe.src = src;
+ document.body.appendChild(iframe);
+ iframe.addEventListener('load', resolve);
+ }))
+ .then(() => new Promise((resolve, reject) => {
+ callWithTrustedClick(() => {
+ iframe.contentWindow.postMessage(
+ {type: 'DiscoverServices', options: options}, '*');
+ });
+
+ function messageHandler(messageEvent) {
+ if (messageEvent.data == 'DiscoveryComplete') {
+ window.removeEventListener('message', messageHandler);
+ resolve();
+ } else {
+ reject(new Error(`Unexpected message: ${messageEvent.data}`));
+ }
+ }
+ window.addEventListener('message', messageHandler);
+ }))
+ .then(() => requestDeviceWithTrustedClick(options))
+ .then(_ => device = _)
+ .then(device => device.gatt.connect())
+ .then(_ => Object.assign({device}, fakes));
+}
+
+/**
+ * Similar to getHealthThermometerDevice() except the device
+ * is not connected and thus its services have not been
+ * discovered.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
+ * containing a requested BluetoothDevice and its fake counter part.
+ */
+function getDiscoveredHealthThermometerDevice(options = {
+ filters: [{services: ['health_thermometer']}]
+}) {
+ return setUpHealthThermometerDevice().then(fake_peripheral => {
+ return requestDeviceWithTrustedClick(options).then(
+ device => ({device: device, fake_peripheral: fake_peripheral}));
+ });
+}
+
+/**
+ * Similar to getHealthThermometerDevice() except the device has no services,
+ * characteristics, or descriptors.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
+ * containing a requested BluetoothDevice and its fake counter part.
+ */
+function getEmptyHealthThermometerDevice(options) {
+ return getDiscoveredHealthThermometerDevice(options).then(
+ ({device, fake_peripheral}) => {
+ return fake_peripheral
+ .setNextGATTConnectionResponse({code: HCI_SUCCESS})
+ .then(() => device.gatt.connect())
+ .then(
+ () => fake_peripheral.setNextGATTDiscoveryResponse(
+ {code: HCI_SUCCESS}))
+ .then(() => ({device: device, fake_peripheral: fake_peripheral}));
+ });
+}
+
+/**
+ * Similar to getHealthThermometerService() except the service has no
+ * characteristics or included services.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {service: BluetoothRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService} An object containing the
+ * health themometer service object and its corresponding fake.
+ */
+function getEmptyHealthThermometerService(options) {
+ let device;
+ let fake_peripheral;
+ let fake_health_thermometer;
+ return getDiscoveredHealthThermometerDevice(options)
+ .then(result => ({device, fake_peripheral} = result))
+ .then(
+ () => fake_peripheral.setNextGATTConnectionResponse(
+ {code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
+ .then(s => fake_health_thermometer = s)
+ .then(
+ () =>
+ fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(service => ({
+ service: service,
+ fake_health_thermometer: fake_health_thermometer,
+ }));
+}
+
+/**
+ * Similar to getHealthThermometerDevice except the GATT discovery
+ * response has not been set yet so more attributes can still be added.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getConnectedHealthThermometerDevice(options) {
+ let device, fake_peripheral, fakes;
+ return getDiscoveredHealthThermometerDevice(options)
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => populateHealthThermometerFakes(fake_peripheral))
+ .then(_ => fakes = _)
+ .then(() => device.gatt.connect())
+ .then(() => Object.assign({device}, fakes));
+}
+
+/**
+ * Returns an object containing a BluetoothDevice discovered using |options|,
+ * its corresponding FakePeripheral and FakeRemoteGATTServices.
+ * The simulated device is called 'Health Thermometer' it has two known service
+ * UUIDs: 'generic_access' and 'health_thermometer' which correspond to two
+ * services with the same UUIDs. The 'health thermometer' service contains three
+ * characteristics:
+ * - 'temperature_measurement' (indicate),
+ * - 'temperature_type' (read),
+ * - 'measurement_interval' (read, write, indicate)
+ * The 'measurement_interval' characteristic contains a
+ * 'gatt.client_characteristic_configuration' descriptor and a
+ * 'characteristic_user_description' descriptor.
+ * The device has been connected to and its attributes are ready to be
+ * discovered.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getHealthThermometerDevice(options) {
+ let result;
+ return getConnectedHealthThermometerDevice(options)
+ .then(_ => result = _)
+ .then(() => result.fake_peripheral.setNextGATTDiscoveryResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => result);
+}
+
+/**
+ * Similar to getHealthThermometerDevice except that the peripheral has two
+ * 'health_thermometer' services.
+ * @param {RequestDeviceOptions} options The options for requesting a Bluetooth
+ * Device.
+ * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService, fake_health_thermometer1:
+ * FakeRemoteGATTService, fake_health_thermometer2: FakeRemoteGATTService}>} An
+ * object containing a requested Bluetooth device and two fake health
+ * thermometer GATT services.
+ */
+function getTwoHealthThermometerServicesDevice(options) {
+ let device;
+ let fake_peripheral;
+ let fake_generic_access;
+ let fake_health_thermometer1;
+ let fake_health_thermometer2;
+
+ return getConnectedHealthThermometerDevice(options)
+ .then(result => {
+ ({
+ device,
+ fake_peripheral,
+ fake_generic_access,
+ fake_health_thermometer: fake_health_thermometer1,
+ } = result);
+ })
+ .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
+ .then(s => fake_health_thermometer2 = s)
+ .then(
+ () =>
+ fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
+ .then(() => ({
+ device: device,
+ fake_peripheral: fake_peripheral,
+ fake_generic_access: fake_generic_access,
+ fake_health_thermometer1: fake_health_thermometer1,
+ fake_health_thermometer2: fake_health_thermometer2
+ }));
+}
+
+/**
+ * Returns an object containing a Health Thermometer BluetoothRemoteGattService
+ * and its corresponding FakeRemoteGATTService.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeRemoteGATTService}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getHealthThermometerService() {
+ let result;
+ return getHealthThermometerDevice()
+ .then(r => result = r)
+ .then(() => result.device.gatt.getPrimaryService('health_thermometer'))
+ .then(service => Object.assign(result, {
+ service,
+ fake_service: result.fake_health_thermometer,
+ }));
+}
+
+/**
+ * Returns an object containing a Measurement Interval
+ * BluetoothRemoteGATTCharacteristic and its corresponding
+ * FakeRemoteGATTCharacteristic.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeRemoteGATTCharacteristic}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getMeasurementIntervalCharacteristic() {
+ let result;
+ return getHealthThermometerService()
+ .then(r => result = r)
+ .then(() => result.service.getCharacteristic('measurement_interval'))
+ .then(characteristic => Object.assign(result, {
+ characteristic,
+ fake_characteristic: result.fake_measurement_interval,
+ }));
+}
+
+/**
+ * Returns an object containing a User Description
+ * BluetoothRemoteGATTDescriptor and its corresponding
+ * FakeRemoteGATTDescriptor.
+ * @returns {Promise<{device: BluetoothDevice, fakes: {
+ * fake_peripheral: FakePeripheral,
+ * fake_generic_access: FakeRemoteGATTService,
+ * fake_health_thermometer: FakeRemoteGATTService,
+ * fake_measurement_interval: FakeRemoteGATTCharacteristic,
+ * fake_cccd: FakeRemoteGATTDescriptor,
+ * fake_user_description: FakeRemoteGATTDescriptor,
+ * fake_temperature_measurement: FakeRemoteGATTCharacteristic,
+ * fake_temperature_type: FakeRemoteGATTCharacteristic,
+ * service: BluetoothRemoteGATTService,
+ * fake_service: FakeRemoteGATTService,
+ * characteristic: BluetoothRemoteGATTCharacteristic,
+ * fake_characteristic: FakeRemoteGATTCharacteristic
+ * descriptor: BluetoothRemoteGATTDescriptor,
+ * fake_descriptor: FakeRemoteGATTDescriptor}}>} An object
+ * containing a requested BluetoothDevice and all of the GATT fake
+ * objects.
+ */
+function getUserDescriptionDescriptor() {
+ let result;
+ return getMeasurementIntervalCharacteristic()
+ .then(r => result = r)
+ .then(
+ () => result.characteristic.getDescriptor(
+ 'gatt.characteristic_user_description'))
+ .then(descriptor => Object.assign(result, {
+ descriptor,
+ fake_descriptor: result.fake_user_description,
+ }));
+}
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js
deleted file mode 100644
index 2d863b16037..00000000000
--- a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js
+++ /dev/null
@@ -1,1022 +0,0 @@
-'use strict';
-
-function loadScript(path) {
- let script = document.createElement('script');
- let promise = new Promise(resolve => script.onload = resolve);
- script.src = path;
- script.async = false;
- document.head.appendChild(script);
- return promise;
-}
-
-function loadScripts(paths) {
- let chain = Promise.resolve();
- for (let path of paths) {
- chain = chain.then(() => loadScript(path));
- }
- return chain;
-}
-
-function performChromiumSetup() {
- // Make sure we are actually on Chromium with Mojo enabled.
- if (typeof Mojo === 'undefined') {
- return;
- }
-
- // Load the Chromium-specific resources.
- let prefix = '/resources/chromium';
- let genPrefix = '/gen';
- let extra = [];
- const pathname = window.location.pathname;
- if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) {
- let root = pathname.match(/.*(?:LayoutTests|web_tests)/);
- prefix = `${root}/external/wpt/resources/chromium`;
- extra = [
- `${root}/resources/bluetooth/bluetooth-fake-adapter.js`,
- ];
- genPrefix = 'file:///gen';
- } else if (window.location.pathname.startsWith('/bluetooth/https/')) {
- extra = [
- '/js-test-resources/bluetooth/bluetooth-fake-adapter.js',
- ];
- }
- return loadScripts([
- `${genPrefix}/layout_test_data/mojo/public/js/mojo_bindings.js`,
- `${genPrefix}/content/test/data/mojo_web_test_helper_test.mojom.js`,
- `${genPrefix}/device/bluetooth/public/mojom/uuid.mojom.js`,
- `${genPrefix}/url/mojom/origin.mojom.js`,
- `${genPrefix}/device/bluetooth/public/mojom/test/fake_bluetooth.mojom.js`,
- `${genPrefix}/content/shell/common/web_test/fake_bluetooth_chooser.mojom.js`,
- `${prefix}/web-bluetooth-test.js`,
- ].concat(extra))
- // Call setBluetoothFakeAdapter() to clean up any fake adapters left over
- // by legacy tests.
- // Legacy tests that use setBluetoothFakeAdapter() sometimes fail to clean
- // their fake adapter. This is not a problem for these tests because the
- // next setBluetoothFakeAdapter() will clean it up anyway but it is a
- // problem for the new tests that do not use setBluetoothFakeAdapter().
- // TODO(crbug.com/569709): Remove once setBluetoothFakeAdapter is no
- // longer used.
- .then(() => typeof setBluetoothFakeAdapter === 'undefined' ?
- undefined : setBluetoothFakeAdapter(''));
-}
-
-
-// These tests rely on the User Agent providing an implementation of the
-// Web Bluetooth Testing API.
-// https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/edit?ts=59b6d823#heading=h.7nki9mck5t64
-function bluetooth_test(func, name, properties) {
- Promise.resolve()
- .then(() => promise_test(t => Promise.resolve()
- // Trigger Chromium-specific setup.
- .then(performChromiumSetup)
- .then(() => func(t))
- .then(() => navigator.bluetooth.test.allResponsesConsumed())
- .then(consumed => assert_true(consumed)), name, properties));
-}
-
-// HCI Error Codes. Used for simulateGATT[Dis]ConnectionResponse.
-// For a complete list of possible error codes see
-// BT 4.2 Vol 2 Part D 1.3 List Of Error Codes.
-const HCI_SUCCESS = 0x0000;
-const HCI_CONNECTION_TIMEOUT = 0x0008;
-
-// GATT Error codes. Used for GATT operations responses.
-// BT 4.2 Vol 3 Part F 3.4.1.1 Error Response
-const GATT_SUCCESS = 0x0000;
-const GATT_INVALID_HANDLE = 0x0001;
-
-// Bluetooth UUID constants:
-// Services:
-var blocklist_test_service_uuid = "611c954a-263b-4f4a-aab6-01ddb953f985";
-var request_disconnection_service_uuid = "01d7d889-7451-419f-aeb8-d65e7b9277af";
-// Characteristics:
-var blocklist_exclude_reads_characteristic_uuid =
- "bad1c9a2-9a5b-4015-8b60-1579bbbf2135";
-var request_disconnection_characteristic_uuid =
- "01d7d88a-7451-419f-aeb8-d65e7b9277af";
-// Descriptors:
-var blocklist_test_descriptor_uuid = "bad2ddcf-60db-45cd-bef9-fd72b153cf7c";
-var blocklist_exclude_reads_descriptor_uuid =
- "bad3ec61-3cc3-4954-9702-7977df514114";
-
-// Sometimes we need to test that using either the name, alias, or UUID
-// produces the same result. The following objects help us do that.
-var generic_access = {
- alias: 0x1800,
- name: 'generic_access',
- uuid: '00001800-0000-1000-8000-00805f9b34fb'
-};
-var device_name = {
- alias: 0x2a00,
- name: 'gap.device_name',
- uuid: '00002a00-0000-1000-8000-00805f9b34fb'
-};
-var reconnection_address = {
- alias: 0x2a03,
- name: 'gap.reconnection_address',
- uuid: '00002a03-0000-1000-8000-00805f9b34fb'
-};
-var heart_rate = {
- alias: 0x180d,
- name: 'heart_rate',
- uuid: '0000180d-0000-1000-8000-00805f9b34fb'
-};
-var health_thermometer = {
- alias: 0x1809,
- name: 'health_thermometer',
- uuid: '00001809-0000-1000-8000-00805f9b34fb'
-};
-var body_sensor_location = {
- alias: 0x2a38,
- name: 'body_sensor_location',
- uuid: '00002a38-0000-1000-8000-00805f9b34fb'
-};
-var glucose = {
- alias: 0x1808,
- name: 'glucose',
- uuid: '00001808-0000-1000-8000-00805f9b34fb'
-};
-var battery_service = {
- alias: 0x180f,
- name: 'battery_service',
- uuid: '0000180f-0000-1000-8000-00805f9b34fb'
-};
-var battery_level = {
- alias: 0x2A19,
- name: 'battery_level',
- uuid: '00002a19-0000-1000-8000-00805f9b34fb'
-};
-var user_description = {
- alias: 0x2901,
- name: 'gatt.characteristic_user_description',
- uuid: '00002901-0000-1000-8000-00805f9b34fb'
-};
-var client_characteristic_configuration = {
- alias: 0x2902,
- name: 'gatt.client_characteristic_configuration',
- uuid: '00002902-0000-1000-8000-00805f9b34fb'
-};
-var measurement_interval = {
- alias: 0x2a21,
- name: 'measurement_interval',
- uuid: '00002a21-0000-1000-8000-00805f9b34fb'
-};
-
-// The following tests make sure the Web Bluetooth implementation
-// responds correctly to the different types of errors the
-// underlying platform might return for GATT operations.
-
-// Each browser should map these characteristics to specific code paths
-// that result in different errors thus increasing code coverage
-// when testing. Therefore some of these characteristics might not be useful
-// for all browsers.
-//
-// TODO(ortuno): According to the testing spec errorUUID(0x101) to
-// errorUUID(0x1ff) should be use for the uuids of the characteristics.
-var gatt_errors_tests = [{
- testName: 'GATT Error: Unknown.',
- uuid: errorUUID(0xA1),
- error: new DOMException(
- 'GATT Error Unknown.',
- 'NotSupportedError')
-}, {
- testName: 'GATT Error: Failed.',
- uuid: errorUUID(0xA2),
- error: new DOMException(
- 'GATT operation failed for unknown reason.',
- 'NotSupportedError')
-}, {
- testName: 'GATT Error: In Progress.',
- uuid: errorUUID(0xA3),
- error: new DOMException(
- 'GATT operation already in progress.',
- 'NetworkError')
-}, {
- testName: 'GATT Error: Invalid Length.',
- uuid: errorUUID(0xA4),
- error: new DOMException(
- 'GATT Error: invalid attribute length.',
- 'InvalidModificationError')
-}, {
- testName: 'GATT Error: Not Permitted.',
- uuid: errorUUID(0xA5),
- error: new DOMException(
- 'GATT operation not permitted.',
- 'NotSupportedError')
-}, {
- testName: 'GATT Error: Not Authorized.',
- uuid: errorUUID(0xA6),
- error: new DOMException(
- 'GATT operation not authorized.',
- 'SecurityError')
-}, {
- testName: 'GATT Error: Not Paired.',
- uuid: errorUUID(0xA7),
- // TODO(ortuno): Change to InsufficientAuthenticationError or similiar
- // once https://github.com/WebBluetoothCG/web-bluetooth/issues/137 is
- // resolved.
- error: new DOMException(
- 'GATT Error: Not paired.',
- 'NetworkError')
-}, {
- testName: 'GATT Error: Not Supported.',
- uuid: errorUUID(0xA8),
- error: new DOMException(
- 'GATT Error: Not supported.',
- 'NotSupportedError')
-}];
-
-// Waits until the document has finished loading.
-function waitForDocumentReady() {
- return new Promise(resolve => {
- if (document.readyState === 'complete') {
- resolve();
- }
-
- window.addEventListener('load', () => {
- resolve();
- }, {once: true});
- });
-}
-
-function callWithTrustedClick(callback) {
- return waitForDocumentReady()
- .then(() => new Promise(resolve => {
- let button = document.createElement('button');
- button.textContent = 'click to continue test';
- button.style.display = 'block';
- button.style.fontSize = '20px';
- button.style.padding = '10px';
- button.onclick = () => {
- document.body.removeChild(button);
- resolve(callback());
- };
- document.body.appendChild(button);
- test_driver.click(button);
- }));
-}
-
-// Calls requestDevice() in a context that's 'allowed to show a popup'.
-function requestDeviceWithTrustedClick() {
- let args = arguments;
- return callWithTrustedClick(
- () => navigator.bluetooth.requestDevice.apply(navigator.bluetooth, args));
-}
-
-// Calls requestLEScan() in a context that's 'allowed to show a popup'.
-function requestLEScanWithTrustedClick() {
- let args = arguments;
- return callWithTrustedClick(
- () => navigator.bluetooth.requestLEScan.apply(navigator.bluetooth, args));
-}
-
-// errorUUID(alias) returns a UUID with the top 32 bits of
-// '00000000-97e5-4cd7-b9f1-f5a427670c59' replaced with the bits of |alias|.
-// For example, errorUUID(0xDEADBEEF) returns
-// 'deadbeef-97e5-4cd7-b9f1-f5a427670c59'. The bottom 96 bits of error UUIDs
-// were generated as a type 4 (random) UUID.
-function errorUUID(uuidAlias) {
- // Make the number positive.
- uuidAlias >>>= 0;
- // Append the alias as a hex number.
- var strAlias = '0000000' + uuidAlias.toString(16);
- // Get last 8 digits of strAlias.
- strAlias = strAlias.substr(-8);
- // Append Base Error UUID
- return strAlias + '-97e5-4cd7-b9f1-f5a427670c59';
-}
-
-// Function to test that a promise rejects with the expected error type and
-// message.
-function assert_promise_rejects_with_message(promise, expected, description) {
- return promise.then(() => {
- assert_unreached('Promise should have rejected: ' + description);
- }, error => {
- assert_equals(error.name, expected.name, 'Unexpected Error Name:');
- if (expected.message) {
- assert_equals(error.message, expected.message, 'Unexpected Error Message:');
- }
- });
-}
-
-function runGarbageCollection()
-{
- // Run gc() as a promise.
- return new Promise(
- function(resolve, reject) {
- GCController.collect();
- step_timeout(resolve, 0);
- });
-}
-
-function eventPromise(target, type, options) {
- return new Promise(resolve => {
- let wrapper = function(event) {
- target.removeEventListener(type, wrapper);
- resolve(event);
- };
- target.addEventListener(type, wrapper, options);
- });
-}
-
-// Helper function to assert that events are fired and a promise resolved
-// in the correct order.
-// 'event' should be passed as |should_be_first| to indicate that the events
-// should be fired first, otherwise 'promiseresolved' should be passed.
-// Attaches |num_listeners| |event| listeners to |object|. If all events have
-// been fired and the promise resolved in the correct order, returns a promise
-// that fulfills with the result of |object|.|func()| and |event.target.value|
-// of each of event listeners. Otherwise throws an error.
-function assert_promise_event_order_(should_be_first, object, func, event, num_listeners) {
- let order = [];
- let event_promises = [];
- for (let i = 0; i < num_listeners; i++) {
- event_promises.push(new Promise(resolve => {
- let event_listener = (e) => {
- object.removeEventListener(event, event_listener);
- order.push('event');
- resolve(e.target.value);
- };
- object.addEventListener(event, event_listener);
- }));
- }
-
- let func_promise = object[func]().then(result => {
- order.push('promiseresolved');
- return result;
- });
-
- return Promise.all([func_promise, ...event_promises])
- .then((result) => {
- if (should_be_first !== order[0]) {
- throw should_be_first === 'promiseresolved' ?
- `'${event}' was fired before promise resolved.` :
- `Promise resolved before '${event}' was fired.`;
- }
-
- if (order[0] !== 'promiseresolved' &&
- order[order.length - 1] !== 'promiseresolved') {
- throw 'Promise resolved in between event listeners.';
- }
-
- return result;
- });
-}
-
-// See assert_promise_event_order_ above.
-function assert_promise_resolves_before_event(
- object, func, event, num_listeners=1) {
- return assert_promise_event_order_(
- 'promiseresolved', object, func, event, num_listeners);
-}
-
-// See assert_promise_event_order_ above.
-function assert_promise_resolves_after_event(
- object, func, event, num_listeners=1) {
- return assert_promise_event_order_(
- 'event', object, func, event, num_listeners);
-}
-
-// Returns a promise that resolves after 100ms unless
-// the the event is fired on the object in which case
-// the promise rejects.
-function assert_no_events(object, event_name) {
- return new Promise((resolve, reject) => {
- let event_listener = (e) => {
- object.removeEventListener(event_name, event_listener);
- assert_unreached('Object should not fire an event.');
- };
- object.addEventListener(event_name, event_listener);
- // TODO: Remove timeout.
- // http://crbug.com/543884
- step_timeout(() => {
- object.removeEventListener(event_name, event_listener);
- resolve();
- }, 100);
- });
-}
-
-class TestCharacteristicProperties {
- // |properties| is an array of strings for property bits to be set
- // as true.
- constructor(properties) {
- this.broadcast = false;
- this.read = false;
- this.writeWithoutResponse = false;
- this.write = false;
- this.notify = false;
- this.indicate = false;
- this.authenticatedSignedWrites = false;
- this.reliableWrite = false;
- this.writableAuxiliaries = false;
-
- properties.forEach(val => {
- if (this.hasOwnProperty(val))
- this[val] = true;
- else
- throw `Invalid member '${val}'`;
- });
- }
-}
-
-function assert_properties_equal(properties, expected_properties) {
- for (let key in expected_properties) {
- assert_equals(properties[key], expected_properties[key]);
- }
-}
-
-class EventCatcher {
- constructor(object, event) {
- this.eventFired = false;
- let event_listener = () => {
- object.removeEventListener(event, event_listener);
- this.eventFired = true;
- };
- object.addEventListener(event, event_listener);
- }
-}
-
-// Returns a function that when called returns a promise that resolves when
-// the device has disconnected. Example:
-// device.gatt.connect()
-// .then(gatt => get_request_disconnection(gatt))
-// .then(requestDisconnection => requestDisconnection())
-// .then(() => // device is now disconnected)
-function get_request_disconnection(gattServer) {
- return gattServer.getPrimaryService(request_disconnection_service_uuid)
- .then(service => service.getCharacteristic(request_disconnection_characteristic_uuid))
- .then(characteristic => {
- return () => assert_promise_rejects_with_message(
- characteristic.writeValue(new Uint8Array([0])),
- new DOMException(
- 'GATT Server is disconnected. Cannot perform GATT operations. ' +
- '(Re)connect first with `device.gatt.connect`.',
- 'NetworkError'));
- });
-}
-
-function generateRequestDeviceArgsWithServices(services = ['heart_rate']) {
- return [{
- filters: [{ services: services }]
- }, {
- filters: [{ services: services, name: 'Name' }]
- }, {
- filters: [{ services: services, namePrefix: 'Pre' }]
- }, {
- filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }]
- }, {
- filters: [{ services: services }],
- optionalServices: ['heart_rate']
- }, {
- filters: [{ services: services, name: 'Name' }],
- optionalServices: ['heart_rate']
- }, {
- filters: [{ services: services, namePrefix: 'Pre' }],
- optionalServices: ['heart_rate']
- }, {
- filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }],
- optionalServices: ['heart_rate']
- }];
-}
-
-// Causes |fake_peripheral| to disconnect and returns a promise that resolves
-// once `gattserverdisconnected` has been fired on |device|.
-function simulateGATTDisconnectionAndWait(device, fake_peripheral) {
- return Promise.all([
- eventPromise(device, 'gattserverdisconnected'),
- fake_peripheral.simulateGATTDisconnection(),
- ]);
-}
-
-// Simulates a pre-connected device with |address|, |name| and
-// |knownServiceUUIDs|.
-function setUpPreconnectedDevice({
- address = '00:00:00:00:00:00', name = 'LE Device', knownServiceUUIDs = []}) {
- return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
- .then(fake_central => fake_central.simulatePreconnectedPeripheral({
- address: address,
- name: name,
- knownServiceUUIDs: knownServiceUUIDs,
- }));
-}
-
-const health_thermometer_ad_packet = {
- deviceAddress: '09:09:09:09:09:09',
- rssi: -10,
- scanRecord: {
- name: 'Health Thermometer',
- uuids: [health_thermometer.uuid],
- },
-};
-
-// Returns a FakePeripheral that corresponds to a simulated pre-connected device
-// called 'Health Thermometer'. The device has two known serviceUUIDs:
-// 'generic_access' and 'health_thermometer'.
-function setUpHealthThermometerDevice() {
- return setUpPreconnectedDevice({
- address: '09:09:09:09:09:09',
- name: 'Health Thermometer',
- knownServiceUUIDs: ['generic_access', 'health_thermometer'],
- });
-}
-
-// Returns an array containing two FakePeripherals corresponding
-// to the simulated devices.
-function setUpHealthThermometerAndHeartRateDevices() {
- return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
- .then(fake_central => Promise.all([
- fake_central.simulatePreconnectedPeripheral({
- address: '09:09:09:09:09:09',
- name: 'Health Thermometer',
- knownServiceUUIDs: ['generic_access', 'health_thermometer'],
- }),
- fake_central.simulatePreconnectedPeripheral({
- address: '08:08:08:08:08:08',
- name: 'Heart Rate',
- knownServiceUUIDs: ['generic_access', 'heart_rate'],
- })]));
-}
-
-// Returns the same fake peripheral as setUpHealthThermometerDevice() except
-// that connecting to the peripheral will succeed.
-function setUpConnectableHealthThermometerDevice() {
- let fake_peripheral;
- return setUpHealthThermometerDevice()
- .then(_ => fake_peripheral = _)
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => fake_peripheral);
-}
-
-// Returns an object containing a BluetoothDevice discovered using |options|,
-// its corresponding FakePeripheral and FakeRemoteGATTServices.
-// The simulated device is called 'Health Thermometer' it has two known service
-// UUIDs: 'generic_access' and 'health_thermometer' which correspond to two
-// services with the same UUIDs. The 'health thermometer' service contains three
-// characteristics:
-// - 'temperature_measurement' (indicate),
-// - 'temperature_type' (read),
-// - 'measurement_interval' (read, write, indicate)
-// The 'measurement_interval' characteristic contains a
-// 'gatt.client_characteristic_configuration' descriptor and a
-// 'characteristic_user_description' descriptor.
-// The device has been connected to and its attributes are ready to be
-// discovered.
-function getHealthThermometerDevice(options) {
- let result;
- return getConnectedHealthThermometerDevice(options)
- .then(_ => result = _)
- .then(() => result.fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => result);
-}
-
-// Similar to getHealthThermometerDevice except that the peripheral has
-// two 'health_thermometer' services.
-function getTwoHealthThermometerServicesDevice(options) {
- let device;
- let fake_peripheral;
- let fake_generic_access;
- let fake_health_thermometer1;
- let fake_health_thermometer2;
-
- return getConnectedHealthThermometerDevice(options)
- .then(result => {
- ({
- device,
- fake_peripheral,
- fake_generic_access,
- fake_health_thermometer: fake_health_thermometer1,
- } = result);
- })
- .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
- .then(s => fake_health_thermometer2 = s)
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS}))
- .then(() => ({
- device: device,
- fake_peripheral: fake_peripheral,
- fake_generic_access: fake_generic_access,
- fake_health_thermometer1: fake_health_thermometer1,
- fake_health_thermometer2: fake_health_thermometer2
- }));
-}
-
-// Returns an object containing a Health Thermometer BluetoothRemoteGattService
-// and its corresponding FakeRemoteGATTService.
-function getHealthThermometerService() {
- let result;
- return getHealthThermometerDevice()
- .then(r => result = r)
- .then(() => result.device.gatt.getPrimaryService('health_thermometer'))
- .then(service => Object.assign(result, {
- service,
- fake_service: result.fake_health_thermometer,
- }));
-}
-
-// Returns an object containing a Measurement Interval
-// BluetoothRemoteGATTCharacteristic and its corresponding
-// FakeRemoteGATTCharacteristic.
-function getMeasurementIntervalCharacteristic() {
- let result;
- return getHealthThermometerService()
- .then(r => result = r)
- .then(() => result.service.getCharacteristic('measurement_interval'))
- .then(characteristic => Object.assign(result, {
- characteristic,
- fake_characteristic: result.fake_measurement_interval,
- }));
-}
-
-function getUserDescriptionDescriptor() {
- let result;
- return getMeasurementIntervalCharacteristic()
- .then(r => result = r)
- .then(() => result.characteristic.getDescriptor(
- 'gatt.characteristic_user_description'))
- .then(descriptor => Object.assign(result, {
- descriptor,
- fake_descriptor: result.fake_user_description,
- }));
-}
-
-// Populates a fake_peripheral with various fakes appropriate for a health
-// thermometer. This resolves to an associative array composed of the fakes,
-// including the |fake_peripheral|.
-function populateHealthThermometerFakes(fake_peripheral) {
- let fake_generic_access, fake_health_thermometer, fake_measurement_interval,
- fake_user_description, fake_cccd, fake_temperature_measurement,
- fake_temperature_type;
- return fake_peripheral.addFakeService({uuid: 'generic_access'})
- .then(_ => fake_generic_access = _)
- .then(() => fake_peripheral.addFakeService({
- uuid: 'health_thermometer',
- }))
- .then(_ => fake_health_thermometer = _)
- .then(() => fake_health_thermometer.addFakeCharacteristic({
- uuid: 'measurement_interval',
- properties: ['read', 'write', 'indicate'],
- }))
- .then(_ => fake_measurement_interval = _)
- .then(() => fake_measurement_interval.addFakeDescriptor({
- uuid: 'gatt.characteristic_user_description',
- }))
- .then(_ => fake_user_description = _)
- .then(() => fake_measurement_interval.addFakeDescriptor({
- uuid: 'gatt.client_characteristic_configuration',
- }))
- .then(_ => fake_cccd = _)
- .then(() => fake_health_thermometer.addFakeCharacteristic({
- uuid: 'temperature_measurement',
- properties: ['indicate'],
- }))
- .then(_ => fake_temperature_measurement = _)
- .then(() => fake_health_thermometer.addFakeCharacteristic({
- uuid: 'temperature_type',
- properties: ['read'],
- }))
- .then(_ => fake_temperature_type = _)
- .then(() => ({
- fake_peripheral,
- fake_generic_access,
- fake_health_thermometer,
- fake_measurement_interval,
- fake_cccd,
- fake_user_description,
- fake_temperature_measurement,
- fake_temperature_type,
- }));
-}
-
-// Similar to getHealthThermometerDevice except the GATT discovery
-// response has not been set yet so more attributes can still be added.
-function getConnectedHealthThermometerDevice(options) {
- let device, fake_peripheral, fakes;
- return getDiscoveredHealthThermometerDevice(options)
- .then(_ => ({device, fake_peripheral} = _))
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => populateHealthThermometerFakes(fake_peripheral))
- .then(_ => fakes = _)
- .then(() => device.gatt.connect())
- .then(() => Object.assign({device}, fakes));
-}
-
-// Returns an object containing a BluetoothDevice discovered using |options|,
-// its corresponding FakePeripheral and FakeRemoteGATTServices.
-// The simulated device is called 'Blocklist Device' and it has one known
-// service UUIDs |blocklist_test_service_uuid| which
-// correspond to a service with the same UUID. The
-// |blocklist_test_service_uuid| service contains two characteristics:
-// - |blocklist_exclude_reads_characteristic_uuid| (read, write)
-// - 'gap.peripheral_privacy_flag' (read, write)
-// The 'gap.peripheral_privacy_flag' characteristic contains three descriptors:
-// - |blocklist_test_descriptor_uuid|
-// - |blocklist_exclude_reads_descriptor_uuid|
-// - 'gatt.client_characteristic_configuration'
-// These are special UUIDs that have been added to the blocklist found at
-// https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
-// There are also test UUIDs that have been added to the test environment which
-// other implementations should add as test UUIDs as well.
-// The device has been connected to and its attributes are ready to be
-// discovered.
-function getBlocklistDevice(
- options = {filters: [{services: [blocklist_test_service_uuid]}]}) {
- let device, fake_peripheral, fake_blocklist_test_service,
- fake_blocklist_exclude_reads_characteristic,
- fake_blocklist_exclude_writes_characteristic,
- fake_blocklist_descriptor,
- fake_blocklist_exclude_reads_descriptor,
- fake_blocklist_exclude_writes_descriptor;
- return setUpPreconnectedDevice({
- address: '11:11:11:11:11:11',
- name: 'Blocklist Device',
- knownServiceUUIDs: ['generic_access', blocklist_test_service_uuid],
- })
- .then(_ => fake_peripheral = _)
- .then(() => requestDeviceWithTrustedClick(options))
- .then(_ => device = _)
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.addFakeService({
- uuid: blocklist_test_service_uuid,
- }))
- .then(_ => fake_blocklist_test_service = _)
- .then(() => fake_blocklist_test_service.addFakeCharacteristic({
- uuid: blocklist_exclude_reads_characteristic_uuid,
- properties: ['read', 'write'],
- }))
- .then(_ => fake_blocklist_exclude_reads_characteristic = _)
- .then(() => fake_blocklist_test_service.addFakeCharacteristic({
- uuid: 'gap.peripheral_privacy_flag',
- properties: ['read', 'write'],
- }))
- .then(_ => fake_blocklist_exclude_writes_characteristic = _)
- .then(() => fake_blocklist_exclude_writes_characteristic
- .addFakeDescriptor({uuid: blocklist_test_descriptor_uuid}))
- .then(_ => fake_blocklist_descriptor = _)
- .then(() => fake_blocklist_exclude_writes_characteristic
- .addFakeDescriptor({uuid: blocklist_exclude_reads_descriptor_uuid}))
- .then(_ => fake_blocklist_exclude_reads_descriptor = _)
- .then(() => fake_blocklist_exclude_writes_characteristic
- .addFakeDescriptor({
- uuid: 'gatt.client_characteristic_configuration'
- }))
- .then(_ => fake_blocklist_exclude_writes_descriptor = _)
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => ({
- device,
- fake_peripheral,
- fake_blocklist_test_service,
- fake_blocklist_exclude_reads_characteristic,
- fake_blocklist_exclude_writes_characteristic,
- fake_blocklist_descriptor,
- fake_blocklist_exclude_reads_descriptor,
- fake_blocklist_exclude_writes_descriptor,
- }));
-}
-
-// Returns an object containing a Blocklist Test BluetoothRemoveGattService and
-// its corresponding FakeRemoteGATTService.
-function getBlocklistTestService() {
- let result;
- return getBlocklistDevice()
- .then(_ => result = _)
- .then(() =>
- result.device.gatt.getPrimaryService(blocklist_test_service_uuid))
- .then(service => Object.assign(result, {
- service,
- fake_service: result.fake_blocklist_test_service,
- }));
-}
-
-// Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
-// that excludes reads and its corresponding FakeRemoteGATTCharacteristic.
-function getBlocklistExcludeReadsCharacteristic() {
- let result, fake_characteristic;
- return getBlocklistTestService()
- .then(_ => result = _)
- .then(() => result.service.getCharacteristic(
- blocklist_exclude_reads_characteristic_uuid))
- .then(characteristic =>
- Object.assign(
- result, {
- characteristic,
- fake_characteristic:
- result.fake_blocklist_exclude_reads_characteristic
- }));
-}
-
-// Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
-// that excludes writes and its corresponding FakeRemoteGATTCharacteristic.
-function getBlocklistExcludeWritesCharacteristic() {
- let result, fake_characteristic;
- return getBlocklistTestService()
- .then(_ => result = _)
- .then(() => result.service.getCharacteristic(
- 'gap.peripheral_privacy_flag'))
- .then(characteristic =>
- Object.assign(
- result, {
- characteristic,
- fake_characteristic:
- result.fake_blocklist_exclude_writes_characteristic
- }));
-}
-
-// Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
-// excludes reads and its corresponding FakeRemoteGATTDescriptor.
-function getBlocklistExcludeReadsDescriptor() {
- let result;
- return getBlocklistExcludeWritesCharacteristic()
- .then(_ => result = _)
- .then(() => result.characteristic.getDescriptor(
- blocklist_exclude_reads_descriptor_uuid))
- .then(descriptor => Object.assign(
- result, {
- descriptor,
- fake_descriptor: result.fake_blocklist_exclude_reads_descriptor
- }));
-}
-
-// Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
-// excludes writes and its corresponding FakeRemoteGATTDescriptor.
-function getBlocklistExcludeWritesDescriptor() {
- let result;
- return getBlocklistExcludeWritesCharacteristic()
- .then(_ => result = _)
- .then(() => result.characteristic.getDescriptor(
- 'gatt.client_characteristic_configuration'))
- .then(descriptor => Object.assign(
- result, {
- descriptor: descriptor,
- fake_descriptor: result.fake_blocklist_exclude_writes_descriptor,
- }));
-}
-
-// Returns the same device and fake peripheral as getHealthThermometerDevice()
-// after another frame (an iframe we insert) discovered the device,
-// connected to it and discovered its services.
-function getHealthThermometerDeviceWithServicesDiscovered(options) {
- let device, fake_peripheral, fakes;
- let iframe = document.createElement('iframe');
- return setUpConnectableHealthThermometerDevice()
- .then(_ => fake_peripheral = _)
- .then(() => populateHealthThermometerFakes(fake_peripheral))
- .then(_ => fakes = _)
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => new Promise(resolve => {
- let src = '/bluetooth/resources/health-thermometer-iframe.html';
- // TODO(509038): Can be removed once LayoutTests/bluetooth/* that use
- // health-thermometer-iframe.html have been moved to
- // LayoutTests/external/wpt/bluetooth/*
- if (window.location.pathname.includes('/LayoutTests/')) {
- src = '../../../external/wpt/bluetooth/resources/health-thermometer-iframe.html';
- }
- iframe.src = src;
- document.body.appendChild(iframe);
- iframe.addEventListener('load', resolve);
- }))
- .then(() => new Promise((resolve, reject) => {
- callWithTrustedClick(() => {
- iframe.contentWindow.postMessage({
- type: 'DiscoverServices',
- options: options
- }, '*');
- });
-
- function messageHandler(messageEvent) {
- if (messageEvent.data == 'DiscoveryComplete') {
- window.removeEventListener('message', messageHandler);
- resolve();
- } else {
- reject(new Error(`Unexpected message: ${messageEvent.data}`));
- }
- }
- window.addEventListener('message', messageHandler);
- }))
- .then(() => requestDeviceWithTrustedClick(options))
- .then(_ => device = _)
- .then(device => device.gatt.connect())
- .then(_ => Object.assign({device}, fakes));
-}
-
-// Similar to getHealthThermometerDevice() except the device has no services,
-// characteristics, or descriptors.
-function getEmptyHealthThermometerDevice(options) {
- return getDiscoveredHealthThermometerDevice(options)
- .then(({device, fake_peripheral}) => {
- return fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS})
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS}))
- .then(() => ({
- device: device,
- fake_peripheral: fake_peripheral
- }));
- });
-}
-
-// Similar to getHealthThermometerService() except the service has no
-// characteristics or included services.
-function getEmptyHealthThermometerService(options) {
- let device;
- let fake_peripheral;
- let fake_health_thermometer;
- return getDiscoveredHealthThermometerDevice(options)
- .then(result => ({device, fake_peripheral} = result))
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS}))
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
- .then(s => fake_health_thermometer = s)
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS}))
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- .then(service => ({
- service: service,
- fake_health_thermometer: fake_health_thermometer,
- }));
-}
-
-// Returns a BluetoothDevice discovered using |options| and its
-// corresponding FakePeripheral.
-// The simulated device is called 'HID Device' it has three known service
-// UUIDs: 'generic_access', 'device_information', 'human_interface_device'.
-// The primary service with 'device_information' UUID has a characteristics
-// with UUID 'serial_number_string'. The device has been connected to and its
-// attributes are ready to be discovered.
-function getHIDDevice(options) {
- let device, fake_peripheral;
- return getConnectedHIDDevice(options)
- .then(_ => ({device, fake_peripheral} = _))
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => ({device, fake_peripheral}));
-}
-
-// Similar to getHealthThermometerDevice except the GATT discovery
-// response has not been set yet so more attributes can still be added.
-// TODO(crbug.com/719816): Add descriptors.
-function getConnectedHIDDevice(options) {
- let device, fake_peripheral;
- return setUpPreconnectedDevice({
- address: '10:10:10:10:10:10',
- name: 'HID Device',
- knownServiceUUIDs: [
- 'generic_access',
- 'device_information',
- 'human_interface_device',
- ],
- })
- .then(_ => (fake_peripheral = _))
- .then(() => requestDeviceWithTrustedClick(options))
- .then(_ => (device = _))
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.addFakeService({
- uuid: 'generic_access',
- }))
- .then(() => fake_peripheral.addFakeService({
- uuid: 'device_information',
- }))
- // Blocklisted Characteristic:
- // https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
- .then(dev_info => dev_info.addFakeCharacteristic({
- uuid: 'serial_number_string',
- properties: ['read'],
- }))
- .then(() => fake_peripheral.addFakeService({
- uuid: 'human_interface_device',
- }))
- .then(() => ({device, fake_peripheral}));
-}
-
-// Similar to getHealthThermometerDevice() except the device
-// is not connected and thus its services have not been
-// discovered.
-function getDiscoveredHealthThermometerDevice(
- options = {filters: [{services: ['health_thermometer']}]}) {
- return setUpHealthThermometerDevice()
- .then(fake_peripheral => {
- return requestDeviceWithTrustedClick(options)
- .then(device => ({
- device: device,
- fake_peripheral: fake_peripheral
- }));
- });
-}
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js
index 9b173e6367c..f474c9c3066 100644
--- a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js
+++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js
@@ -39,4 +39,4 @@ function verifyBluetoothAdvertisingEvent(e) {
assert_equals(data[0], e.serviceData.get(health_uuid).getUint8(0))
assert_equals(data[1], e.serviceData.get(health_uuid).getUint8(1))
assert_equals(data[2], e.serviceData.get(health_uuid).getUint8(2))
-} \ No newline at end of file
+}
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js
new file mode 100644
index 00000000000..d2c6bcbdb73
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js
@@ -0,0 +1,384 @@
+'use strict';
+
+/**
+ * Test Setup Helpers
+ */
+
+/**
+ * Loads a script by creating a <script> element pointing to |path|.
+ * @param {string} path The path of the script to load.
+ * @returns {Promise<void>} Resolves when the script has finished loading.
+ */
+function loadScript(path) {
+ let script = document.createElement('script');
+ let promise = new Promise(resolve => script.onload = resolve);
+ script.src = path;
+ script.async = false;
+ document.head.appendChild(script);
+ return promise;
+}
+
+/**
+ * Loads the scripts in |paths|.
+ * @param {string[]} paths
+ * @returns {Promise<void>} A promise chain that resolves when all scripts have
+ * finished loading.
+ */
+function loadScripts(paths) {
+ let chain = Promise.resolve();
+ for (let path of paths) {
+ chain = chain.then(() => loadScript(path));
+ }
+ return chain;
+}
+
+/**
+ * Performs the Chromium specific setup necessary to run the tests in the
+ * Chromium browser. This test file is shared between Web Platform Tests and
+ * Blink Web Tests, so this method figures out the correct paths to use for
+ * loading scripts.
+ *
+ * TODO(https://crbug.com/569709): Update this description when all Web
+ * Bluetooth Blink Web Tests have been migrated into this repository.
+ * @returns {Promise<void>} Resolves when Chromium specific setup is complete.
+ */
+function performChromiumSetup() {
+ // Make sure we are actually on Chromium with Mojo enabled.
+ if (typeof Mojo === 'undefined') {
+ return;
+ }
+
+ // Load the Chromium-specific resources.
+ let prefix = '/resources/chromium';
+ let genPrefix = '/gen';
+ let extra = [];
+ const pathname = window.location.pathname;
+ if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) {
+ let root = pathname.match(/.*(?:LayoutTests|web_tests)/);
+ prefix = `${root}/external/wpt/resources/chromium`;
+ extra = [
+ `${root}/resources/bluetooth/bluetooth-fake-adapter.js`,
+ ];
+ genPrefix = 'file:///gen';
+ } else if (window.location.pathname.startsWith('/bluetooth/https/')) {
+ extra = [
+ '/js-test-resources/bluetooth/bluetooth-fake-adapter.js',
+ ];
+ }
+ return loadScripts([
+ `${genPrefix}/layout_test_data/mojo/public/js/mojo_bindings.js`,
+ `${genPrefix}/content/test/data/mojo_web_test_helper_test.mojom.js`,
+ `${genPrefix}/device/bluetooth/public/mojom/uuid.mojom.js`,
+ `${genPrefix}/url/mojom/origin.mojom.js`,
+ `${genPrefix}/device/bluetooth/public/mojom/test/fake_bluetooth.mojom.js`,
+ `${genPrefix}/content/shell/common/web_test/fake_bluetooth_chooser.mojom.js`,
+ `${prefix}/web-bluetooth-test.js`,
+ ].concat(extra))
+ // Call setBluetoothFakeAdapter() to clean up any fake adapters left over
+ // by legacy tests.
+ // Legacy tests that use setBluetoothFakeAdapter() sometimes fail to clean
+ // their fake adapter. This is not a problem for these tests because the
+ // next setBluetoothFakeAdapter() will clean it up anyway but it is a
+ // problem for the new tests that do not use setBluetoothFakeAdapter().
+ // TODO(https://crbug.com/569709): Remove once setBluetoothFakeAdapter is
+ // no longer used.
+ .then(
+ () => typeof setBluetoothFakeAdapter === 'undefined' ?
+ undefined :
+ setBluetoothFakeAdapter(''));
+}
+
+/**
+ * These tests rely on the User Agent providing an implementation of the Web
+ * Bluetooth Testing API.
+ * https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/edit?ts=59b6d823#heading=h.7nki9mck5t64
+ * @param {function{*}: Promise<*>} test_function The Web Bluetooth test to run.
+ * @param {string} name The name or description of the test.
+ * @param {object} properties An object containing extra options for the test.
+ * @returns {Promise<void>} Resolves if Web Bluetooth test ran successfully, or
+ * rejects if the test failed.
+ */
+function bluetooth_test(test_function, name, properties) {
+ Promise.resolve().then(
+ () => promise_test(
+ t => Promise
+ .resolve()
+ // Trigger Chromium-specific setup.
+ .then(performChromiumSetup)
+ .then(() => test_function(t))
+ .then(() => navigator.bluetooth.test.allResponsesConsumed())
+ .then(consumed => assert_true(consumed)),
+ name, properties));
+}
+
+/**
+ * Test Helpers
+ */
+
+/**
+ * Waits until the document has finished loading.
+ * @returns {Promise<void>} Resolves if the document is already completely
+ * loaded or when the 'onload' event is fired.
+ */
+function waitForDocumentReady() {
+ return new Promise(resolve => {
+ if (document.readyState === 'complete') {
+ resolve();
+ }
+
+ window.addEventListener('load', () => {
+ resolve();
+ }, {once: true});
+ });
+}
+
+/**
+ * Simulates a user activation prior to running |callback|.
+ * @param {Function} callback The function to run after the user activation.
+ * @returns {Promise<*>} Resolves when the user activation has been simulated
+ * with the result of |callback|.
+ */
+function callWithTrustedClick(callback) {
+ return waitForDocumentReady().then(() => new Promise(resolve => {
+ let button =
+ document.createElement('button');
+ button.textContent =
+ 'click to continue test';
+ button.style.display = 'block';
+ button.style.fontSize = '20px';
+ button.style.padding = '10px';
+ button.onclick = () => {
+ document.body.removeChild(button);
+ resolve(callback());
+ };
+ document.body.appendChild(button);
+ test_driver.click(button);
+ }));
+}
+
+/**
+ * Calls requestDevice() in a context that's 'allowed to show a popup'.
+ * @returns {Promise<BluetoothDevice>} Resolves with a Bluetooth device if
+ * successful or rejects with an error.
+ */
+function requestDeviceWithTrustedClick() {
+ let args = arguments;
+ return callWithTrustedClick(
+ () => navigator.bluetooth.requestDevice.apply(navigator.bluetooth, args));
+}
+
+/**
+ * Calls requestLEScan() in a context that's 'allowed to show a popup'.
+ * @returns {Promise<BluetoothLEScan>} Resolves with the properties of the scan
+ * if successful or rejects with an error.
+ */
+function requestLEScanWithTrustedClick() {
+ let args = arguments;
+ return callWithTrustedClick(
+ () => navigator.bluetooth.requestLEScan.apply(navigator.bluetooth, args));
+}
+
+/**
+ * Function to test that a promise rejects with the expected error type and
+ * message.
+ * @param {Promise} promise
+ * @param {object} expected
+ * @param {string} description
+ * @returns {Promise<void>} Resolves if |promise| rejected with |expected|
+ * error.
+ */
+function assert_promise_rejects_with_message(promise, expected, description) {
+ return promise.then(
+ () => {
+ assert_unreached('Promise should have rejected: ' + description);
+ },
+ error => {
+ assert_equals(error.name, expected.name, 'Unexpected Error Name:');
+ if (expected.message) {
+ assert_equals(
+ error.message, expected.message, 'Unexpected Error Message:');
+ }
+ });
+}
+
+/**
+ * Runs the garbage collection.
+ * @returns {Promise<void>} Resolves when garbage collection has finished.
+ */
+function runGarbageCollection() {
+ // Run gc() as a promise.
+ return new Promise(function(resolve, reject) {
+ GCController.collect();
+ step_timeout(resolve, 0);
+ });
+}
+
+/**
+ * Helper class that can be created to check that an event has fired.
+ */
+class EventCatcher {
+ /**
+ * @param {EventTarget} object The object to listen for events on.
+ * @param {string} event The type of event to listen for.
+ */
+ constructor(object, event) {
+ /** @type {boolean} */
+ this.eventFired = false;
+
+ /** @type {function()} */
+ let event_listener = () => {
+ object.removeEventListener(event, event_listener);
+ this.eventFired = true;
+ };
+ object.addEventListener(event, event_listener);
+ }
+}
+
+/**
+ * Notifies when the event |type| has fired.
+ * @param {EventTarget} target The object to listen for the event.
+ * @param {string} type The type of event to listen for.
+ * @param {object} options Characteristics about the event listener.
+ * @returns {Promise<Event>} Resolves when an event of |type| has fired.
+ */
+function eventPromise(target, type, options) {
+ return new Promise(resolve => {
+ let wrapper = function(event) {
+ target.removeEventListener(type, wrapper);
+ resolve(event);
+ };
+ target.addEventListener(type, wrapper, options);
+ });
+}
+
+/**
+ * The action that should occur first in assert_promise_event_order_().
+ * @enum {string}
+ */
+const ShouldBeFirst = {
+ EVENT: 'event',
+ PROMISE_RESOLUTION: 'promiseresolved',
+};
+
+/**
+ * Helper function to assert that events are fired and a promise resolved
+ * in the correct order.
+ * 'event' should be passed as |should_be_first| to indicate that the events
+ * should be fired first, otherwise 'promiseresolved' should be passed.
+ * Attaches |num_listeners| |event| listeners to |object|. If all events have
+ * been fired and the promise resolved in the correct order, returns a promise
+ * that fulfills with the result of |object|.|func()| and |event.target.value|
+ * of each of event listeners. Otherwise throws an error.
+ * @param {ShouldBeFirst} should_be_first Indicates whether |func| should
+ * resolve before |event| is fired.
+ * @param {EventTarget} object The target object to add event listeners to.
+ * @param {function(*): Promise<*>} func The function to test the resolution
+ * order for.
+ * @param {string} event The event type to listen for.
+ * @param {number} num_listeners The number of events to listen for.
+ * @returns {Promise<*>} The return value of |func|.
+ */
+function assert_promise_event_order_(
+ should_be_first, object, func, event, num_listeners) {
+ let order = [];
+ let event_promises = [];
+ for (let i = 0; i < num_listeners; i++) {
+ event_promises.push(new Promise(resolve => {
+ let event_listener = (e) => {
+ object.removeEventListener(event, event_listener);
+ order.push(ShouldBeFirst.EVENT);
+ resolve(e.target.value);
+ };
+ object.addEventListener(event, event_listener);
+ }));
+ }
+
+ let func_promise = object[func]().then(result => {
+ order.push(ShouldBeFirst.PROMISE_RESOLUTION);
+ return result;
+ });
+
+ return Promise.all([func_promise, ...event_promises]).then((result) => {
+ if (should_be_first !== order[0]) {
+ throw should_be_first === ShouldBeFirst.PROMISE_RESOLUTION ?
+ `'${event}' was fired before promise resolved.` :
+ `Promise resolved before '${event}' was fired.`;
+ }
+
+ if (order[0] !== ShouldBeFirst.PROMISE_RESOLUTION &&
+ order[order.length - 1] !== ShouldBeFirst.PROMISE_RESOLUTION) {
+ throw 'Promise resolved in between event listeners.';
+ }
+
+ return result;
+ });
+}
+
+/**
+ * Asserts that the promise returned by |func| resolves before events of type
+ * |event| are fired |num_listeners| times on |object|. See
+ * assert_promise_event_order_ above for more details.
+ * @param {EventTarget} object The target object to add event listeners to.
+ * @param {function(*): Promise<*>} func The function whose promise should
+ * resolve first.
+ * @param {string} event The event type to listen for.
+ * @param {number} num_listeners The number of events to listen for.
+ * @returns {Promise<*>} The return value of |func|.
+ */
+function assert_promise_resolves_before_event(
+ object, func, event, num_listeners = 1) {
+ return assert_promise_event_order_(
+ ShouldBeFirst.PROMISE_RESOLUTION, object, func, event, num_listeners);
+}
+
+/**
+ * Asserts that the promise returned by |func| resolves after events of type
+ * |event| are fired |num_listeners| times on |object|. See
+ * assert_promise_event_order_ above for more details.
+ * @param {EventTarget} object The target object to add event listeners to.
+ * @param {function(*): Promise<*>} func The function whose promise should
+ * resolve first.
+ * @param {string} event The event type to listen for.
+ * @param {number} num_listeners The number of events to listen for.
+ * @returns {Promise<*>} The return value of |func|.
+ */
+function assert_promise_resolves_after_event(
+ object, func, event, num_listeners = 1) {
+ return assert_promise_event_order_(
+ ShouldBeFirst.EVENT, object, func, event, num_listeners);
+}
+
+/**
+ * Returns a promise that resolves after 100ms unless the the event is fired on
+ * the object in which case the promise rejects.
+ * @param {EventTarget} object The target object to listen for events.
+ * @param {string} event_name The event type to listen for.
+ * @returns {Promise<void>} Resolves if no events were fired.
+ */
+function assert_no_events(object, event_name) {
+ return new Promise((resolve, reject) => {
+ let event_listener = (e) => {
+ object.removeEventListener(event_name, event_listener);
+ assert_unreached('Object should not fire an event.');
+ };
+ object.addEventListener(event_name, event_listener);
+ // TODO: Remove timeout.
+ // http://crbug.com/543884
+ step_timeout(() => {
+ object.removeEventListener(event_name, event_listener);
+ resolve();
+ }, 100);
+ });
+}
+
+/**
+ * Asserts that |properties| contains the same properties in
+ * |expected_properties| with equivalent values.
+ * @param {object} properties Actual object to compare.
+ * @param {object} expected_properties Expected object to compare with.
+ */
+function assert_properties_equal(properties, expected_properties) {
+ for (let key in expected_properties) {
+ assert_equals(properties[key], expected_properties[key]);
+ }
+}
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
index c0fa4aed552..e677f00f087 100644
--- 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
@@ -1,5 +1,6 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
TEST
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html
index aebd681c2ad..1326b073879 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Device will connect';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html
index f70befcb4b4..d9c07b64bc0 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Garbage Collection ran during a connect call that ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html
index c3e35532835..5e9383851f3 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Multiple connects should return the same gatt object.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html
index 63624961ec7..b861040b236 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = '[SameObject] test for BluetoothRemoteGATTServer\'s device.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html
index e0d8439ab66..7ed2cb94603 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Connect + Disconnect twice still results in ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html
index 8b1459db192..c1863e92322 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html
index 5dada7a9c99..d4d6e2fca78 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Calling disconnect twice in a row still results in ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html
index 04ccedeb5e9..41d2b151d33 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';
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
index 4a1baf3ebc2..6f4f076110a 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called before getPrimaryService. ' +
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
index c7c80244193..24184ea8ba4 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryService ' +
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
index 5655d8ee41c..8a8714bca57 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryService call that ' +
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
index 0d3e5cf18a4..52699ee0a08 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls on services after we disconnect and connect again. ' +
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
index 7bb1ef5cb63..e0a31f6136e 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'getPrimaryService called before connecting. Reject with ' +
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
index ee3cf97f4db..52875b18548 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service without permission. Should ' +
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
index 5bf720cd48e..56362f20bfc 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service. Must reject with ' +
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
index 4c3111720c2..06d6a31eeb5 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during a getPrimaryService ' +
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
index fe7d749063d..cd4a0d39f28 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index 301658c73bb..6cd60732879 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index c46a1a52c03..f05adce27b1 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getPrimaryService should return the same object.';
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
index 704ab8bb2da..b30e4cc48f4 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Wrong Service name. Reject with TypeError.';
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
index 8daab29eaf9..6df58222e0a 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service without permission. ' +
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
index d55dee753cf..d6ae0b6dc8f 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for present service without permission to access ' +
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
index d357a214dfd..e11ed9e41e2 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for present service without permission. ' +
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
index 32350e779dc..0b8419a8042 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service. Reject with NotFoundError.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html
index 6fccff1813f..6484b8227d2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for service. Should return right service';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html
index eb20225e4ba..064d8d2e3b4 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
"use strict";
const test_desc = 'Two iframes in the same origin should be able to access ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html
index 6ed24fda403..90d776c77ee 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for services. Does not return blocklisted service.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html
index 2a34e0bf50a..df83dfe193f 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for services. Does not return blocklisted service.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html
index 9fffbd5d00e..9672d50a2bc 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Find correct services with UUID.';
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
index 8bc12f3c474..ea0c1616050 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called before getPrimaryServices. ' +
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
index 1c77e4e710a..04dc61083b8 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called before getPrimaryServices. ' +
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
index 230325a8c76..3223049d2a8 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryServices ' +
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
index dce13c5d006..646db21586f 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryServices ' +
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
index 8e2e32ba4fd..472eb991ece 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
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
index 78dcffdcbb1..86d56889325 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
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
index c226d2dc65e..0a5e07310fa 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls on services after we disconnect and connect again. ' +
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
index d69f6c5d5c2..e87339d59d0 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls on services after we disconnect and connect again. ' +
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
index a35984f8511..bb440a7caa2 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
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
index 36d7e64d555..26f3269a0c9 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
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
index 130657d228f..b52dac0385f 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service without permission. Should ' +
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
index 3817a1a5a38..f944f72583f 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service. Must reject with ' +
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
index c986835ce31..455bd47a040 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
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
index bd438db09e3..2e832d89e17 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
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
index 3b441cedeff..4555242ae82 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index 1b3302a1ba6..0eb78ba1b32 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index 378ade0c90b..11671cbf7b3 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index bdef5aa2f20..efda6cf4a41 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc =
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
index aca34e58ff0..d84ca0aa7fc 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getPrimaryServices should return the same object.';
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
index 0ea805e339d..3f876f5b76b 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getPrimaryServices should return the same object.';
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
index eeb6dd4dcf8..d26c0aa20a6 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Wrong Service name. Reject with TypeError.';
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
index c755dd7129d..4aefb9955b3 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service without permission. ' +
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
index 03b7f2329c8..a5006e6da84 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for present service without permission to access ' +
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
index e50c6d56128..e7d20bd3f23 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for present service without permission to access ' +
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
index c703d0a9363..8f4811fe08b 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for present service without permission. ' +
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
index 9dc1877f9f2..8bf9d8c0b6b 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent service. Reject with NotFoundError.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html
index 6face0acfae..92ca4ea6a6e 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for services. Should return right number of ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html
index 6edb1118c2a..d39c69fc7f1 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Find all services in a device.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html
index 2632ec6e7fe..4c78ad19d0e 100644
--- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for services in a device with no services. Reject ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html b/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html
index 0d5ab649683..4c479dda90b 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Same parent device returned from multiple services.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html
index de57c2e3760..d9590b17dc2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = '[SameObject] test for BluetoothRemoteGATTService device.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html
index 9746f4b058c..0fb2ff3532f 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for characteristic. Should return right ' +
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
index 72b9bac63a4..fb96df568ff 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Serial Number String characteristic is blocklisted. ' +
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
index a8b2ef892c7..c0987c68f59 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent characteristics with UUID. ' +
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
index 7457161faa0..1c429fc4945 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during getCharacteristic ' +
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
index 54ab061deb9..636ba9de773 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getCharacteristic should return the same object.';
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
index 8f44ecb08be..2331f86c4ae 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
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
index da5462a8bfa..bc96ce5eefd 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() and connect() called during ' +
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
index 0fe5b01146e..d04967e3a8c 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service is removed before getCharacteristic call. ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html
index 5620f2c9245..3298f5fd3d0 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'The Device Information service is composed of blocklisted ' +
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html
index 9139ae10f89..6188adbafb9 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Find characteristics with UUID in service.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html
index 952e3e6b5e9..6812cd977f2 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Find all characteristics in a service.';
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html
index 6401740681a..a629b5e1c11 100644
--- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html
+++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html
@@ -3,7 +3,8 @@
<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 src="/bluetooth/resources/bluetooth-test.js"></script>
+<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Request for absent characteristics. Reject with ' +
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
index cd8a6fa380a..c39a29c845b 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Serial Number String characteristic is blocklisted. ' +
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
index fff2bd038a8..ccaa7388e7e 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Request for absent characteristics with UUID. ' +
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
index 925786c74de..ad4ab9f3f50 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during getCharacteristics ' +
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
index d0ecff89f70..844814508f9 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Garbage Collection ran during getCharacteristics ' +
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
index fb3346dc4e4..35d277e3839 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getCharacteristics should return the same object.';
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
index 576e0831501..4326ee29079 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getCharacteristics should return the same object.';
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
index 5b2bd39d3e0..14b2e509be4 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Wrong Characteristic name. Reject with TypeError.';
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
index 95f22b11fcf..34207a2f60d 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() and connect() called during ' +
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
index 184632f1d05..4354cfc0671 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() and connect() called during ' +
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
index 6ff7b4f3631..8d0e7c2fc33 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service is removed before getCharacteristics call. ' +
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
index b4492885b83..dff0d3d9397 100644
--- 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
@@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
-// META: script=/bluetooth/resources/bluetooth-helpers.js
+// META: script=/bluetooth/resources/bluetooth-test.js
+// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service is removed before getCharacteristics call. ' +
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py
new file mode 100644
index 00000000000..eaca03fe76d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py
@@ -0,0 +1,2 @@
+def main(request, response):
+ return 301, [('Location', 'do-not-expect-received.py'),('Accept-CH', 'device-memory, DPR')], ''
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py
new file mode 100644
index 00000000000..835ef396b8b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py
@@ -0,0 +1,2 @@
+def main(request, response):
+ return 301, [('Location', 'expect-received.py'),('Accept-CH', 'device-memory, DPR')], ''
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js
index 46b499a5e41..5275057c3e5 100644
--- a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js
@@ -5,19 +5,54 @@ const expect = "/client-hints/accept-ch-stickiness/resources/expect-client-hints
const do_not_expect = "/client-hints/accept-ch-stickiness/resources/do-not-expect-client-hints-headers.html"
const host_info = get_host_info();
-const run_test = test => {
- // First, verify the initial state to make sure that the browser does not have
- // client hints preferences cached from a previous run of the test.
+
+function verify_initial_state(initial_url, test_name) {
promise_test(t => {
- return fetch(test.initial_url).then(r => {
+ return fetch(initial_url).then(r => {
assert_equals(r.status, 200)
// Verify that the browser did not include client hints in the request
// headers when fetching echo-client-hints-received.py.
assert_false(r.headers.has("device-memory-received"),
"device-memory-received");
});
- }, test.name + " precondition: Test that the browser does not have client " +
+ }, test_name + " precondition: Test that the browser does not have client " +
"hints preferences cached");
+}
+
+function verify_navigation_state(expect_url, test_name) {
+ promise_test(t => {
+ return new Promise(resolve => {
+ let win;
+ window.addEventListener('message', t.step_func(function(e) {
+ win.close();
+ assert_equals(e.data, "PASS", "message from opened page");
+ fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
+ }));
+ // Open a new window. Verify that the user agent attaches client hints.
+ win = window.open(expect_url);
+ assert_not_equals(win, null, "Popup windows not allowed?");
+ });
+ }, test_name + " got client hints according to expectations.");
+}
+
+function verify_subresource_state(expect_url, test_name) {
+ promise_test(t => {
+ return new Promise(resolve => {
+ let win;
+ window.addEventListener('message', t.step_func(function(e) {
+ win.close();
+ assert_equals(e.data, "PASS", "message from opened page");
+ fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
+ }));
+ // Open expect_url as a subresource.
+ fetch(expect_url).then(resolve);
+ });
+ }, test_name + " got client hints according to expectations.");
+}
+const run_test = test => {
+ // First, verify the initial state to make sure that the browser does not have
+ // client hints preferences cached from a previous run of the test.
+ verify_initial_state(test.initial_url, test.name);
// Then, attempt to set Accept-CH
promise_test(t => {
@@ -53,18 +88,6 @@ const run_test = test => {
}, test.name + " set Accept-CH");
// Finally, verify that CH are actually sent (or not) on requests
- promise_test(t => {
- return new Promise(resolve => {
- let win;
- window.addEventListener('message', t.step_func(function(e) {
- win.close();
- assert_equals(e.data, "PASS", "message from opened page");
- fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve);
- }));
- // Open a new window. Verify that the user agent attaches client hints.
- win = window.open(test.expect_url);
- assert_not_equals(win, null, "Popup windows not allowed?");
- });
- }, test.name + " got client hints according to expectations.");
+ verify_navigation_state(test.expect_url, test.name);
};
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py
new file mode 100644
index 00000000000..6b0e61af9db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py
@@ -0,0 +1,19 @@
+def main(request, response):
+ """
+ Check that headers sent to navigate here *do not* contain the device-memory client
+ hint, and report success/failure in a way compatible with
+ verify_subresource_state() in accept-ch-test.js
+ """
+
+ if "device-memory" in request.headers:
+ result = "FAIL"
+ else:
+ result = "PASS"
+
+ content = '''
+<script>
+ window.opener.postMessage("%s" , "*");
+</script>
+''' % (result)
+ headers = [("Content-Type", "text/html")]
+ return 200, headers, content
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py
new file mode 100644
index 00000000000..5aab578ae34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py
@@ -0,0 +1,19 @@
+def main(request, response):
+ """
+ Check that headers sent to navigate here contain the device-memory client
+ hint, and report success/failure in a way compatible with
+ verify_navigation_state() in accept-ch-test.js
+ """
+
+ if "device-memory" in request.headers:
+ result = "PASS"
+ else:
+ result = "FAIL"
+
+ content = '''
+<script>
+ window.opener.postMessage("%s" , "*");
+</script>
+''' % (result)
+ headers = [("Content-Type", "text/html")]
+ return 200, headers, content
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html
new file mode 100644
index 00000000000..2ab128f2d82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<meta name="timeout" content="long">
+<title>Accept-CH Persistence test</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/accept-ch-test.js"></script>
+
+<script>
+// This is similar to accept-ch-test.js tests, except setting and checking
+// header here are a single step, connected via redirect.
+const test_name = "redirect on navigation";
+verify_initial_state(echo, test_name);
+verify_navigation_state("resources/accept-ch-and-redir-to-expect.py", test_name);
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html
new file mode 100644
index 00000000000..4a8233bc3e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<meta name="timeout" content="long">
+<title>Accept-CH Persistence test</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/accept-ch-test.js"></script>
+
+<script>
+// This is similar to accept-ch-test.js tests, except setting and checking
+// header here are a single step, connected via redirect.
+const test_name = "redirect on navigation";
+verify_initial_state(echo, test_name);
+verify_subresource_state("resources/accept-ch-and-redir-to-do-not-expect.py", test_name);
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html
index 06b777fbe32..a1a51c98690 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html
@@ -1,6 +1,7 @@
<!doctype html>
<meta charset=utf-8>
<title>Clipboard IDL test</title>
+<meta name="timeout" content="long">
<link rel='help' href='https://w3c.github.io/clipboard-apis/#async-clipboard-api'>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html b/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html
index db71ca0262c..a0570f82a90 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html
+++ b/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html
@@ -3,6 +3,7 @@
<title>line-height interpolation</title>
<link rel="help" href="https://www.w3.org/TR/CSS2/visudet.html#propdef-line-height">
<meta name="assert" content="line-height supports animation by computation">
+<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html
new file mode 100644
index 00000000000..e7f00b00e8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html
@@ -0,0 +1,16 @@
+<!doctype HTML>
+<iframe srcdoc="
+<!doctype HTML>
+<style>
+ div {
+ background: linear-gradient(lightblue, yellow);
+ background-size: 300px 300px;
+ background-position: 50px 50px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+</style>
+<div></div>"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html
new file mode 100644
index 00000000000..08464fc9eb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html
@@ -0,0 +1,15 @@
+<!doctype HTML>
+<title>Backgrounds on the root element of an iframe should extend to cover the entire canvas of the iframe in the presence of margin</title>
+<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background">
+<link rel="match" href="background-margin-iframe-root-ref.html">
+<iframe srcdoc="
+<!doctype HTML>
+<style>
+ html {
+ background: linear-gradient(lightblue, yellow);
+ height: 300px;
+ margin: 50px;
+ overflow: hidden;
+ }
+</style>"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html
new file mode 100644
index 00000000000..2e5ec36ec08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html
@@ -0,0 +1,14 @@
+<!doctype HTML>
+<style>
+ div {
+ background: linear-gradient(lightblue, yellow);
+ background-size: 300px 300px;
+ background-position: 50px 50px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+</style>
+<div></div>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html
new file mode 100644
index 00000000000..cbba6c012d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html
@@ -0,0 +1,12 @@
+<!doctype HTML>
+<title>Backgrounds on the root element should extend to cover the entire canvas in the presence of margin</title>
+<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background">
+<link rel="match" href="background-margin-root-ref.html">
+<style>
+ html {
+ background: linear-gradient(lightblue, yellow);
+ height: 300px;
+ margin: 50px;
+ }
+</style>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html
new file mode 100644
index 00000000000..2e5ec36ec08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html
@@ -0,0 +1,14 @@
+<!doctype HTML>
+<style>
+ div {
+ background: linear-gradient(lightblue, yellow);
+ background-size: 300px 300px;
+ background-position: 50px 50px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+</style>
+<div></div>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html
new file mode 100644
index 00000000000..87129f38184
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html
@@ -0,0 +1,13 @@
+<!doctype HTML>
+<title>Backgrounds on the root element should extend to cover the entire canvas in the presence of margin and transform</title>
+<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background">
+<link rel="match" href="background-margin-transformed-root-ref.html">
+<style>
+ html {
+ background: linear-gradient(lightblue, yellow);
+ height: 300px;
+ margin: 50px;
+ transform: rotateZ(0deg);
+ }
+</style>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html
index d772748564f..25c0c5cb357 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html
@@ -11,7 +11,6 @@
background-color: green;
block-size: 100px;
display: flex;
- gap: 20px;
}
section > div{
background-color: grey;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html
index 66d104a86d1..5aac91817f3 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html
@@ -11,7 +11,6 @@
background-color: green;
block-size: 100px;
display: flex;
- gap: 20px;
}
section > div{
background-color: grey;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html
index 7556857e052..bb0cf3c0eb0 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html
@@ -11,7 +11,6 @@
background-color: green;
block-size: 100px;
display: flex;
- gap: 20px;
}
section > div{
background-color: grey;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html
index f9c0c55eaaf..8d761c6dfbc 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html
@@ -12,7 +12,6 @@
block-size: 200px;
display: flex;
flex-direction: column;
- gap: 20px;
}
section > div{
background-color: gray;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html
index c9148e2976a..9310e9ae488 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html
@@ -12,7 +12,6 @@
block-size: 200px;
display: flex;
flex-direction: column;
- gap: 20px;
}
section > div{
background-color: grey;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html
new file mode 100644
index 00000000000..d1d579e30b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-line-break">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Gaps are respected when gathering items into lines for row flexboxes." />
+
+<style>
+.item {
+ width: 100px;
+ height: 50px;
+ flex: 0 0 auto;
+ background: green;
+}
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=reference-overlapped-red></div>
+
+<div style="display: flex; width: 200px; column-gap: 50px; flex-flow: row wrap">
+ <div class=item></div>
+ <div class=item></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html
new file mode 100644
index 00000000000..19b39b9a783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-line-break">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Gaps are respected when gathering items into lines for column flexboxes." />
+
+<style>
+.item {
+ width: 50px;
+ height: 100px;
+ flex: 0 0 auto;
+ background: green;
+}
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=reference-overlapped-red></div>
+
+<div style="display: flex; height: 200px; width: 100px; row-gap: 50px; flex-flow: column wrap;">
+ <div class=item></div>
+ <div class=item></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html
new file mode 100644
index 00000000000..30e4c43e719
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Main axis gap makes grow turn to shrink." />
+
+<style>
+.item {
+ width: 30px;
+ flex: 1 1 auto;
+ background: red;
+}
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div style="display: flex; height: 100px; width: 100px; column-gap: 100px; background: green;">
+ <div class=item></div>
+ <div class=item></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html
new file mode 100644
index 00000000000..c600478c73c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#main-alignment">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="There are gaps between 0-main-size items" />
+
+<style>
+.item {
+ height: 10px;
+ flex: 0 0 auto;
+}
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=reference-overlapped-red></div>
+
+<div style="display: flex; width: 100px; row-gap: 40px; background: green; flex-direction: column;">
+ <div class=item></div>
+ <div class=item style="height: 0px"></div>
+ <div class=item></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html
new file mode 100644
index 00000000000..e54598e2000
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#intrinsic-sizes">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Intrinsic min size includes gaps" />
+
+<style>
+.item {
+ flex: 0 0 auto;
+ line-height: 0px;
+}
+
+.inline-block {
+ display: inline-block;
+ width: 10px;
+}
+
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=reference-overlapped-red></div>
+
+<div style="display: flex; column-gap: 80px; background: green; height: 100px; width: min-content">
+ <div class=item> <!-- min: 10 max: 20 -->
+ <div class=inline-block></div><div class=inline-block></div>
+ </div>
+ <div class=item style="width: 10px"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html
new file mode 100644
index 00000000000..a5441772567
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>Flex gaps</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#intrinsic-sizes">
+<link rel="help" href="https://drafts.csswg.org/css-align/#gaps">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Intrinsic max size includes gaps" />
+
+<style>
+.item {
+ flex: 0 0 auto;
+ line-height: 0px;
+}
+
+.inline-block {
+ display: inline-block;
+ width: 10px;
+}
+
+#reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=reference-overlapped-red></div>
+
+<div style="display: flex; column-gap: 70px; background: green; height: 100px; width: max-content">
+ <div class=item> <!-- min: 10 max: 20 -->
+ <div class=inline-block></div><div class=inline-block></div>
+ </div>
+ <div class=item style="width: 10px"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html
index c0688870818..89ed671fdf1 100644
--- a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html
@@ -187,4 +187,112 @@ test_with_at_property({
}
}, 'Ongoing animation picks up redeclared meaning of \'unset\'');
+test_with_at_property({
+ syntax: '"<color>"',
+ inherits: false,
+ initialValue: 'red'
+}, (name) => {
+ try {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(255, 0, 0)');
+ div.style = `transition: ${name} steps(2, start) 100s; ${name}: blue`;
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(128, 0, 128)');
+ } finally {
+ div.style = '';
+ }
+}, 'Transitioning from initial value');
+
+test_with_at_property({
+ syntax: '"<color>"',
+ inherits: false,
+ initialValue: 'red'
+}, (name) => {
+ try {
+ div.style = `${name}: blue;`;
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 0, 255)');
+ div.style = `transition: ${name} steps(2, start) 100s; ${name}: green`;
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 64, 128)');
+ } finally {
+ div.style = '';
+ }
+}, 'Transitioning from specified value');
+
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '100px'
+}, (name) => {
+ with_style_node(`div { transition: ${name} steps(2, start) 100s; }`, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '100px');
+ // Re-declaring the property with a different initial value effectively
+ // means the computed value has changed. This means we should transition
+ // from the old initial value to the new initial value.
+ with_at_property({
+ name: name,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '200px'
+ }, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '150px');
+ });
+ });
+}, 'Transition triggered by initial value change');
+
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '100px'
+}, (name) => {
+ with_style_node(`div { transition: ${name} steps(2, start) 100s; }`, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '100px');
+ with_at_property({
+ name: name,
+ syntax: '"<color>"',
+ inherits: false,
+ initialValue: 'green'
+ }, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)');
+ });
+ });
+}, 'No transition when changing types');
+
+test(() => {
+ let name = generate_name();
+ with_style_node(`div { ${name}: 100px; transition: ${name} steps(2, start) 100s; }`, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' 100px');
+
+ let style1 = document.createElement('style');
+ style1.textContent = `
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 200px;
+ }
+ `;
+
+ let style2 = document.createElement('style');
+ style2.textContent = `div { ${name}: 400px; }`;
+
+ try {
+ // Register the property:
+ document.body.append(style1);
+ // The token sequence ' 100px' is now interpreted as a length '100px'.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '100px');
+
+ // Change the computed value:
+ document.body.append(style2);
+ // This should cause an interpolation between 100px and 400px:
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '250px');
+
+ // In the middle of the transition above, remove the @property rule
+ // (making the computed value a token sequence again). We should snap
+ // to the new token sequence.
+ style1.remove();
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' 400px');
+ } finally {
+ style1.remove();
+ style2.remove();
+ }
+ });
+}, 'No transition when removing @property rule');
+
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html
new file mode 100644
index 00000000000..04c40c8be0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#css-style-value-reification">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/utils.js"></script>
+<div id=div></div>
+<script>
+
+test(() => {
+ let name = generate_name();
+ with_style_node(`div { ${name}: 100px; }`, () => {
+ // Before registering the property, ${name} should reify as a
+ // a token sequence.
+ assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnparsedValue');
+ assert_equals(div.computedStyleMap().get(name).toString(), ' 100px');
+
+ with_at_property({
+ name: name,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '0px'
+ }, () => {
+ // After registering, it should reify as a <length>.
+ assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue');
+ assert_equals(div.computedStyleMap().get(name).value, 100);
+ assert_equals(div.computedStyleMap().get(name).unit, 'px');
+ });
+
+ // After @property is removed, the computed value is once again a token
+ // sequence.
+ assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnparsedValue');
+ assert_equals(div.computedStyleMap().get(name).toString(), ' 100px');
+ });
+}, 'Properties declared with @property reify correctly');
+
+test(() => {
+ let name = generate_name();
+ // 0 is valid as a both <length> and <integer>, which reify differently.
+ with_style_node(`div { ${name}: 0; }`, () => {
+ with_at_property({
+ name: name,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '1000px'
+ }, () => {
+ assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue');
+ assert_equals(div.computedStyleMap().get(name).value, 0);
+ assert_equals(div.computedStyleMap().get(name).unit, 'px');
+
+ with_at_property({
+ name: name,
+ syntax: '"<integer>"',
+ inherits: false,
+ initialValue: '1000'
+ }, () => {
+ assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue');
+ assert_equals(div.computedStyleMap().get(name).value, 0);
+ assert_equals(div.computedStyleMap().get(name).unit, 'number');
+ });
+ });
+ });
+}, 'Re-declaring a property with a different type affects reification');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html
index 9a68be51d79..e6bbbec9640 100644
--- a/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html
@@ -3,132 +3,230 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/utils.js"></script>
-<style>
-@property --a {
- syntax: "<length>";
- inherits: false;
- initial-value: 1px;
-}
-
-@property --b {
- syntax: "<length>";
- inherits: false;
- initial-value: 2px;
-}
-
-@property --c {
- syntax: "<length>";
- inherits: false;
- initial-value: 3px;
-}
-
-@property --d {
- syntax: "<length>";
- inherits: false;
- initial-value: 4px;
-}
-
-@property --d {
- syntax: "<color>";
- inherits: false;
- initial-value: red;
-}
-</style>
-<style>
-@property --c {
- syntax: "<integer>";
- inherits: false;
- initial-value: 6;
-}
-</style>
<div id=outer>
<div id=div></div>
</div>
<script>
-CSS.registerProperty({
- name: '--b',
- syntax: '<color>',
+test_with_at_property({
+ syntax: '"<length>"',
inherits: false,
- initialValue: 'green'
-});
-
-CSS.registerProperty({
- name: '--e',
- syntax: '<color>',
- inherits: false,
- initialValue: 'blue'
-});
-
-test(() => {
- assert_equals(getComputedStyle(div).getPropertyValue('--a'), '1px');
+ initialValue: '1px'
+}, (name) => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
}, '@property determines the registration when uncontested');
-test(() => {
- assert_equals(getComputedStyle(div).getPropertyValue('--b'), 'rgb(0, 128, 0)');
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '2px'
+}, (name) => {
+ CSS.registerProperty({
+ name: name,
+ syntax: '<color>',
+ inherits: false,
+ initialValue: 'green'
+ });
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)');
}, 'CSS.registerProperty wins over @property');
-test(() => {
- assert_equals(getComputedStyle(div).getPropertyValue('--c'), '6');
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '3px'
+}, (name1) => {
+ with_at_property({
+ name: name1,
+ syntax: '"<integer>"',
+ inherits: false,
+ initialValue: '6'
+ }, (name2) => {
+ assert_equals(name1, name2);
+ assert_equals(getComputedStyle(div).getPropertyValue(name2), '6');
+ });
}, '@property later in document order wins');
test(() => {
- assert_equals(getComputedStyle(div).getPropertyValue('--d'), 'rgb(255, 0, 0)');
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 4px;
+ }
+
+ @property ${name} {
+ syntax: "<color>";
+ inherits: false;
+ initial-value: red;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(255, 0, 0)');
+ });
}, '@property later in stylesheet wins');
test(() => {
- assert_equals(getComputedStyle(div).getPropertyValue('--e'), 'rgb(0, 0, 255)');
+ let name = generate_name();
+ CSS.registerProperty({
+ name: name,
+ syntax: '<color>',
+ inherits: false,
+ initialValue: 'green'
+ });
+ assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)');
}, 'CSS.registerProperty determines the registration when uncontested');
test(() => {
- // --f is initially not registered, hence has no initial value.
- assert_equals(getComputedStyle(div).getPropertyValue('--f'), '');
+ let name = generate_name();
+
+ // ${name} is initially not registered, hence has no initial value.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '');
with_at_property({
- name: '--f',
+ name: name,
syntax: '"<length>"',
inherits: false,
initialValue: '10px'
}, () => {
- assert_equals(getComputedStyle(div).getPropertyValue('--f'), '10px');
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '10px');
});
- // When the style node is removed, --f should be unregistered again.
- assert_equals(getComputedStyle(div).getPropertyValue('--f'), '');
+ // When the style node is removed, ${name} should be unregistered again.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '');
}, '@property registrations are cleared when rule removed');
-test_with_style_node('div { --g: calc(1px + 1px); }', () => {
- // --g should be a token sequence at this point.
- assert_equals(getComputedStyle(div).getPropertyValue('--g'), ' calc(1px + 1px)');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`div { ${name}: calc(1px + 1px); }`, () => {
+ // ${name} should be a token sequence at this point.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)');
+
+ with_at_property({
+ name: name,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '0px'
+ }, () => {
+ // ${name} is now a <length>, hence the calc() should be simplified.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '2px');
+ });
+
+ // ${name} should be a token sequence again.
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)');
+ });
+}, 'Computed value becomes token sequence when @property is removed');
- with_at_property({
- name: '--g',
- syntax: '"<length>"',
- inherits: false,
- initialValue: '0px'
- }, () => {
- // --g is now a <length>, hence the calc() should be simplified.
- assert_equals(getComputedStyle(div).getPropertyValue('--g'), '2px');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`#outer { ${name}: 10px; }`, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px');
+
+ with_at_property({
+ name: name,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '0px'
+ }, () => {
+ // ${name} is no longer inherited
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '0px');
+ });
+
+ assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px');
});
+}, 'Inherited status is reflected in computed styles when @property is removed');
- // --g should be a token sequence again.
- assert_equals(getComputedStyle(div).getPropertyValue('--g'), ' calc(1px + 1px)');
-}, 'Computed value becomes token sequence when @property is removed');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 1px;
+ }
+
+ @property ${name} {
+ inherits: false;
+ initial-value: green;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
+ });
+}, 'Invalid @property rule (missing syntax) does not overwrite previous valid rule');
-test_with_style_node('#outer { --h: 10px; }', () => {
- assert_equals(getComputedStyle(div).getPropertyValue('--h'), ' 10px');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 1px;
+ }
+
+ @property ${name} {
+ syntax: "<color>";
+ initial-value: green;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
+ });
+}, 'Invalid @property rule (missing inherits descriptor) does not overwrite previous valid rule');
- with_at_property({
- name: '--h',
- syntax: '"<length>"',
- inherits: false,
- initialValue: '0px'
- }, () => {
- // --h is no longer inherited
- assert_equals(getComputedStyle(div).getPropertyValue('--h'), '0px');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 1px;
+ }
+
+ @property ${name} {
+ syntax: "<color>";
+ inherits: false;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
+}, 'Invalid @property rule (missing initial-value) does not overwrite previous valid rule');
- assert_equals(getComputedStyle(div).getPropertyValue('--h'), ' 10px');
-}, 'Inherited status is reflected in computed styles when @property is removed');
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<color>";
+ inherits: false;
+ }
+
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 1px;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
+ });
+}, 'Previous invalid rule does not prevent valid rule from causing registration');
+
+test(() => {
+ let name = generate_name();
+
+ with_style_node(`
+ @property ${name} {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 1px;
+ quite-unknown: 200;
+ }
+ `, () => {
+ assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
+ });
+}, 'Unknown descriptors are ignored and do not invalidate rule');
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html
new file mode 100644
index 00000000000..3441050a59d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+ <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-backface-visibility">
+ <style>
+ #flip {
+ height: 100px;
+ width: 100px;
+ transform: rotateY(180deg);
+ transform-style: preserve-3d;
+ }
+
+ #back {
+ background: lightblue;
+ transform: rotateY(180deg);
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 200px;
+ height: 200px;
+ backface-visibility: hidden;
+ }
+
+ #posabs {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ background: yellow;
+ }
+ </style>
+ <div id="flip">
+ <div id="back">
+ <i id="posabs">Text</i>
+ </div>
+ </div>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html
new file mode 100644
index 00000000000..6cdefad6620
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html class=reftest-wait>
+ <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-backface-visibility">
+ <link rel="match" href="backface-visibility-hidden-animated-ref.html">
+ <style>
+ @keyframes show-backface {
+ 0% { transform: rotateY(60deg); }
+ 0.01% { transform: rotateY(180deg); }
+ 100% { transform: rotateY(180deg); }
+ }
+
+ .flip {
+ animation: 10s linear 0s infinite forwards show-backface;
+ height: 100px;
+ width: 100px;
+ transform: rotateY(60deg);
+ transform-style: preserve-3d;
+ }
+
+ #back {
+ background: lightblue;
+ transform: rotateY(180deg);
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 200px;
+ height: 200px;
+ backface-visibility: hidden;
+ }
+
+ #posabs {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ background: yellow;
+ }
+ </style>
+ <div id="flip">
+ <div id="back">
+ <i id="posabs">Text</i>
+ </div>
+ </div>
+ <script>
+ onload = () => requestAnimationFrame(() => requestAnimationFrame(() => {
+ flip.classList.add("flip");
+ requestAnimationFrame(() => requestAnimationFrame(() =>
+ document.documentElement.classList.remove("reftest-wait")));
+ }));
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-001.html
index 7e9b133aead..7e9b133aead 100644
--- a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box.html
+++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-001.html
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html
new file mode 100644
index 00000000000..9044048e387
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>transform-box: fill-box on an SVG container element</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box">
+<link rel="match" href="reference/greensquare200x200.html">
+<style>
+#container {
+ transform-box: fill-box;
+ transform-origin: center;
+ transform: scale(2);
+}
+</style>
+<p>There should be a green 200x200 rectangle below, and no red.</p>
+<svg width="200" height="200">
+ <rect width="200" height="200" fill="red"/>
+ <g id="container">
+ <rect x="50" y="50" width="100" height="100" fill="green"/>
+ </g>
+</svg>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html
new file mode 100644
index 00000000000..92ebe78c1d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html class="reftest-wait">
+<title>CSS Transforms: 'transform' resolved percentage values in SVG after mutation</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-property">
+<link rel="match" href="transform-box/reference/greensquare200x200.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/rendering-utils.js"></script>
+<style>
+ #container {
+ width: 400px;
+ height: 200px;
+ }
+</style>
+<p>There should be a green 200x200 rectangle below, and no red.</p>
+<div id="container">
+ <svg width="100%" height="100%">
+ <rect width="200" height="200" fill="red"/>
+ <g id="target" style="transform: translate(50%, 50%)">
+ <rect x="-100" y="-100" width="100%" height="100%" fill="green"/>
+ </g>
+ </svg>
+</div>
+<script>
+ waitForAtLeastOneFrame().then(() => {
+ document.getElementById('container').style.width = '200px';
+ takeScreenshot();
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html
new file mode 100644
index 00000000000..cf5d63b02a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing: PerformanceObserver with buffered flag and durationThreshold</title>
+<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=resources/event-timing-test-utils.js></script>
+<div id='myDiv'>Click me</div>
+<script>
+promise_test(async t => {
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
+ // Add a PerformanceObserver and observe with a durationThreshold of 30 and buffered flag.
+ return new Promise(async resolve1 => {
+ // Add a slow click event and make sure it's dispatched to observers.
+ await new Promise(async resolve2 => {
+ // Observer to await until event entry is dispatched.
+ new PerformanceObserver(() => {
+ resolve2();
+ }).observe({type: "event", durationThreshold: 16});
+ await clickOnElementAndDelay('myDiv', 30);
+ });
+ const afterFirstClick = performance.now();
+ new PerformanceObserver(t.step_func(list => {
+ const mouseDowns = list.getEntriesByName('mousedown');
+ assert_equals(mouseDowns.length, 1, 'Should only observe 1 click!');
+ assert_greater_than(mouseDowns[0].processingStart, afterFirstClick,
+ 'The entry should not be the first click!!');
+ verifyClickEvent(mouseDowns[0], 'myDiv', false /* isFirst */, 16 /* minDuration*/);
+ resolve1();
+ })).observe({type: 'event', durationThreshold: 16, buffered: true});
+ // This should be the only click observed since the other one would not be buffered.
+ await clickOnElementAndDelay('myDiv', 30);
+ });
+}, "PerformanceObserver buffering independent of durationThreshold");
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html
new file mode 100644
index 00000000000..5665d42d334
--- /dev/null
+++ b/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing: PerformanceObserver with a durationThreshold of 125</title>
+<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=resources/event-timing-test-utils.js></script>
+<div id='myDiv'>Click me</div>
+<script>
+promise_test(async t => {
+ return testDuration(t, 'myDiv', numEntries=2, dur=125, fastDur=70, slowDur=140);
+}, "PerformanceObserver observes events according to its durationThreshold");
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html
new file mode 100644
index 00000000000..a827f2211b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing: PerformanceObserver with a durationThreshold of 50</title>
+<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=resources/event-timing-test-utils.js></script>
+<div id='myDiv'>Click me</div>
+<script>
+promise_test(async t => {
+ return testDuration(t, 'myDiv', numEntries=3, dur=50, fastDur=20, slowDur=70);
+}, "PerformanceObserver observes events according to its durationThreshold");
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html
new file mode 100644
index 00000000000..443b38a2783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing: PerformanceObserver with a durationThreshold less than 16</title>
+<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=resources/event-timing-test-utils.js></script>
+<div id='myDiv'>Click me</div>
+<script>
+promise_test(async t => {
+ return testDuration(t, 'myDiv', numEntries=5, dur=0, fastDur=0, slowDur=20);
+}, "PerformanceObserver with durationThreshold of 0 sees events of duration >= 16");
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js b/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js
index cc824d9cba6..bceaa5053d5 100644
--- a/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js
+++ b/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js
@@ -1,16 +1,16 @@
-// Clicks on the element with the given ID. It adds an event handler to the element
-// which ensures that the events have a long duration and reported by EventTiming
-// where appropriate. Calls |callback| during event handler.
-function clickOnElement(id, callback) {
+// Clicks on the element with the given ID. It adds an event handler to the element which
+// ensures that the events have a duration of at least |delay|. Calls |callback| during
+// event handler if |callback| is provided.
+async function clickOnElementAndDelay(id, delay, callback) {
const element = document.getElementById(id);
const clickHandler = () => {
- mainThreadBusy(120);
+ mainThreadBusy(delay);
if (callback)
callback();
element.removeEventListener("mousedown", clickHandler);
};
element.addEventListener("mousedown", clickHandler);
- test_driver.click(element);
+ await test_driver.click(element);
}
function mainThreadBusy(duration) {
@@ -18,15 +18,16 @@ function mainThreadBusy(duration) {
while (performance.now() < now + duration);
}
-// This method should receive an entry of type 'event'. |is_first| is true only
-// when the event also happens to correspond to the first event. In this case,
-// the timings of the 'first-input' entry should be equal to those of this entry.
-function verifyClickEvent(entry, targetId, is_first=false) {
+// This method should receive an entry of type 'event'. |isFirst| is true only when we want
+// to check that the event also happens to correspond to the first event. In this case, the
+// timings of the 'first-input' entry should be equal to those of this entry. |minDuration|
+// is used to compared against entry.duration.
+function verifyClickEvent(entry, targetId, isFirst=false, minDuration=104) {
assert_true(entry.cancelable);
assert_equals(entry.name, 'mousedown');
assert_equals(entry.entryType, 'event');
- assert_greater_than_equal(entry.duration, 104,
- "The entry's duration should be greater than or equal to 104 ms.");
+ assert_greater_than_equal(entry.duration, minDuration,
+ "The entry's duration should be greater than or equal to " + minDuration + " ms.");
assert_greater_than(entry.processingStart, entry.startTime,
"The entry's processingStart should be greater than startTime.");
assert_greater_than_equal(entry.processingEnd, entry.processingStart,
@@ -35,7 +36,7 @@ function verifyClickEvent(entry, targetId, is_first=false) {
// on the actual duration.
assert_greater_than_equal(entry.duration + 4, entry.processingEnd - entry.startTime,
"The entry's duration must be at least as large as processingEnd - startTime.");
- if (is_first) {
+ if (isFirst) {
let firstInputs = performance.getEntriesByType('first-input');
assert_equals(firstInputs.length, 1, 'There should be a single first-input entry');
let firstInput = firstInputs[0];
@@ -61,6 +62,58 @@ function wait() {
function clickAndBlockMain(id) {
return new Promise((resolve, reject) => {
- clickOnElement(id, resolve);
+ clickOnElementAndDelay(id, 120, resolve);
});
}
+
+ // Add a PerformanceObserver and observe with a durationThreshold of |dur|. This test will
+ // attempt to check that the duration is appropriately checked by:
+ // * Asserting that entries received have a duration which is the smallest multiple of 8
+ // that is greater than or equal to |dur|.
+ // * Issuing |numEntries| entries that are fast, of duration |slowDur|.
+ // * Issuing |numEntries| entries that are slow, of duration |fastDur|.
+ // * Asserting that at least |numEntries| entries are received (at least the slow ones).
+ // Parameters:
+ // |t| - the test harness.
+ // |dur| - the durationThreshold for the PerformanceObserver.
+ // |id| - the ID of the element to be clicked.
+ // |numEntries| - the number of slow and number of fast entries.
+ // |slowDur| - the min duration of a slow entry.
+ // |fastDur| - the min duration of a fast entry.
+async function testDuration(t, id, numEntries, dur, fastDur, slowDur) {
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
+ const observerPromise = new Promise(async resolve => {
+ let minDuration = Math.ceil(dur / 8) * 8;
+ // Exposed events must always have a minimum duration of 16.
+ minDuration = Math.max(minDuration, 16);
+ let numEntriesReceived = 0;
+ new PerformanceObserver(list => {
+ const mouseDowns = list.getEntriesByName('mousedown');
+ mouseDowns.forEach(e => {
+ t.step(() => {
+ verifyClickEvent(e, id, false /* isFirst */, minDuration);
+ });
+ });
+ numEntriesReceived += mouseDowns.length;
+ // Note that we may receive more entries if the 'fast' click events turn out slower
+ // than expected.
+ if (numEntriesReceived >= numEntries)
+ resolve();
+ }).observe({type: "event", durationThreshold: dur});
+ });
+ const clicksPromise = new Promise(async resolve => {
+ for (let index = 0; index < numEntries; index++) {
+ // Add some fast click events.
+ await clickOnElementAndDelay(id, slowDur);
+ // Add some slow click events.
+ if (fastDur > 0) {
+ await clickOnElementAndDelay(id, fastDur);
+ } else {
+ // We can just directly call test_driver when |fastDur| is 0.
+ await test_driver.click(document.getElementById(id));
+ }
+ }
+ resolve();
+ });
+ return Promise.all([observerPromise, clicksPromise]);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/event-timing/timingconditions.html b/tests/wpt/web-platform-tests/event-timing/timingconditions.html
index 12280cb894a..e7763c40dc0 100644
--- a/tests/wpt/web-platform-tests/event-timing/timingconditions.html
+++ b/tests/wpt/web-platform-tests/event-timing/timingconditions.html
@@ -15,10 +15,8 @@
<script>
let trustedClickStart;
function trustedClickAndBlockMain(id) {
- return new Promise((resolve, reject) => {
- trustedClickStart = performance.now();
- clickOnElement(id, resolve);
- });
+ trustedClickStart = performance.now();
+ return clickAndBlockMain(id);
}
function untrustedClickAndBlockMain(id) {
diff --git a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html
index 41ece6826ed..c28708019fa 100644
--- a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html
+++ b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html
@@ -17,9 +17,13 @@ promise_test(async (test) => {
var request_token = token();
const response = await fetch(`resources/stale-script.py?token=` + request_token);
+ // Wait until resource is completely fetched to allow caching before next fetch.
+ const body = await response.text();
const response2 = await fetch(`resources/stale-script.py?token=` + request_token);
assert_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id'));
+ const body2 = await response2.text();
+ assert_equals(body, body2);
while(true) {
const revalidation_check = await fetch(`resources/stale-script.py?query&token=` + request_token);
diff --git a/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js b/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js
index a60b7fe838e..ddcc59c4034 100644
--- a/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/hr-time/idlharness.any.js b/tests/wpt/web-platform-tests/hr-time/idlharness.any.js
index 4e266c09e33..6676b001a8b 100644
--- a/tests/wpt/web-platform-tests/hr-time/idlharness.any.js
+++ b/tests/wpt/web-platform-tests/hr-time/idlharness.any.js
@@ -1,6 +1,7 @@
// META: global=window,worker
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js b/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js
index 50faf83514f..d4d739ae8eb 100644
--- a/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html
index d29a8e11f43..4cad9483003 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html
@@ -15,7 +15,6 @@ test(function() {
}, "window object");
test(function() {
var proto = Object.getPrototypeOf(window);
- assert_class_string(proto, "WindowPrototype");
assert_equals(proto, Window.prototype);
}, "Window.prototype");
test(function() {
@@ -24,12 +23,10 @@ test(function() {
}, "Global scope polluter");
test(function() {
var protoproto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(window)));
- assert_class_string(protoproto, "EventTargetPrototype");
assert_equals(protoproto, EventTarget.prototype);
}, "EventTarget.prototype");
test(function() {
var protoprotoproto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(window))));
- assert_class_string(protoprotoproto, "Object");
assert_equals(protoprotoproto, Object.prototype);
}, "Object.prototype");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html
index a10ea1d2858..35f151b12d6 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html
@@ -53,6 +53,11 @@
// We have no test cases using valid colors other than "#000000".
return "#000000";
}
+ function browserSupportsInputTypeOf(inputType) {
+ var inputTest = document.createElement("input");
+ inputTest.type = inputType;
+ return (inputTest.type === inputType);
+ }
var types = [
@@ -99,6 +104,8 @@
for (var j = 0; j < types.length; j++) {
if (types[i] != types[j]) {
test(function() {
+ assert_implements(browserSupportsInputTypeOf(types[i].type), "Support for input type " + types[i].type + " is required for this test.");
+ assert_implements(browserSupportsInputTypeOf(types[j].type), "Support for input type " + types[j].type + " is required for this test.");
var input = document.createElement("input");
var expected = INITIAL_VALUE;
input.type = types[i].type;
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
index 9409dd08e4d..9a22728ec7e 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
+++ b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
@@ -10,9 +10,9 @@
promise_test(async t => {
const uaData = navigator.userAgentData;
- for (ua of uaData.uaList) {
- assert_equals(typeof ua.brand, "string", "brand should be a string");
- assert_equals(typeof ua.version, "string", "version should be a string");
+ for (brandVersionPair of uaData.brands) {
+ assert_equals(typeof brandVersionPair.brand, "string", "brand should be a string");
+ assert_equals(typeof brandVersionPair.version, "string", "version should be a string");
}
assert_equals(typeof uaData.mobile, "boolean", "mobile should be a boolean");
const highEntropyData = await uaData.getHighEntropyValues(["platform", "platformVersion", "architecture", "model"]);
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl
index f102510db47..b7d9c33d596 100644
--- a/tests/wpt/web-platform-tests/interfaces/cssom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl
@@ -14,7 +14,7 @@ typedef DOMString CSSOMString;
[Exposed=Window]
interface MediaList {
- stringifier attribute [TreatNullAs=EmptyString] CSSOMString mediaText;
+ stringifier attribute [LegacyNullToEmptyString] CSSOMString mediaText;
readonly attribute unsigned long length;
getter CSSOMString? item(unsigned long index);
void appendMedium(CSSOMString medium);
@@ -130,10 +130,10 @@ interface CSSStyleDeclaration {
getter CSSOMString item(unsigned long index);
CSSOMString getPropertyValue(CSSOMString property);
CSSOMString getPropertyPriority(CSSOMString property);
- [CEReactions] void setProperty(CSSOMString property, [TreatNullAs=EmptyString] CSSOMString value, optional [TreatNullAs=EmptyString] CSSOMString priority = "");
+ [CEReactions] void setProperty(CSSOMString property, [LegacyNullToEmptyString] CSSOMString value, optional [LegacyNullToEmptyString] CSSOMString priority = "");
[CEReactions] CSSOMString removeProperty(CSSOMString property);
readonly attribute CSSRule? parentRule;
- [CEReactions] attribute [TreatNullAs=EmptyString] CSSOMString cssFloat;
+ [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString cssFloat;
};
interface mixin ElementCSSInlineStyle {
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index a8b9b423301..c9018f1b63d 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -45,10 +45,10 @@ interface DOMStringList {
enum DocumentReadyState { "loading", "interactive", "complete" };
typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement;
-[OverrideBuiltins]
+[LegacyOverrideBuiltIns]
partial interface Document {
// resource metadata management
- [PutForwards=href, Unforgeable] readonly attribute Location? location;
+ [PutForwards=href, LegacyUnforgeable] readonly attribute Location? location;
attribute USVString domain;
readonly attribute USVString referrer;
attribute USVString cookie;
@@ -89,7 +89,7 @@ partial interface Document {
DOMString queryCommandValue(DOMString commandId);
// special event handler IDL attributes that only apply to Document objects
- [LenientThis] attribute EventHandler onreadystatechange;
+ [LegacyLenientThis] attribute EventHandler onreadystatechange;
// also has obsolete members
};
@@ -119,7 +119,7 @@ interface HTMLElement : Element {
[CEReactions] attribute boolean spellcheck;
[CEReactions] attribute DOMString autocapitalize;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;
ElementInternals attachInternals();
};
@@ -145,7 +145,7 @@ interface mixin HTMLOrSVGElement {
};
[Exposed=Window,
- OverrideBuiltins]
+ LegacyOverrideBuiltIns]
interface DOMStringMap {
getter DOMString (DOMString name);
[CEReactions] setter void (DOMString name, DOMString value);
@@ -365,7 +365,7 @@ interface HTMLSourceElement : HTMLElement {
};
[Exposed=Window,
- NamedConstructor=Image(optional unsigned long width, optional unsigned long height)]
+ LegacyFactoryFunction=Image(optional unsigned long width, optional unsigned long height)]
interface HTMLImageElement : HTMLElement {
[HTMLConstructor] constructor();
@@ -463,7 +463,7 @@ interface HTMLVideoElement : HTMLMediaElement {
};
[Exposed=Window,
- NamedConstructor=Audio(optional DOMString src)]
+ LegacyFactoryFunction=Audio(optional DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {
[HTMLConstructor] constructor();
};
@@ -766,7 +766,7 @@ interface HTMLTableCellElement : HTMLElement {
};
[Exposed=Window,
- OverrideBuiltins,
+ LegacyOverrideBuiltIns,
LegacyUnenumerableNamedProperties]
interface HTMLFormElement : HTMLElement {
[HTMLConstructor] constructor();
@@ -840,7 +840,7 @@ interface HTMLInputElement : HTMLElement {
[CEReactions] attribute DOMString step;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString value;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString value;
attribute object? valueAsDate;
attribute unrestricted double valueAsNumber;
[CEReactions] attribute unsigned long width;
@@ -944,7 +944,7 @@ interface HTMLOptGroupElement : HTMLElement {
};
[Exposed=Window,
- NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
+ LegacyFactoryFunction=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
interface HTMLOptionElement : HTMLElement {
[HTMLConstructor] constructor();
@@ -979,7 +979,7 @@ interface HTMLTextAreaElement : HTMLElement {
readonly attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
- attribute [TreatNullAs=EmptyString] DOMString value;
+ attribute [LegacyNullToEmptyString] DOMString value;
readonly attribute unsigned long textLength;
readonly attribute boolean willValidate;
@@ -1269,7 +1269,7 @@ interface mixin CanvasFillStrokeStyles {
attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
- CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition);
+ CanvasPattern? createPattern(CanvasImageSource image, [LegacyNullToEmptyString] DOMString repetition);
};
@@ -1593,11 +1593,11 @@ dictionary DragEventInit : MouseEventInit {
LegacyUnenumerableNamedProperties]
interface Window : EventTarget {
// the current browsing context
- [Unforgeable] readonly attribute WindowProxy window;
+ [LegacyUnforgeable] readonly attribute WindowProxy window;
[Replaceable] readonly attribute WindowProxy self;
- [Unforgeable] readonly attribute Document document;
+ [LegacyUnforgeable] readonly attribute Document document;
attribute DOMString name;
- [PutForwards=href, Unforgeable] readonly attribute Location location;
+ [PutForwards=href, LegacyUnforgeable] readonly attribute Location location;
readonly attribute History history;
readonly attribute CustomElementRegistry customElements;
[Replaceable] readonly attribute BarProp locationbar;
@@ -1616,11 +1616,11 @@ interface Window : EventTarget {
// other browsing contexts
[Replaceable] readonly attribute WindowProxy frames;
[Replaceable] readonly attribute unsigned long length;
- [Unforgeable] readonly attribute WindowProxy? top;
+ [LegacyUnforgeable] readonly attribute WindowProxy? top;
attribute any opener;
[Replaceable] readonly attribute WindowProxy? parent;
readonly attribute Element? frameElement;
- WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = "");
+ WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = "");
getter object (DOMString name);
// Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic
// object on the prototype chain. Indeed, this does not make the global object an exotic object.
@@ -1668,21 +1668,21 @@ interface History {
[Exposed=Window]
interface Location { // but see also additional creation steps and overridden internal methods
- [Unforgeable] stringifier attribute USVString href;
- [Unforgeable] readonly attribute USVString origin;
- [Unforgeable] attribute USVString protocol;
- [Unforgeable] attribute USVString host;
- [Unforgeable] attribute USVString hostname;
- [Unforgeable] attribute USVString port;
- [Unforgeable] attribute USVString pathname;
- [Unforgeable] attribute USVString search;
- [Unforgeable] attribute USVString hash;
+ [LegacyUnforgeable] stringifier attribute USVString href;
+ [LegacyUnforgeable] readonly attribute USVString origin;
+ [LegacyUnforgeable] attribute USVString protocol;
+ [LegacyUnforgeable] attribute USVString host;
+ [LegacyUnforgeable] attribute USVString hostname;
+ [LegacyUnforgeable] attribute USVString port;
+ [LegacyUnforgeable] attribute USVString pathname;
+ [LegacyUnforgeable] attribute USVString search;
+ [LegacyUnforgeable] attribute USVString hash;
- [Unforgeable] void assign(USVString url);
- [Unforgeable] void replace(USVString url);
- [Unforgeable] void reload();
+ [LegacyUnforgeable] void assign(USVString url);
+ [LegacyUnforgeable] void replace(USVString url);
+ [LegacyUnforgeable] void reload();
- [Unforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins;
+ [LegacyUnforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins;
};
[Exposed=Window,
@@ -1787,15 +1787,15 @@ dictionary PromiseRejectionEventInit : EventInit {
any reason;
};
-[TreatNonObjectAsNull]
+[LegacyTreatNonObjectAsNull]
callback EventHandlerNonNull = any (Event event);
typedef EventHandlerNonNull? EventHandler;
-[TreatNonObjectAsNull]
+[LegacyTreatNonObjectAsNull]
callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error);
typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
-[TreatNonObjectAsNull]
+[LegacyTreatNonObjectAsNull]
callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event);
typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler;
@@ -1836,8 +1836,8 @@ interface mixin GlobalEventHandlers {
attribute EventHandler onloadedmetadata;
attribute EventHandler onloadstart;
attribute EventHandler onmousedown;
- [LenientThis] attribute EventHandler onmouseenter;
- [LenientThis] attribute EventHandler onmouseleave;
+ [LegacyLenientThis] attribute EventHandler onmouseenter;
+ [LegacyLenientThis] attribute EventHandler onmouseleave;
attribute EventHandler onmousemove;
attribute EventHandler onmouseout;
attribute EventHandler onmouseover;
@@ -1969,7 +1969,7 @@ interface mixin NavigatorLanguage {
};
interface mixin NavigatorContentUtils {
- [SecureContext] void registerProtocolHandler(DOMString scheme, USVString url, DOMString title);
+ [SecureContext] void registerProtocolHandler(DOMString scheme, USVString url);
[SecureContext] void unregisterProtocolHandler(DOMString scheme, USVString url);
};
@@ -2361,8 +2361,8 @@ interface HTMLFrameElement : HTMLElement {
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth;
};
partial interface HTMLAnchorElement {
@@ -2378,11 +2378,11 @@ partial interface HTMLAreaElement {
};
partial interface HTMLBodyElement {
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString text;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString link;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vLink;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString aLink;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString text;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString link;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString vLink;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString aLink;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
[CEReactions] attribute DOMString background;
};
@@ -2426,7 +2426,7 @@ partial interface HTMLEmbedElement {
interface HTMLFontElement : HTMLElement {
[HTMLConstructor] constructor();
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString color;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString color;
[CEReactions] attribute DOMString face;
[CEReactions] attribute DOMString size;
};
@@ -2453,8 +2453,8 @@ partial interface HTMLIFrameElement {
[CEReactions] attribute DOMString frameBorder;
[CEReactions] attribute USVString longDesc;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth;
};
partial interface HTMLImageElement {
@@ -2465,7 +2465,7 @@ partial interface HTMLImageElement {
[CEReactions] attribute unsigned long vspace;
[CEReactions] attribute USVString longDesc;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString border;
};
partial interface HTMLInputElement {
@@ -2506,7 +2506,7 @@ partial interface HTMLObjectElement {
[CEReactions] attribute DOMString codeBase;
[CEReactions] attribute DOMString codeType;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString border;
};
partial interface HTMLOListElement {
@@ -2544,9 +2544,9 @@ partial interface HTMLTableElement {
[CEReactions] attribute DOMString summary;
[CEReactions] attribute DOMString width;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellPadding;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellSpacing;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellPadding;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellSpacing;
};
partial interface HTMLTableSectionElement {
@@ -2567,7 +2567,7 @@ partial interface HTMLTableCellElement {
[CEReactions] attribute boolean noWrap;
[CEReactions] attribute DOMString vAlign;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
};
partial interface HTMLTableRowElement {
@@ -2576,7 +2576,7 @@ partial interface HTMLTableRowElement {
[CEReactions] attribute DOMString chOff;
[CEReactions] attribute DOMString vAlign;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
};
partial interface HTMLUListElement {
@@ -2585,11 +2585,11 @@ partial interface HTMLUListElement {
};
partial interface Document {
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString fgColor;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString linkColor;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vlinkColor;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString alinkColor;
- [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString fgColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString linkColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString vlinkColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString alinkColor;
+ [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
[SameObject] readonly attribute HTMLCollection anchors;
[SameObject] readonly attribute HTMLCollection applets;
diff --git a/tests/wpt/web-platform-tests/interfaces/pointerevents.idl b/tests/wpt/web-platform-tests/interfaces/pointerevents.idl
index 728fff98d91..8a42b5a8446 100644
--- a/tests/wpt/web-platform-tests/interfaces/pointerevents.idl
+++ b/tests/wpt/web-platform-tests/interfaces/pointerevents.idl
@@ -12,6 +12,8 @@ dictionary PointerEventInit : MouseEventInit {
long tiltX = 0;
long tiltY = 0;
long twist = 0;
+ double altitudeAngle = 0;
+ double azimuthAngle = 0;
DOMString pointerType = "";
boolean isPrimary = false;
sequence<PointerEvent> coalescedEvents = [];
@@ -29,6 +31,8 @@ interface PointerEvent : MouseEvent {
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
+ readonly attribute double altitudeAngle;
+ readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
index e3c2da8d2ab..24b76ad0fe6 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
@@ -28,17 +28,17 @@ enum RTCStatsType {
};
dictionary RTCRtpStreamStats : RTCStats {
- unsigned long ssrc;
- DOMString kind;
+ required unsigned long ssrc;
+ required DOMString kind;
DOMString transportId;
DOMString codecId;
};
dictionary RTCCodecStats : RTCStats {
- unsigned long payloadType;
+ required unsigned long payloadType;
RTCCodecType codecType;
- DOMString transportId;
- DOMString mimeType;
+ required DOMString transportId;
+ required DOMString mimeType;
unsigned long clockRate;
unsigned long channels;
DOMString sdpFmtpLine;
@@ -70,8 +70,7 @@ dictionary RTCReceivedRtpStreamStats : RTCRtpStreamStats {
};
dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
- DOMString trackId;
- DOMString receiverId;
+ required DOMString receiverId;
DOMString remoteId;
unsigned long framesDecoded;
unsigned long keyFramesDecoded;
@@ -131,7 +130,6 @@ dictionary RTCSentRtpStreamStats : RTCRtpStreamStats {
dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats {
unsigned long rtxSsrc;
- DOMString trackId;
DOMString mediaSourceId;
DOMString senderId;
DOMString remoteId;
@@ -187,8 +185,8 @@ dictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats {
};
dictionary RTCMediaSourceStats : RTCStats {
- DOMString trackIdentifier;
- DOMString kind;
+ required DOMString trackIdentifier;
+ required DOMString kind;
boolean relayedSource;
};
@@ -209,8 +207,8 @@ dictionary RTCVideoSourceStats : RTCMediaSourceStats {
};
dictionary RTCRtpContributingSourceStats : RTCStats {
- unsigned long contributorSsrc;
- DOMString inboundRtpStreamId;
+ required unsigned long contributorSsrc;
+ required DOMString inboundRtpStreamId;
unsigned long packetsContributedTo;
double audioLevel;
};
@@ -223,15 +221,15 @@ dictionary RTCPeerConnectionStats : RTCStats {
};
dictionary RTCRtpTransceiverStats : RTCStats {
- DOMString senderId;
- DOMString receiverId;
+ required DOMString senderId;
+ required DOMString receiverId;
DOMString mid;
};
dictionary RTCMediaHandlerStats : RTCStats {
DOMString trackIdentifier;
boolean ended;
- DOMString kind;
+ required DOMString kind;
};
dictionary RTCVideoHandlerStats : RTCMediaHandlerStats {
@@ -258,8 +256,8 @@ dictionary RTCDataChannelStats : RTCStats {
DOMString label;
DOMString protocol;
unsigned short dataChannelIdentifier;
- DOMString transportId;
- RTCDataChannelState state;
+ required DOMString transportId;
+ required RTCDataChannelState state;
unsigned long messagesSent;
unsigned long long bytesSent;
unsigned long messagesReceived;
@@ -274,7 +272,7 @@ dictionary RTCTransportStats : RTCStats {
DOMString rtcpTransportStatsId;
RTCIceRole iceRole;
DOMString iceLocalUsernameFragment;
- RTCDtlsTransportState dtlsState;
+ required RTCDtlsTransportState dtlsState;
RTCIceTransportState iceState;
DOMString selectedCandidatePairId;
DOMString localCertificateId;
@@ -295,21 +293,21 @@ dictionary RTCSctpTransportStats : RTCStats {
};
dictionary RTCIceCandidateStats : RTCStats {
- DOMString transportId;
+ required DOMString transportId;
DOMString? address;
long port;
DOMString protocol;
- RTCIceCandidateType candidateType;
+ required RTCIceCandidateType candidateType;
long priority;
DOMString url;
DOMString relayProtocol;
};
dictionary RTCIceCandidatePairStats : RTCStats {
- DOMString transportId;
- DOMString localCandidateId;
- DOMString remoteCandidateId;
- RTCStatsIceCandidatePairState state;
+ required DOMString transportId;
+ required DOMString localCandidateId;
+ required DOMString remoteCandidateId;
+ required RTCStatsIceCandidatePairState state;
boolean nominated;
unsigned long long packetsSent;
unsigned long long packetsReceived;
@@ -349,14 +347,14 @@ enum RTCStatsIceCandidatePairState {
};
dictionary RTCCertificateStats : RTCStats {
- DOMString fingerprint;
- DOMString fingerprintAlgorithm;
- DOMString base64Certificate;
+ required DOMString fingerprint;
+ required DOMString fingerprintAlgorithm;
+ required DOMString base64Certificate;
DOMString issuerCertificateId;
};
dictionary RTCIceServerStats : RTCStats {
- DOMString url;
+ required DOMString url;
long port;
DOMString protocol;
unsigned long totalRequestsSent;
diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl
index 5f5320c2055..2d83277526d 100644
--- a/tests/wpt/web-platform-tests/interfaces/webxr.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl
@@ -65,6 +65,7 @@ dictionary XRRenderStateInit {
double depthFar;
double inlineVerticalFieldOfView;
XRWebGLLayer? baseLayer;
+ sequence<XRLayer>? layers;
};
[SecureContext, Exposed=Window] interface XRRenderState {
@@ -172,6 +173,9 @@ interface XRInputSourceArray {
getter XRInputSource(unsigned long index);
};
+[SecureContext, Exposed=Window]
+interface XRLayer {};
+
typedef (WebGLRenderingContext or
WebGL2RenderingContext) XRWebGLRenderingContext;
@@ -185,7 +189,7 @@ dictionary XRWebGLLayerInit {
};
[SecureContext, Exposed=Window]
-interface XRWebGLLayer {
+interface XRWebGLLayer: XRLayer {
constructor(XRSession session,
XRWebGLRenderingContext context,
optional XRWebGLLayerInit layerInit = {});
diff --git a/tests/wpt/web-platform-tests/layout-instability/resources/util.js b/tests/wpt/web-platform-tests/layout-instability/resources/util.js
index 515914e11fa..2ef971ddb79 100644
--- a/tests/wpt/web-platform-tests/layout-instability/resources/util.js
+++ b/tests/wpt/web-platform-tests/layout-instability/resources/util.js
@@ -59,6 +59,7 @@ ScoreWatcher = function() {
resetPromise();
const observer = new PerformanceObserver(list => {
list.getEntries().forEach(entry => {
+ this.lastEntry = entry;
this.score += entry.value;
if (!entry.hadRecentInput)
this.scoreWithInputExclusion += entry.value;
diff --git a/tests/wpt/web-platform-tests/layout-instability/sources.html b/tests/wpt/web-platform-tests/layout-instability/sources.html
new file mode 100644
index 00000000000..599a5c471b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/layout-instability/sources.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>Layout Instability: sources attribute</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<style>
+
+body { margin: 10px; }
+#shifter { position: relative; width: 300px; height: 100px; }
+
+</style>
+<div id="shifter"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
+<script>
+
+strrect = r => `[${r.x},${r.y},${r.width},${r.height}]`;
+
+promise_test(async () => {
+ const watcher = new ScoreWatcher;
+ const shifter = document.querySelector("#shifter");
+
+ // Wait for the initial render to complete.
+ await waitForAnimationFrames(2);
+
+ // Modify the position of the div.
+ shifter.style = "top: 60px; left: 10px";
+ await watcher.promise;
+
+ const sources = watcher.lastEntry.sources;
+ assert_equals(sources.length, 1);
+
+ const source = sources[0];
+ assert_equals(source.node, shifter);
+ assert_equals(strrect(source.previousRect), "[10,10,300,100]");
+ assert_equals(strrect(source.currentRect), "[20,70,300,100]");
+}, "Sources attribute.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index 42102299396..726b64c56ac 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -756,3 +756,12 @@ TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-circul
TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-clip-path-crash.html
TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-defs-crash.html
TESTHARNESS-IN-OTHER-TYPE: svg/svg-in-svg/svg-in-svg-circular-filter-reference-crash.html
+
+# TODO: Temporary inclusions while we deprecate assert_precondition
+# https://github.com/web-platform-tests/wpt/issues/21971
+ASSERT-PRECONDITION: infrastructure/expected-fail/precondition.html
+ASSERT-PRECONDITION: infrastructure/expected-fail/precondition-in-setup.html
+ASSERT-PRECONDITION: infrastructure/expected-fail/precondition-in-promise.html
+ASSERT-PRECONDITION: resources/testharness.js
+ASSERT-PRECONDITION: webrtc/protocol/crypto-suite.https.html
+ASSERT-PRECONDITION: webrtc-extensions/RTCRtpSynchronizationSource-captureTimestamp.html
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html
index efb46073169..92512eef012 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html
@@ -15,18 +15,33 @@
<script src=/resources/testharnessreport.js></script>
<script>
"use strict";
+
//NOTE ALEX: for completion, a test for ondevicechange event is missing.
+
promise_test(async () => {
assert_not_equals(navigator.mediaDevices.enumerateDevices, undefined, "navigator.mediaDevices.enumerateDevices exists");
const deviceList = await navigator.mediaDevices.enumerateDevices();
for (const mediaInfo of deviceList) {
- assert_not_equals(mediaInfo.deviceId, undefined, "mediaInfo's deviceId should exist.");
- assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist.");
- assert_not_equals(mediaInfo.label, undefined, "mediaInfo's label should exist.");
- assert_not_equals(mediaInfo.groupId, undefined, "mediaInfo's groupId should exist.");
+ assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist.");
+ assert_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and be empty if getUserMedia was never called successfully.");
+ assert_equals(mediaInfo.label, "", "mediaInfo's label should exist and be empty if getUserMedia was never called successfully.");
+ assert_equals(mediaInfo.groupId, "", "mediaInfo's groupId should exist and be empty if getUserMedia was never called successfully.");
+ assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]);
+ }
+ assert_less_than_equal(deviceList.filter((item) => { return item.kind == "audioinput"; }).length, 1, "there should be zero or one audio input device ");
+ assert_less_than_equal(deviceList.filter((item) => { return item.kind == "videoinput"; }).length, 1, "there should be zero or one video input device ");
+
+}, "mediaDevices.enumerateDevices() is present and working - before capture");
+
+promise_test(async () => {
+ await navigator.mediaDevices.getUserMedia({ audio : true });
+ const deviceList = await navigator.mediaDevices.enumerateDevices();
+ for (const mediaInfo of deviceList) {
+ assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist.");
+ assert_not_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and not be empty.");
assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]);
}
-}, "mediaDevices.enumerateDevices() is present and working");
+}, "mediaDevices.enumerateDevices() is present and working - after capture");
promise_test(async () => {
const deviceList = await navigator.mediaDevices.enumerateDevices();
diff --git a/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js b/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js
index 567912ddd77..98b27fd9e38 100644
--- a/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js b/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js
index 504453b9aff..530a9058faa 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js b/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js
index 55cfed9276b..ba816bb87cf 100644
--- a/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js
+++ b/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
// https://w3c.github.io/deviceorientation/spec-source-orientation.html
diff --git a/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js b/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js
index c8ee8a326d1..d239c29b47e 100644
--- a/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js
+++ b/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js
@@ -1,6 +1,7 @@
// META: global=window,worker
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js b/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js
index 8cc2f83095c..7af89b6ddf2 100644
--- a/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js b/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js
index 878114ec7ed..dfb0190abac 100644
--- a/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js
+++ b/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js
@@ -2,6 +2,7 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js b/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js
index 53f36db7d9e..51c63aadefc 100644
--- a/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js
+++ b/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html b/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html
index cd192029df4..82036f9a617 100644
--- a/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html
+++ b/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>The unitless length quirk (no-quirks)</title>
+ <meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style> iframe { width:20px; height:20px; } </style>
diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js
index d01da49c2d5..a5e2ca0b25a 100644
--- a/tests/wpt/web-platform-tests/resources/idlharness.js
+++ b/tests/wpt/web-platform-tests/resources/idlharness.js
@@ -1333,7 +1333,8 @@ function IdlInterface(obj, is_callback, is_mixin)
/** An array of IdlInterfaceMembers. */
this.members = obj.members.map(function(m){return new IdlInterfaceMember(m); });
- if (this.has_extended_attribute("Unforgeable")) {
+ if (this.has_extended_attribute("Unforgeable") ||
+ this.has_extended_attribute("LegacyUnforgeable")) {
this.members
.filter(function(m) { return m.special !== "static" && (m.type == "attribute" || m.type == "operation"); })
.forEach(function(m) { return m.isUnforgeable = true; });
@@ -1795,11 +1796,12 @@ IdlInterface.prototype.test_self = function()
}.bind(this), this.name + " interface: legacy window alias");
}
- if (this.has_extended_attribute("NamedConstructor")) {
+ if (this.has_extended_attribute("NamedConstructor") ||
+ this.has_extended_attribute("LegacyFactoryFunction")) {
var constructors = this.extAttrs
- .filter(function(attr) { return attr.name == "NamedConstructor"; });
+ .filter(function(attr) { return attr.name == "NamedConstructor" || attr.name == "LegacyFactoryFunction"; });
if (constructors.length !== 1) {
- throw new IdlHarnessError("Internal error: missing support for multiple NamedConstructor extended attributes");
+ throw new IdlHarnessError("Internal error: missing support for multiple LegacyFactoryFunction extended attributes");
}
var constructor = constructors[0];
var min_length = minOverloadLength([constructor]);
@@ -1808,10 +1810,10 @@ IdlInterface.prototype.test_self = function()
{
// This function tests WebIDL as of 2019-01-14.
- // "for every [NamedConstructor] extended attribute on an exposed
+ // "for every [LegacyFactoryFunction] extended attribute on an exposed
// interface, a corresponding property must exist on the ECMAScript
// global object. The name of the property is the
- // [NamedConstructor]'s identifier, and its value is an object
+ // [LegacyFactoryFunction]'s identifier, and its value is an object
// called a named constructor, ... . The property has the attributes
// { [[Writable]]: true, [[Enumerable]]: false,
// [[Configurable]]: true }."
@@ -2371,7 +2373,8 @@ IdlInterface.prototype.test_member_attribute = function(member)
"The prototype object must have a property " +
format_value(member.name));
- if (!member.has_extended_attribute("LenientThis")) {
+ if (!member.has_extended_attribute("LenientThis") &&
+ !member.has_extended_attribute("LegacyLenientThis")) {
if (member.idlType.generic !== "Promise") {
// this.get_interface_object() returns a thing in our global
assert_throws_js(TypeError, function() {
@@ -3027,7 +3030,7 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_
// "The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
// true, [[Configurable]]: configurable }, where:
// "configurable is false if the attribute was declared with the
- // [Unforgeable] extended attribute and true otherwise;
+ // [LegacyUnforgeable] extended attribute and true otherwise;
// "G is the attribute getter, defined below; and
// "S is the attribute setter, also defined below."
var desc = Object.getOwnPropertyDescriptor(obj, member.name);
@@ -3036,7 +3039,7 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_
assert_true(desc.enumerable, "property should be enumerable");
if (member.isUnforgeable)
{
- assert_false(desc.configurable, "[Unforgeable] property must not be configurable");
+ assert_false(desc.configurable, "[LegacyUnforgeable] property must not be configurable");
}
else
{
@@ -3051,10 +3054,11 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_
// "If the attribute is a regular attribute, then:"
if (member.special !== "static") {
// "If O is not a platform object that implements I, then:
- // "If the attribute was specified with the [LenientThis] extended
+ // "If the attribute was specified with the [LegacyLenientThis] extended
// attribute, then return undefined.
// "Otherwise, throw a TypeError."
- if (!member.has_extended_attribute("LenientThis")) {
+ if (!member.has_extended_attribute("LenientThis") &&
+ !member.has_extended_attribute("LegacyLenientThis")) {
if (member.idlType.generic !== "Promise") {
assert_throws_js(globalOf(desc.get).TypeError, function() {
desc.get.call({});
@@ -3101,12 +3105,13 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_
// "If the attribute is a regular attribute, then:"
if (member.special !== "static") {
// "If /validThis/ is false and the attribute was not specified
- // with the [LenientThis] extended attribute, then throw a
+ // with the [LegacyLenientThis] extended attribute, then throw a
// TypeError."
// "If the attribute is declared with a [Replaceable] extended
// attribute, then: ..."
// "If validThis is false, then return."
- if (!member.has_extended_attribute("LenientThis")) {
+ if (!member.has_extended_attribute("LenientThis") &&
+ !member.has_extended_attribute("LegacyLenientThis")) {
assert_throws_js(globalOf(desc.set).TypeError, function() {
desc.set.call({});
}.bind(this), "calling setter on wrong object type must throw TypeError");
@@ -3146,7 +3151,8 @@ function IdlInterfaceMember(obj)
this.extAttrs = [];
}
- this.isUnforgeable = this.has_extended_attribute("Unforgeable");
+ this.isUnforgeable = this.has_extended_attribute("Unforgeable") ||
+ this.has_extended_attribute("LegacyUnforgeable");
this.isUnscopable = this.has_extended_attribute("Unscopable");
}
diff --git a/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html b/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html
index 1c7d9982285..064ab4c5f3a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html
@@ -89,6 +89,10 @@
endScrollOffset: {target: end, ...config.end }
});
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+
const animation = createScrollLinkedAnimation(t, timeline);
const scrollRange = end.offsetTop - start.offsetTop;
const timeRange = animation.timeline.timeRange;
@@ -100,11 +104,12 @@
"The start time is null in Idle state.");
animation.play();
+ assert_true(animation.pending, "Animation is in pending state.");
// Verify initial start and current times in Pending state.
assert_times_equal(animation.currentTime, 0,
- "The current time is a hold time in Pending state.");
- assert_equals(animation.startTime, null,
- "The start time is null in Pending state.");
+ "The current time is zero in Pending state.");
+ assert_equals(animation.startTime, 0,
+ "The start time is zero in Pending state.");
await animation.ready;
// Verify initial start and current times in Playing state.
diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html
new file mode 100644
index 00000000000..07dae95692e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test basic functionality of scroll linked animation.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<script src="testcommon.js"></script>
+<style>
+ .scroller {
+ overflow: auto;
+ height: 100px;
+ width: 100px;
+ }
+ .contents {
+ height: 1000px;
+ width: 100%;
+ }
+</style>
+<div id="log"></div>
+<script>
+ 'use strict';
+
+promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ // Make the scroll timeline inactive.
+ scroller.style.overflow = 'visible';
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ // Play the animation when the timeline is inactive.
+ animation.play();
+ assert_equals(animation.currentTime, null,
+ 'The current time is null when the timeline is inactive.');
+ assert_equals(animation.startTime, 0,
+ 'The start time is zero in Pending state.');
+ await waitForNextFrame();
+ assert_true(animation.pending,
+ 'Animation has play pending task while the timeline is inactive.');
+ assert_equals(animation.playState, 'running',
+ 'State is \'running\' in Pending state.');
+}, 'Play pending task doesn\'t run when the timeline is inactive.');
+
+promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ // Make the scroll timeline inactive.
+ scroller.style.overflow = 'visible';
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ // Play the animation when the timeline is inactive.
+ animation.play();
+
+ // Make the scroll timeline active.
+ scroller.style.overflow = 'auto';
+ await animation.ready;
+ // Ready promise is resolved as a result of the timeline becoming active.
+ assert_equals(animation.currentTime, 0,
+ 'Animation current time is resolved when the animation is ready.');
+ assert_equals(animation.startTime, 0,
+ 'Animation start time is resolved when the animation is ready.');
+}, 'Animation start and current times are correct if scroll timeline is ' +
+ 'activated after animation.play call.');
+
+promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const target = animation.effect.target;
+ // Advance the scroller.
+ scroller.scrollTop = 0.2 * maxScroll;
+
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ // Play the animation when the timeline is active.
+ animation.play();
+ await animation.ready;
+
+ // Make the scroll timeline inactive.
+ scroller.style.overflow = 'visible';
+ scroller.scrollTop;
+ await waitForNextFrame();
+ assert_equals(animation.playState, 'running',
+ 'State is \'running\' when the timeline is inactive.');
+ assert_equals(animation.currentTime, null,
+ 'Current time is unresolved when the timeline is inactive.');
+ assert_equals(animation.startTime, 0,
+ 'Start time is zero when the timeline is inactive.');
+ assert_equals(
+ animation.effect.getComputedTiming().localTime,
+ null,
+ 'Effect local time is null when the timeline is inactive.');
+ assert_equals(Number(getComputedStyle(target).opacity), 1,
+ 'Animation does not have an effect when the timeline is inactive.');
+
+ // Make the scroll timeline active.
+ scroller.style.overflow = 'auto';
+ await waitForNextFrame();
+
+ assert_equals(animation.playState, 'running',
+ 'State is \'running\' when the timeline is active.');
+ assert_equals(animation.currentTime, 200,
+ 'Current time is resolved when the timeline is active.');
+ assert_equals(animation.startTime, 0,
+ 'Start time is zero when the timeline is active.');
+ assert_times_equal(
+ animation.effect.getComputedTiming().localTime,
+ 200,
+ 'Effect local time is resolved when the timeline is active.');
+ assert_equals(Number(getComputedStyle(target).opacity), 0.2,
+ 'Animation has an effect when the timeline is active.');
+}, 'Animation current time is correct when the timeline becomes newly ' +
+ 'inactive and then active again.');
+
+promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ scroller.scrollTop;
+
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ animation.play();
+ await animation.ready;
+
+ // Make the scroll timeline inactive.
+ scroller.style.overflow = 'visible';
+ scroller.scrollTop;
+ await waitForNextFrame();
+
+ const eventWatcher = new EventWatcher(t, animation, 'cancel');
+ animation.cancel();
+ const cancelEvent = await eventWatcher.wait_for('cancel');
+
+ assert_equals(cancelEvent.currentTime, null,
+ 'event.currentTime should be unresolved when the timeline is inactive.');
+ assert_equals(cancelEvent.timelineTime, null,
+ 'event.timelineTime should be unresolved when the timeline is inactive');
+}, 'oncancel event is fired when the timeline is inactive.');
+
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html
index 901549e7a44..cb270d52f7c 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html
@@ -23,7 +23,10 @@
const animation = createScrollLinkedAnimation(t);
const scroller = animation.timeline.scrollSource;
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
- const timeRange = animation.timeline.timeRange;
+
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
// Verify initial start and current times in Idle state.
assert_equals(animation.currentTime, null,
@@ -31,11 +34,12 @@
assert_equals(animation.startTime, null,
"The start time is null in Idle state.");
animation.play();
+ assert_true(animation.pending, "Animation is in pending state.");
// Verify initial start and current times in Pending state.
assert_equals(animation.currentTime, 0,
- "The current time is a hold time in Pending state.");
- assert_equals(animation.startTime, null,
- "The start time is null in Pending state.");
+ "The current time is zero in Pending state.");
+ assert_equals(animation.startTime, 0,
+ "The start time is zero in Pending state.");
await animation.ready;
// Verify initial start and current times in Playing state.
@@ -62,7 +66,7 @@ promise_test(async t => {
const animation = createScrollLinkedAnimation(t);
const scroller = animation.timeline.scrollSource;
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
- const timeRange = animation.timeline.timeRange;
+
// Advance the scroller.
scroller.scrollTop = 0.2 * maxScroll;
// Wait for new animation frame which allows the timeline to compute new
@@ -78,8 +82,8 @@ promise_test(async t => {
// Verify initial start and current times in Pending state.
assert_equals(animation.currentTime, animation.timeline.currentTime,
"The current time is a hold time in Pending state.");
- assert_equals(animation.startTime, null,
- "The start time is null in Pending state.");
+ assert_equals(animation.startTime, 0,
+ "The start time is zero in Pending state.");
await animation.ready;
// Verify initial start and current times in Playing state.
@@ -96,7 +100,7 @@ promise_test(async t => {
const animation2 = createScrollLinkedAnimation(t, timeline);
const scroller = timeline.scrollSource;
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
- const timeRange = timeline.timeRange;
+
// Advance the scroller.
scroller.scrollTop = 0.2 * maxScroll;
// Wait for new animation frame which allows the timeline to compute new
@@ -118,13 +122,13 @@ promise_test(async t => {
assert_equals(animation1.currentTime, timeline.currentTime,
"The current time corresponds to the scroll position of the scroller" +
" in Pending state.");
- assert_equals(animation1.startTime, null,
- "The start time is null in Pending state.");
+ assert_equals(animation1.startTime, 0,
+ "The start time is zero in Pending state.");
assert_equals(animation2.currentTime, timeline.currentTime,
"The current time corresponds to the scroll position of the scroller" +
" in Pending state.");
- assert_equals(animation2.startTime, null,
- "The start time is null in Pending state.");
+ assert_equals(animation2.startTime, 0,
+ "The start time is zero in Pending state.");
await animation1.ready;
await animation2.ready;
@@ -143,30 +147,6 @@ promise_test(async t => {
promise_test(async t => {
const animation = createScrollLinkedAnimation(t);
const scroller = animation.timeline.scrollSource;
- // Make the scroll timeline inactive.
- scroller.style.overflow = "visible";
- // Trigger layout;
- scroller.scrollTop;
- assert_equals(animation.timeline.currentTime, null,
- "Timeline current time is null in inactive state.");
- // Play the animation when the timeline is inactive.
- animation.play();
- // Make the scroll timeline active.
- scroller.style.overflow = "auto";
- await animation.ready;
- // Ready promise is resolved as a result of the timeline becoming active.
- assert_equals(animation.timeline.currentTime, 0,
- "Timeline current time is resolved in active state.");
- assert_equals(animation.currentTime, 0,
- "Animation current time is resolved when the animation is ready.");
- assert_equals(animation.startTime, 0,
- "Animation start time is resolved when the animation is ready.");
-}, 'Animation start and current times are correct if scroll timeline is ' +
- 'activated after animation.play call.');
-
-promise_test(async t => {
- const animation = createScrollLinkedAnimation(t);
- const scroller = animation.timeline.scrollSource;
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
const timeRange = animation.timeline.timeRange;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html
index 0b7dcc60034..d46206d8257 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html
@@ -223,5 +223,71 @@
" source has been scrolled."
);
}, 'Set Animation current time then scroll.');
+
+ promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ animation.play();
+ await animation.ready;
+
+ // Make the timeline inactive.
+ scroller.style.overflow = 'visible';
+ scroller.scrollTop;
+ await waitForNextFrame();
+
+ assert_equals(animation.currentTime, null,
+ 'Current time is unresolved when the timeline is inactive.');
+
+ animation.currentTime = 300;
+ assert_equals(animation.currentTime, 300,
+ 'Animation current time should be equal to the set value.');
+ assert_equals(animation.playState, 'paused',
+ 'Animation play state is \'paused\' when current time is set and ' +
+ 'timeline is inactive.');
+}, 'Animation current time and play state are correct when current time is ' +
+ 'set while the timeline is inactive.');
+
+promise_test(async t => {
+ const animation = createScrollLinkedAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+
+ // Wait for new animation frame which allows the timeline to compute new
+ // current time.
+ await waitForNextFrame();
+ animation.play();
+ await animation.ready;
+
+ // Make the timeline inactive.
+ scroller.style.overflow = 'visible';
+ scroller.scrollTop;
+ await waitForNextFrame();
+
+ assert_equals(animation.timeline.currentTime, null,
+ 'Current time is unresolved when the timeline is inactive.');
+
+ animation.currentTime = 300;
+ assert_equals(animation.currentTime, 300,
+ 'Animation current time should be equal to the set value.');
+ assert_equals(animation.playState, 'paused',
+ 'Animation play state is \'paused\' when current time is set and ' +
+ 'timeline is inactive.');
+
+ // Make the timeline active.
+ scroller.style.overflow = 'auto';
+ scroller.scrollTop;
+ await waitForNextFrame();
+
+ assert_equals(animation.timeline.currentTime, 0,
+ 'Current time is resolved when the timeline is active.');
+ assert_equals(animation.currentTime, 300,
+ 'Animation current time holds the set value.');
+ assert_equals(animation.playState, 'paused',
+ 'Animation holds \'paused\' state.');
+}, 'Animation current time set while the timeline is inactive holds when the ' +
+ 'timeline becomes active again.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/testcommon.js b/tests/wpt/web-platform-tests/scroll-animations/testcommon.js
index 2a89d8e022f..733b5f9f643 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/testcommon.js
+++ b/tests/wpt/web-platform-tests/scroll-animations/testcommon.js
@@ -27,7 +27,7 @@ function createScrollLinkedAnimation(test, timeline) {
if (timeline === undefined)
timeline = createScrollTimeline(test);
const DURATION = 1000; // ms
- const KEYFRAMES = { opacity: [1, 0] };
+ const KEYFRAMES = { opacity: [0, 1] };
return new Animation(
new KeyframeEffect(createDiv(test), KEYFRAMES, DURATION), timeline);
}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py
new file mode 100644
index 00000000000..60688d94382
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py
@@ -0,0 +1,20 @@
+def main(request, response):
+ """
+ Returns a response with a Set-Cookie header based on the query params.
+ The body will be "1" if the cookie is present in the request and `drop` parameter is "0",
+ otherwise the body will be "0".
+ """
+ same_site = request.GET.first("same-site")
+ cookie_name = request.GET.first("cookie-name")
+ drop = request.GET.first("drop")
+ cookie_in_request = "0"
+ cookie = "%s=1; Secure; SameSite=%s" % (cookie_name, same_site)
+
+ if drop == "1":
+ cookie += "; Max-Age=0"
+
+ if request.cookies.get(cookie_name):
+ cookie_in_request = request.cookies[cookie_name].value
+
+ headers = [('Content-Type', 'text/html'), ('Set-Cookie', cookie)]
+ return (200, headers, cookie_in_request)
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js
new file mode 100644
index 00000000000..6e1ab232907
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js
@@ -0,0 +1,3 @@
+self.addEventListener('fetch', event => {
+ event.respondWith(event.preloadResponse);
+});
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html
new file mode 100644
index 00000000000..a860d954566
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>Navigation Preload: SameSite cookies</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/test-helpers.sub.js"></script>
+<body>
+<script>
+const scope = 'resources/cookie.py';
+const script = 'resources/navigation-preload-worker.js';
+
+async function drop_cookie(t, same_site, cookie) {
+ const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=1');
+ t.add_cleanup(() => frame.remove());
+}
+
+async function same_site_cookies_test(t, same_site, cookie) {
+ // Remove the cookie before the first visit.
+ await drop_cookie(t, same_site, cookie);
+
+ {
+ const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=0');
+ t.add_cleanup(() => frame.remove());
+ // The body will be 0 because this is the first visit.
+ assert_equals(frame.contentDocument.body.textContent, '0', 'first visit');
+ }
+
+ {
+ const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=0');
+ t.add_cleanup(() => frame.remove());
+ // The body will be 1 because this is the second visit.
+ assert_equals(frame.contentDocument.body.textContent, '1', 'second visit');
+ }
+
+ // Remove the cookie after the test.
+ t.add_cleanup(() => drop_cookie(t, same_site, cookie));
+}
+
+promise_test(async t => {
+ const registration =
+ await service_worker_unregister_and_register(t, script, scope);
+ promise_test(t => registration.unregister(), 'Unregister a service worker.');
+
+ await wait_for_state(t, registration.installing, 'activated');
+ await registration.navigationPreload.enable();
+}, 'Set up a service worker for navigation preload tests.');
+
+promise_test(async t => {
+ await same_site_cookies_test(t, 'None', 'cookie-key-none');
+}, 'Navigation Preload for same site cookies (None).');
+
+promise_test(async t => {
+ await same_site_cookies_test(t, 'Strict', 'cookie-key-strict');
+}, 'Navigation Preload for same site cookies (Strict).');
+
+promise_test(async t => {
+ await same_site_cookies_test(t, 'Lax', 'cookie-key-lax');
+}, 'Navigation Preload for same site cookies (Lax).');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html
new file mode 100644
index 00000000000..0acdeb812ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<title>Declarative Shadow DOM Element Attachment</title>
+<link rel='author' title='Mason Freed' href='mailto:masonfreed@chromium.org'>
+<link rel='help' href='https://github.com/whatwg/dom/issues/831'>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='../resources/shadow-dom-utils.js'></script>
+
+<script>
+const shadowContent = '<span>Shadow tree</span><slot></slot>';
+function getDeclarativeContent(mode, delegatesFocus) {
+ const delegatesFocusText = delegatesFocus ? ' shadowrootdelegatesfocus' : '';
+ return `<template shadowroot=${mode}${delegatesFocusText}>${shadowContent}</template>`;
+}
+
+const lightDomTextContent = 'Light DOM';
+function addDeclarativeShadowRoot(elementType, mode, delegatesFocus) {
+ const declarativeString = `<${elementType} id=theelement>${getDeclarativeContent(mode, delegatesFocus)}
+ <span class='lightdom'>${lightDomTextContent}</span></${elementType}>`;
+ const wrapper = document.createElement('div');
+ wrapper.innerHTML = declarativeString;
+ const element = wrapper.querySelector('#theelement');
+ return {wrapper: wrapper, element: element};
+}
+
+function testElementType(allowed, nochildren, elementType, mode, delegatesFocus) {
+ var t = test(function() {
+ const nodes = addDeclarativeShadowRoot(elementType, mode, delegatesFocus);
+ if (allowed) {
+ const element = nodes.element;
+ assert_true(!!element, 'Unable to locate the element');
+ // Just one light DOM child, and no leftover template.
+ assert_true(!nodes.wrapper.querySelector('template'));
+ assert_equals(element.children.length, 1);
+ assert_equals(element.children[0].textContent, lightDomTextContent);
+ let originalShadowRoot = null;
+ if (mode === 'open') {
+ // TODO(masonfreed): Add a check for ElementInternals.shadowRoot once that exists.
+ assert_true(!!element.shadowRoot, 'Shadow root should be present');
+ assert_equals(element.shadowRoot.innerHTML, shadowContent, 'Correct shadow content');
+ originalShadowRoot = element.shadowRoot;
+ }
+
+ // Now, call attachShadow() and make sure we get back the same (original) shadowRoot, but empty.
+ const oppositeMode = (mode === 'open') ? 'closed' : 'open';
+ const newShadow = element.attachShadow({mode: oppositeMode}); // Should be no exception here
+ if (mode === 'open') {
+ // TODO(masonfreed): Add a check for ElementInternals.shadowRoot once that exists.
+ assert_equals(element.shadowRoot, originalShadowRoot, 'The same shadow root should be returned');
+ assert_equals(element.shadowRoot.innerHTML, '', 'Empty shadow content');
+ assert_equals(element.shadowRoot.mode, mode, 'Original shadow mode');
+ }
+ } else {
+ const wrapper = nodes.wrapper;
+ if (!nochildren) {
+ // Invalid elements should retain a <template> element child with a shadowroot attribute.
+ const template = nodes.wrapper.querySelector('template[shadowroot]');
+ assert_true(!!template);
+ assert_equals(template.getAttribute('shadowroot'), mode, `Template with shadowroot=${mode} should be left over`);
+ const span = nodes.wrapper.querySelector('span.lightdom');
+ assert_true(!!span);
+ assert_equals(span.textContent, lightDomTextContent);
+ if (nodes.element) {
+ // For some tags (e.g. <html>) there won't be an element inside wrapper.
+ assert_true(!nodes.element.shadowRoot, 'Shadow root should not be present');
+ }
+ }
+ }
+ }, `Declarative Shadow DOM as a child of <${elementType}>, with mode=${mode}, delegatesFocus=${delegatesFocus}. Should be ${allowed ? 'safelisted' : 'disallowed'}.`);
+}
+
+function runAllTests() {
+ const noChildElements = ['iframe','noscript','script','select','style','textarea','title'];
+ const noCheck = ['body'];
+ const safelisted = ATTACHSHADOW_SAFELISTED_ELEMENTS.filter(el => !noCheck.includes(el));
+ const disallowed = ATTACHSHADOW_DISALLOWED_ELEMENTS.filter(el => !noCheck.includes(el));
+ const minimumKnownElements = 113; // We should have at least this many elements in the lists from shadow-dom-utils.js.
+ assert_true(safelisted.length + disallowed.length + noChildElements.length >= minimumKnownElements,'All element types should be tested');
+ for (let delegatesFocus of [false, true]) {
+ for (let mode of ['open', 'closed', 'invalid']) {
+ for (let elementName of safelisted) {
+ testElementType(mode !== 'invalid', false, elementName, mode, delegatesFocus);
+ }
+ for (let elementName of disallowed) {
+ testElementType(false, noChildElements.includes(elementName), elementName, mode, delegatesFocus);
+ }
+ }
+ }
+}
+
+runAllTests();
+
+</script>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-basic.tentative.html
index 792d4bf4b3e..c8a00f59bc8 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom.tentative.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-basic.tentative.html
@@ -113,5 +113,24 @@ test(() => {
assert_true(!!host.shadowRoot,"No shadow root found");
assert_false(host.shadowRoot.delegatesFocus,"delegatesFocus should be false without the shadowrootdelegatesfocus attribute");
}, 'Declarative Shadow DOM: delegates focus attribute');
+</script>
+
+<div id="multi-host">
+ <template shadowroot="open">
+ <span>root 1</span>
+ </template>
+ <template shadowroot="closed">
+ <span>root 2</span>
+ </template>
+</div>
+
+<script>
+test(() => {
+ const host = document.querySelector('#multi-host');
+ assert_equals(host.querySelector('template'), null, "No leftover template nodes from either root");
+ assert_true(!!host.shadowRoot,"No open shadow root found - first root should remain");
+ const innerSpan = host.shadowRoot.querySelector('span');
+ assert_equals(innerSpan.textContent, 'root 2', "Content should come from last declarative shadow root");
+}, 'Declarative Shadow DOM: Multiple roots');
</script>
diff --git a/tests/wpt/web-platform-tests/storage/idlharness.https.any.js b/tests/wpt/web-platform-tests/storage/idlharness.https.any.js
index 0ce4d5a0c8f..773fac4e4a8 100644
--- a/tests/wpt/web-platform-tests/storage/idlharness.https.any.js
+++ b/tests/wpt/web-platform-tests/storage/idlharness.https.any.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg b/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg
new file mode 100644
index 00000000000..c90cfb317f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml">
+ <title>Local URL reference on &#x3c;textPath&#x3e; with base URL different from document URL</title>
+ <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css"/>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/linking.html#linkRefAttrs"/>
+ <h:link rel="match" href="reference/green-100x100.svg"/>
+ <h:base href="http://www.example.com/"/>
+
+ <path id="path" d="M0,80h100"/>
+ <text font-size="100" font-family="Ahem" fill="green"><textPath href="#path">X</textPath></text>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py
index e8dfa6163e5..a5a8ca7db29 100755
--- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py
+++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py
@@ -174,13 +174,13 @@ def install_webkitgtk_from_apt_repository(channel):
run(["sudo", "apt-get", "-qqy", "-t", "bionic-wpt-webkit-updates", "install", "webkit2gtk-driver"])
-def download_url_to_descriptor(fd, url, max_retries=3):
+def download_url_to_descriptor(fd, url, max_retries=5):
"""Download an URL in chunks and saves it to a file descriptor (truncating it)
It doesn't close the descriptor, but flushes it on success.
It retries the download in case of ECONNRESET up to max_retries."""
if max_retries < 1:
max_retries = 1
- wait = 1
+ wait = 2
for current_retry in range(1, max_retries+1):
try:
print("INFO: Downloading %s Try %d/%d" % (url, current_retry, max_retries))
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
index 562239c31e3..d2d76df13a7 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
@@ -4,7 +4,7 @@ components:
workerType: ci
schedulerId: taskcluster-github
deadline: "24 hours"
- image: harjgam/web-platform-tests:0.34
+ image: webplatformtests/wpt:0.36
maxRunTime: 7200
artifacts:
public/results:
@@ -103,8 +103,6 @@ components:
env:
TOXENV: py36
PY_COLORS: 0
- install:
- - python3-pip
tox-python38:
env:
diff --git a/tests/wpt/web-platform-tests/tools/docker/Dockerfile b/tests/wpt/web-platform-tests/tools/docker/Dockerfile
index 0a842de1ab8..f3927fd0d71 100644
--- a/tests/wpt/web-platform-tests/tools/docker/Dockerfile
+++ b/tests/wpt/web-platform-tests/tools/docker/Dockerfile
@@ -25,6 +25,8 @@ RUN apt-get -qqy update \
pulseaudio \
python \
python-pip \
+ python3 \
+ python3-pip \
qemu-kvm \
tzdata \
sudo \
diff --git a/tests/wpt/web-platform-tests/tools/docker/README.md b/tests/wpt/web-platform-tests/tools/docker/README.md
index 8b0737359ea..9342aded298 100644
--- a/tests/wpt/web-platform-tests/tools/docker/README.md
+++ b/tests/wpt/web-platform-tests/tools/docker/README.md
@@ -1,11 +1,18 @@
This docker images is used for testing Chrome, Firefox, WebKitGTK and running
other tasks on Taskcluster. When any of the files in this directory change, the
-images must be updated as well. To do this, assuming you have docker installed:
+images must be updated as well. Doing this requires you be part of the
+'webplatformtests' organization on Docker Hub; ping @Hexcles or @stephenmcgruer
+if you are not a member.
+
+In this directory, run the following, where `<tag>` is of the form
+`webplatformtests/wpt:{current-version + 0.01}`:
-In this directory, run
```sh
# --pull forces Docker to get the newest base image.
docker build --pull -t <tag> .
docker push <tag>
```
+Then update the following Taskcluster configurations to use the new image:
+* `.taskcluster.yml` (the decision task)
+* `tools/ci/tc/tasks/test.yml` (all the other tasks)
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index 2cfd41e967e..1762049d198 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -392,7 +392,8 @@ regexps = [item() for item in # type: ignore
rules.MissingDepsRegexp,
rules.SpecialPowersRegexp,
rules.AssertThrowsRegexp,
- rules.PromiseRejectsRegexp]]
+ rules.PromiseRejectsRegexp,
+ rules.AssertPreconditionRegexp]]
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 b36681d092a..6fbdc1c360d 100644
--- a/tests/wpt/web-platform-tests/tools/lint/rules.py
+++ b/tests/wpt/web-platform-tests/tools/lint/rules.py
@@ -478,3 +478,11 @@ class PromiseRejectsRegexp(Regexp):
file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
description = "Test-file line has a `promise_rejects(...)` call"
to_fix = """Replace with promise_rejects_dom or promise_rejects_js or `promise_rejects_exactly`"""
+
+
+class AssertPreconditionRegexp(Regexp):
+ pattern = br"[^.]assert_precondition\("
+ name = "ASSERT-PRECONDITION"
+ file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
+ description = "Test-file line has an `assert_precondition(...)` call"
+ to_fix = """Replace with `assert_implements` or `assert_implements_optional`"""
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
index 62ed53865d7..086560b6a87 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
@@ -64,7 +64,9 @@ class ChromiumFormatter(base.BaseFormatter):
"""
if "artifacts" not in cur_dict.keys():
cur_dict["artifacts"] = {}
- cur_dict["artifacts"][artifact_name] = artifact_value
+ # Artifacts are all expected to be lists, so even though we only have a
+ # single |artifact_value| we still put it in a list.
+ cur_dict["artifacts"][artifact_name] = [artifact_value]
def _store_test_result(self, name, actual, expected, message, wpt_actual, subtest_failure):
"""
@@ -151,13 +153,15 @@ class ChromiumFormatter(base.BaseFormatter):
:return str: the expected statuses as a string
"""
expected_statuses = self._map_status_name(data["expected"]) if "expected" in data else actual_status
- if "known_intermittent" in data:
+ if data.get("known_intermittent"):
expected_statuses += " " + " ".join(
[self._map_status_name(other_status) for other_status in data["known_intermittent"]])
return expected_statuses
def suite_start(self, data):
- self.start_timestamp_seconds = (data["time"] if "time" in data
+ # |data| contains a timestamp in microseconds, while time.time() gives
+ # it in seconds.
+ self.start_timestamp_seconds = (float(data["time"]) / 1000 if "time" in data
else time.time())
def test_status(self, data):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
index cb6f1ad370f..2a5d3e79280 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
@@ -157,11 +157,11 @@ def test_subtest_messages(capfd):
output_json = json.load(output)
t1_artifacts = output_json["tests"]["t1"]["artifacts"]
- assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
- "[PASS] t1_b: t1_b_message\n"
- assert t1_artifacts["wpt_subtest_failure"] == "true"
+ assert t1_artifacts["log"] == ["[FAIL expected PASS] t1_a: t1_a_message\n"
+ "[PASS] t1_b: t1_b_message\n"]
+ assert t1_artifacts["wpt_subtest_failure"] == ["true"]
t2_artifacts = output_json["tests"]["t2"]["artifacts"]
- assert t2_artifacts["log"] == "[TIMEOUT expected PASS] t2_message\n"
+ assert t2_artifacts["log"] == ["[TIMEOUT expected PASS] t2_message\n"]
assert "wpt_subtest_failure" not in t2_artifacts.keys()
@@ -204,14 +204,14 @@ def test_subtest_failure(capfd):
test_obj = output_json["tests"]["t1"]
t1_artifacts = test_obj["artifacts"]
- assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
- "[PASS] t1_b: t1_b_message\n" \
- "[TIMEOUT expected PASS] t1_c: t1_c_message\n"
- assert t1_artifacts["wpt_subtest_failure"] == "true"
+ assert t1_artifacts["log"] == ["[FAIL expected PASS] t1_a: t1_a_message\n"
+ "[PASS] t1_b: t1_b_message\n"
+ "[TIMEOUT expected PASS] t1_c: t1_c_message\n"]
+ assert t1_artifacts["wpt_subtest_failure"] == ["true"]
# The status of the test in the output is a failure because subtests failed,
# despite the harness reporting that the test passed. But the harness status
# is logged as an artifact.
- assert t1_artifacts["wpt_actual_status"] == "PASS"
+ assert t1_artifacts["wpt_actual_status"] == ["PASS"]
assert test_obj["actual"] == "FAIL"
assert test_obj["expected"] == "PASS"
# Also ensure that the formatter cleaned up its internal state
@@ -258,9 +258,9 @@ def test_expected_subtest_failure(capfd):
test_obj = output_json["tests"]["t1"]
t1_log = test_obj["artifacts"]["log"]
- assert t1_log == "[FAIL] t1_a: t1_a_message\n" \
- "[PASS] t1_b: t1_b_message\n" \
- "[TIMEOUT] t1_c: t1_c_message\n"
+ assert t1_log == ["[FAIL] t1_a: t1_a_message\n"
+ "[PASS] t1_b: t1_b_message\n"
+ "[TIMEOUT] t1_c: t1_c_message\n"]
# The status of the test in the output is a pass because the subtest
# failures were all expected.
assert test_obj["actual"] == "PASS"
@@ -303,11 +303,11 @@ def test_unexpected_subtest_pass(capfd):
test_obj = output_json["tests"]["t1"]
t1_artifacts = test_obj["artifacts"]
- assert t1_artifacts["log"] == "[PASS expected FAIL] t1_a: t1_a_message\n"
- assert t1_artifacts["wpt_subtest_failure"] == "true"
+ assert t1_artifacts["log"] == ["[PASS expected FAIL] t1_a: t1_a_message\n"]
+ assert t1_artifacts["wpt_subtest_failure"] == ["true"]
# Since the subtest status is unexpected, we fail the test. But we report
# wpt_actual_status as an artifact
- assert t1_artifacts["wpt_actual_status"] == "PASS"
+ assert t1_artifacts["wpt_actual_status"] == ["PASS"]
assert test_obj["actual"] == "FAIL"
assert test_obj["expected"] == "PASS"
# Also ensure that the formatter cleaned up its internal state
@@ -482,7 +482,39 @@ def test_precondition_failed(capfd):
# The precondition failure should map to FAIL status, but we should also
# have an artifact containing the original PRECONDITION_FAILED status.
assert test_obj["actual"] == "FAIL"
- assert test_obj["artifacts"]["wpt_actual_status"] == "PRECONDITION_FAILED"
+ assert test_obj["artifacts"]["wpt_actual_status"] == ["PRECONDITION_FAILED"]
# ...this is an unexpected regression because we expected a pass but failed
assert test_obj["is_regression"] is True
assert test_obj["is_unexpected"] is True
+
+
+def test_known_intermittent_empty(capfd):
+ # If the known_intermittent list is empty, we want to ensure we don't append
+ # any extraneous characters to the output.
+
+ # set up the handler.
+ output = StringIO()
+ logger = structuredlog.StructuredLogger("test_a")
+ logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
+
+ # Run a test and include an empty known_intermittent list
+ logger.suite_start(["t1"], run_info={}, time=123)
+ logger.test_start("t1")
+ logger.test_end("t1", status="OK", expected="OK", known_intermittent=[])
+ logger.suite_end()
+
+ # check nothing got output to stdout/stderr
+ # (note that mozlog outputs exceptions during handling to stderr!)
+ captured = capfd.readouterr()
+ assert captured.out == ""
+ assert captured.err == ""
+
+ # check the actual output of the formatter
+ output.seek(0)
+ output_json = json.load(output)
+
+ test_obj = output_json["tests"]["t1"]
+ # Both actual and expected statuses get mapped to Pass. No extra whitespace
+ # anywhere.
+ assert test_obj["actual"] == "PASS"
+ assert test_obj["expected"] == "PASS"
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
index 1e27f90d91a..8f828ff43ab 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
@@ -349,6 +349,9 @@ class Test(object):
if implementation_status:
return implementation_status
+ # assuming no specific case, we are implementing it
+ return "implementing"
+
def known_intermittent(self, subtest=None):
metadata = self._get_metadata(subtest)
if metadata is None:
diff --git a/tests/wpt/web-platform-tests/vibration/idlharness.window.js b/tests/wpt/web-platform-tests/vibration/idlharness.window.js
index fbe14daa611..a3cfbc11e03 100644
--- a/tests/wpt/web-platform-tests/vibration/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/vibration/idlharness.window.js
@@ -1,5 +1,6 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js b/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js
new file mode 100644
index 00000000000..572db0c01b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js
@@ -0,0 +1,13 @@
+// META: global=jsshell
+
+test(() => {
+ assert_not_own_property(WebAssembly.CompileError.prototype, Symbol.toStringTag);
+}, "WebAssembly.CompileError");
+
+test(() => {
+ assert_not_own_property(WebAssembly.LinkError.prototype, Symbol.toStringTag);
+}, "WebAssembly.LinkError");
+
+test(() => {
+ assert_not_own_property(WebAssembly.RuntimeError.prototype, Symbol.toStringTag);
+}, "WebAssembly.RuntimeError");
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js
index ca025576c2b..5f64d72de9d 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js
@@ -5,3 +5,13 @@ test(() => {
const global = new WebAssembly.Global(argument);
assert_class_string(global, "WebAssembly.Global");
}, "Object.prototype.toString on an Global");
+
+test(() => {
+ assert_own_property(WebAssembly.Global.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WebAssembly.Global", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js
index ccd665eb285..701ec8f9bad 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js
@@ -7,3 +7,13 @@ test(() => {
const instance = new WebAssembly.Instance(module);
assert_class_string(instance, "WebAssembly.Instance");
}, "Object.prototype.toString on an Instance");
+
+test(() => {
+ assert_own_property(WebAssembly.Instance.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Instance.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WebAssembly.Instance", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js
index 4e15d75ea20..bb9081d1861 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js
@@ -5,3 +5,13 @@ test(() => {
const memory = new WebAssembly.Memory(argument);
assert_class_string(memory, "WebAssembly.Memory");
}, "Object.prototype.toString on an Memory");
+
+test(() => {
+ assert_own_property(WebAssembly.Memory.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Memory.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WebAssembly.Memory", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js
index 2db2002ffd2..7dd85a1c4ac 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js
@@ -6,3 +6,13 @@ test(() => {
const module = new WebAssembly.Module(emptyModuleBinary);
assert_class_string(module, "WebAssembly.Module");
}, "Object.prototype.toString on an Module");
+
+test(() => {
+ assert_own_property(WebAssembly.Module.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Module.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WebAssembly.Module", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html b/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html
new file mode 100644
index 00000000000..72931cca77c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>WebAssembly JS API: Default [[Prototype]] value is from NewTarget's Realm</title>
+<link rel="help" href="https://heycam.github.io/webidl/#internally-create-a-new-object-implementing-the-interface">
+<link rel="help" href="https://tc39.es/ecma262/#sec-nativeerror">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="wasm-module-builder.js"></script>
+<body>
+<iframe id="constructor-iframe" hidden></iframe>
+<iframe id="new-target-iframe" hidden></iframe>
+<iframe id="other-iframe" hidden></iframe>
+<script>
+"use strict";
+
+const constructorRealm = document.querySelector("#constructor-iframe").contentWindow;
+const newTargetRealm = document.querySelector("#new-target-iframe").contentWindow;
+const otherRealm = document.querySelector("#other-iframe").contentWindow;
+
+const emptyModuleBinary = new WasmModuleBuilder().toBuffer();
+const interfaces = [
+ ["Module", emptyModuleBinary],
+ ["Instance", new WebAssembly.Module(emptyModuleBinary)],
+ ["Memory", {initial: 0}],
+ ["Table", {element: "anyfunc", initial: 0}],
+ ["Global", {value: "i32"}],
+
+ // See step 2 of https://tc39.es/ecma262/#sec-nativeerror
+ ["CompileError"],
+ ["LinkError"],
+ ["RuntimeError"],
+];
+
+const primitives = [
+ undefined,
+ null,
+ false,
+ true,
+ 0,
+ -1,
+ "",
+ "str",
+ Symbol(),
+];
+
+const getNewTargets = function* (realm) {
+ for (const primitive of primitives) {
+ const newTarget = new realm.Function();
+ newTarget.prototype = primitive;
+ yield [newTarget, "cross-realm NewTarget with `" + format_value(primitive) + "` prototype"];
+ }
+
+ // GetFunctionRealm (https://tc39.es/ecma262/#sec-getfunctionrealm) coverage:
+ const bindOther = otherRealm.Function.prototype.bind;
+ const ProxyOther = otherRealm.Proxy;
+
+ const bound = new realm.Function();
+ bound.prototype = undefined;
+ yield [bindOther.call(bound), "bound cross-realm NewTarget with `undefined` prototype"];
+
+ const boundBound = new realm.Function();
+ boundBound.prototype = null;
+ yield [bindOther.call(bindOther.call(boundBound)), "bound bound cross-realm NewTarget with `null` prototype"];
+
+ const boundProxy = new realm.Function();
+ boundProxy.prototype = false;
+ yield [bindOther.call(new ProxyOther(boundProxy, {})), "bound Proxy of cross-realm NewTarget with `false` prototype"];
+
+ const proxy = new realm.Function();
+ proxy.prototype = true;
+ yield [new ProxyOther(proxy, {}), "Proxy of cross-realm NewTarget with `true` prototype"];
+
+ const proxyProxy = new realm.Function();
+ proxyProxy.prototype = -0;
+ yield [new ProxyOther(new ProxyOther(proxyProxy, {}), {}), "Proxy of Proxy of cross-realm NewTarget with `-0` prototype"];
+
+ const proxyBound = new realm.Function();
+ proxyBound.prototype = NaN;
+ yield [new ProxyOther(bindOther.call(proxyBound), {}), "Proxy of bound cross-realm NewTarget with `NaN` prototype"];
+};
+
+for (const [interfaceName, constructorArg] of interfaces) {
+ for (const [newTarget, testDescription] of getNewTargets(newTargetRealm)) {
+ test(() => {
+ const Constructor = constructorRealm.WebAssembly[interfaceName];
+ const object = Reflect.construct(Constructor, [constructorArg], newTarget);
+
+ const NewTargetConstructor = newTargetRealm.WebAssembly[interfaceName];
+ assert_true(object instanceof NewTargetConstructor);
+ assert_equals(Object.getPrototypeOf(object), NewTargetConstructor.prototype);
+ }, `WebAssembly.${interfaceName}: ${testDescription}`);
+ }
+}
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js
index e576477910a..708c17b3aca 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js
@@ -5,3 +5,13 @@ test(() => {
const table = new WebAssembly.Table(argument);
assert_class_string(table, "WebAssembly.Table");
}, "Object.prototype.toString on an Table");
+
+test(() => {
+ assert_own_property(WebAssembly.Table.prototype, Symbol.toStringTag);
+
+ const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Table.prototype, Symbol.toStringTag);
+ assert_equals(propDesc.value, "WebAssembly.Table", "value");
+ assert_equals(propDesc.configurable, true, "configurable");
+ assert_equals(propDesc.enumerable, false, "enumerable");
+ assert_equals(propDesc.writable, false, "writable");
+}, "@@toStringTag exists on the prototype with the appropriate descriptor");
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html
index fe7efe05aaf..c200f9e9773 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html
@@ -31,5 +31,25 @@ promise_test(t => {
});
}, 'reports true -> false when paused');
+promise_test(async t => {
+ const animation =
+ new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC),
+ null);
+ animation.play();
+ assert_true(animation.pending);
+ await waitForAnimationFrames(2);
+ assert_true(animation.pending);
+}, 'reports true -> true when played without a timeline');
+
+promise_test(async t => {
+ const animation =
+ new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC),
+ null);
+ animation.pause();
+ assert_true(animation.pending);
+ await waitForAnimationFrames(2);
+ assert_true(animation.pending);
+}, 'reports true -> true when paused without a timeline');
+
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html
index dd861750395..7e98ef4260f 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html
@@ -60,7 +60,7 @@ test(t => {
new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC),
null);
animation.startTime = document.timeline.currentTime;
- assert_equals(animation.playState, 'idle');
+ assert_equals(animation.playState, 'running');
animation.timeline = document.timeline;
@@ -73,7 +73,7 @@ test(t => {
new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC),
null);
animation.startTime = document.timeline.currentTime - 200 * MS_PER_SEC;
- assert_equals(animation.playState, 'idle');
+ assert_equals(animation.playState, 'running');
animation.timeline = document.timeline;
diff --git a/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js b/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js
index 1ad570370e5..2df7831c340 100644
--- a/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js
@@ -1,6 +1,7 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
// META: global=window,dedicatedworker,sharedworker,serviceworker
+// META: timeout=long
'use strict';
diff --git a/tests/wpt/web-platform-tests/hit-test/idlharness.https.html b/tests/wpt/web-platform-tests/webxr/hit-test/idlharness.https.html
index b7f67845470..b7f67845470 100644
--- a/tests/wpt/web-platform-tests/hit-test/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/webxr/hit-test/idlharness.https.html
diff --git a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html
index e47e7e7ceba..4e8ca34eebc 100644
--- a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html
+++ b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html
@@ -10,7 +10,7 @@
worker.onmessage = resolve;
});
- assert_equals(e.data.uaList, undefined);
+ assert_equals(e.data.brands, undefined);
assert_equals(e.data.mobile, undefined);
assert_equals(e.data.getHighEntropyValues, undefined);
}, "Test that userAgentData is not available in workers in non-secure contexts");
diff --git a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html
index 91a63966c01..c93cd1ed345 100644
--- a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html
+++ b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html
@@ -10,10 +10,10 @@
worker.onmessage = resolve;
});
- assert_equals(e.data.uaList.length, navigator.userAgentData.uaList.length);
- for (let i = 0; i < e.data.uaList.length; ++i) {
- const workerUA = e.data.uaList[i];
- const windowUA = navigator.userAgentData.uaList[i];
+ assert_equals(e.data.brands.length, navigator.userAgentData.brands.length);
+ for (let i = 0; i < e.data.brands.length; ++i) {
+ const workerUA = e.data.brands[i];
+ const windowUA = navigator.userAgentData.brands[i];
assert_equals(workerUA.brand, windowUA.brand);
assert_equals(workerUA.version, windowUA.version);
}
diff --git a/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html b/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html
index e7cb1c47623..343bfe289f3 100644
--- a/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html
+++ b/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html
@@ -24,7 +24,7 @@ promise_setup(async () => {
};
worker.onerror = () => resolve(false);
});
- assert_precondition(
+ assert_implements(
supportsModuleWorkers,
"Static import must be supported on module dedicated worker to run this test."
);
diff --git a/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js b/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js
index eec2f6884a1..88e994959b3 100644
--- a/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js
+++ b/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js
@@ -6,8 +6,8 @@
obj.userAgent = navigator.userAgent;
obj.onLine = navigator.onLine;
if (navigator.userAgentData) {
- obj.uaList = navigator.userAgentData.uaList;
- obj.mobile = navigator.userAgentData.mobile;
+ obj.brands = navigator.userAgentData.brands;
+ obj.mobile = navigator.userAgentData.mobile;
const highEntropyValues = await navigator.userAgentData.getHighEntropyValues(["platform", "platformVersion", "architecture", "model", "uaFullVersion"]);
obj.platform = highEntropyValues.platform;
obj.platformVersion = highEntropyValues.platformVersion;
diff --git a/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm b/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm
index 43bbe4b6d79..54d7eb550df 100644
--- a/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm
+++ b/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm
@@ -24,20 +24,20 @@
function redirect(code, name = code, method = "GET", body = null, explicitType = null, safelistContentType = false) {
async_test(t => {
- var client = new XMLHttpRequest()
+ let { body: expectedBody, type: expectedType } = extractBody(body);
+ if (explicitType !== null) {
+ expectedType = explicitType;
+ }
+ let expectedMethod = method;
+ if (((code === "301" || code === "302") && method === "POST") || (code === "303" && method !== "GET" && method !== "HEAD")) {
+ expectedMethod = "GET";
+ expectedBody = "";
+ expectedType = "NO";
+ }
+ const client = new XMLHttpRequest();
client.onreadystatechange = t.step_func(() => {
if (client.readyState === 4) {
- if (explicitType !== "application/x-pony" || safelistContentType) {
- let { body: expectedBody, type: expectedType } = extractBody(body);
- if (explicitType !== null) {
- expectedType = explicitType
- }
- let expectedMethod = method;
- if (((code === "301" || code === "302") && method === "POST") || code === "303") {
- expectedMethod = "GET";
- expectedBody = "";
- expectedType = "NO";
- }
+ if ((expectedMethod === "GET" && expectedType === "NO") || explicitType !== "application/x-pony" || safelistContentType) {
assert_equals(client.status, 200);
assert_equals(client.getResponseHeader("x-request-method"), expectedMethod);
assert_equals(client.getResponseHeader("x-request-content-type"), expectedType);
@@ -51,7 +51,7 @@
}
t.done();
}
- })
+ });
let safelist = "";
if (safelistContentType) {
safelist = "?safelist_content_type";
@@ -67,6 +67,7 @@
redirect("301")
redirect("301", "301 GET with explicit Content-Type", "GET", null, "application/x-pony")
redirect("301", "301 GET with explicit Content-Type safelisted", "GET", null, "application/x-pony", true)
+ redirect("303", "303 GET with explicit Content-Type safelisted", "GET", null, "application/x-pony", true)
redirect("302")
redirect("303")
redirect("302", "302 FOO with string and explicit Content-Type safelisted", "FOO", "test", "application/x-pony", true)
diff --git a/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini b/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini
index 4c7e8ccd177..2a86fa51b59 100644
--- a/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini
+++ b/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini
@@ -107,3 +107,6 @@
[WebGL test #52: attachment 7 should be 0,255,0,255\nat (4, 0) expected: 0,255,0,255 was 255,255,0,0]
expected: FAIL
+ [WebGL test #52: attachment 7 should be 0,255,0,255\nat (0, 0) expected: 0,255,0,255 was 0,0,255,255]
+ expected: FAIL
+