aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/file/File-constructor.html.ini3
-rw-r--r--tests/wpt/metadata/MANIFEST.json5974
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/digest/digest.https.worker.js.ini (renamed from tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini)3
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini275
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.https.worker.js.ini (renamed from tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini)128
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.https.worker.js.ini (renamed from tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini)3
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.https.worker.js.ini (renamed from tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini)3
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js.ini (renamed from tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini)3
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini5
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js.ini4
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini5
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-000.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-001.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-003.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-004.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-007.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-008.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-019.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-019.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-020.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-021.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/lang-selector-005.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/lang-selector-006.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/selectors/pseudo-006.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/at-charset-002.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/at-charset-003.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/at-charset-004.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/at-charset-005.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/at-charset-006.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/comments-005.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/content-type-000.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/ident-003.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/syntax/ident-020.xht.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/caption-side-applies-to-007.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-001.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-003.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-004.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-007.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-009.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/row-visibility-001.xht.ini2
-rw-r--r--tests/wpt/metadata/css/CSS2/tables/row-visibility-002.xht.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-heights-000.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-heights-001.html.ini8
-rw-r--r--tests/wpt/metadata/css/css-flexbox/position-absolute-001.html.ini90
-rw-r--r--tests/wpt/metadata/css/css-flexbox/position-absolute-002.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-values/lh-rlh-on-root-001.html.ini13
-rw-r--r--tests/wpt/metadata/css/css-values/lh-unit-001.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-values/lh-unit-002.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/security/redirect-to-url-with-credentials.https.html.ini4
-rw-r--r--tests/wpt/metadata/html/dom/usvstring-reflection.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html.ini7
-rw-r--r--tests/wpt/metadata/mozilla-sync4
-rw-r--r--tests/wpt/metadata/performance-timeline/po-takeRecords.html.ini4
-rw-r--r--tests/wpt/web-platform-tests/.travis.yml2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/common.js3
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html1
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html1
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/file/File-constructor.html4
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/url/sandboxed-iframe.html5
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/url/url-format.any.js2
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.html40
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.html2
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.worker.js)2
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html1
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer_insecure_context.html3
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer_onerror-manual.https.html1
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-common.sub.js8
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js26
-rw-r--r--tests/wpt/web-platform-tests/beacon/resources/beacon.py72
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/README.md36
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.html27
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.html41
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/generate.py189
-rwxr-xr-xtests/wpt/web-platform-tests/bluetooth/generate_test.py56
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/idl/idl-Bluetooth.html4
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/idl/idl-NavigatorBluetooth.html3
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html13
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html15
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template10
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/characteristic-is-removed.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/descriptor-get-same-object.js32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-before.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-error.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-success.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-invalidates-objects.js39
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnected-device.js20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-service-not-found.js16
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-error.js25
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-success.js24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-different-service-after-reconnection.js35
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-same-object.js33
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/invalid-service-name.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-absent-service.js23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-for-any-service.js17
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-present-service.js22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/script-tests/server/service-not-found.js16
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html18
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html22
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html44
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html28
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html46
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html26
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html32
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html31
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html42
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html40
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html30
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html24
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html29
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html23
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html36
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html20
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html74
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html77
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html18
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/form-action/form-action-self-allowed-target-blank.html39
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-allowed.html23
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-blocked.html23
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html25
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-blocked.html30
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/checkReport.sub.js51
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/postmessage-pass-to-opener.html3
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/prefetch-helper.js65
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css3
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/report.py70
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-003.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-004.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-005.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-006.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-007.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-008.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-009.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-010.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-011.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-003.xht7
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-004.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-008.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-019.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-017.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-019.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-020.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-021.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-selector-010.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/id-selector-002.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-006.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-006.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-007.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/comments-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/ident-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/ident-020.xht27
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/.htaccess40
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-001.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-002.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-003.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-004.css4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-005.css4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-006.css4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/support/plaintext.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-005.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-007.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-009.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-010.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-011.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-012.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-013.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-014.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-015.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-004.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-007.xht10
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-008.xht10
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-009.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-001.xht7
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-002.xht7
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/table-cell-001.xht7
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/element-replacement-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/element-replacement.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/resources/rect.svg3
-rw-r--r--tests/wpt/web-platform-tests/css/css-display/display-contents-text-inherit-002.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-03.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-04.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-06.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-07.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-08.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-09.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-10.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-11.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-12.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-13.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-14.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-15.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-16.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-17.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-18.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-001.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-002.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-003.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-004.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-005.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-006.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-007.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-008.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-009.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-010.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-011.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-012.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-013.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-014.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-015.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-016.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-017.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-018.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-019.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-020.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-021.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-022.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-023.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-024.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-025.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-026.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-027.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-028.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-029.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-030.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-031.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-032.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-033.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-034.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-035.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-036.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/support/style-change.js (renamed from tests/wpt/web-platform-tests/css/css-grid/support/style-change.js)2
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-invalid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html64
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-invalid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-valid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-valid.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/resources/parsing-testcommon.js39
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001-ref.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001.xht44
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image-ref.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/resources/html5.pngbin0 -> 1302 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-scoping/css-scoping-shadow-nested-slot-display-override.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/resources/parsing-testcommon.js39
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-invalid.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-valid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-invalid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-valid.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-invalid.html52
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-valid.html66
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/resources/1x1-green.pngbin0 -> 135 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/resources/testhelper.js146
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html49
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html175
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssPositionValue.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html115
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html55
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html71
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/get.tentative.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/has.tentative.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/append.tentative.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/get.tentative.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/has.tentative.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/test.tentative.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html88
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/get.tentative.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/has.tentative.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html88
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/lh-rlh-on-root-001.html86
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/lh-unit-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-values/lh-unit-002.html26
-rw-r--r--tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box.html18
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html25
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html25
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html36
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list4
-rw-r--r--tests/wpt/web-platform-tests/docs/_running-tests/chrome_android.md35
-rw-r--r--tests/wpt/web-platform-tests/fetch/security/redirect-to-url-with-credentials.https.html69
-rw-r--r--tests/wpt/web-platform-tests/gamepad/idlharness-manual.html80
-rw-r--r--tests/wpt/web-platform-tests/gamepad/idlharness.html66
-rw-r--r--tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js82
-rw-r--r--tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html10
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html9
-rw-r--r--tests/wpt/web-platform-tests/html/dom/usvstring-reflection.html9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py10
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt14
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html14
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html4
-rw-r--r--tests/wpt/web-platform-tests/images/pattern.mp4bin0 -> 1528 bytes
-rw-r--r--tests/wpt/web-platform-tests/interfaces/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/WebCryptoAPI.idl (renamed from tests/wpt/web-platform-tests/WebCryptoAPI/WebCryptoAPI.idl)0
-rw-r--r--tests/wpt/web-platform-tests/interfaces/gamepad.idl33
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/proximity.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webxr.idl180
-rw-r--r--tests/wpt/web-platform-tests/interfaces/xhr.idl91
-rw-r--r--tests/wpt/web-platform-tests/keyboard-lock/idlharness.https.html6
-rw-r--r--tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html (renamed from tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html)8
-rw-r--r--tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html (renamed from tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html)6
-rw-r--r--tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock.https.html (renamed from tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock.https.html)4
-rw-r--r--tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardUnlock.https.html (renamed from tests/wpt/web-platform-tests/keyboard-lock/navigator-cancelKeyboardLock.https.html)4
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist1
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html1
-rwxr-xr-xtests/wpt/web-platform-tests/media-source/generate-config-change-tests.py226
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-config-changes.js9
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-play.html12
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html1
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html4
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html37
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-takeRecords.html39
-rw-r--r--tests/wpt/web-platform-tests/pointerlock/movementX_Y_basic-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html2
-rw-r--r--tests/wpt/web-platform-tests/proximity/idlharness.html77
-rw-r--r--tests/wpt/web-platform-tests/proximity/idlharness.https.html37
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html24
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_dedicated_worker.html28
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html24
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_frame_initiator_type.html37
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_ignore_data_url.html33
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_ignore_failures.html33
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_initiator_types.html109
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_memory_cached.sub.html84
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_redirects.html53
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_reparenting.html53
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resource_script_types.html72
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/all_resource_types.htm49
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/blank_page_green.htm10
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/empty_script.js0
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/green_frame.htm7
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/nested.css10
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/worker_with_images.js21
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js26
-rw-r--r--tests/wpt/web-platform-tests/resources/check-layout-th.js1
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js23
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/server-timing/server_timing_header-parsing.html38
-rw-r--r--tests/wpt/web-platform-tests/server-timing/test_server_timing.html1
-rw-r--r--tests/wpt/web-platform-tests/svg/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/svg/extensibility/foreignObject/properties.svg15
-rw-r--r--tests/wpt/web-platform-tests/svg/path/closepath/segment-completing-ref.svg10
-rw-r--r--tests/wpt/web-platform-tests/svg/path/closepath/segment-completing.svg16
-rw-r--r--tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive-ref.svg32
-rw-r--r--tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive.svg39
-rw-r--r--tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero-ref.svg26
-rw-r--r--tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero.svg39
-rw-r--r--tests/wpt/web-platform-tests/svg/path/error-handling/bounding.svg33
-rw-r--r--tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error-ref.svg13
-rw-r--r--tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error.svg25
-rw-r--r--tests/wpt/web-platform-tests/svg/path/interfaces/SVGAnimatedPathData-removed.svg24
-rw-r--r--tests/wpt/web-platform-tests/svg/types/elements/SVGGeometryElement-rect.svg28
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/check_stability.py5
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh1
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/XMLParser.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/manifest.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/runner/report.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/sslutils/base.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini30
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/protocol.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/servo.py18
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py58
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/install.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/markdown.py15
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py23
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_stability.py7
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py16
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tox.ini41
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/utils.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/virtualenv.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/MANIFEST.in1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/README.rst2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/docs/conf.py22
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/docs/usage.rst2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/setup.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/test/test.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/tox.ini39
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/b2g_setup/certtest_app.zipbin1237 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py98
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/stability.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_hosts.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/__init__.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/tree.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/vcs.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py20
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py57
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py69
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py11
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py7
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py29
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade.sub.https.html64
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html19
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html19
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html11
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html16
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html16
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html17
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html17
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html31
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html10
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/dummy.html1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html5
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html5
-rw-r--r--tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html3
-rw-r--r--tests/wpt/web-platform-tests/visual-viewport/viewport-resize-event-on-load-overflowing-page.html12
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/support/create.py4
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html403
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize.html10
-rw-r--r--tests/wpt/web-platform-tests/webxr/interfaces.https.html25
-rw-r--r--tests/wpt/web-platform-tests/worklets/layout-worklet-credentials.https.html15
-rw-r--r--tests/wpt/web-platform-tests/worklets/layout-worklet-csp.https.html15
-rw-r--r--tests/wpt/web-platform-tests/worklets/layout-worklet-import.https.html15
-rw-r--r--tests/wpt/web-platform-tests/worklets/layout-worklet-referrer.https.html15
-rw-r--r--tests/wpt/web-platform-tests/worklets/layout-worklet-service-worker-interception.https.html15
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/worklet-test-utils.js6
-rw-r--r--tests/wpt/web-platform-tests/xhr/interfaces.html116
-rw-r--r--tests/wpt/web-platform-tests/xhr/xmlhttprequest-sync-default-feature-policy.sub.html3
832 files changed, 16018 insertions, 2641 deletions
diff --git a/tests/wpt/metadata/FileAPI/file/File-constructor.html.ini b/tests/wpt/metadata/FileAPI/file/File-constructor.html.ini
index 3e76435960d..a812f00415f 100644
--- a/tests/wpt/metadata/FileAPI/file/File-constructor.html.ini
+++ b/tests/wpt/metadata/FileAPI/file/File-constructor.html.ini
@@ -18,6 +18,3 @@
[Invalid bits argument: "hello"]
expected: FAIL
- [Using object fileName]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 1e5937ddc0c..29e8265a446 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -79733,6 +79733,54 @@
{}
]
],
+ "css/CSS2/selectors/class-selector-009.xht": [
+ [
+ "/css/CSS2/selectors/class-selector-009.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-green-background.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/class-selector-010.xht": [
+ [
+ "/css/CSS2/selectors/class-selector-010.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-green-background.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/class-selector-011.xht": [
+ [
+ "/css/CSS2/selectors/class-selector-011.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-green-background.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/class-selector-012.xht": [
+ [
+ "/css/CSS2/selectors/class-selector-012.xht",
+ [
+ [
+ "/css/CSS2/selectors/class-selector-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/combinator-001.xht": [
[
"/css/CSS2/selectors/combinator-001.xht",
@@ -79973,6 +80021,42 @@
{}
]
],
+ "css/CSS2/selectors/first-child-selector-001.xht": [
+ [
+ "/css/CSS2/selectors/first-child-selector-001.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-child-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-child-selector-002.xht": [
+ [
+ "/css/CSS2/selectors/first-child-selector-002.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-child-selector-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-child-selector-003.xht": [
+ [
+ "/css/CSS2/selectors/first-child-selector-003.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-this-text-should-be-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/first-letter-001.xht": [
[
"/css/CSS2/selectors/first-letter-001.xht",
@@ -85073,6 +85157,114 @@
{}
]
],
+ "css/CSS2/selectors/first-letter-selector-000.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-000.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-001.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-002.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-002.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-003.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-003.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-004.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-004.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-005.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-005.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-007.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-007.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-008.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-008.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-019.xht": [
+ [
+ "/css/CSS2/selectors/first-letter-selector-019.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/first-letter-selector-028.xht": [
[
"/css/CSS2/selectors/first-letter-selector-028.xht",
@@ -85253,6 +85445,54 @@
{}
]
],
+ "css/CSS2/selectors/first-line-pseudo-019.xht": [
+ [
+ "/css/CSS2/selectors/first-line-pseudo-019.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-this-text-should-be-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-line-pseudo-020.xht": [
+ [
+ "/css/CSS2/selectors/first-line-pseudo-020.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-this-text-should-be-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-line-pseudo-021.xht": [
+ [
+ "/css/CSS2/selectors/first-line-pseudo-021.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-this-text-should-be-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-line-selector-010.xht": [
+ [
+ "/css/CSS2/selectors/first-line-selector-010.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/first-line-selector-013.xht": [
[
"/css/CSS2/selectors/first-line-selector-013.xht",
@@ -85305,6 +85545,18 @@
{}
]
],
+ "css/CSS2/selectors/id-selector-002.xht": [
+ [
+ "/css/CSS2/selectors/id-selector-002.xht",
+ [
+ [
+ "/css/CSS2/reference/filler-text-below-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/id-selector-004.xht": [
[
"/css/CSS2/selectors/id-selector-004.xht",
@@ -85377,6 +85629,42 @@
{}
]
],
+ "css/CSS2/selectors/lang-selector-004.xht": [
+ [
+ "/css/CSS2/selectors/lang-selector-004.xht",
+ [
+ [
+ "/css/CSS2/selectors/lang-selector-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/lang-selector-005.xht": [
+ [
+ "/css/CSS2/selectors/lang-selector-005.xht",
+ [
+ [
+ "/css/CSS2/reference/filler-text-below-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/lang-selector-006.xht": [
+ [
+ "/css/CSS2/selectors/lang-selector-006.xht",
+ [
+ [
+ "/css/CSS2/reference/filler-text-below-green.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/pseudo-001.xht": [
[
"/css/CSS2/selectors/pseudo-001.xht",
@@ -85401,6 +85689,42 @@
{}
]
],
+ "css/CSS2/selectors/pseudo-006.xht": [
+ [
+ "/css/CSS2/selectors/pseudo-006.xht",
+ [
+ [
+ "/css/CSS2/selectors/first-letter-selector-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/pseudo-007.xht": [
+ [
+ "/css/CSS2/selectors/pseudo-007.xht",
+ [
+ [
+ "/css/CSS2/selectors/universal-selector-002-ref.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/pseudo-008.xht": [
+ [
+ "/css/CSS2/selectors/pseudo-008.xht",
+ [
+ [
+ "/css/CSS2/selectors/pseudo-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/selectors/pseudo-014.xht": [
[
"/css/CSS2/selectors/pseudo-014.xht",
@@ -87910,7 +88234,7 @@
"/css/CSS2/syntax/ident-003.xht",
[
[
- "/css/CSS2/syntax/ident-000-ref.xht",
+ "/css/CSS2/syntax/ident-003-ref.xht",
"=="
]
],
@@ -88109,18 +88433,6 @@
{}
]
],
- "css/CSS2/syntax/ident-020.xht": [
- [
- "/css/CSS2/syntax/ident-020.xht",
- [
- [
- "/css/CSS2/syntax/ident-000-ref.xht",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/CSS2/syntax/ignored-rules-001.xht": [
[
"/css/CSS2/syntax/ignored-rules-001.xht",
@@ -89249,6 +89561,174 @@
{}
]
],
+ "css/CSS2/tables/caption-side-applies-to-001.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-001.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-002.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-002.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-003.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-003.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-005.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-005.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-006.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-006.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-007.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-007.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-008.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-009.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-009.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-010.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-010.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-011.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-011.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-012.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-012.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-013.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-013.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-014.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-014.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-015.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-015.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/caption-side-applies-to-016.xht": [
[
"/css/CSS2/tables/caption-side-applies-to-016.xht",
@@ -89261,6 +89741,90 @@
{}
]
],
+ "css/CSS2/tables/caption-side-applies-to-017.xht": [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-017.xht",
+ [
+ [
+ "/css/CSS2/tables/caption-side-applies-to-017-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-001.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-001.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-003.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-003.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-004.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-004.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-007.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-007.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-008.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-008.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-009.xht": [
+ [
+ "/css/CSS2/tables/collapsing-border-model-009.xht",
+ [
+ [
+ "/css/CSS2/tables/collapsing-border-model-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/collapsing-border-model-010a.xht": [
[
"/css/CSS2/tables/collapsing-border-model-010a.xht",
@@ -90377,6 +90941,30 @@
{}
]
],
+ "css/CSS2/tables/row-visibility-001.xht": [
+ [
+ "/css/CSS2/tables/row-visibility-001.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/CSS2/tables/row-visibility-002.xht": [
+ [
+ "/css/CSS2/tables/row-visibility-002.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/separated-border-model-003a.xht": [
[
"/css/CSS2/tables/separated-border-model-003a.xht",
@@ -92593,6 +93181,18 @@
{}
]
],
+ "css/CSS2/tables/table-cell-001.xht": [
+ [
+ "/css/CSS2/tables/table-cell-001.xht",
+ [
+ [
+ "/css/CSS2/reference/ref-filled-black-96px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/table-column-rendering-001.xht": [
[
"/css/CSS2/tables/table-column-rendering-001.xht",
@@ -104481,6 +105081,18 @@
{}
]
],
+ "css/css-content/element-replacement.html": [
+ [
+ "/css/css-content/element-replacement.html",
+ [
+ [
+ "/css/css-content/element-replacement-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-display/display-contents-alignment-001.html": [
[
"/css/css-display/display-contents-alignment-001.html",
@@ -105081,6 +105693,18 @@
{}
]
],
+ "css/css-display/display-contents-text-inherit-002.html": [
+ [
+ "/css/css-display/display-contents-text-inherit-002.html",
+ [
+ [
+ "/css/css-display/display-contents-text-inherit-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-display/display-contents-text-inherit.html": [
[
"/css/css-display/display-contents-text-inherit.html",
@@ -123177,6 +123801,18 @@
{}
]
],
+ "css/css-scoping/css-scoping-shadow-nested-slot-display-override.html": [
+ [
+ "/css/css-scoping/css-scoping-shadow-nested-slot-display-override.html",
+ [
+ [
+ "/css/css-scoping/reference/green-box.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-scoping/css-scoping-shadow-root-hides-children.html": [
[
"/css/css-scoping/css-scoping-shadow-root-hides-children.html",
@@ -146809,6 +147445,30 @@
{}
]
],
+ "css/css-values/lh-unit-001.html": [
+ [
+ "/css/css-values/lh-unit-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-values/lh-unit-002.html": [
+ [
+ "/css/css-values/lh-unit-002.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-values/vh-calc-support-pct.html": [
[
"/css/css-values/vh-calc-support-pct.html",
@@ -158769,6 +159429,18 @@
{}
]
],
+ "css/motion/offset-anchor-transform-box-fill-box.html": [
+ [
+ "/css/motion/offset-anchor-transform-box-fill-box.html",
+ [
+ [
+ "/css/motion/offset-anchor-transform-box-fill-box-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/motion/offset-path-ray.html": [
[
"/css/motion/offset-path-ray.html",
@@ -163197,6 +163869,30 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html": [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html",
+ [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html": [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html",
+ [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/fonts3/font-size-adjust-zero-1.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/fonts3/font-size-adjust-zero-1.html",
@@ -175941,6 +176637,30 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html",
+ [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html",
+ [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-audio-element/audio_001.htm": [
[
"/html/semantics/embedded-content/the-audio-element/audio_001.htm",
@@ -177561,6 +178281,54 @@
{}
]
],
+ "svg/path/closepath/segment-completing.svg": [
+ [
+ "/svg/path/closepath/segment-completing.svg",
+ [
+ [
+ "/svg/path/closepath/segment-completing-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "svg/path/distance/pathLength-positive.svg": [
+ [
+ "/svg/path/distance/pathLength-positive.svg",
+ [
+ [
+ "/svg/path/distance/pathLength-positive-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "svg/path/distance/pathLength-zero.svg": [
+ [
+ "/svg/path/distance/pathLength-zero.svg",
+ [
+ [
+ "/svg/path/distance/pathLength-zero-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "svg/path/error-handling/render-until-error.svg": [
+ [
+ "/svg/path/error-handling/render-until-error.svg",
+ [
+ [
+ "/svg/path/error-handling/render-until-error-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"svg/path/property/priority.svg": [
[
"/svg/path/property/priority.svg",
@@ -183003,11 +183771,6 @@
{}
]
],
- "WebCryptoAPI/WebCryptoAPI.idl": [
- [
- {}
- ]
- ],
"WebCryptoAPI/derive_bits_keys/ecdh_bits.js": [
[
{}
@@ -186388,6 +187151,16 @@
{}
]
],
+ "bluetooth/generate.py": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/generate_test.py": [
+ [
+ {}
+ ]
+ ],
"bluetooth/resources/bluetooth-helpers.js": [
[
{}
@@ -186398,6 +187171,101 @@
{}
]
],
+ "bluetooth/script-tests/base_test_html.template": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/characteristic/characteristic-is-removed.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/characteristic/descriptor-get-same-object.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/disconnect-called-before.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/disconnect-called-during-error.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/disconnect-called-during-success.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/disconnect-invalidates-objects.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/disconnected-device.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/discovery-complete-service-not-found.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/garbage-collection-ran-during-error.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/garbage-collection-ran-during-success.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/get-different-service-after-reconnection.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/get-same-object.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/invalid-service-name.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/no-permission-absent-service.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/no-permission-for-any-service.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/no-permission-present-service.js": [
+ [
+ {}
+ ]
+ ],
+ "bluetooth/script-tests/server/service-not-found.js": [
+ [
+ {}
+ ]
+ ],
"clear-site-data/support/echo-clear-site-data.py": [
[
{}
@@ -209008,6 +209876,11 @@
{}
]
],
+ "content-security-policy/prefetch-src/prefetch-header-allowed.html.headers": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/reporting/reporting-api-doesnt-send-reports-without-violation.https.sub.html.sub.headers": [
[
{}
@@ -209433,11 +210306,31 @@
{}
]
],
+ "content-security-policy/support/postmessage-pass-to-opener.html": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/support/postmessage-pass.html": [
[
{}
]
],
+ "content-security-policy/support/prefetch-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/support/prefetch-subresource.css": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/support/prefetch-subresource.css.headers": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/support/report.py": [
[
{}
@@ -222358,6 +223251,11 @@
{}
]
],
+ "css/CSS2/selectors/class-selector-012-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/selectors/descendent-selector-002-ref.xht": [
[
{}
@@ -222373,6 +223271,16 @@
{}
]
],
+ "css/CSS2/selectors/first-child-selector-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-child-selector-002-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/selectors/first-letter-001-ref.xht": [
[
{}
@@ -224438,6 +225346,36 @@
{}
]
],
+ "css/CSS2/selectors/first-letter-selector-000-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-003-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-005-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/selectors/first-letter-selector-007-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/selectors/first-letter-selector-028-ref.xht": [
[
{}
@@ -224503,11 +225441,21 @@
{}
]
],
+ "css/CSS2/selectors/lang-selector-004-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/selectors/lang-selector-005.xht.headers": [
[
{}
]
],
+ "css/CSS2/selectors/pseudo-008-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/selectors/selectors-001-ref.xht": [
[
{}
@@ -225318,11 +226266,6 @@
{}
]
],
- "css/CSS2/syntax/support/.htaccess": [
- [
- {}
- ]
- ],
"css/CSS2/syntax/support/1x1-green.png": [
[
{}
@@ -225378,27 +226321,27 @@
{}
]
],
- "css/CSS2/syntax/support/at-charset-002.css": [
+ "css/CSS2/syntax/support/at-charset-001.css.headers": [
[
{}
]
],
- "css/CSS2/syntax/support/at-charset-003.css": [
+ "css/CSS2/syntax/support/at-charset-002.css": [
[
{}
]
],
- "css/CSS2/syntax/support/at-charset-004.css": [
+ "css/CSS2/syntax/support/at-charset-002.css.headers": [
[
{}
]
],
- "css/CSS2/syntax/support/at-charset-005.css": [
+ "css/CSS2/syntax/support/at-charset-003.css": [
[
{}
]
],
- "css/CSS2/syntax/support/at-charset-006.css": [
+ "css/CSS2/syntax/support/at-charset-003.css.headers": [
[
{}
]
@@ -225963,6 +226906,11 @@
{}
]
],
+ "css/CSS2/syntax/support/plaintext.css.headers": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/syntax/support/ring.png": [
[
{}
@@ -226178,6 +227126,46 @@
{}
]
],
+ "css/CSS2/tables/caption-side-applies-to-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-003-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-006-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-008-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/caption-side-applies-to-017-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/collapsing-border-model-003-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/tables/column-visibility-004-ref.xht": [
[
{}
@@ -233038,6 +234026,16 @@
{}
]
],
+ "css/css-content/element-replacement-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-content/resources/rect.svg": [
+ [
+ {}
+ ]
+ ],
"css/css-counter-styles/OWNERS": [
[
{}
@@ -242963,6 +243961,11 @@
{}
]
],
+ "css/css-grid/alignment/support/style-change.js": [
+ [
+ {}
+ ]
+ ],
"css/css-grid/grid-definition/grid-template-columns-fit-content-001-ref.html": [
[
{}
@@ -243118,11 +244121,6 @@
{}
]
],
- "css/css-grid/support/style-change.js": [
- [
- {}
- ]
- ],
"css/css-grid/test-plan/index.html": [
[
{}
@@ -243683,6 +244681,11 @@
{}
]
],
+ "css/css-masking/parsing/resources/parsing-testcommon.js": [
+ [
+ {}
+ ]
+ ],
"css/css-masking/test-mask-ref.html": [
[
{}
@@ -244758,6 +245761,11 @@
{}
]
],
+ "css/css-paint-api/resources/html5.png": [
+ [
+ {}
+ ]
+ ],
"css/css-paint-api/style-background-image-ref.html": [
[
{}
@@ -246143,6 +247151,11 @@
{}
]
],
+ "css/css-shapes/parsing/resources/parsing-testcommon.js": [
+ [
+ {}
+ ]
+ ],
"css/css-shapes/shape-outside/shape-box/reference/shape-outside-box-001-ref.html": [
[
{}
@@ -252193,6 +253206,16 @@
{}
]
],
+ "css/css-typed-om/resources/1x1-green.png": [
+ [
+ {}
+ ]
+ ],
+ "css/css-typed-om/resources/testhelper.js": [
+ [
+ {}
+ ]
+ ],
"css/css-ui/OWNERS": [
[
{}
@@ -257793,6 +258816,11 @@
{}
]
],
+ "css/motion/offset-anchor-transform-box-fill-box-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/motion/offset-path-ray-ref.html": [
[
{}
@@ -261718,6 +262746,16 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
[
{}
@@ -264118,6 +265156,11 @@
{}
]
],
+ "docs/_running-tests/chrome_android.md": [
+ [
+ {}
+ ]
+ ],
"docs/_running-tests/index.md": [
[
{}
@@ -275548,6 +276591,11 @@
{}
]
],
+ "html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py": [
+ [
+ {}
+ ]
+ ],
"html/semantics/document-metadata/styling/.gitkeep": [
[
{}
@@ -275973,6 +277021,11 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/resources/cues-no-separation.vtt": [
[
{}
@@ -276218,6 +277271,16 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/track-helpers.js": [
[
{}
@@ -279463,6 +280526,11 @@
{}
]
],
+ "images/pattern.mp4": [
+ [
+ {}
+ ]
+ ],
"images/pattern.ogv": [
[
{}
@@ -279618,6 +280686,11 @@
{}
]
],
+ "interfaces/WebCryptoAPI.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/accelerometer.idl": [
[
{}
@@ -279663,6 +280736,11 @@
{}
]
],
+ "interfaces/gamepad.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/generic-sensor.idl": [
[
{}
@@ -279718,6 +280796,11 @@
{}
]
],
+ "interfaces/proximity.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/remoteplayback.idl": [
[
{}
@@ -279758,6 +280841,16 @@
{}
]
],
+ "interfaces/webxr.idl": [
+ [
+ {}
+ ]
+ ],
+ "interfaces/xhr.idl": [
+ [
+ {}
+ ]
+ ],
"intersection-observer/observer-in-iframe.html": [
[
{}
@@ -280133,6 +281226,11 @@
{}
]
],
+ "media-source/generate-config-change-tests.py": [
+ [
+ {}
+ ]
+ ],
"media-source/import_tests.sh": [
[
{}
@@ -284463,11 +285561,26 @@
{}
]
],
+ "resource-timing/resources/all_resource_types.htm": [
+ [
+ {}
+ ]
+ ],
+ "resource-timing/resources/blank_page_green.htm": [
+ [
+ {}
+ ]
+ ],
"resource-timing/resources/blue.png": [
[
{}
]
],
+ "resource-timing/resources/empty_script.js": [
+ [
+ {}
+ ]
+ ],
"resource-timing/resources/fake_responses.html": [
[
{}
@@ -284478,6 +285591,11 @@
{}
]
],
+ "resource-timing/resources/green_frame.htm": [
+ [
+ {}
+ ]
+ ],
"resource-timing/resources/gzip_xml.py": [
[
{}
@@ -284533,6 +285651,11 @@
{}
]
],
+ "resource-timing/resources/nested.css": [
+ [
+ {}
+ ]
+ ],
"resource-timing/resources/notify_parent.html": [
[
{}
@@ -284578,6 +285701,11 @@
{}
]
],
+ "resource-timing/resources/worker_with_images.js": [
+ [
+ {}
+ ]
+ ],
"resource-timing/test_resource_timing.js": [
[
{}
@@ -284703,6 +285831,846 @@
{}
]
],
+ "server-timing/resources/parsing/0.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/0.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/1.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/1.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/10.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/10.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/11.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/11.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/12.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/12.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/13.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/13.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/14.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/14.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/15.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/15.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/16.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/16.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/17.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/17.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/18.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/18.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/19.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/19.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/2.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/2.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/20.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/20.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/21.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/21.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/22.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/22.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/23.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/23.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/24.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/24.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/25.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/25.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/26.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/26.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/27.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/27.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/28.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/28.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/29.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/29.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/3.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/3.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/30.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/30.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/31.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/31.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/32.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/32.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/33.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/33.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/34.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/34.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/35.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/35.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/36.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/36.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/37.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/37.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/38.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/38.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/39.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/39.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/4.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/4.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/40.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/40.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/41.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/41.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/42.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/42.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/43.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/43.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/44.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/44.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/45.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/45.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/46.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/46.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/47.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/47.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/48.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/48.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/49.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/49.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/5.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/5.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/50.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/50.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/51.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/51.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/52.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/52.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/53.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/53.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/54.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/54.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/55.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/55.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/56.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/56.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/57.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/57.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/58.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/58.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/59.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/59.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/6.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/6.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/60.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/60.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/61.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/61.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/62.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/62.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/63.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/63.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/64.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/64.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/65.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/65.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/66.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/66.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/67.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/67.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/68.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/68.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/69.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/69.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/7.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/7.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/70.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/70.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/71.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/71.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/72.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/72.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/73.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/73.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/74.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/74.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/75.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/75.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/76.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/76.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/77.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/77.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/78.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/78.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/79.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/79.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/8.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/8.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/80.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/80.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/81.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/81.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/82.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/82.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/83.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/83.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/9.js": [
+ [
+ {}
+ ]
+ ],
+ "server-timing/resources/parsing/9.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
"server-timing/test_server_timing.html.sub.headers": [
[
{}
@@ -286998,6 +288966,26 @@
{}
]
],
+ "svg/path/closepath/segment-completing-ref.svg": [
+ [
+ {}
+ ]
+ ],
+ "svg/path/distance/pathLength-positive-ref.svg": [
+ [
+ {}
+ ]
+ ],
+ "svg/path/distance/pathLength-zero-ref.svg": [
+ [
+ {}
+ ]
+ ],
+ "svg/path/error-handling/render-until-error-ref.svg": [
+ [
+ {}
+ ]
+ ],
"svg/path/property/priority-ref.svg": [
[
{}
@@ -287418,6 +289406,106 @@
{}
]
],
+ "upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/dummy.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html": [
+ [
+ {}
+ ]
+ ],
"upgrade-insecure-requests/support/pass.png": [
[
{}
@@ -298779,27 +300867,27 @@
}
]
],
- "WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js": [
+ "WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js": [
[
- "/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.html",
+ "/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.html",
{}
]
],
- "WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js": [
+ "WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js": [
[
- "/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.html",
+ "/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.html",
{}
]
],
- "WebCryptoAPI/derive_bits_keys/hkdf.worker.js": [
+ "WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js": [
[
- "/WebCryptoAPI/derive_bits_keys/hkdf.worker.html",
+ "/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.html",
{}
]
],
- "WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js": [
+ "WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js": [
[
- "/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.html",
+ "/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.html",
{
"timeout": "long"
}
@@ -298901,9 +300989,9 @@
}
]
],
- "WebCryptoAPI/digest/digest.worker.js": [
+ "WebCryptoAPI/digest/digest.https.worker.js": [
[
- "/WebCryptoAPI/digest/digest.worker.html",
+ "/WebCryptoAPI/digest/digest.https.worker.html",
{}
]
],
@@ -298915,27 +301003,27 @@
}
]
],
- "WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js": [
[
- "/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.html",
+ "/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.html",
{}
]
],
- "WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js": [
[
- "/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.html",
+ "/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.html",
{}
]
],
- "WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js": [
[
- "/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.html",
+ "/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.html",
{}
]
],
- "WebCryptoAPI/encrypt_decrypt/rsa.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js": [
[
- "/WebCryptoAPI/encrypt_decrypt/rsa.worker.html",
+ "/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.html",
{}
]
],
@@ -299317,39 +301405,33 @@
{}
]
],
- "WebCryptoAPI/idlharness.html": [
- [
- "/WebCryptoAPI/idlharness.html",
- {}
- ]
- ],
"WebCryptoAPI/idlharness.https.html": [
[
"/WebCryptoAPI/idlharness.https.html",
{}
]
],
- "WebCryptoAPI/idlharness.worker.js": [
+ "WebCryptoAPI/idlharness.https.worker.js": [
[
- "/WebCryptoAPI/idlharness.worker.html",
+ "/WebCryptoAPI/idlharness.https.worker.html",
{}
]
],
- "WebCryptoAPI/import_export/ec_importKey.worker.js": [
+ "WebCryptoAPI/import_export/ec_importKey.https.worker.js": [
[
- "/WebCryptoAPI/import_export/ec_importKey.worker.html",
+ "/WebCryptoAPI/import_export/ec_importKey.https.worker.html",
{}
]
],
- "WebCryptoAPI/import_export/rsa_importKey.worker.js": [
+ "WebCryptoAPI/import_export/rsa_importKey.https.worker.js": [
[
- "/WebCryptoAPI/import_export/rsa_importKey.worker.html",
+ "/WebCryptoAPI/import_export/rsa_importKey.https.worker.html",
{}
]
],
- "WebCryptoAPI/import_export/symmetric_importKey.worker.js": [
+ "WebCryptoAPI/import_export/symmetric_importKey.https.worker.js": [
[
- "/WebCryptoAPI/import_export/symmetric_importKey.worker.html",
+ "/WebCryptoAPI/import_export/symmetric_importKey.https.worker.html",
{}
]
],
@@ -299383,27 +301465,27 @@
{}
]
],
- "WebCryptoAPI/sign_verify/ecdsa.worker.js": [
+ "WebCryptoAPI/sign_verify/ecdsa.https.worker.js": [
[
- "/WebCryptoAPI/sign_verify/ecdsa.worker.html",
+ "/WebCryptoAPI/sign_verify/ecdsa.https.worker.html",
{}
]
],
- "WebCryptoAPI/sign_verify/hmac.worker.js": [
+ "WebCryptoAPI/sign_verify/hmac.https.worker.js": [
[
- "/WebCryptoAPI/sign_verify/hmac.worker.html",
+ "/WebCryptoAPI/sign_verify/hmac.https.worker.html",
{}
]
],
- "WebCryptoAPI/sign_verify/rsa_pkcs.worker.js": [
+ "WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js": [
[
- "/WebCryptoAPI/sign_verify/rsa_pkcs.worker.html",
+ "/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.html",
{}
]
],
- "WebCryptoAPI/sign_verify/rsa_pss.worker.js": [
+ "WebCryptoAPI/sign_verify/rsa_pss.https.worker.js": [
[
- "/WebCryptoAPI/sign_verify/rsa_pss.worker.html",
+ "/WebCryptoAPI/sign_verify/rsa_pss.https.worker.html",
{}
]
],
@@ -299447,9 +301529,9 @@
}
]
],
- "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js": [
+ "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js": [
[
- "/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.html",
+ "/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.html",
{
"timeout": "long"
}
@@ -299895,6 +301977,142 @@
{}
]
],
+ "bluetooth/characteristic/characteristicProperties.https.html": [
+ [
+ "/bluetooth/characteristic/characteristicProperties.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [
+ [
+ "/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [
+ [
+ "/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [
+ [
+ "/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/notifications/characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/notifications/characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/event-is-fired.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/event-is-fired.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/read-succeeds.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/read-succeeds.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/readValue/read-updates-value.https.html": [
+ [
+ "/bluetooth/characteristic/readValue/read-updates-value.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/writeValue/characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/writeValue/characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [
+ [
+ "/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/characteristic/writeValue/write-succeeds.https.html": [
+ [
+ "/bluetooth/characteristic/writeValue/write-succeeds.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"bluetooth/idl/idl-Bluetooth.html": [
[
"/bluetooth/idl/idl-Bluetooth.html",
@@ -300009,6 +302227,342 @@
}
]
],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-get-same-object.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [
+ [
+ "/bluetooth/server/getPrimaryService/gen-service-not-found.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [
+ [
+ "/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"bluetooth/service/getCharacteristic/characteristic-found.https.html": [
[
"/bluetooth/service/getCharacteristic/characteristic-found.https.html",
@@ -300473,6 +303027,12 @@
{}
]
],
+ "content-security-policy/form-action/form-action-self-allowed-target-blank.html": [
+ [
+ "/content-security-policy/form-action/form-action-self-allowed-target-blank.html",
+ {}
+ ]
+ ],
"content-security-policy/form-action/form-action-src-allowed.sub.html": [
[
"/content-security-policy/form-action/form-action-src-allowed.sub.html",
@@ -301119,6 +303679,30 @@
{}
]
],
+ "content-security-policy/prefetch-src/prefetch-allowed.html": [
+ [
+ "/content-security-policy/prefetch-src/prefetch-allowed.html",
+ {}
+ ]
+ ],
+ "content-security-policy/prefetch-src/prefetch-blocked.html": [
+ [
+ "/content-security-policy/prefetch-src/prefetch-blocked.html",
+ {}
+ ]
+ ],
+ "content-security-policy/prefetch-src/prefetch-header-allowed.html": [
+ [
+ "/content-security-policy/prefetch-src/prefetch-header-allowed.html",
+ {}
+ ]
+ ],
+ "content-security-policy/prefetch-src/prefetch-header-blocked.html": [
+ [
+ "/content-security-policy/prefetch-src/prefetch-header-blocked.html",
+ {}
+ ]
+ ],
"content-security-policy/reporting/reporting-api-doesnt-send-reports-without-violation.https.sub.html": [
[
"/content-security-policy/reporting/reporting-api-doesnt-send-reports-without-violation.https.sub.html",
@@ -304717,6 +307301,42 @@
{}
]
],
+ "css/css-masking/parsing/clip-invalid.html": [
+ [
+ "/css/css-masking/parsing/clip-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-masking/parsing/clip-path-invalid.html": [
+ [
+ "/css/css-masking/parsing/clip-path-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-masking/parsing/clip-path-valid.html": [
+ [
+ "/css/css-masking/parsing/clip-path-valid.html",
+ {}
+ ]
+ ],
+ "css/css-masking/parsing/clip-rule-invalid.html": [
+ [
+ "/css/css-masking/parsing/clip-rule-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-masking/parsing/clip-rule-valid.html": [
+ [
+ "/css/css-masking/parsing/clip-rule-valid.html",
+ {}
+ ]
+ ],
+ "css/css-masking/parsing/clip-valid.html": [
+ [
+ "/css/css-masking/parsing/clip-valid.html",
+ {}
+ ]
+ ],
"css/css-multicol/extremely-tall-multicol-with-extremely-tall-child-crash.html": [
[
"/css/css-multicol/extremely-tall-multicol-with-extremely-tall-child-crash.html",
@@ -304939,6 +307559,42 @@
{}
]
],
+ "css/css-shapes/parsing/shape-image-threshold-invalid.html": [
+ [
+ "/css/css-shapes/parsing/shape-image-threshold-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-shapes/parsing/shape-image-threshold-valid.html": [
+ [
+ "/css/css-shapes/parsing/shape-image-threshold-valid.html",
+ {}
+ ]
+ ],
+ "css/css-shapes/parsing/shape-margin-invalid.html": [
+ [
+ "/css/css-shapes/parsing/shape-margin-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-shapes/parsing/shape-margin-valid.html": [
+ [
+ "/css/css-shapes/parsing/shape-margin-valid.html",
+ {}
+ ]
+ ],
+ "css/css-shapes/parsing/shape-outside-invalid.html": [
+ [
+ "/css/css-shapes/parsing/shape-outside-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-shapes/parsing/shape-outside-valid.html": [
+ [
+ "/css/css-shapes/parsing/shape-outside-valid.html",
+ {}
+ ]
+ ],
"css/css-shapes/shape-outside-invalid-001.html": [
[
"/css/css-shapes/shape-outside-invalid-001.html",
@@ -307123,6 +309779,36 @@
{}
]
],
+ "css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html",
+ {}
+ ]
+ ],
"css/css-typed-om/stylevalue-objects/interface.html": [
[
"/css/css-typed-om/stylevalue-objects/interface.html",
@@ -307153,12 +309839,222 @@
{}
]
],
+ "css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssPositionValue.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssPositionValue.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html",
+ {}
+ ]
+ ],
"css/css-typed-om/stylevalue-subclasses/cssKeywordValue-interface.html": [
[
"/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-interface.html",
{}
]
],
+ "css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html": [
+ [
+ "/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html": [
+ [
+ "/css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html": [
+ [
+ "/css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/get.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/get.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/has.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/has.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/append.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/append.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/get.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/get.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/has.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/has.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/set.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/test.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/test.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/update.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/append.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/get.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/get.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/has.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/has.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/set.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html",
+ {}
+ ]
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/update.tentative.html": [
+ [
+ "/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html",
+ {}
+ ]
+ ],
"css/css-typed-om/the-stylepropertymap/interface.html": [
[
"/css/css-typed-om/the-stylepropertymap/interface.html",
@@ -307249,6 +310145,12 @@
{}
]
],
+ "css/css-values/lh-rlh-on-root-001.html": [
+ [
+ "/css/css-values/lh-rlh-on-root-001.html",
+ {}
+ ]
+ ],
"css/css-values/unset-value-storage.html": [
[
"/css/css-values/unset-value-storage.html",
@@ -314835,6 +317737,12 @@
{}
]
],
+ "fetch/security/redirect-to-url-with-credentials.https.html": [
+ [
+ "/fetch/security/redirect-to-url-with-credentials.https.html",
+ {}
+ ]
+ ],
"fullscreen/api/document-exit-fullscreen-active-document.html": [
[
"/fullscreen/api/document-exit-fullscreen-active-document.html",
@@ -318679,6 +321587,12 @@
{}
]
],
+ "html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html": [
+ [
+ "/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html",
+ {}
+ ]
+ ],
"html/semantics/document-metadata/styling/LinkStyle.html": [
[
"/html/semantics/document-metadata/styling/LinkStyle.html",
@@ -320057,6 +322971,18 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html": [
[
"/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html",
@@ -320075,6 +323001,18 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/track-cues-missed.html": [
[
"/html/semantics/embedded-content/media-elements/track/track-element/track-cues-missed.html",
@@ -327501,27 +330439,27 @@
{}
]
],
- "keyboard-lock/navigator-cancelKeyboardLock.https.html": [
+ "keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html": [
[
- "/keyboard-lock/navigator-cancelKeyboardLock.https.html",
+ "/keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html",
{}
]
],
- "keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html": [
+ "keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html": [
[
- "/keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html",
+ "/keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html",
{}
]
],
- "keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html": [
+ "keyboard-lock/navigator-keyboardLock.https.html": [
[
- "/keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html",
+ "/keyboard-lock/navigator-keyboardLock.https.html",
{}
]
],
- "keyboard-lock/navigator-requestKeyboardLock.https.html": [
+ "keyboard-lock/navigator-keyboardUnlock.https.html": [
[
- "/keyboard-lock/navigator-requestKeyboardLock.https.html",
+ "/keyboard-lock/navigator-keyboardUnlock.https.html",
{}
]
],
@@ -339415,6 +342353,12 @@
{}
]
],
+ "performance-timeline/po-takeRecords.html": [
+ [
+ "/performance-timeline/po-takeRecords.html",
+ {}
+ ]
+ ],
"performance-timeline/worker-with-performance-observer.html": [
[
"/performance-timeline/worker-with-performance-observer.html",
@@ -339673,9 +342617,9 @@
{}
]
],
- "proximity/idlharness.html": [
+ "proximity/idlharness.https.html": [
[
- "/proximity/idlharness.html",
+ "/proximity/idlharness.https.html",
{}
]
],
@@ -347997,12 +350941,66 @@
{}
]
],
+ "resource-timing/resource_dedicated_worker.html": [
+ [
+ "/resource-timing/resource_dedicated_worker.html",
+ {}
+ ]
+ ],
"resource-timing/resource_dynamic_insertion.html": [
[
"/resource-timing/resource_dynamic_insertion.html",
{}
]
],
+ "resource-timing/resource_frame_initiator_type.html": [
+ [
+ "/resource-timing/resource_frame_initiator_type.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_ignore_data_url.html": [
+ [
+ "/resource-timing/resource_ignore_data_url.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_ignore_failures.html": [
+ [
+ "/resource-timing/resource_ignore_failures.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_initiator_types.html": [
+ [
+ "/resource-timing/resource_initiator_types.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_memory_cached.sub.html": [
+ [
+ "/resource-timing/resource_memory_cached.sub.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_redirects.html": [
+ [
+ "/resource-timing/resource_redirects.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_reparenting.html": [
+ [
+ "/resource-timing/resource_reparenting.html",
+ {}
+ ]
+ ],
+ "resource-timing/resource_script_types.html": [
+ [
+ "/resource-timing/resource_script_types.html",
+ {}
+ ]
+ ],
"resource-timing/resource_subframe_self_navigation.html": [
[
"/resource-timing/resource_subframe_self_navigation.html",
@@ -348375,6 +351373,12 @@
{}
]
],
+ "server-timing/server_timing_header-parsing.html": [
+ [
+ "/server-timing/server_timing_header-parsing.html",
+ {}
+ ]
+ ],
"server-timing/test_server_timing.html": [
[
"/server-timing/test_server_timing.html",
@@ -351597,6 +354601,18 @@
{}
]
],
+ "svg/path/error-handling/bounding.svg": [
+ [
+ "/svg/path/error-handling/bounding.svg",
+ {}
+ ]
+ ],
+ "svg/path/interfaces/SVGAnimatedPathData-removed.svg": [
+ [
+ "/svg/path/interfaces/SVGAnimatedPathData-removed.svg",
+ {}
+ ]
+ ],
"svg/path/property/d-interpolation-discrete.svg": [
[
"/svg/path/property/d-interpolation-discrete.svg",
@@ -351627,6 +354643,12 @@
{}
]
],
+ "svg/types/elements/SVGGeometryElement-rect.svg": [
+ [
+ "/svg/types/elements/SVGGeometryElement-rect.svg",
+ {}
+ ]
+ ],
"svg/types/scripted/SVGAnimatedEnumeration-SVGClipPathElement.html": [
[
"/svg/types/scripted/SVGAnimatedEnumeration-SVGClipPathElement.html",
@@ -351985,6 +355007,12 @@
{}
]
],
+ "upgrade-insecure-requests/link-upgrade.sub.https.html": [
+ [
+ "/upgrade-insecure-requests/link-upgrade.sub.https.html",
+ {}
+ ]
+ ],
"upgrade-insecure-requests/websocket-upgrade.https.html": [
[
"/upgrade-insecure-requests/websocket-upgrade.https.html",
@@ -354135,6 +357163,12 @@
{}
]
],
+ "webrtc/RTCPeerConnection-track-stats.https.html": [
+ [
+ "/webrtc/RTCPeerConnection-track-stats.https.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnectionIceEvent-constructor.html": [
[
"/webrtc/RTCPeerConnectionIceEvent-constructor.html",
@@ -356859,6 +359893,12 @@
{}
]
],
+ "webxr/interfaces.https.html": [
+ [
+ "/webxr/interfaces.https.html",
+ {}
+ ]
+ ],
"webxr/webxr_availability.http.sub.html": [
[
"/webxr/webxr_availability.http.sub.html",
@@ -357993,6 +361033,36 @@
{}
]
],
+ "worklets/layout-worklet-credentials.https.html": [
+ [
+ "/worklets/layout-worklet-credentials.https.html",
+ {}
+ ]
+ ],
+ "worklets/layout-worklet-csp.https.html": [
+ [
+ "/worklets/layout-worklet-csp.https.html",
+ {}
+ ]
+ ],
+ "worklets/layout-worklet-import.https.html": [
+ [
+ "/worklets/layout-worklet-import.https.html",
+ {}
+ ]
+ ],
+ "worklets/layout-worklet-referrer.https.html": [
+ [
+ "/worklets/layout-worklet-referrer.https.html",
+ {}
+ ]
+ ],
+ "worklets/layout-worklet-service-worker-interception.https.html": [
+ [
+ "/worklets/layout-worklet-service-worker-interception.https.html",
+ {}
+ ]
+ ],
"worklets/paint-worklet-credentials.https.html": [
[
"/worklets/paint-worklet-credentials.https.html",
@@ -367053,30 +370123,6 @@
{}
]
],
- "css/CSS2/selectors/class-selector-009.xht": [
- [
- "/css/CSS2/selectors/class-selector-009.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/class-selector-010.xht": [
- [
- "/css/CSS2/selectors/class-selector-010.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/class-selector-011.xht": [
- [
- "/css/CSS2/selectors/class-selector-011.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/class-selector-012.xht": [
- [
- "/css/CSS2/selectors/class-selector-012.xht",
- {}
- ]
- ],
"css/CSS2/selectors/default-attribute-selector-005.xht": [
[
"/css/CSS2/selectors/default-attribute-selector-005.xht",
@@ -367101,78 +370147,12 @@
{}
]
],
- "css/CSS2/selectors/first-child-selector-001.xht": [
- [
- "/css/CSS2/selectors/first-child-selector-001.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-child-selector-002.xht": [
- [
- "/css/CSS2/selectors/first-child-selector-002.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-child-selector-003.xht": [
- [
- "/css/CSS2/selectors/first-child-selector-003.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-000.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-000.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-001.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-001.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-002.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-002.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-003.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-003.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-004.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-004.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-005.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-005.xht",
- {}
- ]
- ],
"css/CSS2/selectors/first-letter-selector-006.xht": [
[
"/css/CSS2/selectors/first-letter-selector-006.xht",
{}
]
],
- "css/CSS2/selectors/first-letter-selector-007.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-007.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-letter-selector-008.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-008.xht",
- {}
- ]
- ],
"css/CSS2/selectors/first-letter-selector-009.xht": [
[
"/css/CSS2/selectors/first-letter-selector-009.xht",
@@ -367233,12 +370213,6 @@
{}
]
],
- "css/CSS2/selectors/first-letter-selector-019.xht": [
- [
- "/css/CSS2/selectors/first-letter-selector-019.xht",
- {}
- ]
- ],
"css/CSS2/selectors/first-letter-selector-020.xht": [
[
"/css/CSS2/selectors/first-letter-selector-020.xht",
@@ -367341,24 +370315,6 @@
{}
]
],
- "css/CSS2/selectors/first-line-pseudo-019.xht": [
- [
- "/css/CSS2/selectors/first-line-pseudo-019.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-line-pseudo-020.xht": [
- [
- "/css/CSS2/selectors/first-line-pseudo-020.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/first-line-pseudo-021.xht": [
- [
- "/css/CSS2/selectors/first-line-pseudo-021.xht",
- {}
- ]
- ],
"css/CSS2/selectors/first-line-selector-001.xht": [
[
"/css/CSS2/selectors/first-line-selector-001.xht",
@@ -367407,12 +370363,6 @@
{}
]
],
- "css/CSS2/selectors/first-line-selector-010.xht": [
- [
- "/css/CSS2/selectors/first-line-selector-010.xht",
- {}
- ]
- ],
"css/CSS2/selectors/first-line-selector-011.xht": [
[
"/css/CSS2/selectors/first-line-selector-011.xht",
@@ -367443,48 +370393,6 @@
{}
]
],
- "css/CSS2/selectors/id-selector-002.xht": [
- [
- "/css/CSS2/selectors/id-selector-002.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/lang-selector-004.xht": [
- [
- "/css/CSS2/selectors/lang-selector-004.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/lang-selector-005.xht": [
- [
- "/css/CSS2/selectors/lang-selector-005.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/lang-selector-006.xht": [
- [
- "/css/CSS2/selectors/lang-selector-006.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/pseudo-006.xht": [
- [
- "/css/CSS2/selectors/pseudo-006.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/pseudo-007.xht": [
- [
- "/css/CSS2/selectors/pseudo-007.xht",
- {}
- ]
- ],
- "css/CSS2/selectors/pseudo-008.xht": [
- [
- "/css/CSS2/selectors/pseudo-008.xht",
- {}
- ]
- ],
"css/CSS2/syntax/case-sensitive-008.xht": [
[
"/css/CSS2/syntax/case-sensitive-008.xht",
@@ -370335,96 +373243,6 @@
{}
]
],
- "css/CSS2/tables/caption-side-applies-to-001.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-001.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-002.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-002.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-003.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-003.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-005.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-005.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-006.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-006.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-007.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-007.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-008.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-008.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-009.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-009.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-010.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-010.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-011.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-011.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-012.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-012.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-013.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-013.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-014.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-014.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-015.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-015.xht",
- {}
- ]
- ],
- "css/CSS2/tables/caption-side-applies-to-017.xht": [
- [
- "/css/CSS2/tables/caption-side-applies-to-017.xht",
- {}
- ]
- ],
"css/CSS2/tables/caption-side-example-001.xht": [
[
"/css/CSS2/tables/caption-side-example-001.xht",
@@ -370455,30 +373273,12 @@
{}
]
],
- "css/CSS2/tables/collapsing-border-model-001.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-001.xht",
- {}
- ]
- ],
"css/CSS2/tables/collapsing-border-model-002.xht": [
[
"/css/CSS2/tables/collapsing-border-model-002.xht",
{}
]
],
- "css/CSS2/tables/collapsing-border-model-003.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-003.xht",
- {}
- ]
- ],
- "css/CSS2/tables/collapsing-border-model-004.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-004.xht",
- {}
- ]
- ],
"css/CSS2/tables/collapsing-border-model-005.xht": [
[
"/css/CSS2/tables/collapsing-border-model-005.xht",
@@ -370491,24 +373291,6 @@
{}
]
],
- "css/CSS2/tables/collapsing-border-model-007.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-007.xht",
- {}
- ]
- ],
- "css/CSS2/tables/collapsing-border-model-008.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-008.xht",
- {}
- ]
- ],
- "css/CSS2/tables/collapsing-border-model-009.xht": [
- [
- "/css/CSS2/tables/collapsing-border-model-009.xht",
- {}
- ]
- ],
"css/CSS2/tables/collapsing-table-borders-001.xht": [
[
"/css/CSS2/tables/collapsing-table-borders-001.xht",
@@ -370989,18 +373771,6 @@
{}
]
],
- "css/CSS2/tables/row-visibility-001.xht": [
- [
- "/css/CSS2/tables/row-visibility-001.xht",
- {}
- ]
- ],
- "css/CSS2/tables/row-visibility-002.xht": [
- [
- "/css/CSS2/tables/row-visibility-002.xht",
- {}
- ]
- ],
"css/CSS2/tables/row-visibility-003.xht": [
[
"/css/CSS2/tables/row-visibility-003.xht",
@@ -371559,12 +374329,6 @@
{}
]
],
- "css/CSS2/tables/table-cell-001.xht": [
- [
- "/css/CSS2/tables/table-cell-001.xht",
- {}
- ]
- ],
"css/CSS2/tables/table-cell-002.xht": [
[
"/css/CSS2/tables/table-cell-002.xht",
@@ -378645,6 +381409,12 @@
{}
]
],
+ "css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html": [
+ [
+ "/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html",
+ {}
+ ]
+ ],
"css/css-values/absolute_length_units.html": [
[
"/css/css-values/absolute_length_units.html",
@@ -379445,7 +382215,7 @@
"support"
],
"./.travis.yml": [
- "3ded1c75d66882f00fe588318e373e802dddf15e",
+ "ae17735a06f31093f06a10b643099cbedaa3c459",
"support"
],
"./CONTRIBUTING.md": [
@@ -379473,7 +382243,7 @@
"support"
],
"./lint.whitelist": [
- "e2ff823a37fdb49a64d144ac380ac00ab4d35655",
+ "c55f23203c2e4b158dc13d25617031fcbb791744",
"support"
],
"./serve.py": [
@@ -381965,15 +384735,15 @@
"testharness"
],
"2dcontext/imagebitmap/common.js": [
- "9c16b63a9a724f46e543a32649c21f04c6540893",
+ "c20732ce1e92624a3d3982154d5aba92eba7adc1",
"support"
],
"2dcontext/imagebitmap/createImageBitmap-drawImage.html": [
- "d709088a1850b25a89a4ad5cd58a0c9387aa4840",
+ "ac183f2abd04f0561433083040190cdadb8ac86a",
"testharness"
],
"2dcontext/imagebitmap/createImageBitmap-invalid-args.html": [
- "0f8e0a2a9099ac869e2435dfe018bc1fb65ec71f",
+ "05ccfd7c45806ee919ccef8bb45c76c147bded63",
"testharness"
],
"2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [
@@ -383649,7 +386419,7 @@
"testharness"
],
"FileAPI/file/File-constructor.html": [
- "95198c8156dadc851d279a863b883c8befdc3930",
+ "68673d38dcf818edf59bbc5996d2aa1b2105a481",
"testharness"
],
"FileAPI/file/Worker-read-file-constructor.worker.js": [
@@ -383837,7 +386607,7 @@
"support"
],
"FileAPI/url/sandboxed-iframe.html": [
- "f7de4337c0f154668d24d85753daea9e4636ac52",
+ "b610b4d0f18472d9eb7ba50f68424e8731d9efff",
"testharness"
],
"FileAPI/url/unicode-origin.sub.html": [
@@ -383845,7 +386615,7 @@
"testharness"
],
"FileAPI/url/url-format.any.js": [
- "b2e72a48146973a4d2e95b815758d688c8acb2e0",
+ "b087f507b342f88240efcee2569da96fee469a5b",
"testharness"
],
"FileAPI/url/url-in-tags.window.js": [
@@ -385312,46 +388082,42 @@
"de7dd2ee8b4d23b5170349e7c2dc94862e5faed2",
"support"
],
- "WebCryptoAPI/WebCryptoAPI.idl": [
- "87b02fc82a1b204ac59a51932e58f9369b4a77c6",
- "support"
+ "WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js": [
+ "b5b14e550d5dbff9f63666b42bd46e29b5be8709",
+ "testharness"
],
"WebCryptoAPI/derive_bits_keys/ecdh_bits.js": [
"becf212639e53f6cae83994feeb2a2d0ecb6feeb",
"support"
],
- "WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js": [
- "b5b14e550d5dbff9f63666b42bd46e29b5be8709",
+ "WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js": [
+ "25bcc549b62ecc99df4e2af27753e311c3910e70",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/ecdh_keys.js": [
"c030ebe3984538c73ee1fca4ec378e4356bccbf4",
"support"
],
- "WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js": [
- "25bcc549b62ecc99df4e2af27753e311c3910e70",
+ "WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js": [
+ "0ea6fb5e51a60e8a521da7a2853fde9a4ff2af8f",
"testharness"
],
"WebCryptoAPI/derive_bits_keys/hkdf.js": [
"7c50dfe98c29038cc758cf90d56cf4b328d1fc37",
"support"
],
- "WebCryptoAPI/derive_bits_keys/hkdf.worker.js": [
- "0ea6fb5e51a60e8a521da7a2853fde9a4ff2af8f",
- "testharness"
- ],
"WebCryptoAPI/derive_bits_keys/hkdf_vectors.js": [
"766a7184da406918e9dc6718125975a59d3d5d36",
"support"
],
+ "WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js": [
+ "1149c335951baa52b7d1ad3192292fb46176d491",
+ "testharness"
+ ],
"WebCryptoAPI/derive_bits_keys/pbkdf2.js": [
"dfd8eea5707720186820549837c8a1a319a8ecc4",
"support"
],
- "WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js": [
- "1149c335951baa52b7d1ad3192292fb46176d491",
- "testharness"
- ],
"WebCryptoAPI/derive_bits_keys/pbkdf2_vectors.js": [
"0a073cb726ad239110545eb3cecada2a0ce5daf7",
"support"
@@ -385404,14 +388170,14 @@
"5e776aa3f202bb72a328947983b020f03ba6ec4d",
"testharness"
],
+ "WebCryptoAPI/digest/digest.https.worker.js": [
+ "a9a6b7a15bf0b795729190a94bdda6ed1ddc013d",
+ "testharness"
+ ],
"WebCryptoAPI/digest/digest.js": [
"e68b81bd47af7373a63466ebe2fd13050d5d246d",
"support"
],
- "WebCryptoAPI/digest/digest.worker.js": [
- "a9a6b7a15bf0b795729190a94bdda6ed1ddc013d",
- "testharness"
- ],
"WebCryptoAPI/digest/test_digest.https.html": [
"1f5893b2c01a60e1e49b8ba5dee8f3d6507cc604",
"testharness"
@@ -385420,7 +388186,7 @@
"b05d96920d4ea99e4cd8cbcbb3c92251aac81963",
"support"
],
- "WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js": [
"348e7d6daf461c90ad2f141aee0ec5fb178e33d6",
"testharness"
],
@@ -385428,7 +388194,7 @@
"11b8c11b8fba29f1ce4dd9dc7ed7dd73ddb93322",
"support"
],
- "WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js": [
"aa500eac7a17c4994a84b63bac007199e989ddb7",
"testharness"
],
@@ -385436,7 +388202,7 @@
"bd8aa30846061ba3c1b99a73048ea17b5c9c0567",
"support"
],
- "WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js": [
+ "WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js": [
"fe553a2dbe69cc75c51f7951dbf3812b3522fcd5",
"testharness"
],
@@ -385444,14 +388210,14 @@
"09fe2fc446bd7a5f0039f4ec20d364cab6d6697d",
"support"
],
+ "WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js": [
+ "89c6a19f939936a2947a3a5acd9cf37929e46caa",
+ "testharness"
+ ],
"WebCryptoAPI/encrypt_decrypt/rsa.js": [
"49ddd58c86e0168917b8404d5a3f0ccf0715ef37",
"support"
],
- "WebCryptoAPI/encrypt_decrypt/rsa.worker.js": [
- "89c6a19f939936a2947a3a5acd9cf37929e46caa",
- "testharness"
- ],
"WebCryptoAPI/encrypt_decrypt/rsa_vectors.js": [
"e833d10f83ac5cff26e076371a545d60a8d37b8f",
"support"
@@ -385652,42 +388418,38 @@
"44475110f616c78bc04b93246f015e7a83e78fa7",
"testharness"
],
- "WebCryptoAPI/idlharness.html": [
- "f97da6e12fbd08b0fe93a6bc0fb9724053d147a8",
+ "WebCryptoAPI/idlharness.https.html": [
+ "a0ac6f063c49d9c14b614dee18b681968eee05ad",
"testharness"
],
- "WebCryptoAPI/idlharness.https.html": [
- "f97da6e12fbd08b0fe93a6bc0fb9724053d147a8",
+ "WebCryptoAPI/idlharness.https.worker.js": [
+ "2ef22c6a9f185492c5bca7e52b3a7a6b363a2e2f",
"testharness"
],
- "WebCryptoAPI/idlharness.worker.js": [
- "e3478f4259364d773dab9ca5e0c7194a0b78d5b3",
+ "WebCryptoAPI/import_export/ec_importKey.https.worker.js": [
+ "18e1f688107b6f2ec4d37f593567ec65ac95c9f9",
"testharness"
],
"WebCryptoAPI/import_export/ec_importKey.js": [
"9da62f7432c2bf0268189f3ba58d5f6910b8de09",
"support"
],
- "WebCryptoAPI/import_export/ec_importKey.worker.js": [
- "18e1f688107b6f2ec4d37f593567ec65ac95c9f9",
+ "WebCryptoAPI/import_export/rsa_importKey.https.worker.js": [
+ "4d67403cda8df77690309ac7e6ed1bff65ce0bc6",
"testharness"
],
"WebCryptoAPI/import_export/rsa_importKey.js": [
"7499196d47910b7e06ca369b008e74d8b0c85bfa",
"support"
],
- "WebCryptoAPI/import_export/rsa_importKey.worker.js": [
- "4d67403cda8df77690309ac7e6ed1bff65ce0bc6",
+ "WebCryptoAPI/import_export/symmetric_importKey.https.worker.js": [
+ "e9d9758d0478ecdf93a5fda9f196501e992de614",
"testharness"
],
"WebCryptoAPI/import_export/symmetric_importKey.js": [
"105065232cebaa7ceeb8436ce257b76c6db274e8",
"support"
],
- "WebCryptoAPI/import_export/symmetric_importKey.worker.js": [
- "e9d9758d0478ecdf93a5fda9f196501e992de614",
- "testharness"
- ],
"WebCryptoAPI/import_export/test_ec_importKey.https.html": [
"2c173849dd35c551b71983fb8efc20f650599da2",
"testharness"
@@ -385708,26 +388470,26 @@
"4df3813485b7277571d61ce38a5811729f91ddbe",
"testharness"
],
+ "WebCryptoAPI/sign_verify/ecdsa.https.worker.js": [
+ "bb414663a4a65e9b55028b0a7433753b3f749a95",
+ "testharness"
+ ],
"WebCryptoAPI/sign_verify/ecdsa.js": [
"55c99894ea3ba9186de1082c189f37f77dfe12e1",
"support"
],
- "WebCryptoAPI/sign_verify/ecdsa.worker.js": [
- "bb414663a4a65e9b55028b0a7433753b3f749a95",
- "testharness"
- ],
"WebCryptoAPI/sign_verify/ecdsa_vectors.js": [
"cc71e74a07a65072c004f262a987097aa68a8e75",
"support"
],
+ "WebCryptoAPI/sign_verify/hmac.https.worker.js": [
+ "725bbd226a49624a63d168a84ae63d73ce26d73c",
+ "testharness"
+ ],
"WebCryptoAPI/sign_verify/hmac.js": [
"de5464f41c68d7fd6f4c9cb0653c6e1d591344af",
"support"
],
- "WebCryptoAPI/sign_verify/hmac.worker.js": [
- "725bbd226a49624a63d168a84ae63d73ce26d73c",
- "testharness"
- ],
"WebCryptoAPI/sign_verify/hmac_vectors.js": [
"c7744822c4c292b4eccf623242f1dc46aaffb91e",
"support"
@@ -385736,7 +388498,7 @@
"b828453ea1f8db421bf08b02d3067f91b6867657",
"support"
],
- "WebCryptoAPI/sign_verify/rsa_pkcs.worker.js": [
+ "WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js": [
"a1a0de477cc1e275fa4e874112b11016099fb78d",
"testharness"
],
@@ -385744,7 +388506,7 @@
"1f10e9144cb5e08e5371d956c0410350f3a90b1e",
"support"
],
- "WebCryptoAPI/sign_verify/rsa_pss.worker.js": [
+ "WebCryptoAPI/sign_verify/rsa_pss.https.worker.js": [
"a0e46ac878fc7178cefb52e7e5a398d5e5b80f3b",
"testharness"
],
@@ -385784,14 +388546,14 @@
"2f0070bafc5079f3b70dd8da567fde0ea6bfb113",
"testharness"
],
+ "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js": [
+ "901c6df896c5f9bccd2e680fbd6fc56afce8d364",
+ "testharness"
+ ],
"WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js": [
"963ed1da346e78fce5217210cd1608b88bea1172",
"support"
],
- "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js": [
- "901c6df896c5f9bccd2e680fbd6fc56afce8d364",
- "testharness"
- ],
"WebIDL/OWNERS": [
"f9c94ab08fa997459cba17e61d8cd00ee8b07b46",
"support"
@@ -386289,7 +389051,7 @@
"support"
],
"accelerometer/Accelerometer-disabled-by-feature-policy.https.html": [
- "37ec335921c5e3cb6011986e76da04254106f4f6",
+ "96e5a86bf78239f3aa4a79b32bb4308de0d5f60e",
"testharness"
],
"accelerometer/Accelerometer-disabled-by-feature-policy.https.html.headers": [
@@ -386297,15 +389059,15 @@
"support"
],
"accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "b03ee7c22f1dd78e2681632f2f67598da67a09cb",
+ "f20f89a31daf399a7946b928e8deca9651d38487",
"testharness"
],
"accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html": [
- "6f5a595f9ee8d8e0dcd29eae9816210846c43557",
+ "7ce8c39f0af6c932d1e6b6f75843c090f7274b80",
"testharness"
],
"accelerometer/Accelerometer-enabled-by-feature-policy.https.html": [
- "9997d07beb3ef1c711dcfd6308c58d11c938244d",
+ "dbda7cfa838c1f2d4296b545034d42f0064f331a",
"testharness"
],
"accelerometer/Accelerometer-enabled-by-feature-policy.https.html.headers": [
@@ -386313,7 +389075,7 @@
"support"
],
"accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html": [
- "3b4500e2ff0f8a3efae8ace952a8993ed3005bd6",
+ "b8fb07cdd23dce9690de719387b9d505382772f5",
"testharness"
],
"accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -386321,15 +389083,15 @@
"support"
],
"accelerometer/Accelerometer.https.html": [
- "c0ca55250886c6a8c6194b658ed362e8b10ccae3",
+ "3ff5f61b25c52142e9796f3903d7f2bcaa30314c",
"testharness"
],
"accelerometer/Accelerometer_insecure_context.html": [
- "ad29f70c8f506002154e6ffa430b87f5e5ae0923",
+ "82be1b9a5c6e75291fdc1aabe230af28e22823a8",
"testharness"
],
"accelerometer/Accelerometer_onerror-manual.https.html": [
- "f20acb4b4e2f774fc13c870f972aaa2ca82afd27",
+ "c82f9595dc2582b2da40549a358da1c3fc2ff820",
"manual"
],
"accelerometer/OWNERS": [
@@ -386465,15 +389227,15 @@
"support"
],
"ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "c062b275f18a69d092fe4f8d20d01f93a631556f",
+ "06862bb58d13bf4355cbe66cb7060c7a5ea4a750",
"testharness"
],
"ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html": [
- "e719162b3001f7a6ef307a1f3af9ac048a0f7ce3",
+ "acdf8d84bc3e8708af250d8825c93d130ade435f",
"testharness"
],
"ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html": [
- "605f76f34e24f91ca9e2a6538624ec89633c6d1a",
+ "da2cc1cc0de186731e38512219cdfaf8357b9301",
"testharness"
],
"ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html.headers": [
@@ -386481,7 +389243,7 @@
"support"
],
"ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html": [
- "6ed23575a7dc16c7044970d81d7768796e9968d4",
+ "2a7a1dadbf5d9d05116128633598da781f5f0003",
"testharness"
],
"ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -388665,11 +391427,11 @@
"testharness"
],
"beacon/beacon-common.sub.js": [
- "75bee9ae7588c181a9a4f3eb9bced109a0190bfc",
+ "67226dd8db05540bd79bf5d4983c51fc985ff906",
"support"
],
"beacon/beacon-cors.sub.window.js": [
- "1821072ced64052cea6d2fc3ccb73cfe23a4235e",
+ "378281325f0a8d02d32b584179577babfeb7b013",
"testharness"
],
"beacon/beacon-error.window.js": [
@@ -388729,7 +391491,7 @@
"support"
],
"beacon/resources/beacon.py": [
- "12c892f085e2498f4c4abfda2409c61b0243a27f",
+ "fb2e689ef46d36e3d17b99d9dfad3994110b2033",
"support"
],
"beacon/resources/content-type.py": [
@@ -388745,11 +391507,87 @@
"support"
],
"bluetooth/README.md": [
- "570b51035ed737c73da8b266cbe0eb658745286e",
+ "2406b51635145355309f8e8778a5669ff561813d",
+ "support"
+ ],
+ "bluetooth/characteristic/characteristicProperties.https.html": [
+ "65cc6c0367c0c2860677d2b22a8483c90eac6f2a",
+ "testharness"
+ ],
+ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [
+ "6ba1c71fa5c34f7b0321b5430fa79c75c907fc14",
+ "testharness"
+ ],
+ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [
+ "be7359ed375b28af9aab39c5b06ffbd0da1843bc",
+ "testharness"
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [
+ "fa068af0ac6d1629622f207b77ae95fe3f50b6cc",
+ "testharness"
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [
+ "82084e965ad35f176505631cb0b9007422bf3fd4",
+ "testharness"
+ ],
+ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [
+ "6a02e3fe8ca88b405e4183bc56c5f0bd2d6a426e",
+ "testharness"
+ ],
+ "bluetooth/characteristic/notifications/characteristic-is-removed.https.html": [
+ "f5b14288aad807a4aaaeee5c3ac24f8a43eb4589",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html": [
+ "4bb6355e47507c0e57498533d060106dda0051d4",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/characteristic-is-removed.https.html": [
+ "69e6a733b4d72a1f7f41b26d65fd874fa944aff5",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/event-is-fired.https.html": [
+ "ce736454ce04bcb34be9d1e76f77903ba3f3e805",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [
+ "1700dfa9ba6e1aa44d42630ef7ba61d4beeed330",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/read-succeeds.https.html": [
+ "a87d20692160f3a26fbfde8cfbc8750c0eeb7a65",
+ "testharness"
+ ],
+ "bluetooth/characteristic/readValue/read-updates-value.https.html": [
+ "e8daa0dedd43a87996093e5b2507a83572eadb43",
+ "testharness"
+ ],
+ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
+ "97f5d01743721207c5addfb9625fd3da7c0c61e3",
+ "testharness"
+ ],
+ "bluetooth/characteristic/writeValue/characteristic-is-removed.https.html": [
+ "08efca72e1b522baf8f704f8589cf453b4c2b64b",
+ "testharness"
+ ],
+ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [
+ "62b4bd66196c9c833631916761b41e973aa2a554",
+ "testharness"
+ ],
+ "bluetooth/characteristic/writeValue/write-succeeds.https.html": [
+ "8dcaba2c0c6d277c006dd131f1f306918ac80c49",
+ "testharness"
+ ],
+ "bluetooth/generate.py": [
+ "ef112d89bc14d0e9ebbb457798609f6000a80935",
+ "support"
+ ],
+ "bluetooth/generate_test.py": [
+ "b8749e25c58da9a903feb5edc84c2d6ed8ebda67",
"support"
],
"bluetooth/idl/idl-Bluetooth.html": [
- "5d4d8278b1f24798765974c35777f70fcbfc9cfa",
+ "9ef91a8214b3a46278d8b9b442b34d9052342342",
"testharness"
],
"bluetooth/idl/idl-BluetoothUUID.html": [
@@ -388757,23 +391595,23 @@
"testharness"
],
"bluetooth/idl/idl-NavigatorBluetooth.html": [
- "9367593c5bfe07afb4629791cf6aab70460dcd4c",
+ "fa121bcbea3d19898a71f7dda79708ee941e4b6c",
"testharness"
],
"bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html": [
- "6e17536a0e3f9d9a0fe6ce075905954b23c83b00",
+ "850418b4a67df894ac4b21d2e5a18c5c266d03fd",
"testharness"
],
"bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html": [
- "e212d4609a7f295a564417a22c984c6ddeeeb0c3",
+ "e156278ff3af38ebc2695ffd3116039be7889e3e",
"testharness"
],
"bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html": [
- "899200ebcc741fd99b7c8a4e09cb6877c66c6bf5",
+ "c6e28d2c8509ea2f0e3633b2517ad68631119ffe",
"testharness"
],
"bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html": [
- "4478ad0afabf3adcd1f84e8165f1a3f185698974",
+ "50eaac3e0c94933fa995c102d53b6b00b3087ea6",
"testharness"
],
"bluetooth/resources/bluetooth-helpers.js": [
@@ -388781,59 +391619,303 @@
"support"
],
"bluetooth/resources/health-thermometer-iframe.html": [
- "badf5e78964f9979d6870c08fb78eb3987027c00",
+ "d42691b2621c13a28c3cfd675de4d95c8a585902",
+ "support"
+ ],
+ "bluetooth/script-tests/base_test_html.template": [
+ "abe5c81d5d9be9b0c6069ba0a465ca3efc24b442",
+ "support"
+ ],
+ "bluetooth/script-tests/characteristic/characteristic-is-removed.js": [
+ "7b7cd34d4c480e62fcde4667f50212cbae7f7b07",
+ "support"
+ ],
+ "bluetooth/script-tests/characteristic/descriptor-get-same-object.js": [
+ "2664262ff94976691ab7811e7b342cfd40e11190",
+ "support"
+ ],
+ "bluetooth/script-tests/server/disconnect-called-before.js": [
+ "3ea0ed09ee2197401437b4d89c335181b2983b17",
+ "support"
+ ],
+ "bluetooth/script-tests/server/disconnect-called-during-error.js": [
+ "43089297c181c29f633ed9dc574313aac34d4ba3",
+ "support"
+ ],
+ "bluetooth/script-tests/server/disconnect-called-during-success.js": [
+ "25835e2c53793ad800774de819b88939f12ebb82",
+ "support"
+ ],
+ "bluetooth/script-tests/server/disconnect-invalidates-objects.js": [
+ "0d113b9ec03ccb4f971710b06156cabc1f97e471",
+ "support"
+ ],
+ "bluetooth/script-tests/server/disconnected-device.js": [
+ "9b537f1e9d3b2416fcf27ff7c65c2a548693fc77",
+ "support"
+ ],
+ "bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js": [
+ "bd9f91f6dc624574f616f62295b3dbede30fdc84",
+ "support"
+ ],
+ "bluetooth/script-tests/server/discovery-complete-service-not-found.js": [
+ "3bd0c4c170efe30bfdbdbae30bfa6cf4563e5193",
+ "support"
+ ],
+ "bluetooth/script-tests/server/garbage-collection-ran-during-error.js": [
+ "e25a59e154898a964822190021cd6bd6f7784df8",
+ "support"
+ ],
+ "bluetooth/script-tests/server/garbage-collection-ran-during-success.js": [
+ "6bd2f4c2f0585ed078cef61b3867627bc0aeb682",
+ "support"
+ ],
+ "bluetooth/script-tests/server/get-different-service-after-reconnection.js": [
+ "4b4c9fcadb0ae28becc1888ffc0c738a898f15a5",
+ "support"
+ ],
+ "bluetooth/script-tests/server/get-same-object.js": [
+ "30382d56a15bb8b8a2825e265ddf00b489829151",
+ "support"
+ ],
+ "bluetooth/script-tests/server/invalid-service-name.js": [
+ "0c2b3d759291d4e247df131f82daa2be847cb1d9",
+ "support"
+ ],
+ "bluetooth/script-tests/server/no-permission-absent-service.js": [
+ "78388409359e9e5bc36b304865e6e14d30769e12",
+ "support"
+ ],
+ "bluetooth/script-tests/server/no-permission-for-any-service.js": [
+ "f9230d7d66815561f575ba55409f2ca4fc0a67b8",
+ "support"
+ ],
+ "bluetooth/script-tests/server/no-permission-present-service.js": [
+ "0f2e002be9842eb06f31f63de31c96fcd2820258",
+ "support"
+ ],
+ "bluetooth/script-tests/server/service-not-found.js": [
+ "b18022b48d354825fa747abda81bc870142d9c59",
"support"
],
"bluetooth/server/connect/connection-succeeds.https.html": [
- "16fe2bccd7e8f8f626222cc49c1df70401463f3a",
+ "167880b07f855325a35a81a8ea833b0d006c7957",
"testharness"
],
"bluetooth/server/connect/garbage-collection-ran-during-success.https.html": [
- "ff136c9e9b463cb8c545a6f51433743347a50db6",
+ "9186c8cef9bc2e170175b811cfd85f69883b14ec",
"testharness"
],
"bluetooth/server/connect/get-same-gatt-server.https.html": [
- "8f7a9a177770c9a44ed5e6fe8f3833ef18a60c1d",
+ "39cf93a9afa8cf4d377ed3746f5184cb61967b0e",
"testharness"
],
"bluetooth/server/device-same-object.https.html": [
- "13abe70e2d5bf768007a2c6e4119ebfe086d38aa",
+ "642394343df7f8d4aa924c330b57f2d4e891c3d5",
"testharness"
],
"bluetooth/server/disconnect/connect-disconnect-twice.https.html": [
- "04b2728be0ed8044629828f015b0d4f78dab6031",
+ "0a815341854fb89ba140dc66546cad449d997b42",
"testharness"
],
"bluetooth/server/disconnect/detach-gc.https.html": [
- "8e9e10665b091c6a7817e1b7d058e48c12163dbd",
+ "a0df0f4983e44466705e57bfcbcde8fc74c504dc",
"testharness"
],
"bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html": [
- "26efe3bc26f792baf0ff087d02730be62cc80f0b",
+ "06f821cc5fd28c776bbf2c2fc76ffdf80d66742d",
"testharness"
],
"bluetooth/server/disconnect/gc-detach.https.html": [
- "e673c3120276ffb6a4e8d03f47b049ff72ac0a9c",
+ "cba04d22660d31b5b9ad0d21b41f42d7761f5092",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [
+ "d1f9a8a640ae96589e7406e6c296137a08c4ea01",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [
+ "7eb6d88b2ac33e3426144ba374bc2b6730be1b01",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [
+ "013b1adff7a583f2706943edef16219a4ef12a50",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [
+ "babca3978d09c505ba002c5790142f45c09409f0",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [
+ "64579c81d08bf9753e4cdc319064b70d4e93c19d",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [
+ "ebb340c97a7dd41203889fb8514bce2202efa6b9",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [
+ "f2733d37d96e85581302f9cc65ea33fbd436c2f2",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [
+ "906d8a13230d427eb018b4bf65eb6800523c99bc",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [
+ "458c0b316c4e0bb06d0825dca372070d5961091e",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [
+ "cbd51c9175418a8c4bd031de3b2a2e4ef2ae7bb6",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [
+ "a064dd7e8fe4137f0a7a83967907b88766f6466f",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [
+ "5728e27aba6861ddfc7cb4278b116ee9d94fbb7a",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [
+ "ed7a5e4ab959f5d8b5e72154c68e397128c4d071",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [
+ "86fab4a334c37e61ff9acbeafba071fd0aab5d30",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [
+ "46717e75f676ff426773a79c4c01b2412b2c70ee",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [
+ "9169ed84f3502d5e3e675d5e0e317d0d895b4ca7",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [
+ "ff1af939fa2b5b77523712a4281839349f00e43b",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [
+ "b579d5e4ea1762930d2831b082fa6d92810e59c3",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [
+ "5bf7c1c17795a136624b149d1c63c423de21a22d",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [
+ "c9b596491a06833d6dca56cd0dc92895056ccb45",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [
+ "a2e353e4812795ee397320add5faf764b0fcd776",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [
+ "22dc609a8be624fad4aeae9b29a280fd2524f180",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [
+ "962c58b5ebf1ec9b7f8801e666d0fb593a75f4bd",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [
+ "7ed5669e52a931920ad1e622b916e3ef9738813b",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [
+ "c240a2232591d9dde3501d8bf7476660e44f75bd",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [
+ "7bbf8a63ec4cf8b14e4cca6c34f92c861b73b78a",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [
+ "1c9ef6cbb708206b700a06b6d20441e7e4d08e3e",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [
+ "eed768bcd0f0b6cd0504a5e255176b53566cf50c",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [
+ "010e58796de1ddfa69a5861ed8f8361e0ff22338",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [
+ "a913ac938d4d0ae148f7165759e26aa9ad04f110",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [
+ "51fd1e4d6a25f7877c08d6415a8e5b5d4cab3bf2",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [
+ "1fdc6561901486f088f911cca14ec6ecf3d7ff98",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [
+ "eb6b10cb0f59a3eedeed6dd38ffd7d6bb5192dc8",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [
+ "159cf4869e074917cf01923fbdf41acab1bde40d",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [
+ "ad2f743b2dab04828ef996ce1912f9d03ddd9d36",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [
+ "62d689a2a97e3f5d2bb22040faf3725d750caae0",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [
+ "878c93bcea918a0d008ab44552f7b26ff6f7a151",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [
+ "f96b80beb4c79a2bda3cc06bc11d6aa5fb392ada",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [
+ "96a195a1b25cf1985ccbc949431a28226f3ee684",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [
+ "618cf409fffba7679abe515982695db4bb1a5f68",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [
+ "3126e3b157670506442b0032de53e6d29e4c30f6",
+ "testharness"
+ ],
+ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [
+ "e9b4e0205d5d30589356aea481e469a746ee419a",
"testharness"
],
"bluetooth/service/getCharacteristic/characteristic-found.https.html": [
- "1861b9bde75f02ed8d7375b97946149ff1c4bf0a",
+ "53479f342ef4aab9a24aaaa4580a63b5e6bcd30b",
"testharness"
],
"bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html": [
- "be1a9c7d2cbc633430c07fd13006893dfc5b952b",
+ "cb0ff8a9913b54ef624a38d367d84b1656b2a536",
"testharness"
],
"bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html": [
- "3f2cb4123c32d9866c44e3946ae9f54410b6cf7b",
+ "b0fe70ff6c0f473079469a21984baf59143d51e9",
"testharness"
],
"bluetooth/service/getCharacteristics/characteristics-found.https.html": [
- "06831d211fb838073c73ca8daa842a833232e01d",
+ "3012c0752b641e8c8de994fbdb13ff2d3f7ea559",
"testharness"
],
"bluetooth/service/getCharacteristics/characteristics-not-found.https.html": [
- "4b57c4ec7579f4a9e625fb6b8a7cda50678b8a41",
+ "694b69270065eb15a7129f9359a2b71d90ed9226",
"testharness"
],
"clear-site-data/navigation-insecure.html": [
@@ -407112,6 +410194,10 @@
"888d3e58d3d094b767067e16494803af432ee057",
"testharness"
],
+ "content-security-policy/form-action/form-action-self-allowed-target-blank.html": [
+ "1a4146819d11ae72ddfe1f1eb319aef992af7dda",
+ "testharness"
+ ],
"content-security-policy/form-action/form-action-src-allowed.sub.html": [
"d0c2dcbb18201b72964f4da5f94b8c200fa02cad",
"testharness"
@@ -407696,6 +410782,26 @@
"cae24a6958eae450d1b21a47f4e13c407cac33be",
"testharness"
],
+ "content-security-policy/prefetch-src/prefetch-allowed.html": [
+ "8c88fefbffb6f5270b64cd8d81b405857a9c1123",
+ "testharness"
+ ],
+ "content-security-policy/prefetch-src/prefetch-blocked.html": [
+ "0c228cef4140a4a9ca5e7704cf4356e13e8f844a",
+ "testharness"
+ ],
+ "content-security-policy/prefetch-src/prefetch-header-allowed.html": [
+ "8b3e0d248e70c2d7587b0ff560f41a42b5bf92f4",
+ "testharness"
+ ],
+ "content-security-policy/prefetch-src/prefetch-header-allowed.html.headers": [
+ "81464314b28226f895ba738b0496b66f60e43b91",
+ "support"
+ ],
+ "content-security-policy/prefetch-src/prefetch-header-blocked.html": [
+ "55c94363465c252a3c24622a56020a8981e01f8e",
+ "testharness"
+ ],
"content-security-policy/reporting/reporting-api-doesnt-send-reports-without-violation.https.sub.html": [
"7be3a72eb885841e8ccb674eeae3761f638adf2c",
"testharness"
@@ -408437,7 +411543,7 @@
"support"
],
"content-security-policy/support/checkReport.sub.js": [
- "50b8b274a0a846ad527c2a369ba870def28e45e6",
+ "06b0c4f4a36a7bd4d323d1920a1a3e2caa9b52dc",
"support"
],
"content-security-policy/support/document-write-alert-fail.js": [
@@ -408512,12 +411618,28 @@
"5ccfe2ec548aa6e16649c319c8252e608777fe64",
"support"
],
+ "content-security-policy/support/postmessage-pass-to-opener.html": [
+ "52e8144873f4a3eb414e4aa029dff4b97ea1f3d6",
+ "support"
+ ],
"content-security-policy/support/postmessage-pass.html": [
"ddfde964afded9ff5189c8c7554bcb2b1b1e5938",
"support"
],
+ "content-security-policy/support/prefetch-helper.js": [
+ "d64724d09dbd36c15c3cd097c1d1e65a44cfbf2a",
+ "support"
+ ],
+ "content-security-policy/support/prefetch-subresource.css": [
+ "e89eb14c8cee8b2c8711a5db7bd3fe3849ba136c",
+ "support"
+ ],
+ "content-security-policy/support/prefetch-subresource.css.headers": [
+ "f5821ebb091ec8effe575972e0ec086238b7beee",
+ "support"
+ ],
"content-security-policy/support/report.py": [
- "8cd779a8017cba678a565475271b892e8ed53e58",
+ "1ad83e152ddc0e2e840862ba6ffc81d73f969725",
"support"
],
"content-security-policy/support/resource.py": [
@@ -446985,52 +450107,56 @@
"reftest"
],
"css/CSS2/selectors/class-selector-001.xht": [
- "5648918099b8bb652d02b24475778f6c42747cca",
+ "f782cf42934491f229730c448f44c6bfe4fd25d0",
"reftest"
],
"css/CSS2/selectors/class-selector-002.xht": [
- "bf8e4920df3d0a43f5ec89c749234ef7c53e95a3",
+ "0847589d090e549aa9cb1353fb093ff9aac28334",
"reftest"
],
"css/CSS2/selectors/class-selector-003.xht": [
- "43ef23aec5bc549e172ae9ef7b48a43219618923",
+ "2e34022ef08f771c1d1da65e37b33745cc8bb285",
"reftest"
],
"css/CSS2/selectors/class-selector-004.xht": [
- "ac7dc5bb4e81a2f4cfe6e68c313eb3ed5481b4a6",
+ "1d6a32197d70f39d08afd1eebe34eff0c0564ddc",
"reftest"
],
"css/CSS2/selectors/class-selector-005.xht": [
- "3de44a047f43b471e90ed81fe5341dd4869923fa",
+ "31779ddbe67569ce616694ec32984f628e2fda4f",
"reftest"
],
"css/CSS2/selectors/class-selector-006.xht": [
- "2faa55faa4a6ef02f7f70ad691d4e122a245cb18",
+ "ad253e995f900cfa227bd5c60fc887a73a61b3d3",
"reftest"
],
"css/CSS2/selectors/class-selector-007.xht": [
- "0d2836c5d5cc65ef88865bac69a9935f82418d03",
+ "843e53a7f82dc6fae88bf491869256eef835742d",
"reftest"
],
"css/CSS2/selectors/class-selector-008.xht": [
- "428d5b4bcdfc689675e49b0a17795c2eca4da57e",
+ "a4eb1a6043f89e6dde3b6533a4b0fc23b6d83e6b",
"reftest"
],
"css/CSS2/selectors/class-selector-009.xht": [
- "6c422bc9f62331610cf53d2a309fbb4e24feea2d",
- "visual"
+ "d1169fd2567d73afa2fb5e82823367849b34b685",
+ "reftest"
],
"css/CSS2/selectors/class-selector-010.xht": [
- "e96a88870884d00155bf3a25f89982c86a068429",
- "visual"
+ "0b95a99da54820d1686a68ab4c5b24b29e300f07",
+ "reftest"
],
"css/CSS2/selectors/class-selector-011.xht": [
- "1a82978e5bd525e211e1885471264f9763530b74",
- "visual"
+ "483a463cd02fdfc4fa1c13d465394804850962c5",
+ "reftest"
+ ],
+ "css/CSS2/selectors/class-selector-012-ref.html": [
+ "d13cdb06ce469f4d9415baa7bf73ce49be781fc7",
+ "support"
],
"css/CSS2/selectors/class-selector-012.xht": [
- "6321e3da4d9d19849566a30d82c03d5e5a3c8058",
- "visual"
+ "1a2657f6a85ac5b36214d6017d95c706271c6419",
+ "reftest"
],
"css/CSS2/selectors/combinator-001.xht": [
"1fe5f1760fc25f31656459b8112907295696988f",
@@ -447148,17 +450274,25 @@
"9dbdc9af0cc734ba71d24babefc27789ff2dbfdb",
"reftest"
],
+ "css/CSS2/selectors/first-child-selector-001-ref.html": [
+ "6106c458659377bc6d1540b33bd13f92cd4e7859",
+ "support"
+ ],
"css/CSS2/selectors/first-child-selector-001.xht": [
- "f0c0419341b9f2f2677bef20c864d63ca3d19f06",
- "visual"
+ "73e0e50f7abc3b4016dac296b8efa80d132a195d",
+ "reftest"
+ ],
+ "css/CSS2/selectors/first-child-selector-002-ref.html": [
+ "fb0430966695bc0004d8ce980f9c5a588ab4bc65",
+ "support"
],
"css/CSS2/selectors/first-child-selector-002.xht": [
- "e8695799372216306711c0dd3f69e16e13e4c94d",
- "visual"
+ "a5d4c1c651bec9fcc9b3f182050d8e4fd44a2067",
+ "reftest"
],
"css/CSS2/selectors/first-child-selector-003.xht": [
- "d4f74f7eb20614c277950bb95741000116b2e048",
- "visual"
+ "89d82c26002157c9bce5059480d360efcf3f6e76",
+ "reftest"
],
"css/CSS2/selectors/first-letter-001-ref.xht": [
"a374dbdf5e818f625b3b24690ac52e2443edd330",
@@ -450512,41 +453646,65 @@
"7887d7447a6e83fa4a5cf62291b2550963fd09cd",
"reftest"
],
+ "css/CSS2/selectors/first-letter-selector-000-ref.html": [
+ "41c6e1a118791457c4fa366e64236079a676d0e2",
+ "support"
+ ],
"css/CSS2/selectors/first-letter-selector-000.xht": [
- "dde783ae8f5bad85a98aa2d0bba101c48d2c0403",
- "visual"
+ "354f7772a494e4f83e0ff346ef6c63e9a9cfd2aa",
+ "reftest"
+ ],
+ "css/CSS2/selectors/first-letter-selector-001-ref.html": [
+ "df974758e92b5745dc487c5a30901057848b79d7",
+ "support"
],
"css/CSS2/selectors/first-letter-selector-001.xht": [
- "dddd83cf893fe823c11dbce07f81ca8a98cad61b",
- "visual"
+ "8987f8880b711803af4deaac69c92d57afae2659",
+ "reftest"
+ ],
+ "css/CSS2/selectors/first-letter-selector-002-ref.html": [
+ "7bb98994faf5d24bd7b4abe1f7e13d4a9d473b5a",
+ "support"
],
"css/CSS2/selectors/first-letter-selector-002.xht": [
- "5e68f979ae695e92f5135a6b0cae0bfc4d784567",
- "visual"
+ "74c5c78870d8a776067e35c6542e64523b7685c0",
+ "reftest"
+ ],
+ "css/CSS2/selectors/first-letter-selector-003-ref.html": [
+ "addc58522c98706146deffc112a95be2b46992cf",
+ "support"
],
"css/CSS2/selectors/first-letter-selector-003.xht": [
- "fcfa7cf2aeb2926f568e4cc7732ad9e7d2998d8b",
- "visual"
+ "3417822d446e4d1e17a18b5041c44757b4cec7f8",
+ "reftest"
],
"css/CSS2/selectors/first-letter-selector-004.xht": [
- "faa17b3bfdcdbe249f70e47b5a338ce6036d712e",
- "visual"
+ "039d40f7b40087f4358ccca683fb178814a0dd99",
+ "reftest"
+ ],
+ "css/CSS2/selectors/first-letter-selector-005-ref.html": [
+ "d6c181a3a7bbf713c83ff4884d95e2da392cfbd0",
+ "support"
],
"css/CSS2/selectors/first-letter-selector-005.xht": [
- "403795228552dabcd7b74654fa8ab0a39aebe1e9",
- "visual"
+ "0bb54184e7895cd38b8b4f35336b0b7f0fec0a84",
+ "reftest"
],
"css/CSS2/selectors/first-letter-selector-006.xht": [
"bfd35783aee6b60dbe8c51a6359acc49a511b881",
"visual"
],
+ "css/CSS2/selectors/first-letter-selector-007-ref.html": [
+ "df406bb15f44fd0b5a976911c951a520dd03c6f2",
+ "support"
+ ],
"css/CSS2/selectors/first-letter-selector-007.xht": [
- "6cfa147b1579217d5039526a1394fed7526d5385",
- "visual"
+ "b3f74216dc8510efaebd0a6614b5d25a7de3e901",
+ "reftest"
],
"css/CSS2/selectors/first-letter-selector-008.xht": [
- "fd859cc37299e2b805f2ef686131b055cbc38e91",
- "visual"
+ "834b8447d99c8d7dec2a0be801121d5b1f263d0c",
+ "reftest"
],
"css/CSS2/selectors/first-letter-selector-009.xht": [
"21656d6c13cef9d55e67e254577120c1f8375a98",
@@ -450589,8 +453747,8 @@
"visual"
],
"css/CSS2/selectors/first-letter-selector-019.xht": [
- "2b718ea24e68c7e83706961ef62f3b112dd1dd2a",
- "visual"
+ "9da2d6dd4cfe451b00471ad6380edc7549b50407",
+ "reftest"
],
"css/CSS2/selectors/first-letter-selector-020.xht": [
"86e79eacf0e5a2ed4cd7266200583208412f88bc",
@@ -450753,7 +453911,7 @@
"reftest"
],
"css/CSS2/selectors/first-line-pseudo-017.xht": [
- "21853a26f2632750f953c4089896e5b63e332f82",
+ "3cdb96056d0565ee1dd083e380176e02515d651b",
"visual"
],
"css/CSS2/selectors/first-line-pseudo-018.xht": [
@@ -450761,16 +453919,16 @@
"reftest"
],
"css/CSS2/selectors/first-line-pseudo-019.xht": [
- "8c8b6c3ebd182d2e3f8b3706694681f6f4684844",
- "visual"
+ "c7653bfb7b9bc546f041f64dd20c6021dfc39e9d",
+ "reftest"
],
"css/CSS2/selectors/first-line-pseudo-020.xht": [
- "a11b4a2cbcd2f91ad8afe3f7dda40d35e69ac60d",
- "visual"
+ "b51d47dc42a15b868d1a3ae3d2834515b8f2d85a",
+ "reftest"
],
"css/CSS2/selectors/first-line-pseudo-021.xht": [
- "cc5386cda420799feab17dab36ba996646d81d82",
- "visual"
+ "af4f8bd5e6574cd622eecb56dd5945d15bdf57a1",
+ "reftest"
],
"css/CSS2/selectors/first-line-pseudo-README": [
"d135c53808c7b08a60dd28484545e37c7c2050a9",
@@ -450809,8 +453967,8 @@
"visual"
],
"css/CSS2/selectors/first-line-selector-010.xht": [
- "d6467bf0235b2ee9b183930125344f69aa37d00e",
- "visual"
+ "3601bf26d3674ce0407a1c369823bc677a6c9886",
+ "reftest"
],
"css/CSS2/selectors/first-line-selector-011.xht": [
"5580babec217ff169ab34fb93c6ef579165eed98",
@@ -450889,8 +454047,8 @@
"reftest"
],
"css/CSS2/selectors/id-selector-002.xht": [
- "680910791cac641da5e1cad7c54d3c92036166ec",
- "visual"
+ "97d323171ef3a0c571b6800c9db3d119cfab1506",
+ "reftest"
],
"css/CSS2/selectors/id-selector-004.xht": [
"49082e851cfe003e8e501c5a51c76f88a0b14e1e",
@@ -450920,21 +454078,25 @@
"b60d14eb9f201effc13b77446cd402322b8c51d2",
"reftest"
],
+ "css/CSS2/selectors/lang-selector-004-ref.html": [
+ "2f01fcfb8e87774c8862e0f69eadcd8002ff6834",
+ "support"
+ ],
"css/CSS2/selectors/lang-selector-004.xht": [
- "5dd95963da95ae8ec1ede71f317f0fb062bc98b0",
- "visual"
+ "4c288f74876a197f8e1942f9204e84264f5a391f",
+ "reftest"
],
"css/CSS2/selectors/lang-selector-005.xht": [
- "131ec3a98ac25150fada2724c87ce463297eb682",
- "visual"
+ "4ba7c718773b17a6b64b8b4464eea855622184c1",
+ "reftest"
],
"css/CSS2/selectors/lang-selector-005.xht.headers": [
"9d32780bb7dcc87f872222e49ca4aed4b437f5f4",
"support"
],
"css/CSS2/selectors/lang-selector-006.xht": [
- "80553c10655b0efa5c1d2bceffcace36e27a70e2",
- "visual"
+ "1e374a6c24b7c2c398ebb296c2e502103d81ed29",
+ "reftest"
],
"css/CSS2/selectors/link-visited-selector-001.xht": [
"f26ff1d0a8e15ac910bfa3e6e056e9804c4e125e",
@@ -450973,16 +454135,20 @@
"manual"
],
"css/CSS2/selectors/pseudo-006.xht": [
- "b5cd0c152a5ae4f5668523c7b6090cc772bc08ba",
- "visual"
+ "714289f41e5984c9aebe059ebd502020064329d0",
+ "reftest"
],
"css/CSS2/selectors/pseudo-007.xht": [
- "a45c61157960ee0068a2976d769ce869a1d1d5f7",
- "visual"
+ "644d39c5e4c8a0d3acadcf4e247edd3d40bcb9bb",
+ "reftest"
+ ],
+ "css/CSS2/selectors/pseudo-008-ref.html": [
+ "e03231cfc884e858dd3bde9a7750cc9c4ba6e261",
+ "support"
],
"css/CSS2/selectors/pseudo-008.xht": [
- "e7f76c8ff2cbc3784f3d54e4779166a80daf063f",
- "visual"
+ "a4aea999241a8822f383da0216445889acb9a146",
+ "reftest"
],
"css/CSS2/selectors/pseudo-009.xht": [
"f4a15140bd17de62eccdc2d4bb1e55885f878077",
@@ -451521,15 +454687,15 @@
"reftest"
],
"css/CSS2/syntax/at-charset-004.xht": [
- "abf22e6c2cb3a62a8cf0a769433944fe767645d6",
+ "4be54f24add87fa928e2a626b01bb386834464ef",
"reftest"
],
"css/CSS2/syntax/at-charset-005.xht": [
- "50e0b983c5b9da991749aca73b813f88ed66cecc",
+ "0d8fc695d9eec9ce8e7a2eca8a181781c4b8d5e2",
"reftest"
],
"css/CSS2/syntax/at-charset-006.xht": [
- "91255df72b78144f58619440c084c81f34096602",
+ "ccb61b4f7657b866fc73096c3d03edbd39a114a6",
"reftest"
],
"css/CSS2/syntax/at-charset-007.xht": [
@@ -452121,7 +455287,7 @@
"reftest"
],
"css/CSS2/syntax/comments-005.xht": [
- "68cac0bb97b4d05b56fae95131ead1723f303418",
+ "43df4d6db913c7044fd14f99235ed263a19894e5",
"reftest"
],
"css/CSS2/syntax/comments-006.xht": [
@@ -452481,7 +455647,7 @@
"support"
],
"css/CSS2/syntax/ident-003.xht": [
- "c60d9157d642240dba18739f3304b86a9acb0a09",
+ "5e1b8bfc9103962c40180bf61e72f0fab9568c8d",
"reftest"
],
"css/CSS2/syntax/ident-004.xht": [
@@ -452552,10 +455718,6 @@
"52344643762a293f247235ca1860a3d82b134009",
"reftest"
],
- "css/CSS2/syntax/ident-020.xht": [
- "dbc6a7c3921e6b50bc0a839ad5ba5c792cc70700",
- "reftest"
- ],
"css/CSS2/syntax/ignored-rules-001.xht": [
"07506eee3478a63ee68550c2d9a4305b49c3cbed",
"reftest"
@@ -452760,10 +455922,6 @@
"c51a03a807743f59e3027371ccfbd8e80235a485",
"support"
],
- "css/CSS2/syntax/support/.htaccess": [
- "7f6c0bd932e4c213e919689e54d80a3035151ee0",
- "support"
- ],
"css/CSS2/syntax/support/1x1-green.png": [
"51e7b6974a09eda6cb31337717c5eaeb9c44b443",
"support"
@@ -452808,24 +455966,24 @@
"bf760baf57311ad536ba734f29e7e89bf7b26131",
"support"
],
- "css/CSS2/syntax/support/at-charset-002.css": [
- "076ea5f1245eadb58678b486b40dec79ebbe7d15",
+ "css/CSS2/syntax/support/at-charset-001.css.headers": [
+ "8c0fa1a7ffc1f2a3a7d3b97d8080a8fa6ed43509",
"support"
],
- "css/CSS2/syntax/support/at-charset-003.css": [
- "a0fb89bd89da4327c1f4e0b84f76b6e598b556da",
+ "css/CSS2/syntax/support/at-charset-002.css": [
+ "076ea5f1245eadb58678b486b40dec79ebbe7d15",
"support"
],
- "css/CSS2/syntax/support/at-charset-004.css": [
- "a0fb89bd89da4327c1f4e0b84f76b6e598b556da",
+ "css/CSS2/syntax/support/at-charset-002.css.headers": [
+ "8c0fa1a7ffc1f2a3a7d3b97d8080a8fa6ed43509",
"support"
],
- "css/CSS2/syntax/support/at-charset-005.css": [
+ "css/CSS2/syntax/support/at-charset-003.css": [
"a0fb89bd89da4327c1f4e0b84f76b6e598b556da",
"support"
],
- "css/CSS2/syntax/support/at-charset-006.css": [
- "a0fb89bd89da4327c1f4e0b84f76b6e598b556da",
+ "css/CSS2/syntax/support/at-charset-003.css.headers": [
+ "8c0fa1a7ffc1f2a3a7d3b97d8080a8fa6ed43509",
"support"
],
"css/CSS2/syntax/support/at-charset-007.css": [
@@ -453276,6 +456434,10 @@
"250e49627027fb261bc023cad47a0ba5bdfcf188",
"support"
],
+ "css/CSS2/syntax/support/plaintext.css.headers": [
+ "4abca84cbd566bb501053408ca983b17b5eae889",
+ "support"
+ ],
"css/CSS2/syntax/support/ring.png": [
"11dd9e78a68b2fc5eb69c401920b43070751a569",
"support"
@@ -455524,69 +458686,93 @@
"4c8d8123470efe103c3041d1b07a9f4cc9fde6f1",
"visual"
],
+ "css/CSS2/tables/caption-side-applies-to-001-ref.html": [
+ "c7c39e671a33b41746184d0754f3f191b4c6d309",
+ "support"
+ ],
"css/CSS2/tables/caption-side-applies-to-001.xht": [
- "a33828fb6ef755cbd122adf8c36924297367a18e",
- "visual"
+ "8cfb1967c9f9f00ffc1ad0e4487ccc4f3d4d1eed",
+ "reftest"
+ ],
+ "css/CSS2/tables/caption-side-applies-to-002-ref.html": [
+ "9dc6fee0ede5482fc998e2b97795442853ed19a8",
+ "support"
],
"css/CSS2/tables/caption-side-applies-to-002.xht": [
- "60a1856140f8fa5cda9da3e00d26ac7965d3d049",
- "visual"
+ "a567cb5206e2927fcdf84074c4ab01066a26ee44",
+ "reftest"
+ ],
+ "css/CSS2/tables/caption-side-applies-to-003-ref.html": [
+ "31ba9c2a4e8006a3e056a0f1afb8575f925568cc",
+ "support"
],
"css/CSS2/tables/caption-side-applies-to-003.xht": [
- "c760b23d4d23bacc858484f7281901b788f4eb46",
- "visual"
+ "e38f584d9f50b6c63b5aba96d23985e4835361be",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-005.xht": [
- "5e4431bc587669fba72de3f6edebe61686a6ef88",
- "visual"
+ "83204fa51853aa755b7b2a0281e013d66712f290",
+ "reftest"
+ ],
+ "css/CSS2/tables/caption-side-applies-to-006-ref.html": [
+ "5c2277f81ef8b2ddf6bc7bd7c672a71e3eb8e198",
+ "support"
],
"css/CSS2/tables/caption-side-applies-to-006.xht": [
- "841a1d7586697e71d86899a77195db78f9a4400d",
- "visual"
+ "b7b930de8476845990e91763af72a02d7d2e5f1f",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-007.xht": [
- "d8a78135f717b130139affde9a9f0b25c0d7d499",
- "visual"
+ "0afcb39831c07ae9f2a2a7042fc9c1028d508a05",
+ "reftest"
+ ],
+ "css/CSS2/tables/caption-side-applies-to-008-ref.html": [
+ "fc5b655d43de07bf86f77884d3f53378ad487d77",
+ "support"
],
"css/CSS2/tables/caption-side-applies-to-008.xht": [
- "1b76e5c2f19ead45b1fb99cd69e79099b371e0f0",
- "visual"
+ "285b2351f9d1dc3abfbea064e9cae7fd7ecf9147",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-009.xht": [
- "7cfabbf9a7e8619d49c079c9b7bf1cebf880705e",
- "visual"
+ "c738519e99fe530224c794525dfa95d7ab324716",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-010.xht": [
- "92c3634c8b2a29dec357b324e358cdc024d2f4a5",
- "visual"
+ "ac4615f06a1b4b3659a9893893fdb7d6b2ed82df",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-011.xht": [
- "789d8b815d7c8cb1627e141c5032a90fc40191cf",
- "visual"
+ "5628655fd66d4975060558e1748b0f3e4b778e42",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-012.xht": [
- "06dbab8a12fbd4b2049f2676eee948842a34970b",
- "visual"
+ "5d0d8a6a96ea0ecd4cb1534f48562cd6f9b6e3d7",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-013.xht": [
- "6c2ce04226c1bb6d8b187716ea1df86d9a89d569",
- "visual"
+ "5c420a560262f1f64713fa6890a4f6ca3661bfe8",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-014.xht": [
- "983fd4da6c9eadabe93420bb049e552006d5ef52",
- "visual"
+ "9d756193fe6044cc0af10988ee8018200b1f6d6a",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-015.xht": [
- "18f6665adbaf40ac0c8b09ab39da281dc438d3f7",
- "visual"
+ "a11fcd0eced488fe19af503cd67c39e3cf4a6295",
+ "reftest"
],
"css/CSS2/tables/caption-side-applies-to-016.xht": [
"6852ac3b59e6a26fbe9670378986b1c7a28e9df2",
"reftest"
],
+ "css/CSS2/tables/caption-side-applies-to-017-ref.html": [
+ "6ac039c92d9dca1c5589e6043cf3d8664436823c",
+ "support"
+ ],
"css/CSS2/tables/caption-side-applies-to-017.xht": [
- "2cb060bbacb37e1b8a30894c76a878f0eac7b61d",
- "visual"
+ "b6b5c2fa8a4d21840ae52a9c1f5f62378c303993",
+ "reftest"
],
"css/CSS2/tables/caption-side-example-001.xht": [
"79311fa5fe281463fba7038c3a22f635a6d511a1",
@@ -455608,21 +458794,29 @@
"45732277d51f78c96aaccb811a8d0b80b63bbf20",
"visual"
],
+ "css/CSS2/tables/collapsing-border-model-001-ref.html": [
+ "307324990ad6d9ca2381fe54aae8b3a9a4ba84af",
+ "support"
+ ],
"css/CSS2/tables/collapsing-border-model-001.xht": [
- "3cdcfc78858fa0beb9fe6ef00d4261d821f1dd48",
- "visual"
+ "aebaa741e96a58b885f4e3c37df77d8c1ed1bac7",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-002.xht": [
"90f06ee14259e475b5a644acbd31f8e6b52d8255",
"visual"
],
+ "css/CSS2/tables/collapsing-border-model-003-ref.html": [
+ "a3800cdbf2321ea23fee866753c96e401386560f",
+ "support"
+ ],
"css/CSS2/tables/collapsing-border-model-003.xht": [
- "a14eb152cfd413fbfae9693111bd4b36dd0ac8aa",
- "visual"
+ "5567414471f502b550d4c81bfb7b521d154359a3",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-004.xht": [
- "5668da0f3f1115b41b9747dbb8dd95640f315e4a",
- "visual"
+ "5942b3adbbb03cc2e3060e0baf13f6853bcc9d34",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-005.xht": [
"97306577aad589918d1b1febb83a609300ad3f18",
@@ -455633,16 +458827,16 @@
"visual"
],
"css/CSS2/tables/collapsing-border-model-007.xht": [
- "137fa735c948f369e502c20ec762df7a430e3f72",
- "visual"
+ "e38919cd16785ab2448678b3c25d20a104dcb6cb",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-008.xht": [
- "571db2a677a174e10e668821c7c10ca102ff6d51",
- "visual"
+ "4a7575c04bde514dcf0c98795a1d9ec68617a810",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-009.xht": [
- "d08d7959e15c817dca83f4bf85acfad643861d8b",
- "visual"
+ "eca3fb31b72cfcbc79d74a54be207afafcf2d57d",
+ "reftest"
],
"css/CSS2/tables/collapsing-border-model-010a.xht": [
"e439734ebbe198bbf77066db3275a58b1be686b3",
@@ -456525,12 +459719,12 @@
"support"
],
"css/CSS2/tables/row-visibility-001.xht": [
- "5f8962c6026581ddd659cb96617f79330ccae7ed",
- "visual"
+ "bf888162e2f031ba7fc148fa2620866edf024f15",
+ "reftest"
],
"css/CSS2/tables/row-visibility-002.xht": [
- "2496e438c6d776a3b8332bfc911f14d00aac53de",
- "visual"
+ "ce966c71fd29af94b2bab86c2a9faf8f2d630201",
+ "reftest"
],
"css/CSS2/tables/row-visibility-003.xht": [
"14f51e20306bcb7f01872f91f808cee5abe834b1",
@@ -457869,8 +461063,8 @@
"visual"
],
"css/CSS2/tables/table-cell-001.xht": [
- "55b32dcd32789ee78a131f5a8db78b5c7faeb807",
- "visual"
+ "4c60202579bc55ba74b03219d6fd6ebf92c9ed3d",
+ "reftest"
],
"css/CSS2/tables/table-cell-002.xht": [
"21ecd5040224235a46864e54acc2f70627672bd1",
@@ -473008,6 +476202,18 @@
"056b3597f3555c803c74a8f6277a06626efd12ea",
"reftest"
],
+ "css/css-content/element-replacement-ref.html": [
+ "f1ad3fca133b1b671e45ae1307fbe9454c40e3ec",
+ "support"
+ ],
+ "css/css-content/element-replacement.html": [
+ "f491ddf2b3062ea2f9b616c968c88b9cc95f22eb",
+ "reftest"
+ ],
+ "css/css-content/resources/rect.svg": [
+ "e0c37ea653aee58f962133219edc4484a734c6e0",
+ "support"
+ ],
"css/css-counter-styles/OWNERS": [
"820cad495f069d1badb3a727b9a2514269c6008e",
"support"
@@ -473932,6 +477138,10 @@
"073573175b4ef24f0ba26ae7456e161f775a7d40",
"reftest"
],
+ "css/css-display/display-contents-text-inherit-002.html": [
+ "4ab5c9c2b6c5a0c5e148e550ef16662e6b3575b0",
+ "reftest"
+ ],
"css/css-display/display-contents-text-inherit-ref.html": [
"b248e78a0255b923c4ed4aa269e65f53b6386bf4",
"support"
@@ -478557,19 +481767,19 @@
"reftest"
],
"css/css-fonts/font-variant-alternates-01-ref.html": [
- "fee60b0c399502744f3188df83c86f19d3fc6efc",
+ "2d7df070714d9efa07d70e434666ff4f780b55be",
"support"
],
"css/css-fonts/font-variant-alternates-01.html": [
- "e2360e9b1465384a6f29476838508af3b6ec71ab",
+ "445ff998bf052c1f04ab8e33002eedf391cb835d",
"reftest"
],
"css/css-fonts/font-variant-alternates-02-ref.html": [
- "7c8dd8a6f9a3d42fe04a90bef6c843351793539e",
+ "712b40e7dae774153502defd5206d4da8d592ccc",
"support"
],
"css/css-fonts/font-variant-alternates-02.html": [
- "7dce91351ff56b97ce966b102f6f00d0574fb63a",
+ "e9d74f02812d6b947fd88ffe91838cdae65df4cb",
"reftest"
],
"css/css-fonts/font-variant-alternates-03-ref.html": [
@@ -478577,7 +481787,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-03.html": [
- "a26b895506ba1d3f29b2343bb635867bc099f386",
+ "e4ab952f4a9c5f5421b3237f589c08c8f6c04509",
"reftest"
],
"css/css-fonts/font-variant-alternates-04-ref.html": [
@@ -478585,15 +481795,15 @@
"support"
],
"css/css-fonts/font-variant-alternates-04.html": [
- "157455c29dc696127ce5c3b45b581c5bd03b6909",
+ "09306fe9ff6d99d7226811c84702fe451b680e0a",
"reftest"
],
"css/css-fonts/font-variant-alternates-05-ref.html": [
- "9a2081e861f551b8b22ede7686ea8e6636f8e579",
+ "d426d7ac09177d75146fbb04cf13e4b2e7c6326a",
"support"
],
"css/css-fonts/font-variant-alternates-05.html": [
- "3c86787c1e81bc8db802428f5522bc7b5f15b8f9",
+ "a40b09abdd8a3f31100184f9f13b1c65d93d6abc",
"reftest"
],
"css/css-fonts/font-variant-alternates-06-ref.html": [
@@ -478601,7 +481811,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-06.html": [
- "ae40f2db209b804d7589ef03b69557e71995b9ae",
+ "eb87b2a0af758871cc856a9ec2aa4e976716c293",
"reftest"
],
"css/css-fonts/font-variant-alternates-07-ref.html": [
@@ -478609,7 +481819,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-07.html": [
- "8b44a336d7f7f6b69e401c86733e978b2bb52cfc",
+ "caf337f548657c4e188aa477ccec4b8149d092bf",
"reftest"
],
"css/css-fonts/font-variant-alternates-08-ref.html": [
@@ -478617,7 +481827,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-08.html": [
- "e67a8cc7e4b3de219f3862329f8b916fac7e8b90",
+ "f9fc6c2252064c94ba3e6120b3646faa0bb590f7",
"reftest"
],
"css/css-fonts/font-variant-alternates-09-ref.html": [
@@ -478625,7 +481835,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-09.html": [
- "5c00521c873d41c049acf23a9b8fa178def49636",
+ "75768372f5747e12bf569e40c1474f3341479552",
"reftest"
],
"css/css-fonts/font-variant-alternates-10-ref.html": [
@@ -478633,7 +481843,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-10.html": [
- "0cd86b6749badec6551407c069b211f262e8aec1",
+ "36ec29992f8a3de6a3679c8b89410c7c4fef6e41",
"reftest"
],
"css/css-fonts/font-variant-alternates-11-ref.html": [
@@ -478641,7 +481851,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-11.html": [
- "7d926b680fef01676946fb6dc16511f8a3cc1b6b",
+ "70b0db84986c8f982d0cc5fe08d997f7757924bc",
"reftest"
],
"css/css-fonts/font-variant-alternates-12-ref.html": [
@@ -478649,7 +481859,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-12.html": [
- "f180da31bb437d71b81fa2fe91a7ba46ee8f3060",
+ "c173b400c5c247aa13d400efe7a0b7d0440a498c",
"reftest"
],
"css/css-fonts/font-variant-alternates-13-ref.html": [
@@ -478657,7 +481867,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-13.html": [
- "cc84ecb5ca83bba5b95d6fab9761edd3985f297e",
+ "47ed224bd5c03bd2610521defe634776d25ae27f",
"reftest"
],
"css/css-fonts/font-variant-alternates-14-ref.html": [
@@ -478665,7 +481875,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-14.html": [
- "2f76c2d8eea0fa73be08ec1baf09c8603c410c0a",
+ "e5d952170c8e4e4ee507550f20e06f4f02358aa7",
"reftest"
],
"css/css-fonts/font-variant-alternates-15-ref.html": [
@@ -478673,7 +481883,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-15.html": [
- "b52acb2a3c7ea8b3a94efd4fec55651c76b63531",
+ "9ff98fb9ba0a0d8f7dd7eeba46f9fff0cded50d5",
"reftest"
],
"css/css-fonts/font-variant-alternates-16-ref.html": [
@@ -478681,7 +481891,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-16.html": [
- "37b2e733219908a78b72d5ccec71e3fd82d60d6e",
+ "438440aa6dcc401f66d6c9f271221b377e08f12f",
"reftest"
],
"css/css-fonts/font-variant-alternates-17-ref.html": [
@@ -478689,7 +481899,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-17.html": [
- "b42d28fb6df88c1f955080fedf7c60298c4caa64",
+ "9c7b3567045c4bce12d693df687120534e066c56",
"reftest"
],
"css/css-fonts/font-variant-alternates-18-ref.html": [
@@ -478697,7 +481907,7 @@
"support"
],
"css/css-fonts/font-variant-alternates-18.html": [
- "de45acb63b567c5318b014ebab07098ca8c317b6",
+ "b85b14eaf76f9c1b89a015b8a5aea9382f61e332",
"reftest"
],
"css/css-fonts/font-variant-alternates-parsing.html": [
@@ -485753,147 +488963,147 @@
"reftest"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-001.html": [
- "4d7695956abc3d5589e22ae6e2a8fb687a631698",
+ "6a98b19084f09099a83cd1e150dcc99e58967596",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-002.html": [
- "126a23ef4ad9fafe013f423de81ecad914dfc354",
+ "de9c39a8cf8a34cf3fabcc54250fce96f0da97f2",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-003.html": [
- "322cd468bd9e554b7152549b6a59f577ddc1f522",
+ "f900fe7f668b23d0263b8f6c0c75aa7e3cbd94db",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-004.html": [
- "5270072349ede83f9c4819d897205fdb0561675a",
+ "9bd03a88898d05c43c37746b14faeba4ec76fee1",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-005.html": [
- "9175d7ba9eab2525278bccc19ce67580629e1394",
+ "0cccd51996f9802335781decffff868a4952f7b1",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-006.html": [
- "a0b444c6bc8050b957fcf2dc0f01e9d9a2745b7f",
+ "eb27b625fe24bfa2c82782f135c5003b7626f55b",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-007.html": [
- "1a7924d186eaf96c34ef327b53eaad9dc232e59a",
+ "4ece5545866128327b8b5d4dd9375c65cab6def5",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-008.html": [
- "dc9642f2940dbd5cfd063c6618f3e582bf6f13b2",
+ "80962fbd4435119db662903b0a201286e9bf91cf",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-009.html": [
- "2b911d9a088e2498916f71d3fae6690ec9e7ae30",
+ "384f6b6b006da58c897b896c4f474b90e6dade1e",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-010.html": [
- "26a41689f987213e209f2e7a334d546c47c8120b",
+ "cc2954da9e8a924770e0802c132a8d5d05ff6a67",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-011.html": [
- "1039c62b02bf29117616070d7c69fa702be2a0d4",
+ "e1befaf27f4defef626b8c423f3a82f661160655",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-012.html": [
- "2f2f560cead46e8d4dc6a0199f34cbecd94a2545",
+ "84eb6de9bb892de373129df60f10bdf0cf9b59d8",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-013.html": [
- "24268a6bd064461d595f27fd19449e667767a153",
+ "f527bc3b0669b048268a8c59274150f3adeabd01",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-014.html": [
- "56936df344200f196bfad7149b04269b307c89e5",
+ "eee651407a75b74ba32d60312a347bef95a6501f",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-015.html": [
- "c0579a49665ae2b8125dfeb5d7bd1514cab24bbf",
+ "cccb3afaab2bb61b26229a5bb5713348c9d4a519",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-016.html": [
- "2aaf17aa7217d6eea98a6f39cc5f22676ff83514",
+ "661f7bbd9c211bb29f14bf9124676e40e44d21cd",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-017.html": [
- "bf62dfb709848b87734a19c033a4c74e9c868aff",
+ "c5aeba430655c90997b790b922ba7aaed087211b",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-018.html": [
- "2e7bb50061ee0af312a3249df5ff05313f61c80e",
+ "89abc2805c57b1c79b65288efbf82fb9f98fc31a",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-019.html": [
- "ed2833b2bd7b74425a7daa3f0f58394286dd1110",
+ "dd94f62a1bcf515c8667466ef2a4680089c9bef5",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-020.html": [
- "ae305d831dd2b461bfd8f2ca47c5e5d1d302485f",
+ "5e04f379860ecd2b7c6870d10444e0e022d30b9d",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-021.html": [
- "f649e11557664937aeb2a465d00563642afb7884",
+ "a3f885dd5ac3a87bf272d17fc996c9aba32e175a",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-022.html": [
- "d2e1f4a999a7377421ea4b9e8cb4b4ae5e320bbd",
+ "7b64b2643498ea16f3718f1f85de0c59374fed47",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-023.html": [
- "a223e17741b3a0ef6cd22e54466fc02fb4b77b8e",
+ "2cac611759cb41fe10ef080b459a23b93bfeb5d9",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-024.html": [
- "d5c7d56e74ab8f6b6986e272ef998dd0212abcc9",
+ "b379721b172702289188baf3bc86b1cc5d5e3793",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-025.html": [
- "725f50b1f9d3be9fb368ae613eae9377baf8d43f",
+ "3437429a0baacfc0770a28aee7e7c5922b83968a",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-026.html": [
- "a6370fe0c3e9f987f9a0766c93165ecefec85132",
+ "3b9c36585804926a99157ef5f1707b54318da971",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-027.html": [
- "f82bae8883376515e7faaa7f0ed667576f5fad37",
+ "e51d98a565264448dd2c39ac556bba8073236ab0",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-028.html": [
- "396f4f823eb6e2115a9d5ce390fbdb529e799063",
+ "4c5c94ae2ac166374725a53604f0b50a9b09fa34",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-029.html": [
- "411ed5d2577ac0c2839bbb829efc170ba7136c19",
+ "2c99765c101af32aff4ef16b615930a650db52f2",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-030.html": [
- "1d0ac6855db55908602d543660d9ae14a18edf1f",
+ "6c3e1b09a0a8e1268a3e2c513b7959972fee1632",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-031.html": [
- "97b2b7231b6f7f812c3ee8ff89317281b1ecfa6e",
+ "627a1e421cbcc93dbf5b5beb028482495aa96ea9",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-032.html": [
- "4c55498e0a14acdded1563a4890b18da9b464201",
+ "a3b9af60a41c8baa60f5ec891a56d3c2e075d6c1",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-033.html": [
- "222a1a659ae09f78641551a369a2bf4fc01f86eb",
+ "ab9eda7db315fdd67240c93d5544fe3230101509",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-034.html": [
- "f0ea292f1996f5635e2f8c382bb14baa71c1840d",
+ "1f506f17eeaf10ca4728c0b3b40ec825e85a4438",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-035.html": [
- "029a04b0ba3297c3b357454f2b5cba743dfcb90a",
+ "2bfd66cdd546bf0151c1aaa800903bf974a10b75",
"testharness"
],
"css/css-grid/alignment/grid-alignment-implies-size-change-036.html": [
- "201ebb99796766165de76c4d762214102157129d",
+ "d9ab0bc1deb8a9a8b29c80b446ee9f7cb720d214",
"testharness"
],
"css/css-grid/alignment/grid-column-axis-alignment-positioned-items-001.html": [
@@ -486624,6 +489834,10 @@
"dc9d15b18538afb38790de51e31095ce9f93e0a9",
"reftest"
],
+ "css/css-grid/alignment/support/style-change.js": [
+ "021db5d6c4e974ab0c8d7e59666a785db03942c4",
+ "support"
+ ],
"css/css-grid/grid-definition/fr-unit-with-percentage.html": [
"0dc90f8d107fe96a35cd837a224d4a28dd971f92",
"reftest"
@@ -487332,10 +490546,6 @@
"6bb300b8baebf700481ea162fb7b41913fcca29c",
"support"
],
- "css/css-grid/support/style-change.js": [
- "a92e1d3f5be007d10fdf432bb198f87b00bdc35a",
- "support"
- ],
"css/css-grid/test-plan/index.html": [
"e633dc7584fbc7bfe99177aa5dd9fbd107a2d3f5",
"support"
@@ -488508,6 +491718,34 @@
"8853e79d6e9c3d262ebb38c569e97932f3b27cd4",
"support"
],
+ "css/css-masking/parsing/clip-invalid.html": [
+ "fad5d0257532a5c1572d41f83d045c92a6fe0d61",
+ "testharness"
+ ],
+ "css/css-masking/parsing/clip-path-invalid.html": [
+ "791ea3c564f629ed8d679499f5483e122ad9f602",
+ "testharness"
+ ],
+ "css/css-masking/parsing/clip-path-valid.html": [
+ "4ac5715cdba374d3b702157ffce4a0a45009995a",
+ "testharness"
+ ],
+ "css/css-masking/parsing/clip-rule-invalid.html": [
+ "5a7673c56ae29a10133ed1395ae1e61ee2a7dd81",
+ "testharness"
+ ],
+ "css/css-masking/parsing/clip-rule-valid.html": [
+ "9236b88f0ac03139210fe6f5fd5f9fa08a613c09",
+ "testharness"
+ ],
+ "css/css-masking/parsing/clip-valid.html": [
+ "e7805a38a0634d760bdc31e4c331da1a56582bc9",
+ "testharness"
+ ],
+ "css/css-masking/parsing/resources/parsing-testcommon.js": [
+ "b5cc6f7c0c7729328bbbc45ec2a8147dae8d8668",
+ "support"
+ ],
"css/css-masking/test-mask-ref.html": [
"6307ecf282b941dbe1475bdb603208f4140b2f26",
"support"
@@ -488953,11 +492191,11 @@
"reftest"
],
"css/css-multicol/multicol-nested-column-rule-001-ref.xht": [
- "d53e71b2a82e6d519fa7fffcc62ba832717cd7a5",
+ "ae91439c53426782f29ed92e1f75da836d978ba5",
"support"
],
"css/css-multicol/multicol-nested-column-rule-001.xht": [
- "7157a7f0a6dc740d9a12561118c2aa71923511c7",
+ "0dfe07fddd84a8eab8b0ed71e48cd40ab7117e7e",
"reftest"
],
"css/css-multicol/multicol-nested-margin-001-ref.xht": [
@@ -490165,11 +493403,11 @@
"reftest"
],
"css/css-paint-api/paint2d-image-ref.html": [
- "c71e0b960177b13614d2c11392c94ea155927ebe",
+ "d4abe5cfd1d2416da7e390d28bc359feac91a2e7",
"support"
],
"css/css-paint-api/paint2d-image.https.html": [
- "5df17bc61598b6687091b3da4b626ed0938cd89e",
+ "df6ce0e992726401b8b3eec1ee72029c2f113316",
"reftest"
],
"css/css-paint-api/paint2d-paths-ref.html": [
@@ -490304,6 +493542,10 @@
"4eee3e45f32779df4464132fa43717a3afc135b2",
"reftest"
],
+ "css/css-paint-api/resources/html5.png": [
+ "0b71ad4f2c95d41419082c2f1a2fc8370b14ebd2",
+ "support"
+ ],
"css/css-paint-api/style-background-image-ref.html": [
"0985e20363c8aac715c534ad59f1209889244fb0",
"support"
@@ -492952,6 +496194,10 @@
"7e780a2c98d134a62aeea85f8695c39bef1d63b5",
"reftest"
],
+ "css/css-scoping/css-scoping-shadow-nested-slot-display-override.html": [
+ "6779dddd0b63ddfcecf33584fd8196b43d698f5a",
+ "reftest"
+ ],
"css/css-scoping/css-scoping-shadow-root-hides-children.html": [
"ecf7c1427ea8556476506f618eef7ad25e11a2bf",
"reftest"
@@ -493100,6 +496346,34 @@
"b0841c5c1e328846aaa95376ae62178173cdf5a5",
"testharness"
],
+ "css/css-shapes/parsing/resources/parsing-testcommon.js": [
+ "b5cc6f7c0c7729328bbbc45ec2a8147dae8d8668",
+ "support"
+ ],
+ "css/css-shapes/parsing/shape-image-threshold-invalid.html": [
+ "72fb606c460752043db729e7157483fd01f7ce0b",
+ "testharness"
+ ],
+ "css/css-shapes/parsing/shape-image-threshold-valid.html": [
+ "040363d13bbed463d1e5e02fea84566da39853cb",
+ "testharness"
+ ],
+ "css/css-shapes/parsing/shape-margin-invalid.html": [
+ "678fe576221b82b6a85927de3337cef02f85da8d",
+ "testharness"
+ ],
+ "css/css-shapes/parsing/shape-margin-valid.html": [
+ "bf937f106b1d6e5b15abce0971da8773777a0ac0",
+ "testharness"
+ ],
+ "css/css-shapes/parsing/shape-outside-invalid.html": [
+ "024c4a2789493964b162397bc994b699274e1423",
+ "testharness"
+ ],
+ "css/css-shapes/parsing/shape-outside-valid.html": [
+ "5b90c13064455cff16f5a4d54a6343c76775f3cc",
+ "testharness"
+ ],
"css/css-shapes/shape-outside-invalid-001.html": [
"550e970032ac78ada40b7b8b3e7159c4160d60da",
"testharness"
@@ -507260,10 +510534,42 @@
"4bcfaa7a22cbe8fa2ca234583403d26bd520474c",
"testharness"
],
+ "css/css-typed-om/resources/1x1-green.png": [
+ "51e7b6974a09eda6cb31337717c5eaeb9c44b443",
+ "support"
+ ],
+ "css/css-typed-om/resources/testhelper.js": [
+ "08f2394f7dfa11460d1e67b8d0c6e556620bf65a",
+ "support"
+ ],
"css/css-typed-om/styleMap-update-function.html": [
"a1dee75d914b68753af742ce8e6dbbac0397a9a6",
"testharness"
],
+ "css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html": [
+ "162ce70613e78bb007ea24ea525ec78ef17cd3bd",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html": [
+ "65c2418988148bf9662f5f502bb4650cc6105a85",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html": [
+ "a52fdeadf8f0663e5e8f455e60a233da816e05ca",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html": [
+ "4bc704fca50d3a114fe0fde76b6030516662d43a",
+ "visual"
+ ],
+ "css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html": [
+ "9334ee684f4a2897f6a191d9217e63af5630cc0d",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html": [
+ "3a5ea9eef361accde1e0166d9defa186bae5c602",
+ "testharness"
+ ],
"css/css-typed-om/stylevalue-objects/interface.html": [
"5c9086db5b7f3a9d6e3109f1ce47385ad345f474",
"testharness"
@@ -507284,10 +510590,150 @@
"2b6761e72a7867218d2f9d9f780569b342c1d89c",
"testharness"
],
+ "css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html": [
+ "004752ad2e9682845697d668af158679031f65dc",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html": [
+ "9bcb4ff6461793d61925d173da7650230e3b4555",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssPositionValue.html": [
+ "155be052f2810afb0560b72e7c223293c02e61a8",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html": [
+ "d255d5d406d5620d4ed1cdd2979c7dc720475399",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html": [
+ "022aec2fac9ccdda36adf97bd47aa407e2825f6e",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html": [
+ "7ba0e1c9db3799bad925036de1da7c51fd102610",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html": [
+ "7b7fa7d06c5dcf614864bab0adef083359278ab6",
+ "testharness"
+ ],
"css/css-typed-om/stylevalue-subclasses/cssKeywordValue-interface.html": [
"53394d04d67fa9526240c2c0af8b71f54a60a0c3",
"testharness"
],
+ "css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html": [
+ "63600cc74e62ecbaf98bf786de17362764ec947e",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html": [
+ "236520d8ac6199066d1e082b9860f2381ff61be6",
+ "testharness"
+ ],
+ "css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html": [
+ "dc32e826e1f840c99f3b4bad4f03bd0f9573ce4e",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html": [
+ "f217ed58d7f56ea588aa942fddfec0322d557283",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/get.tentative.html": [
+ "caf3a345b03a2b929af25a8b360d5da9bb59fb5a",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html": [
+ "4393dba1aea1936ac0ff0f08ef6b5810eaaa8b6b",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html": [
+ "9e0018aed64fbca86d25f5ec466f88212ebd4906",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/has.tentative.html": [
+ "b7b16ab44745e235883303b8c495aa1ceb874d0c",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html": [
+ "71dc6c117d3b0e17ddcee46c9db11953197edb75",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/append.tentative.html": [
+ "6a408857cd88d03a4a00ee2127a3825380d2565f",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html": [
+ "0a2097381fd03a532db7e2b1fb85dd7a901fb011",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/get.tentative.html": [
+ "944052a99d1b5cc1a574c07339c33fdb6b1423d4",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html": [
+ "ba694cbe689837f183601aab4872c4525613ebd4",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html": [
+ "7cb65bf76de24fe33a48178f5193bc05c5ec3f44",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/has.tentative.html": [
+ "3299b5537f2d535988f2f6dac65b3eaba63833b2",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html": [
+ "3652cf0e25de23c04beadbaf2e4ddfffb244333d",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/set.tentative.html": [
+ "2e8b919993a68f96008f17a0e95c08d05434e6a6",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/test.tentative.html": [
+ "eca38801c677a07ebc5e15ec7d11a3338bf0ecc6",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/declared/update.tentative.html": [
+ "02eff9d89e280182fd065b63d71167041c6a8394",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/append.tentative.html": [
+ "df640de5b24c8276459a1a7fbc8a02cc97db6223",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html": [
+ "352917486fa593e0d3f6f645c9c67846aa303ed8",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/get.tentative.html": [
+ "28c506dae933e33e536f02e17b110cced9ea0278",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html": [
+ "a149643634642b6277c4ada8da9b712f40ccf9b5",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html": [
+ "5187e1eb4fb23b6b9a7fba8130d2649c4ea9152e",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/has.tentative.html": [
+ "89b6d05db8717f1bc1f82690706d849a57104ec7",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html": [
+ "e8317c96cea894eaa47d361ba5adbb15d237726e",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/set.tentative.html": [
+ "00d06230cd8f21d522ab895c853201f9910d0d90",
+ "testharness"
+ ],
+ "css/css-typed-om/the-stylepropertymap/inline/update.tentative.html": [
+ "30ee6179d77f18692867217c18852db94b1d10bb",
+ "testharness"
+ ],
"css/css-typed-om/the-stylepropertymap/interface.html": [
"73aac61c85d142f38b871ef21c8ce75bd468cf40",
"testharness"
@@ -509708,6 +513154,18 @@
"5e071d71a9cc355a62d0165b4ca2840ba0ab8c66",
"reftest"
],
+ "css/css-values/lh-rlh-on-root-001.html": [
+ "ecac1ab87e66bddd777f8799c11fde8909e2e408",
+ "testharness"
+ ],
+ "css/css-values/lh-unit-001.html": [
+ "441da6e10585655372496de1d640e8a41259dbc3",
+ "reftest"
+ ],
+ "css/css-values/lh-unit-002.html": [
+ "bc74010a3b7e81f008277cad91ba8adea5382787",
+ "reftest"
+ ],
"css/css-values/reference/200-200-green.html": [
"1ac64ebcfdbff6285f24dae29e32767646145082",
"support"
@@ -518480,6 +521938,14 @@
"51a3f4808392b7bcce4f2569256c540a3be817dc",
"support"
],
+ "css/motion/offset-anchor-transform-box-fill-box-ref.html": [
+ "0cd13108479de1850b6457cce41fee37dcd022fc",
+ "support"
+ ],
+ "css/motion/offset-anchor-transform-box-fill-box.html": [
+ "bed35419a1cb479707bca1e4e23db725d1925da9",
+ "reftest"
+ ],
"css/motion/offset-path-ray-ref.html": [
"dfea2bd9cadf9d1b83e95bc2dbffef3539937ff1",
"support"
@@ -523556,8 +527022,24 @@
"471738f74a0754bea39a0d48ac71c75d26aa9130",
"reftest"
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html": [
+ "0d84c9abc0971826e7ab6a4167c90075c052357f",
+ "support"
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html": [
+ "200c7bb0fb583bf4f7d6e85213be498cb88659ba",
+ "reftest"
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html": [
+ "f7656df52db5f8b601dd10c3b827f96c7f66b74b",
+ "support"
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html": [
+ "f741f790f2effdc45525e63863318540415824df",
+ "reftest"
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
- "4dfb8e7cd5345f510d05ccf683cacdbed8c80bfa",
+ "a0d4a43edbe193d5e2cf2dc949b3e3ccf5726263",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [
@@ -529112,6 +532594,10 @@
"e1b4b49cbd7ea1fd703c7ab3814deee0669e9336",
"support"
],
+ "docs/_running-tests/chrome_android.md": [
+ "fab045301c74644f3feeed712b43707cac13db53",
+ "support"
+ ],
"docs/_running-tests/index.md": [
"15811229e77d2949a6cb5d1848cff7136d8f11af",
"support"
@@ -534864,6 +538350,10 @@
"678e1f80a090021a240933034d1a9206cddde8a4",
"testharness"
],
+ "fetch/security/redirect-to-url-with-credentials.https.html": [
+ "6eb9c75887afd084c12dee609dd4c4a7cf7a6a5e",
+ "testharness"
+ ],
"fetch/security/support/embedded-credential-window.sub.html": [
"09ab38acc0bc980af3e96a61390cd000885b2fe5",
"support"
@@ -535389,11 +538879,11 @@
"manual"
],
"gamepad/idlharness-manual.html": [
- "b7feb12fc02bc656eb41f406999481d204293c08",
+ "e570c8f2defac5b53f5f18fa3a09b184e8adb845",
"manual"
],
"gamepad/idlharness.html": [
- "cafa75af045a99b74e979b8905671d8b4bde107c",
+ "302f0796746f252a1a851d306d7e96cf86d7d402",
"testharness"
],
"gamepad/timestamp-manual.html": [
@@ -535413,7 +538903,7 @@
"support"
],
"generic-sensor/generic-sensor-tests.js": [
- "2209b4cc293aefecded2d325b664d494820d38af",
+ "22c64a2145caa9eeaf4e53243dc971d832a478e0",
"support"
],
"generic-sensor/idlharness.https.html": [
@@ -535481,7 +538971,7 @@
"testharness"
],
"geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html": [
- "ae1bdcf06fbf8dc8189950593b83bdd749e37880",
+ "f67a0c9e416e45326d7301c2a40c758029011738",
"testharness"
],
"geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html.headers": [
@@ -535489,15 +538979,15 @@
"support"
],
"geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "6b0ea48ea2fb1cb6b81348bf5e28618716a34166",
+ "fb033fd0f0d891e9b6ed2b54b835f8f06364643e",
"testharness"
],
"geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html": [
- "f1b108ddd2f5b1ea915410f4cdb28c2e1a812cf9",
+ "06e4487981f8e6e062d9e9fea14d52e64b6b5035",
"testharness"
],
"geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html": [
- "35fea3e77f992df2861bea97405e9c75f7a1f994",
+ "e8287121361749246b874207dcffb92e459dfbec",
"testharness"
],
"geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html.headers": [
@@ -535505,7 +538995,7 @@
"support"
],
"geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html": [
- "a9da2c50d4bde9eb24ef343979afcbc6547684e2",
+ "4222f48c8c2a932c5b65b6426bb9a0ad476ddd0c",
"testharness"
],
"geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -535533,7 +539023,7 @@
"testharness"
],
"gyroscope/Gyroscope-disabled-by-feature-policy.https.html": [
- "03457271ec8c254bf74f89afa7532a595b837404",
+ "bc6f85cb3506d3e3e062eef43dca88bf3a4ebe89",
"testharness"
],
"gyroscope/Gyroscope-disabled-by-feature-policy.https.html.headers": [
@@ -535541,15 +539031,15 @@
"support"
],
"gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "68df44bc71f1aaba74188f70dc916e9ee1dcc330",
+ "cc1f4082fa420a9076f929d88268f5a1d921a44a",
"testharness"
],
"gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html": [
- "e7c53323038c11a977e547ebe9d7ae94646f1a06",
+ "75429c87bbebd19df7b4edaddc5869c6202b3fab",
"testharness"
],
"gyroscope/Gyroscope-enabled-by-feature-policy.https.html": [
- "e4e170946a0289e8b1b6be83083aeeb92ddc4a8f",
+ "5129c05f9b226650a9b7fed4841871045525bf15",
"testharness"
],
"gyroscope/Gyroscope-enabled-by-feature-policy.https.html.headers": [
@@ -535557,7 +539047,7 @@
"support"
],
"gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html": [
- "f48401e0e04294624ebb864224a6d2126e849870",
+ "2603bd858929ae6f84ebbe0cce34c5417ccdae06",
"testharness"
],
"gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -535953,11 +539443,11 @@
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html": [
- "d1a0dcf7e544066d7d30454e9915fad22c6966dc",
+ "3924bc14b2b90880c939e384bf4b075531793a57",
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html": [
- "7feaab2a60b39d697819571136463ce26936d3db",
+ "4ceab904264ef4e4151a3fac41f662d83a80072e",
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/contains.json": [
@@ -540125,7 +543615,7 @@
"testharness"
],
"html/dom/usvstring-reflection.html": [
- "c0f3943df125b3042abb5ef891e01f2b61fea0e5",
+ "a48e32b268a8117ed803c8ede806a879e1556d76",
"testharness"
],
"html/editing/.gitkeep": [
@@ -545872,6 +549362,14 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html": [
+ "e30982d8f6490bfd4b3c124b281d13a1f93e0e18",
+ "testharness"
+ ],
+ "html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py": [
+ "fde4968951519e82db85aa8624470f5256e16396",
+ "support"
+ ],
"html/semantics/document-metadata/styling/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -547132,6 +550630,10 @@
"fee519ec5f5afc13be7c7f5a4387e746135c3747",
"support"
],
+ "html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt": [
+ "c99c03bde6cc607a6b0c2b0831527bf8a3081e13",
+ "support"
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/resources/cues-no-separation.vtt": [
"251de0c5026da00c2b18469ee99924cf70ad1b4e",
"support"
@@ -547376,8 +550878,16 @@
"c8ab03c7d84d150befa8152e552d99e889ce4ec0",
"testharness"
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html": [
+ "32cb1d3aec235d98b1f4654bb81f2bafd24a2e56",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html": [
+ "703a140689ca43502dd3e2922c9718034bc9f7fd",
+ "testharness"
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html": [
- "ac23d5be03b500a264d3bf919d88396e318b4e89",
+ "1ab49530360602eee786211576774956d8f5cc2b",
"testharness"
],
"html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html": [
@@ -547388,6 +550898,30 @@
"688c592e8fc4b4dbc2d7d6ea16e17380c13f440a",
"testharness"
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html": [
+ "0fe944a0ec2df071f3d0ea5bfa8a69720d52af86",
+ "support"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html": [
+ "5405472fee1eb767d8b95e64206737e238d60407",
+ "reftest"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html": [
+ "e8bb477c297f47d5f39e25fcf232bd686bf9a36b",
+ "support"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html": [
+ "18072ac5f58f1b84a8574432f9de44e44d4811c8",
+ "reftest"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html": [
+ "135b766f1a8e76914ca9b96385465bbc0b086e9c",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html": [
+ "3eea15ded06b5c4786f223993407c9d78ac40f96",
+ "testharness"
+ ],
"html/semantics/embedded-content/media-elements/track/track-element/track-cues-missed.html": [
"a87ad9da0dad43e1b68183feeabce59a5c864087",
"testharness"
@@ -551909,7 +555443,7 @@
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html": [
- "996d1aa45c5975e13ac0f1e9c9249b3d452ed2e2",
+ "3365d69d34e442962370a1f0ed22017876efe4fe",
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html": [
@@ -552977,7 +556511,7 @@
"testharness"
],
"html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html": [
- "4714117714f350db0174189e6fd2a5acf8280f0f",
+ "aff1352988cb70e52cff99e1fde379a807dd6984",
"testharness"
],
"html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html": [
@@ -552993,7 +556527,7 @@
"support"
],
"html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html": [
- "e328666c9e386349db0cf51bee0838d2dcb83415",
+ "d51356778b9a9e87e79c33b64ea9cf31a091cb07",
"testharness"
],
"html/semantics/text-level-semantics/the-b-element/.gitkeep": [
@@ -554712,6 +558246,10 @@
"1f29964d20d88de0d659fd76b864b51681582870",
"support"
],
+ "images/pattern.mp4": [
+ "341b777522809f50a88b366566069ee7b77cba80",
+ "support"
+ ],
"images/pattern.ogv": [
"340a255f9e8e06dad2a766f4b3e7bb5e15bf697e",
"support"
@@ -554901,7 +558439,11 @@
"manual"
],
"interfaces/OWNERS": [
- "f9c94ab08fa997459cba17e61d8cd00ee8b07b46",
+ "b2cece17c61be3b2d6ebf3294c268ebf1061026e",
+ "support"
+ ],
+ "interfaces/WebCryptoAPI.idl": [
+ "87b02fc82a1b204ac59a51932e58f9369b4a77c6",
"support"
],
"interfaces/accelerometer.idl": [
@@ -554940,6 +558482,10 @@
"fda57b55aabdc54d674851851451c6c69c514ed1",
"support"
],
+ "interfaces/gamepad.idl": [
+ "89fa62f6e0d1fdb497ce6550804b57a5d4ee0d0f",
+ "support"
+ ],
"interfaces/generic-sensor.idl": [
"3b2cb524838f2274463664621fddc7c927ac95af",
"support"
@@ -554961,7 +558507,7 @@
"support"
],
"interfaces/html.idl": [
- "b93b108cc7ce46595b701a6631b5b8536f0e7eb2",
+ "5eead97f7b1cc2e511f268cb5a40011a33519bf0",
"support"
],
"interfaces/magnetometer.idl": [
@@ -554984,6 +558530,10 @@
"3a5f9a4e768409532916c751e7169c35ec0e23a8",
"support"
],
+ "interfaces/proximity.idl": [
+ "74f2bf81a497589e7b3ed323368df218a70925a3",
+ "support"
+ ],
"interfaces/remoteplayback.idl": [
"fc724b70bc1e1d30e538ee5154a99d4871414302",
"support"
@@ -555016,6 +558566,14 @@
"7b5749e1fece69552e0a8bfac7af401fac15394d",
"support"
],
+ "interfaces/webxr.idl": [
+ "7a275cb5317c967a1058cab3a711c9262abfbf59",
+ "support"
+ ],
+ "interfaces/xhr.idl": [
+ "5363c96002f96f796f4800b92f8748b1141f0821",
+ "support"
+ ],
"intersection-observer/bounding-box.html": [
"a3ac1b70ba26234b7c968055171e652f3a8a14d8",
"testharness"
@@ -555201,23 +558759,23 @@
"testharness"
],
"keyboard-lock/idlharness.https.html": [
- "bcaf4f063cd423d5fb0e1055761e8880e4b63220",
+ "4b41c1c46a8f7d2374d0ff9d796f3f938c1f74d8",
"testharness"
],
- "keyboard-lock/navigator-cancelKeyboardLock.https.html": [
- "5109eb45591bba9ce48d3db91fa02c0590397886",
+ "keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html": [
+ "ee6fe59233abea9325bf7f5e14c1472a72e45a11",
"testharness"
],
- "keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html": [
- "6a05080698fbeff768c4f5c85dbbc89cf3cfa09a",
+ "keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html": [
+ "02ad8f54b7cebed96553bd96bbd7e8fc0227d3b1",
"testharness"
],
- "keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html": [
- "79ed9f93e2f72bf8e11d04e25c6fa847c91971e4",
+ "keyboard-lock/navigator-keyboardLock.https.html": [
+ "572f4e827bc3807f4c71641e102d7bac9df3e391",
"testharness"
],
- "keyboard-lock/navigator-requestKeyboardLock.https.html": [
- "6f8091035f4aa18131c548a81cbe80ba328169c9",
+ "keyboard-lock/navigator-keyboardUnlock.https.html": [
+ "c4de12456714a34fb791b070304da31c99da080f",
"testharness"
],
"longtask-timing/OWNERS": [
@@ -555285,7 +558843,7 @@
"support"
],
"magnetometer/Magnetometer-disabled-by-feature-policy.https.html": [
- "e7c3f45ece750fd22149ea34ee968a6f7f795ac3",
+ "9af542095f2fcd57691c0432ef3248b04a0207a0",
"testharness"
],
"magnetometer/Magnetometer-disabled-by-feature-policy.https.html.headers": [
@@ -555293,15 +558851,15 @@
"support"
],
"magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "d9963541021955e037dec0b443e4a80f4ffe4ee0",
+ "47829ff5747eed99ba22e79b12ddfff288fd031e",
"testharness"
],
"magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html": [
- "2ff0ea0df581c878201bc89e05dfc3e82ffadc01",
+ "3b6314e9176a24976d9d882644c30f00554eed6d",
"testharness"
],
"magnetometer/Magnetometer-enabled-by-feature-policy.https.html": [
- "ef9490c36c40ee6fe2f1bb09c6fd30519d70796c",
+ "05128cdb7171ba230143e7b68b09968a484b602a",
"testharness"
],
"magnetometer/Magnetometer-enabled-by-feature-policy.https.html.headers": [
@@ -555309,7 +558867,7 @@
"support"
],
"magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html": [
- "3e96f42d58b119e42b261f0ae641f56a7c685f47",
+ "3240dafd2bc810dea0dc1ebc31728c86a29f2ec5",
"testharness"
],
"magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -555836,6 +559394,10 @@
"c446fd2ec7e9a940b66a297d9d6a5de9015dc42f",
"testharness"
],
+ "media-source/generate-config-change-tests.py": [
+ "044023540660d9b81484d1ae14851e13af907055",
+ "support"
+ ],
"media-source/import_tests.sh": [
"943d26f264d59f2a7c01db30f5d91e72dafa9935",
"support"
@@ -555945,7 +559507,7 @@
"testharness"
],
"media-source/mediasource-config-changes.js": [
- "08d405df023b14f73bb2490d5e8037feb7ae0ad2",
+ "9bafe96e2a478adf28b0c6fd4186d2bae588e921",
"support"
],
"media-source/mediasource-detach.html": [
@@ -555993,7 +559555,7 @@
"testharness"
],
"media-source/mediasource-play.html": [
- "fb9a01c9d1aeecec782726b347aeec7f703de07d",
+ "e9b1b8b37dc3e850e175383997fe68d6935af539",
"testharness"
],
"media-source/mediasource-preload.html": [
@@ -564265,7 +567827,7 @@
"manual"
],
"orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html": [
- "a87d0228b022235fd00eb345cc39f764afd8a64a",
+ "0c7657e32b46c64e5f050f04e40ccfc0dce32e47",
"testharness"
],
"orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html.headers": [
@@ -564273,15 +567835,15 @@
"support"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "7b827dd86f0ec3fd63e7f37d90c9eb85a61be8e2",
+ "71a6966fb91f8ddfe15ee690c843e4621a3b4720",
"testharness"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html": [
- "7bd1a53f63f8ce9cf4421dd173ee9772dd8ab739",
+ "9bbe39e1be4a669f31f0fb3960aca22d7d159c5e",
"testharness"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html": [
- "8eaf4b91ba622a454a1f4bae08b5e59905b0deeb",
+ "9f110b8ceca3dd3ce3d2a9e2567d92a3fc6462bf",
"testharness"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html.headers": [
@@ -564289,7 +567851,7 @@
"support"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html": [
- "02840fd195f2891fcb9d2159e92dad004ec94608",
+ "c4404cf0b16c4d9ad15308392ecf52caee445b86",
"testharness"
],
"orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -564313,7 +567875,7 @@
"manual"
],
"orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html": [
- "721b7ba79a90408c073a00383e84966368602b0e",
+ "8c6c5f8f3bc4421f5143a3e4fab287564cf4907d",
"testharness"
],
"orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html.headers": [
@@ -564321,15 +567883,15 @@
"support"
],
"orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html": [
- "69bcd956cb76f80481eb867a34fc755f96963d4c",
+ "34a79c9033a41c0aceab3fa6a470dd5a76f2ac81",
"testharness"
],
"orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html": [
- "2c86a4a1a9d71e1ebc8909cedc3cd11a82d59db1",
+ "0e6260ccdaa8163b8db96516960be226a4d85ba7",
"testharness"
],
"orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html": [
- "14c83011b5ebcc04b64a3b958e272801f7cd2895",
+ "243b2d60d4c528a77e9cfb68fa256b35234e7346",
"testharness"
],
"orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html.headers": [
@@ -564337,7 +567899,7 @@
"support"
],
"orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html": [
- "a469f03dcf3ce4c8b93fe1498935c6507b1bde87",
+ "c9f234f6508fb778fdf91277bb8950c99479979d",
"testharness"
],
"orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html.headers": [
@@ -564529,7 +568091,7 @@
"testharness"
],
"payment-request/PaymentRequestUpdateEvent/constructor.https.html": [
- "91210fe058e95195ff5f999a1540ce0f2914f552",
+ "2b47979bae7fcc90fa5162dd597d6e55c96f2c15",
"testharness"
],
"payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html": [
@@ -564617,7 +568179,7 @@
"testharness"
],
"payment-request/payment-request-abort-method.https.html": [
- "5c1ddf4e9e2a896036912983462f51f8ff6aa82b",
+ "30c62af4a05a4d83cbbd1e82d0df62bae9a85e96",
"testharness"
],
"payment-request/payment-request-canmakepayment-method.https.html": [
@@ -564625,7 +568187,7 @@
"testharness"
],
"payment-request/payment-request-constructor-crash.https.html": [
- "9983391839ed64c41f9a7ecfb48a9b4abe6b497c",
+ "383d1c3f9505ee63d504bee87e13efa90ba49f3d",
"testharness"
],
"payment-request/payment-request-constructor.https.html": [
@@ -564792,6 +568354,10 @@
"e06354c2fd72bb868f8964cbf9ab393b629a3789",
"testharness"
],
+ "performance-timeline/po-takeRecords.html": [
+ "e674c882ca331e48c92e6b9bf88d8b8a054316e4",
+ "testharness"
+ ],
"performance-timeline/resources/square.png": [
"f2f3c2b3cef895f514f595932b767299cd6dade0",
"support"
@@ -565165,7 +568731,7 @@
"testharness"
],
"pointerlock/movementX_Y_basic-manual.html": [
- "b8567207aa3112562738cc6ffd2f2e5e2af652c5",
+ "eb22c6fb2fbae178f2b662a09a9153635bdb17e6",
"manual"
],
"pointerlock/movementX_Y_no-jumps-manual.html": [
@@ -565577,7 +569143,7 @@
"support"
],
"presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html": [
- "9f18b9602f6866fd9b56ca4759a66b8624b05d17",
+ "f665499c4310075541d7eef79140e1386c651f36",
"support"
],
"presentation-api/receiving-ua/support/PresentationConnection_onclose_receiving-ua.html": [
@@ -565648,8 +569214,8 @@
"ba9b710aa4213f10edc7131a3879821f38f2ef19",
"support"
],
- "proximity/idlharness.html": [
- "8505e5ef30a561c82b7732fd24789387cf8f654e",
+ "proximity/idlharness.https.html": [
+ "25c63ad4caa047d13ef9be748d6c880df4193b0d",
"testharness"
],
"quirks/active-and-hover-manual.html": [
@@ -573333,11 +576899,47 @@
"testharness"
],
"resource-timing/resource_connection_reuse.html": [
- "8ab91aeb45b1db42af8c87681fcd793d71f05254",
+ "b20162d02cad807fc2b250b7d73042822fcb9030",
+ "testharness"
+ ],
+ "resource-timing/resource_dedicated_worker.html": [
+ "8a4f853bdffe110bc15c04aaed4d4436a5ea3a23",
"testharness"
],
"resource-timing/resource_dynamic_insertion.html": [
- "1b6e111056101c88623eda6148042c310a5b7a6d",
+ "a6cd75583f6363a83b18f1bc77d89821de344ff7",
+ "testharness"
+ ],
+ "resource-timing/resource_frame_initiator_type.html": [
+ "dcea1111a2c9a40a1d3de7246a5295e84dcf08b5",
+ "testharness"
+ ],
+ "resource-timing/resource_ignore_data_url.html": [
+ "f8513b4ae7cc26c07cea1c16d872e0594f05041c",
+ "testharness"
+ ],
+ "resource-timing/resource_ignore_failures.html": [
+ "c22e136e1c942a2fd652985a660ca0acd6c3a8b6",
+ "testharness"
+ ],
+ "resource-timing/resource_initiator_types.html": [
+ "b04269a158aadf5a178decc306481c15f2c310b0",
+ "testharness"
+ ],
+ "resource-timing/resource_memory_cached.sub.html": [
+ "7bd3af7679a4e628090bbc1e7114f416457144d6",
+ "testharness"
+ ],
+ "resource-timing/resource_redirects.html": [
+ "76f977ff494e0c7899b616909b0dab1832ed44c5",
+ "testharness"
+ ],
+ "resource-timing/resource_reparenting.html": [
+ "8df6e1b7d03e0480a24535124e72808f061b2bc1",
+ "testharness"
+ ],
+ "resource-timing/resource_script_types.html": [
+ "11ead0e7600ea288f78582f8ee194a903490e6e1",
"testharness"
],
"resource-timing/resource_subframe_self_navigation.html": [
@@ -573348,10 +576950,22 @@
"9e8051a2ff8fff72b36ed1cecb61f9e7bba29071",
"support"
],
+ "resource-timing/resources/all_resource_types.htm": [
+ "c7f698888c64e5b750fac45e22dbb85e5979b3c5",
+ "support"
+ ],
+ "resource-timing/resources/blank_page_green.htm": [
+ "2d6d55d85e17a9fe978db6dbe25ae35a599d5683",
+ "support"
+ ],
"resource-timing/resources/blue.png": [
"99949c515749e66f471c3589ee7a0ef518aaccb5",
"support"
],
+ "resource-timing/resources/empty_script.js": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
"resource-timing/resources/fake_responses.html": [
"c942abc1e8c1672935ffc8ce34821891345bacb9",
"support"
@@ -573360,6 +576974,10 @@
"09568d5f64474184cde594a47e26e374bcc8ac4d",
"support"
],
+ "resource-timing/resources/green_frame.htm": [
+ "08f8ca19b61ab0ac68014d5b406a952669fbe104",
+ "support"
+ ],
"resource-timing/resources/gzip_xml.py": [
"cf637a4389fd259dee3a2df56194a68b3744b4c6",
"support"
@@ -573404,6 +577022,10 @@
"f53513f6f47fd4a6d4994a4ef7d6e37d1777ea57",
"support"
],
+ "resource-timing/resources/nested.css": [
+ "b89daf15601a711f6046d9e2fe1cc43ae1f0fd27",
+ "support"
+ ],
"resource-timing/resources/notify_parent.html": [
"91790b717d0922dcd58237137c9728afbe488e46",
"support"
@@ -573440,6 +577062,10 @@
"59692fb2ebe890d65acba54aa2f814fcf9b46d39",
"support"
],
+ "resource-timing/resources/worker_with_images.js": [
+ "161473f1cd2157a69c506c80dba6ef25f76122ee",
+ "support"
+ ],
"resource-timing/single-entry-per-resource.html": [
"e23e9cab8d42a3bb6b0635cd3916d9131ccc6ba2",
"testharness"
@@ -573449,7 +577075,7 @@
"testharness"
],
"resource-timing/test_resource_timing.js": [
- "504f20a00b7be9c3b15666dfe34df02856a8bc72",
+ "a68dca4f542588b705f126df73dfad8c88c69506",
"support"
],
"screen-orientation/OWNERS": [
@@ -573760,8 +577386,684 @@
"ed768e3cc679a1fef5c47088443fdaec83838394",
"support"
],
+ "server-timing/resources/parsing/0.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/0.js.sub.headers": [
+ "17fa2c18304bcee509c7786fd34e456994360a10",
+ "support"
+ ],
+ "server-timing/resources/parsing/1.js": [
+ "1a6924ba411a7f92aef048336bd117ece499f90a",
+ "support"
+ ],
+ "server-timing/resources/parsing/1.js.sub.headers": [
+ "1f65859f60eea48564091b7f853e3a1c306d91fe",
+ "support"
+ ],
+ "server-timing/resources/parsing/10.js": [
+ "1a6924ba411a7f92aef048336bd117ece499f90a",
+ "support"
+ ],
+ "server-timing/resources/parsing/10.js.sub.headers": [
+ "adf8886166350be375d41de58da0d8a72ae8d2ce",
+ "support"
+ ],
+ "server-timing/resources/parsing/11.js": [
+ "1a6924ba411a7f92aef048336bd117ece499f90a",
+ "support"
+ ],
+ "server-timing/resources/parsing/11.js.sub.headers": [
+ "20c6f242511b2055249eb7bfb0e775af483a6c40",
+ "support"
+ ],
+ "server-timing/resources/parsing/12.js": [
+ "1c6ca0aa58035fba39cfe8284c04468787149469",
+ "support"
+ ],
+ "server-timing/resources/parsing/12.js.sub.headers": [
+ "802c68f944f30b273d71f59c77289e7d2a08becf",
+ "support"
+ ],
+ "server-timing/resources/parsing/13.js": [
+ "266ee41ae7b440ab43e87a087d10fa2b1e193a8f",
+ "support"
+ ],
+ "server-timing/resources/parsing/13.js.sub.headers": [
+ "144652b4740f0d42e3ff0685eaac5c4c1223ddfb",
+ "support"
+ ],
+ "server-timing/resources/parsing/14.js": [
+ "b45df4c8581d127f4738887a009611092e06fae9",
+ "support"
+ ],
+ "server-timing/resources/parsing/14.js.sub.headers": [
+ "ef0ce7496aecd6c2efc4eee9e8a2b35723f68dcd",
+ "support"
+ ],
+ "server-timing/resources/parsing/15.js": [
+ "57529824e71a124c2ff69e9153163de9f4c3433d",
+ "support"
+ ],
+ "server-timing/resources/parsing/15.js.sub.headers": [
+ "d686b34f5a4b3ca534ad55ca36a0c10775f21212",
+ "support"
+ ],
+ "server-timing/resources/parsing/16.js": [
+ "8d82b5abff0bfc1884a350836cb27c8b124129bd",
+ "support"
+ ],
+ "server-timing/resources/parsing/16.js.sub.headers": [
+ "aa781c76e32bfaa1a0e05cd2202b3e4e3ce28b35",
+ "support"
+ ],
+ "server-timing/resources/parsing/17.js": [
+ "b45df4c8581d127f4738887a009611092e06fae9",
+ "support"
+ ],
+ "server-timing/resources/parsing/17.js.sub.headers": [
+ "d8b7e49b673a39e6028b8aeb6241a3be5fa79935",
+ "support"
+ ],
+ "server-timing/resources/parsing/18.js": [
+ "e37a27e8de7cb0d7da20de4b4738f868321f4f7d",
+ "support"
+ ],
+ "server-timing/resources/parsing/18.js.sub.headers": [
+ "19ea20ca46a0dd73a0f22175c03ea1aa5bfdb560",
+ "support"
+ ],
+ "server-timing/resources/parsing/19.js": [
+ "945c0786a390786f6bc648fb80ffe2da2c14c4b1",
+ "support"
+ ],
+ "server-timing/resources/parsing/19.js.sub.headers": [
+ "602127ea29736860e5291c9243d2de54c06a1b7c",
+ "support"
+ ],
+ "server-timing/resources/parsing/2.js": [
+ "1bc5932490ce45826ee11e124924c9588b3e8c4d",
+ "support"
+ ],
+ "server-timing/resources/parsing/2.js.sub.headers": [
+ "49c763e3a400aaa6bc19e02188496a94b952b7f2",
+ "support"
+ ],
+ "server-timing/resources/parsing/20.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/20.js.sub.headers": [
+ "c9003e0ef6e05d0aa3066a06ae404da09d0d1ca8",
+ "support"
+ ],
+ "server-timing/resources/parsing/21.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/21.js.sub.headers": [
+ "babbb8839dae15581d70d50133b7e7dcecb72c60",
+ "support"
+ ],
+ "server-timing/resources/parsing/22.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/22.js.sub.headers": [
+ "60656825b940e844d5b658b15a558d4bf8aeb5a2",
+ "support"
+ ],
+ "server-timing/resources/parsing/23.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/23.js.sub.headers": [
+ "fb73ea7ff1d6c98cf18e8cdc9ae2106988a3c5cd",
+ "support"
+ ],
+ "server-timing/resources/parsing/24.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/24.js.sub.headers": [
+ "b63c644ae9025bce231ff4d3be572e4f5968d1e1",
+ "support"
+ ],
+ "server-timing/resources/parsing/25.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/25.js.sub.headers": [
+ "8761b10c42d5117d5917cd2bafff717f0a5e0d3a",
+ "support"
+ ],
+ "server-timing/resources/parsing/26.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/26.js.sub.headers": [
+ "a25b4947fb552c63ffc4bebcde9748d8b5d3654e",
+ "support"
+ ],
+ "server-timing/resources/parsing/27.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/27.js.sub.headers": [
+ "6256524e6218d7f1da03ffde037c3808cd09ee64",
+ "support"
+ ],
+ "server-timing/resources/parsing/28.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/28.js.sub.headers": [
+ "15bf03440d58c800a88a9bbc493889803e2962e1",
+ "support"
+ ],
+ "server-timing/resources/parsing/29.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/29.js.sub.headers": [
+ "d61f4f751e96db5f3fb2668d581fb04442545adf",
+ "support"
+ ],
+ "server-timing/resources/parsing/3.js": [
+ "1bc5932490ce45826ee11e124924c9588b3e8c4d",
+ "support"
+ ],
+ "server-timing/resources/parsing/3.js.sub.headers": [
+ "e37b008d0de07fdd300f0fef181cfaaac0c2ac9f",
+ "support"
+ ],
+ "server-timing/resources/parsing/30.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/30.js.sub.headers": [
+ "68899f453cbe896880b91add876a2dcf0aa7862c",
+ "support"
+ ],
+ "server-timing/resources/parsing/31.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/31.js.sub.headers": [
+ "23aa6e0121b3efbd010187aef45ec1e343dcc6f8",
+ "support"
+ ],
+ "server-timing/resources/parsing/32.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/32.js.sub.headers": [
+ "13f8e002a56499f19d248968d4da2446c457818c",
+ "support"
+ ],
+ "server-timing/resources/parsing/33.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/33.js.sub.headers": [
+ "3d4b4717629e4564e7e86a8b98eeee76b4278e2e",
+ "support"
+ ],
+ "server-timing/resources/parsing/34.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/34.js.sub.headers": [
+ "b34910643944972a5fd3cd4323c3e460b764acd6",
+ "support"
+ ],
+ "server-timing/resources/parsing/35.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/35.js.sub.headers": [
+ "f9055d1f55a5fdb38691374bd7de69b45d979e27",
+ "support"
+ ],
+ "server-timing/resources/parsing/36.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/36.js.sub.headers": [
+ "87fe726634ad6dae4e348db74a6c64fa19929638",
+ "support"
+ ],
+ "server-timing/resources/parsing/37.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/37.js.sub.headers": [
+ "39fd3379982b21de04a3c280ba4fcdfe84a4e55d",
+ "support"
+ ],
+ "server-timing/resources/parsing/38.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/38.js.sub.headers": [
+ "0b4fa5ed0edc8378cc8ce4c482a49f8a02b8dbd2",
+ "support"
+ ],
+ "server-timing/resources/parsing/39.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/39.js.sub.headers": [
+ "19af60081837aa38b2d14bbe55f1210d3dd75e72",
+ "support"
+ ],
+ "server-timing/resources/parsing/4.js": [
+ "b45df4c8581d127f4738887a009611092e06fae9",
+ "support"
+ ],
+ "server-timing/resources/parsing/4.js.sub.headers": [
+ "3449afe167f6e32a27f682e79ba8aa19d3e5be64",
+ "support"
+ ],
+ "server-timing/resources/parsing/40.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/40.js.sub.headers": [
+ "d822691ba762df6d798567a2610e9973bca07236",
+ "support"
+ ],
+ "server-timing/resources/parsing/41.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/41.js.sub.headers": [
+ "b72a4f5360c93e53338c25ba40e9993859424159",
+ "support"
+ ],
+ "server-timing/resources/parsing/42.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/42.js.sub.headers": [
+ "973f84b410e397abf7123fe86e03b14684b5b0fb",
+ "support"
+ ],
+ "server-timing/resources/parsing/43.js": [
+ "dcf2d8477422cfa60c7eb5da68629925fcc653e2",
+ "support"
+ ],
+ "server-timing/resources/parsing/43.js.sub.headers": [
+ "d6fba3c154dce3d074e1e38c744e291a0c4f9e51",
+ "support"
+ ],
+ "server-timing/resources/parsing/44.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/44.js.sub.headers": [
+ "c447cfda7cf55ee2384842b45a604412e403d8ec",
+ "support"
+ ],
+ "server-timing/resources/parsing/45.js": [
+ "72dcb467c3d7fb4a2491a0ba68b612a4033738f3",
+ "support"
+ ],
+ "server-timing/resources/parsing/45.js.sub.headers": [
+ "ba5cdefb1d89a1ab8b0a556f15ce1f7b722e9a45",
+ "support"
+ ],
+ "server-timing/resources/parsing/46.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/46.js.sub.headers": [
+ "aa0c172f597b9b669fb32823e2dc99147a164387",
+ "support"
+ ],
+ "server-timing/resources/parsing/47.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/47.js.sub.headers": [
+ "34fbb72ad299b3f8da81a55d3357b29b3fb19077",
+ "support"
+ ],
+ "server-timing/resources/parsing/48.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/48.js.sub.headers": [
+ "c893b1918c565f30f6afeac72507636c1181fc6b",
+ "support"
+ ],
+ "server-timing/resources/parsing/49.js": [
+ "6c2c1b45ab69ed8b1da28849accaa69a99d07340",
+ "support"
+ ],
+ "server-timing/resources/parsing/49.js.sub.headers": [
+ "11e6ee5677c66ee62c1c973f5a4a455e178666ef",
+ "support"
+ ],
+ "server-timing/resources/parsing/5.js": [
+ "b45df4c8581d127f4738887a009611092e06fae9",
+ "support"
+ ],
+ "server-timing/resources/parsing/5.js.sub.headers": [
+ "d8b7e49b673a39e6028b8aeb6241a3be5fa79935",
+ "support"
+ ],
+ "server-timing/resources/parsing/50.js": [
+ "71068640ee55f176c283ce788237e26059c043c5",
+ "support"
+ ],
+ "server-timing/resources/parsing/50.js.sub.headers": [
+ "4e80dc4689ac1622f9df3cfde8f2667c0c334b14",
+ "support"
+ ],
+ "server-timing/resources/parsing/51.js": [
+ "1c6ca0aa58035fba39cfe8284c04468787149469",
+ "support"
+ ],
+ "server-timing/resources/parsing/51.js.sub.headers": [
+ "1ff4aed6798c6dfe7b22e11ffbd7db7fbe2e248f",
+ "support"
+ ],
+ "server-timing/resources/parsing/52.js": [
+ "d0a406b076d345dc36d1792781bd078fb9b65ef3",
+ "support"
+ ],
+ "server-timing/resources/parsing/52.js.sub.headers": [
+ "1191714a3f2cdb14c10d7b7f7637bb7fb331826d",
+ "support"
+ ],
+ "server-timing/resources/parsing/53.js": [
+ "235f1ee6973489be765e8edec753b94c9f6d5773",
+ "support"
+ ],
+ "server-timing/resources/parsing/53.js.sub.headers": [
+ "ce3c065722c2f84b4ea8c958465db0cbfac3046a",
+ "support"
+ ],
+ "server-timing/resources/parsing/54.js": [
+ "235f1ee6973489be765e8edec753b94c9f6d5773",
+ "support"
+ ],
+ "server-timing/resources/parsing/54.js.sub.headers": [
+ "4d2f64fb627d52fb965fba226648b0078f90e732",
+ "support"
+ ],
+ "server-timing/resources/parsing/55.js": [
+ "2209fc9eff24dc4f0d7df2f31e5911dd4e05d78d",
+ "support"
+ ],
+ "server-timing/resources/parsing/55.js.sub.headers": [
+ "735e9c9e7e9b4a54a8da1f1ed1893c67a0e5e66e",
+ "support"
+ ],
+ "server-timing/resources/parsing/56.js": [
+ "1bc5932490ce45826ee11e124924c9588b3e8c4d",
+ "support"
+ ],
+ "server-timing/resources/parsing/56.js.sub.headers": [
+ "e44253ff3485c86895c3b3bcf60633d73136a0a9",
+ "support"
+ ],
+ "server-timing/resources/parsing/57.js": [
+ "235f1ee6973489be765e8edec753b94c9f6d5773",
+ "support"
+ ],
+ "server-timing/resources/parsing/57.js.sub.headers": [
+ "653481a7bb1305cc776531b990651fd5570ddaed",
+ "support"
+ ],
+ "server-timing/resources/parsing/58.js": [
+ "3fddff4eee055bf54f23be4ddd0e277cb79d492d",
+ "support"
+ ],
+ "server-timing/resources/parsing/58.js.sub.headers": [
+ "9f9c4e085f0bdc083314fb97d4f485fd7ccf259c",
+ "support"
+ ],
+ "server-timing/resources/parsing/59.js": [
+ "63d1c9fc862e586f387e1715c47c14075b9dc39e",
+ "support"
+ ],
+ "server-timing/resources/parsing/59.js.sub.headers": [
+ "86c7827becd92238fde74e13321031e48240f8e0",
+ "support"
+ ],
+ "server-timing/resources/parsing/6.js": [
+ "1c6ca0aa58035fba39cfe8284c04468787149469",
+ "support"
+ ],
+ "server-timing/resources/parsing/6.js.sub.headers": [
+ "2810bd2697637785f251aacb3af4704fe3b612fe",
+ "support"
+ ],
+ "server-timing/resources/parsing/60.js": [
+ "63d1c9fc862e586f387e1715c47c14075b9dc39e",
+ "support"
+ ],
+ "server-timing/resources/parsing/60.js.sub.headers": [
+ "8bd1fc4b0ede3ae2d20ecaa2f1133b2a7951b48b",
+ "support"
+ ],
+ "server-timing/resources/parsing/61.js": [
+ "3560177cc96b27c6ca4dfd3f4755685f067a9c77",
+ "support"
+ ],
+ "server-timing/resources/parsing/61.js.sub.headers": [
+ "2cb76e965e4e10e84dc39f7a367171209a7f1c58",
+ "support"
+ ],
+ "server-timing/resources/parsing/62.js": [
+ "3560177cc96b27c6ca4dfd3f4755685f067a9c77",
+ "support"
+ ],
+ "server-timing/resources/parsing/62.js.sub.headers": [
+ "6ca23860d81e08d87342e5fdc0bdc1b191dfb427",
+ "support"
+ ],
+ "server-timing/resources/parsing/63.js": [
+ "5c07fca48386d2d35c248c2053a7cb426ade6b7b",
+ "support"
+ ],
+ "server-timing/resources/parsing/63.js.sub.headers": [
+ "4296079454e413eabe5e48799183d37955b25f14",
+ "support"
+ ],
+ "server-timing/resources/parsing/64.js": [
+ "df2fb9e4e7999d2bda0c6e435b541fa37a55c788",
+ "support"
+ ],
+ "server-timing/resources/parsing/64.js.sub.headers": [
+ "162b4c31d0a7894d2d16a8000694171132384a27",
+ "support"
+ ],
+ "server-timing/resources/parsing/65.js": [
+ "5c07fca48386d2d35c248c2053a7cb426ade6b7b",
+ "support"
+ ],
+ "server-timing/resources/parsing/65.js.sub.headers": [
+ "889218df84c44751603a94f889abd7f0d4275408",
+ "support"
+ ],
+ "server-timing/resources/parsing/66.js": [
+ "df2fb9e4e7999d2bda0c6e435b541fa37a55c788",
+ "support"
+ ],
+ "server-timing/resources/parsing/66.js.sub.headers": [
+ "95a5d28f5fc8519b09676ac1fd92bfae2d3fe211",
+ "support"
+ ],
+ "server-timing/resources/parsing/67.js": [
+ "1a6924ba411a7f92aef048336bd117ece499f90a",
+ "support"
+ ],
+ "server-timing/resources/parsing/67.js.sub.headers": [
+ "8c13333e069ade7cd299d89d4f4e49ea0cc13aa8",
+ "support"
+ ],
+ "server-timing/resources/parsing/68.js": [
+ "b5b95d8349cbbc3b92edb61891608b04d004527b",
+ "support"
+ ],
+ "server-timing/resources/parsing/68.js.sub.headers": [
+ "3267edb59ffdfcb7994cad0b0b82fbd1f96295e0",
+ "support"
+ ],
+ "server-timing/resources/parsing/69.js": [
+ "235f1ee6973489be765e8edec753b94c9f6d5773",
+ "support"
+ ],
+ "server-timing/resources/parsing/69.js.sub.headers": [
+ "70735c24c164159739a7d33353715910b7058266",
+ "support"
+ ],
+ "server-timing/resources/parsing/7.js": [
+ "266ee41ae7b440ab43e87a087d10fa2b1e193a8f",
+ "support"
+ ],
+ "server-timing/resources/parsing/7.js.sub.headers": [
+ "4f66fcaa07aaf41da5597d9a051768239cf9046d",
+ "support"
+ ],
+ "server-timing/resources/parsing/70.js": [
+ "1a6924ba411a7f92aef048336bd117ece499f90a",
+ "support"
+ ],
+ "server-timing/resources/parsing/70.js.sub.headers": [
+ "eadacef5c09ddfe284c1b04eb88d1ee7b58406b7",
+ "support"
+ ],
+ "server-timing/resources/parsing/71.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/71.js.sub.headers": [
+ "262f7940893d9dc71881c4dd05a3abc632e164a6",
+ "support"
+ ],
+ "server-timing/resources/parsing/72.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/72.js.sub.headers": [
+ "86acd52721c5aaa6ed6069f192e8be53e61fa691",
+ "support"
+ ],
+ "server-timing/resources/parsing/73.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/73.js.sub.headers": [
+ "3cd0b25e1eda63ec48390f3aeb5e7b62afe64dab",
+ "support"
+ ],
+ "server-timing/resources/parsing/74.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/74.js.sub.headers": [
+ "3a340394523d7772baa452e4c02f1b428898d9a7",
+ "support"
+ ],
+ "server-timing/resources/parsing/75.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/75.js.sub.headers": [
+ "7776357b71f9ff29156489833884bd9263db23b0",
+ "support"
+ ],
+ "server-timing/resources/parsing/76.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/76.js.sub.headers": [
+ "62fc9db1810ab0c4c4154f91195cdb29d3e6ac4f",
+ "support"
+ ],
+ "server-timing/resources/parsing/77.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/77.js.sub.headers": [
+ "3b60dd6d0bf7c97a468d8a05afcadd29ec769349",
+ "support"
+ ],
+ "server-timing/resources/parsing/78.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/78.js.sub.headers": [
+ "66b4011969e248d9ab872bea30776b5e7bd72dfb",
+ "support"
+ ],
+ "server-timing/resources/parsing/79.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/79.js.sub.headers": [
+ "9496c56d010e4652f3d0a0ff628abaadeb717c15",
+ "support"
+ ],
+ "server-timing/resources/parsing/8.js": [
+ "e30f08cfab17bcd0229ebbf0da701f65a193485b",
+ "support"
+ ],
+ "server-timing/resources/parsing/8.js.sub.headers": [
+ "4aa86aa36c632e297433b03a6e63516679ff2cfb",
+ "support"
+ ],
+ "server-timing/resources/parsing/80.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/80.js.sub.headers": [
+ "bc541f7873810c93ade3ad836a38c4bfe12b7bdb",
+ "support"
+ ],
+ "server-timing/resources/parsing/81.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/81.js.sub.headers": [
+ "5bc9a24481b1d2f242d6361cda38d7325c83d6e5",
+ "support"
+ ],
+ "server-timing/resources/parsing/82.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/82.js.sub.headers": [
+ "32d55b5dd32ade7283d69fcf242e757d3dc7eb8f",
+ "support"
+ ],
+ "server-timing/resources/parsing/83.js": [
+ "4b374f4e2751e3c75af68df671c0287e41d617ae",
+ "support"
+ ],
+ "server-timing/resources/parsing/83.js.sub.headers": [
+ "ba24e1d89104fb25d5100dfa0b38388ca19ee9c1",
+ "support"
+ ],
+ "server-timing/resources/parsing/9.js": [
+ "30695307f7a50b46a799f3cf6f5763a359acc0ce",
+ "support"
+ ],
+ "server-timing/resources/parsing/9.js.sub.headers": [
+ "6a8feff546c8564268b238e01a0470588b4739e7",
+ "support"
+ ],
+ "server-timing/server_timing_header-parsing.html": [
+ "15768941cac8f5adeed09e6d204715d5fa59e5aa",
+ "testharness"
+ ],
"server-timing/test_server_timing.html": [
- "2c8420d5bc6ac45923f0c5cbc43c6bd88caa877c",
+ "7c778ca856e5cff0bbc785f59c9ccf1ec86456fb",
"testharness"
],
"server-timing/test_server_timing.html.sub.headers": [
@@ -577701,7 +582003,7 @@
"support"
],
"svg/OWNERS": [
- "13652f4cb17762fe755e81d2a015493ad1a6bc11",
+ "09ddeebeb4f8ad8622d76143f276d90a1d9aebdc",
"support"
],
"svg/README.md": [
@@ -577709,7 +582011,7 @@
"support"
],
"svg/extensibility/foreignObject/properties.svg": [
- "946999ca1917a5069103c025197c2903ab0bae64",
+ "974affbb2c135c9aaa7a3f27687157b5e1250a9f",
"testharness"
],
"svg/extensibility/interfaces/foreignObject-graphics.svg": [
@@ -580064,6 +584366,46 @@
"e7e8508ebb527e97e1f4e289652121b1d070c219",
"reftest"
],
+ "svg/path/closepath/segment-completing-ref.svg": [
+ "67576a75312e20803e4a67a479ce9e8262ccb341",
+ "support"
+ ],
+ "svg/path/closepath/segment-completing.svg": [
+ "62c6ecf218173f1273cbd2bd12f01dcf666170a4",
+ "reftest"
+ ],
+ "svg/path/distance/pathLength-positive-ref.svg": [
+ "051786ae8a8510f97dec152a88541f8d16c6767f",
+ "support"
+ ],
+ "svg/path/distance/pathLength-positive.svg": [
+ "33dc24b00e6ad879519fcfd593179ee2c1903006",
+ "reftest"
+ ],
+ "svg/path/distance/pathLength-zero-ref.svg": [
+ "b47a9aa3a1a5901e97a5f92d056221b8882a2a19",
+ "support"
+ ],
+ "svg/path/distance/pathLength-zero.svg": [
+ "91a81a96729daca9e421cf37a8aeb61dc743a857",
+ "reftest"
+ ],
+ "svg/path/error-handling/bounding.svg": [
+ "83b6c27ecc4ae4394040e15eff96cd178e281994",
+ "testharness"
+ ],
+ "svg/path/error-handling/render-until-error-ref.svg": [
+ "d6b80a84ade1979ab19debe5bf80d2262c08b097",
+ "support"
+ ],
+ "svg/path/error-handling/render-until-error.svg": [
+ "9583661d708ffcd2baeb2eff2e8585f767e5c232",
+ "reftest"
+ ],
+ "svg/path/interfaces/SVGAnimatedPathData-removed.svg": [
+ "bcdadce009a8238a4326e36051876a10bccccbea",
+ "testharness"
+ ],
"svg/path/property/d-interpolation-discrete.svg": [
"6e27bfe4467b16b9e8c29bb66894bbb9dfbaf077",
"testharness"
@@ -580128,6 +584470,10 @@
"42ecd7bc94a3379d920687c79c12e2d3c55b9e98",
"testharness"
],
+ "svg/types/elements/SVGGeometryElement-rect.svg": [
+ "08237002915323f41dd5590ce4226f95ae79f285",
+ "testharness"
+ ],
"svg/types/scripted/SVGAnimatedEnumeration-SVGClipPathElement.html": [
"0f81d16badaade09929ca0b35faf89cc420ef199",
"testharness"
@@ -580760,6 +585106,90 @@
"22f2a05853efc4977d7c427f80898cd8671f3aaa",
"testharness"
],
+ "upgrade-insecure-requests/link-upgrade.sub.https.html": [
+ "0c7c3915c24e355f3353a242843c76bb17b13c62",
+ "testharness"
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html": [
+ "05d450051981b22ac2b9e903b60435ca695b3ad2",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html": [
+ "877348106949c192bd9eb0ce9c283e973d873ffd",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html": [
+ "41dc71d6369a07746a0151b16f2d2eb01029ccc6",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html": [
+ "eac4924c1057d4e5da7f8f128b7c7ee501b5f6e6",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html": [
+ "d02531c22a97a72d307b7dfb32c5f55f64ae0369",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html": [
+ "e90305f8a31486c4eea12415b7d04d731f17d1be",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html": [
+ "6510e3dc659975c1d4cd7826f683ca5d30b05afa",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html": [
+ "28f98b49860dcc8ba80cdd217adc15b3ed93be71",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html": [
+ "6c770a1da89f93c00a1ce22302dfbdddd4de6f99",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/dummy.html": [
+ "2409542664fbfec691cc4cc420a3a047524c4e22",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html": [
+ "d9a3b0b7aa254c929a89a75938c3b8115cfb7b39",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers": [
+ "658f2c2be22add1a5be72b1e19ba340d024a4832",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html": [
+ "d9a3b0b7aa254c929a89a75938c3b8115cfb7b39",
+ "support"
+ ],
+ "upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html": [
+ "ba4d17350d4e1fdb369e058240d4bb72b24f7175",
+ "support"
+ ],
"upgrade-insecure-requests/support/pass.png": [
"c06160c04726a02f1583caa0f380d632b6019179",
"support"
@@ -581085,7 +585515,7 @@
"manual"
],
"visual-viewport/viewport-resize-event-on-load-overflowing-page.html": [
- "cd13682091b00c182e570a87eac642613a3c05c2",
+ "2fe468f0e4460e201de84deeb1291e74e0757518",
"testharness"
],
"visual-viewport/viewport-scale-iframe-manual.html": [
@@ -583197,7 +587627,7 @@
"wdspec"
],
"webdriver/tests/sessions/new_session/invalid_capabilities.py": [
- "4caa08542f61ebe73c020d15d559704af037a97c",
+ "fcc36e5ca46cb8a9fb9927d5f618c7e9433a0260",
"wdspec"
],
"webdriver/tests/sessions/new_session/merge.py": [
@@ -583213,7 +587643,7 @@
"support"
],
"webdriver/tests/sessions/new_session/support/create.py": [
- "440d88462cc418e4d5e1df6f73074d3a722bd2fd",
+ "2c79b22324aa0c318522ac3930e314b4f2b32a86",
"support"
],
"webdriver/tests/sessions/status.py": [
@@ -583992,6 +588422,10 @@
"2a2e3f9ff0a5912fa260d7124f7f5a9c3862c533",
"testharness"
],
+ "webrtc/RTCPeerConnection-track-stats.https.html": [
+ "92fbaf0f4c596222975edae433725d616dac6082",
+ "testharness"
+ ],
"webrtc/RTCPeerConnectionIceEvent-constructor.html": [
"f273bd7fdfc883a15e8fb16fef5309061254c6cc",
"testharness"
@@ -584077,7 +588511,7 @@
"testharness"
],
"webrtc/RTCSctpTransport-maxMessageSize.html": [
- "95a1a701ff1ea46c782131dcd2012d3b4d5d57d2",
+ "4534a810f47cdca106f5300939acc36275222637",
"testharness"
],
"webrtc/RTCStats-helper.js": [
@@ -588344,6 +592778,10 @@
"13f9441d368248225df5adc3396a05061ba2924d",
"support"
],
+ "webxr/interfaces.https.html": [
+ "22e2278ab484ced51fd0a3880d2bfbf610650371",
+ "testharness"
+ ],
"webxr/resources/webxr_check.html": [
"3fa96e39a073bda2e813f0b2c2411c26b73d374e",
"support"
@@ -589444,6 +593882,26 @@
"395ebb855280779c248cc587141568fe0f089715",
"testharness"
],
+ "worklets/layout-worklet-credentials.https.html": [
+ "ffab9e5cdf8e3d1c759fa484512b24b45fca9cc8",
+ "testharness"
+ ],
+ "worklets/layout-worklet-csp.https.html": [
+ "217dfbcbc3f36128f3e984c44e20013cff3793dd",
+ "testharness"
+ ],
+ "worklets/layout-worklet-import.https.html": [
+ "33cf33b95b66020e10fef9515fce2956c27b75ba",
+ "testharness"
+ ],
+ "worklets/layout-worklet-referrer.https.html": [
+ "3de86e7b122d6e8403858279e280d7e6ea5af389",
+ "testharness"
+ ],
+ "worklets/layout-worklet-service-worker-interception.https.html": [
+ "4d3e8556924545768a0d59309a2460532c7192df",
+ "testharness"
+ ],
"worklets/paint-worklet-credentials.https.html": [
"fd0d5e0e34454755ddd693916476af809dfd9bb1",
"testharness"
@@ -589581,7 +594039,7 @@
"support"
],
"worklets/resources/worklet-test-utils.js": [
- "f05d557ba57bca35228a5ebbc418816cc3d01ee4",
+ "2984dfb09c88d7a1831a60d62c64c9b2ec2f6673",
"support"
],
"x-frame-options/deny.sub.html": [
@@ -590045,7 +594503,7 @@
"testharness"
],
"xhr/interfaces.html": [
- "a4c597d2bdb85e37ffe5f5ebba961d7f8a3aeb29",
+ "eb4babf67805d1d65bcbc44c6dcc1cb3ca793695",
"testharness"
],
"xhr/loadstart-and-state.html": [
@@ -591073,7 +595531,7 @@
"testharness"
],
"xhr/xmlhttprequest-sync-default-feature-policy.sub.html": [
- "a702c102155a1399c4a53477fc079d61b739976f",
+ "f83a057d1874e5e633c4529d3fac91249de652b3",
"testharness"
],
"xhr/xmlhttprequest-sync-not-hang-scriptloader-subframe.html": [
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js.ini
new file mode 100644
index 00000000000..125c7716ec1
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js.ini
@@ -0,0 +1,4 @@
+[ecdh_bits.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini
deleted file mode 100644
index 743a1f3083d..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[ecdh_bits.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js.ini
new file mode 100644
index 00000000000..bc636df94ac
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js.ini
@@ -0,0 +1,4 @@
+[ecdh_keys.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini
deleted file mode 100644
index 0549a4a14ef..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[ecdh_keys.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js.ini
new file mode 100644
index 00000000000..e54642475b0
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js.ini
@@ -0,0 +1,4 @@
+[hkdf.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini
deleted file mode 100644
index fca4b53e6ec..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[hkdf.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js.ini
new file mode 100644
index 00000000000..325daee1a61
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js.ini
@@ -0,0 +1,4 @@
+[pbkdf2.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini
deleted file mode 100644
index 5025f11f1bd..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[pbkdf2.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/digest/digest.https.worker.js.ini
index ee646a95f38..dfa563f1b05 100644
--- a/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/digest/digest.https.worker.js.ini
@@ -1,5 +1,4 @@
-[digest.worker.html]
- type: testharness
+[digest.https.worker.html]
[SHA-1 with empty source data]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js.ini
new file mode 100644
index 00000000000..664ebee2fcd
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js.ini
@@ -0,0 +1,4 @@
+[aes_cbc.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini
deleted file mode 100644
index f8f6ca05743..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[aes_cbc.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js.ini
new file mode 100644
index 00000000000..7a771aa25b3
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js.ini
@@ -0,0 +1,4 @@
+[aes_ctr.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini
deleted file mode 100644
index e1abfe885c7..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[aes_ctr.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js.ini
new file mode 100644
index 00000000000..c379308d01f
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js.ini
@@ -0,0 +1,4 @@
+[aes_gcm.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini
deleted file mode 100644
index c93c214c856..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[aes_gcm.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js.ini
new file mode 100644
index 00000000000..3ffc1d7c54f
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js.ini
@@ -0,0 +1,4 @@
+[rsa.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini
deleted file mode 100644
index 3e796f70f7c..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[rsa.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini
deleted file mode 100644
index 9cc87fa0988..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini
+++ /dev/null
@@ -1,275 +0,0 @@
-[idlharness.html]
- type: testharness
- [Crypto interface: attribute subtle]
- expected: FAIL
-
- [Crypto interface: crypto must inherit property "subtle" with the proper type (0)]
- expected: FAIL
-
- [CryptoKey interface: existence and properties of interface object]
- expected: FAIL
-
- [CryptoKey interface object length]
- expected: FAIL
-
- [CryptoKey interface object name]
- expected: FAIL
-
- [CryptoKey interface: existence and properties of interface prototype object]
- expected: FAIL
-
- [CryptoKey interface: existence and properties of interface prototype object's "constructor" property]
- expected: FAIL
-
- [CryptoKey interface: attribute type]
- expected: FAIL
-
- [CryptoKey interface: attribute extractable]
- expected: FAIL
-
- [CryptoKey interface: attribute algorithm]
- expected: FAIL
-
- [CryptoKey interface: attribute usages]
- expected: FAIL
-
- [SubtleCrypto interface: existence and properties of interface object]
- expected: FAIL
-
- [SubtleCrypto interface object length]
- expected: FAIL
-
- [SubtleCrypto interface object name]
- expected: FAIL
-
- [SubtleCrypto interface: existence and properties of interface prototype object]
- expected: FAIL
-
- [SubtleCrypto interface: existence and properties of interface prototype object's "constructor" property]
- expected: FAIL
-
- [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation sign(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation verify(AlgorithmIdentifier,CryptoKey,BufferSource,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation digest(AlgorithmIdentifier,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier,CryptoKey,AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier,CryptoKey,unsigned long)]
- expected: FAIL
-
- [SubtleCrypto interface: operation importKey(KeyFormat,[object Object\],[object Object\],AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation exportKey(KeyFormat,CryptoKey)]
- expected: FAIL
-
- [SubtleCrypto interface: operation wrapKey(KeyFormat,CryptoKey,CryptoKey,AlgorithmIdentifier)]
- expected: FAIL
-
- [SubtleCrypto interface: operation unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto must be primary interface of crypto.subtle]
- expected: FAIL
-
- [Stringification of crypto.subtle]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "encrypt" with the proper type (0)]
- expected: FAIL
-
- [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "decrypt" with the proper type (1)]
- expected: FAIL
-
- [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "sign" with the proper type (2)]
- expected: FAIL
-
- [SubtleCrypto interface: calling sign(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "verify" with the proper type (3)]
- expected: FAIL
-
- [SubtleCrypto interface: calling verify(AlgorithmIdentifier,CryptoKey,BufferSource,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "digest" with the proper type (4)]
- expected: FAIL
-
- [SubtleCrypto interface: calling digest(AlgorithmIdentifier,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "generateKey" with the proper type (5)]
- expected: FAIL
-
- [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey" with the proper type (6)]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier,CryptoKey,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits" with the proper type (7)]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier,CryptoKey,unsigned long) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "importKey" with the proper type (8)]
- expected: FAIL
-
- [SubtleCrypto interface: calling importKey(KeyFormat,[object Object\],[object Object\],AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "exportKey" with the proper type (9)]
- expected: FAIL
-
- [SubtleCrypto interface: calling exportKey(KeyFormat,CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey" with the proper type (10)]
- expected: FAIL
-
- [SubtleCrypto interface: calling wrapKey(KeyFormat,CryptoKey,CryptoKey,AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey" with the proper type (11)]
- expected: FAIL
-
- [SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [Crypto interface: crypto must inherit property "subtle" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation sign(AlgorithmIdentifier, CryptoKey, BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation digest(AlgorithmIdentifier, BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier, boolean, [object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)]
- expected: FAIL
-
- [SubtleCrypto interface: operation importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)]
- expected: FAIL
-
- [SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)]
- expected: FAIL
-
- [SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "sign(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling sign(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "digest(AlgorithmIdentifier, BufferSource)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling digest(AlgorithmIdentifier, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "generateKey(AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "exportKey(KeyFormat, CryptoKey)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling exportKey(KeyFormat, CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
- expected: FAIL
-
- [SubtleCrypto interface: calling unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.https.worker.js.ini
index a6e580bf852..e3db073d83c 100644
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/idlharness.https.worker.js.ini
@@ -1,12 +1,11 @@
-[idlharness.worker.html]
- type: testharness
+[idlharness.https.worker.html]
[ArrayBuffer interface: existence and properties of interface object]
expected: FAIL
[Crypto interface: attribute subtle]
expected: FAIL
- [Crypto interface: crypto must inherit property "subtle" with the proper type (0)]
+ [Crypto interface: crypto must inherit property "subtle" with the proper type]
expected: FAIL
[CryptoKey interface: existence and properties of interface object]
@@ -51,123 +50,6 @@
[SubtleCrypto interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
- [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation sign(AlgorithmIdentifier,CryptoKey,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation verify(AlgorithmIdentifier,CryptoKey,BufferSource,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation digest(AlgorithmIdentifier,BufferSource)]
- expected: FAIL
-
- [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier,CryptoKey,AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier,CryptoKey,unsigned long)]
- expected: FAIL
-
- [SubtleCrypto interface: operation importKey(KeyFormat,[object Object\],[object Object\],AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto interface: operation exportKey(KeyFormat,CryptoKey)]
- expected: FAIL
-
- [SubtleCrypto interface: operation wrapKey(KeyFormat,CryptoKey,CryptoKey,AlgorithmIdentifier)]
- expected: FAIL
-
- [SubtleCrypto interface: operation unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\])]
- expected: FAIL
-
- [SubtleCrypto must be primary interface of crypto.subtle]
- expected: FAIL
-
- [Stringification of crypto.subtle]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "encrypt" with the proper type (0)]
- expected: FAIL
-
- [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "decrypt" with the proper type (1)]
- expected: FAIL
-
- [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "sign" with the proper type (2)]
- expected: FAIL
-
- [SubtleCrypto interface: calling sign(AlgorithmIdentifier,CryptoKey,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "verify" with the proper type (3)]
- expected: FAIL
-
- [SubtleCrypto interface: calling verify(AlgorithmIdentifier,CryptoKey,BufferSource,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "digest" with the proper type (4)]
- expected: FAIL
-
- [SubtleCrypto interface: calling digest(AlgorithmIdentifier,BufferSource) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "generateKey" with the proper type (5)]
- expected: FAIL
-
- [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey" with the proper type (6)]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier,CryptoKey,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits" with the proper type (7)]
- expected: FAIL
-
- [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier,CryptoKey,unsigned long) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "importKey" with the proper type (8)]
- expected: FAIL
-
- [SubtleCrypto interface: calling importKey(KeyFormat,[object Object\],[object Object\],AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "exportKey" with the proper type (9)]
- expected: FAIL
-
- [SubtleCrypto interface: calling exportKey(KeyFormat,CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey" with the proper type (10)]
- expected: FAIL
-
- [SubtleCrypto interface: calling wrapKey(KeyFormat,CryptoKey,CryptoKey,AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey" with the proper type (11)]
- expected: FAIL
-
- [SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
- expected: FAIL
-
- [Crypto interface: crypto must inherit property "subtle" with the proper type]
- expected: FAIL
-
[SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
expected: FAIL
@@ -204,6 +86,12 @@
[SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])]
expected: FAIL
+ [SubtleCrypto must be primary interface of crypto.subtle]
+ expected: FAIL
+
+ [Stringification of crypto.subtle]
+ expected: FAIL
+
[SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.https.worker.js.ini
index 50b89ab7222..fae2ee1aab4 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.https.worker.js.ini
@@ -1,5 +1,4 @@
-[ec_importKey.worker.html]
- type: testharness
+[ec_importKey.https.worker.html]
[Good parameters: P-256 bits (spki, buffer(91), {name: ECDSA, namedCurve: P-256}, true, [\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.https.worker.js.ini
index 9f6f25dcca9..2fd43aa59ca 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.https.worker.js.ini
@@ -1,5 +1,4 @@
-[rsa_importKey.worker.html]
- type: testharness
+[rsa_importKey.https.worker.html]
[Good parameters: 1024 bits (spki, buffer(162), {hash: SHA-1, name: RSA-OAEP}, true, [encrypt\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js.ini
index d974812e8f6..6bd59d55e6a 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js.ini
@@ -1,5 +1,4 @@
-[symmetric_importKey.worker.html]
- type: testharness
+[symmetric_importKey.https.worker.html]
[Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.https.worker.js.ini
new file mode 100644
index 00000000000..13165c83f73
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.https.worker.js.ini
@@ -0,0 +1,4 @@
+[ecdsa.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini
deleted file mode 100644
index 856c25ade29..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[ecdsa.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.https.worker.js.ini
new file mode 100644
index 00000000000..73a0f727de1
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.https.worker.js.ini
@@ -0,0 +1,4 @@
+[hmac.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini
deleted file mode 100644
index 100da1c1d18..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[hmac.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js.ini
new file mode 100644
index 00000000000..0e3c8e7e9fc
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js.ini
@@ -0,0 +1,4 @@
+[rsa_pkcs.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini
deleted file mode 100644
index 1c96d8b79d9..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[rsa_pkcs.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js.ini
new file mode 100644
index 00000000000..319d9233d87
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js.ini
@@ -0,0 +1,4 @@
+[rsa_pss.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini
deleted file mode 100644
index 67beab0d8f2..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[rsa_pss.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js.ini
new file mode 100644
index 00000000000..be805a3f24e
--- /dev/null
+++ b/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js.ini
@@ -0,0 +1,4 @@
+[wrapKey_unwrapKey.https.worker.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini
deleted file mode 100644
index 350cc245816..00000000000
--- a/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[wrapKey_unwrapKey.worker.html]
- type: testharness
- [Untitled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-000.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-000.xht.ini
new file mode 100644
index 00000000000..fb274076bf4
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-000.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-000.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-001.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-001.xht.ini
new file mode 100644
index 00000000000..f71d075b3df
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-001.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-003.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-003.xht.ini
new file mode 100644
index 00000000000..48f477d036d
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-003.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-003.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-004.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-004.xht.ini
new file mode 100644
index 00000000000..faf827cccdb
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-004.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-004.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-007.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-007.xht.ini
new file mode 100644
index 00000000000..c006021a56a
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-007.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-007.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-008.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-008.xht.ini
new file mode 100644
index 00000000000..ec4af304cb4
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-008.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-008.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-019.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-019.xht.ini
new file mode 100644
index 00000000000..b32a0c68330
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-letter-selector-019.xht.ini
@@ -0,0 +1,2 @@
+[first-letter-selector-019.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-019.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-019.xht.ini
new file mode 100644
index 00000000000..b2ba32649d8
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-019.xht.ini
@@ -0,0 +1,2 @@
+[first-line-pseudo-019.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-020.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-020.xht.ini
new file mode 100644
index 00000000000..013dba5388f
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-020.xht.ini
@@ -0,0 +1,2 @@
+[first-line-pseudo-020.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-021.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-021.xht.ini
new file mode 100644
index 00000000000..5154b39f398
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/first-line-pseudo-021.xht.ini
@@ -0,0 +1,2 @@
+[first-line-pseudo-021.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/lang-selector-005.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/lang-selector-005.xht.ini
new file mode 100644
index 00000000000..d69bffd166e
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/lang-selector-005.xht.ini
@@ -0,0 +1,2 @@
+[lang-selector-005.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/lang-selector-006.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/lang-selector-006.xht.ini
new file mode 100644
index 00000000000..cc564d2ee4b
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/lang-selector-006.xht.ini
@@ -0,0 +1,2 @@
+[lang-selector-006.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/selectors/pseudo-006.xht.ini b/tests/wpt/metadata/css/CSS2/selectors/pseudo-006.xht.ini
new file mode 100644
index 00000000000..5711ca8dbeb
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/selectors/pseudo-006.xht.ini
@@ -0,0 +1,2 @@
+[pseudo-006.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/at-charset-002.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/at-charset-002.xht.ini
deleted file mode 100644
index 27f0f13e2d5..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/at-charset-002.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[at-charset-002.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/at-charset-003.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/at-charset-003.xht.ini
deleted file mode 100644
index c4be000564e..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/at-charset-003.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[at-charset-003.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/at-charset-004.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/at-charset-004.xht.ini
deleted file mode 100644
index 3810fc2cbb5..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/at-charset-004.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[at-charset-004.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/at-charset-005.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/at-charset-005.xht.ini
deleted file mode 100644
index b62d77d28bb..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/at-charset-005.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[at-charset-005.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/at-charset-006.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/at-charset-006.xht.ini
deleted file mode 100644
index 766ebc92d41..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/at-charset-006.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[at-charset-006.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/comments-005.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/comments-005.xht.ini
deleted file mode 100644
index 2dbde103d07..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/comments-005.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[comments-005.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/content-type-000.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/content-type-000.xht.ini
deleted file mode 100644
index d7149bb085e..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/content-type-000.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[content-type-000.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/ident-003.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/ident-003.xht.ini
deleted file mode 100644
index ab1272afba9..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/ident-003.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[ident-003.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/syntax/ident-020.xht.ini b/tests/wpt/metadata/css/CSS2/syntax/ident-020.xht.ini
deleted file mode 100644
index 0226043d1ed..00000000000
--- a/tests/wpt/metadata/css/CSS2/syntax/ident-020.xht.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[ident-020.xht]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/caption-side-applies-to-007.xht.ini b/tests/wpt/metadata/css/CSS2/tables/caption-side-applies-to-007.xht.ini
new file mode 100644
index 00000000000..fb449a5f070
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/caption-side-applies-to-007.xht.ini
@@ -0,0 +1,2 @@
+[caption-side-applies-to-007.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-001.xht.ini b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-001.xht.ini
new file mode 100644
index 00000000000..abddf3911b3
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-001.xht.ini
@@ -0,0 +1,2 @@
+[collapsing-border-model-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-003.xht.ini b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-003.xht.ini
new file mode 100644
index 00000000000..7fb8503eead
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-003.xht.ini
@@ -0,0 +1,2 @@
+[collapsing-border-model-003.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-004.xht.ini b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-004.xht.ini
new file mode 100644
index 00000000000..3b8a5b0dc8b
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-004.xht.ini
@@ -0,0 +1,2 @@
+[collapsing-border-model-004.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-007.xht.ini b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-007.xht.ini
new file mode 100644
index 00000000000..321f7ff4b22
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-007.xht.ini
@@ -0,0 +1,2 @@
+[collapsing-border-model-007.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-009.xht.ini b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-009.xht.ini
new file mode 100644
index 00000000000..762c5baed53
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/collapsing-border-model-009.xht.ini
@@ -0,0 +1,2 @@
+[collapsing-border-model-009.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/row-visibility-001.xht.ini b/tests/wpt/metadata/css/CSS2/tables/row-visibility-001.xht.ini
new file mode 100644
index 00000000000..723b6885faa
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/row-visibility-001.xht.ini
@@ -0,0 +1,2 @@
+[row-visibility-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/tables/row-visibility-002.xht.ini b/tests/wpt/metadata/css/CSS2/tables/row-visibility-002.xht.ini
new file mode 100644
index 00000000000..61fbc5acc76
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/tables/row-visibility-002.xht.ini
@@ -0,0 +1,2 @@
+[row-visibility-002.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-heights-000.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-heights-000.html.ini
index 3831f0146ff..297270704ff 100644
--- a/tests/wpt/metadata/css/css-flexbox/percentage-heights-000.html.ini
+++ b/tests/wpt/metadata/css/css-flexbox/percentage-heights-000.html.ini
@@ -6,12 +6,12 @@
[.flexbox 2]
expected: FAIL
- [.flexbox 3]
- expected: FAIL
-
[.flexbox 5]
expected: FAIL
[.flexbox 6]
expected: FAIL
+ [.flexbox 4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-heights-001.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-heights-001.html.ini
index e86530f2c96..785b94a7bb4 100644
--- a/tests/wpt/metadata/css/css-flexbox/percentage-heights-001.html.ini
+++ b/tests/wpt/metadata/css/css-flexbox/percentage-heights-001.html.ini
@@ -2,9 +2,6 @@
[.flexbox 2]
expected: FAIL
- [.flexbox 3]
- expected: FAIL
-
[.flexbox 4]
expected: FAIL
@@ -29,6 +26,9 @@
[.flexbox 12]
expected: FAIL
- [.flexbox 13]
+ [.flexbox 1]
+ expected: FAIL
+
+ [.flexbox 11]
expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/position-absolute-001.html.ini b/tests/wpt/metadata/css/css-flexbox/position-absolute-001.html.ini
index e0077cbfc6a..88274c494fe 100644
--- a/tests/wpt/metadata/css/css-flexbox/position-absolute-001.html.ini
+++ b/tests/wpt/metadata/css/css-flexbox/position-absolute-001.html.ini
@@ -1,16 +1,10 @@
[position-absolute-001.html]
- [.flexbox 1]
- expected: FAIL
-
[.flexbox 2]
expected: FAIL
[.flexbox 3]
expected: FAIL
- [.flexbox 4]
- expected: FAIL
-
[.flexbox 5]
expected: FAIL
@@ -26,18 +20,12 @@
[.flexbox 10]
expected: FAIL
- [.flexbox 11]
- expected: FAIL
-
[.flexbox 12]
expected: FAIL
[.flexbox 13]
expected: FAIL
- [.flexbox 14]
- expected: FAIL
-
[.flexbox 15]
expected: FAIL
@@ -56,9 +44,6 @@
[.flexbox 21]
expected: FAIL
- [.flexbox 22]
- expected: FAIL
-
[.flexbox 23]
expected: FAIL
@@ -80,9 +65,6 @@
[.flexbox 31]
expected: FAIL
- [.flexbox 32]
- expected: FAIL
-
[.flexbox 33]
expected: FAIL
@@ -128,9 +110,6 @@
[.flexbox 51]
expected: FAIL
- [.flexbox 52]
- expected: FAIL
-
[.flexbox 53]
expected: FAIL
@@ -182,18 +161,12 @@
[.flexbox 70]
expected: FAIL
- [.flexbox 71]
- expected: FAIL
-
[.flexbox 72]
expected: FAIL
[.flexbox 73]
expected: FAIL
- [.flexbox 74]
- expected: FAIL
-
[.flexbox 75]
expected: FAIL
@@ -212,18 +185,12 @@
[.flexbox 80]
expected: FAIL
- [.flexbox 81]
- expected: FAIL
-
[.flexbox 82]
expected: FAIL
[.flexbox 83]
expected: FAIL
- [.flexbox 84]
- expected: FAIL
-
[.flexbox 85]
expected: FAIL
@@ -239,18 +206,12 @@
[.flexbox 90]
expected: FAIL
- [.flexbox 91]
- expected: FAIL
-
[.flexbox 92]
expected: FAIL
[.flexbox 93]
expected: FAIL
- [.flexbox 94]
- expected: FAIL
-
[.flexbox 95]
expected: FAIL
@@ -269,9 +230,6 @@
[.flexbox 101]
expected: FAIL
- [.flexbox 102]
- expected: FAIL
-
[.flexbox 103]
expected: FAIL
@@ -293,9 +251,6 @@
[.flexbox 111]
expected: FAIL
- [.flexbox 112]
- expected: FAIL
-
[.flexbox 113]
expected: FAIL
@@ -314,3 +269,48 @@
[.flexbox 119]
expected: FAIL
+ [.flexbox 9]
+ expected: FAIL
+
+ [.flexbox 19]
+ expected: FAIL
+
+ [.flexbox 27]
+ expected: FAIL
+
+ [.flexbox 30]
+ expected: FAIL
+
+ [.flexbox 37]
+ expected: FAIL
+
+ [.flexbox 40]
+ expected: FAIL
+
+ [.flexbox 47]
+ expected: FAIL
+
+ [.flexbox 50]
+ expected: FAIL
+
+ [.flexbox 69]
+ expected: FAIL
+
+ [.flexbox 89]
+ expected: FAIL
+
+ [.flexbox 99]
+ expected: FAIL
+
+ [.flexbox 107]
+ expected: FAIL
+
+ [.flexbox 110]
+ expected: FAIL
+
+ [.flexbox 117]
+ expected: FAIL
+
+ [.flexbox 120]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-flexbox/position-absolute-002.html.ini b/tests/wpt/metadata/css/css-flexbox/position-absolute-002.html.ini
index de14e31ec4a..5f64104f3aa 100644
--- a/tests/wpt/metadata/css/css-flexbox/position-absolute-002.html.ini
+++ b/tests/wpt/metadata/css/css-flexbox/position-absolute-002.html.ini
@@ -1,7 +1,4 @@
[position-absolute-002.html]
- [.flexbox 1]
- expected: FAIL
-
[.flexbox 2]
expected: FAIL
@@ -23,3 +20,6 @@
[.flexbox 8]
expected: FAIL
+ [.flexbox 9]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/lh-rlh-on-root-001.html.ini b/tests/wpt/metadata/css/css-values/lh-rlh-on-root-001.html.ini
new file mode 100644
index 00000000000..2f0ac1423d2
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/lh-rlh-on-root-001.html.ini
@@ -0,0 +1,13 @@
+[lh-rlh-on-root-001.html]
+ [2lh in line-height on root]
+ expected: FAIL
+
+ [2rlh in line-height on root]
+ expected: FAIL
+
+ [2lh in font-size on root]
+ expected: FAIL
+
+ [2rlh in font-size on root]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-values/lh-unit-001.html.ini b/tests/wpt/metadata/css/css-values/lh-unit-001.html.ini
new file mode 100644
index 00000000000..b53f95bdbb4
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/lh-unit-001.html.ini
@@ -0,0 +1,2 @@
+[lh-unit-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-values/lh-unit-002.html.ini b/tests/wpt/metadata/css/css-values/lh-unit-002.html.ini
new file mode 100644
index 00000000000..bad542144c5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-values/lh-unit-002.html.ini
@@ -0,0 +1,2 @@
+[lh-unit-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/fetch/security/redirect-to-url-with-credentials.https.html.ini b/tests/wpt/metadata/fetch/security/redirect-to-url-with-credentials.https.html.ini
new file mode 100644
index 00000000000..f903b9d7fa3
--- /dev/null
+++ b/tests/wpt/metadata/fetch/security/redirect-to-url-with-credentials.https.html.ini
@@ -0,0 +1,4 @@
+[redirect-to-url-with-credentials.https.html]
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/usvstring-reflection.html.ini b/tests/wpt/metadata/html/dom/usvstring-reflection.html.ini
index 17ebf0277ff..1e3ff756963 100644
--- a/tests/wpt/metadata/html/dom/usvstring-reflection.html.ini
+++ b/tests/wpt/metadata/html/dom/usvstring-reflection.html.ini
@@ -20,3 +20,6 @@
[Document URLs: unpaired surrogate codepoint should be replaced with U+FFFD]
expected: FAIL
+ [location.href : unpaired surrogate codepoint should be replaced with U+FFFD]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html.ini
new file mode 100644
index 00000000000..ccaf4df2de3
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html.ini
@@ -0,0 +1,7 @@
+[conditionally-block-rendering-on-link-media-attr.html]
+ [Only the style sheet loaded via a link element whose media attribute matches the environment should block following script execution]
+ expected: FAIL
+
+ [Both style sheets loaded via the link elements should be registered as style sheets for the document after 2 seconds]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/mozilla-sync b/tests/wpt/metadata/mozilla-sync
index 48dce5e5051..5ae6f54c5e9 100644
--- a/tests/wpt/metadata/mozilla-sync
+++ b/tests/wpt/metadata/mozilla-sync
@@ -1,2 +1,2 @@
-local: 9187c9a093860d9f3c31b5a5f402458aa4a607cb
-upstream: 1b93a7d98bc4849fa8f365d9bd13fb2a0448c6e1
+local: 1f6a864ab5372fe4f59b1a4c3db7cf8e7a79b06d
+upstream: 08e864fd23048d707cc42bed8538e644d8dec950
diff --git a/tests/wpt/metadata/performance-timeline/po-takeRecords.html.ini b/tests/wpt/metadata/performance-timeline/po-takeRecords.html.ini
new file mode 100644
index 00000000000..7ea09b3295f
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/po-takeRecords.html.ini
@@ -0,0 +1,4 @@
+[po-takeRecords.html]
+ [Test PerformanceObserver's takeRecords()]
+ expected: FAIL
+
diff --git a/tests/wpt/web-platform-tests/.travis.yml b/tests/wpt/web-platform-tests/.travis.yml
index f5db6cac09e..287c6337cbd 100644
--- a/tests/wpt/web-platform-tests/.travis.yml
+++ b/tests/wpt/web-platform-tests/.travis.yml
@@ -87,7 +87,7 @@ matrix:
apt:
packages:
- libnss3-tools
- env: JOB=wpt_integration TOXENV=py27 SCRIPT=tools/ci/ci_wpt.sh
+ env: JOB=wpt_integration TOXENV=py27,py27-flake8 SCRIPT=tools/ci/ci_wpt.sh
exclude:
- env: # exclude empty env from the top-level above
allow_failures:
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/common.js b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/common.js
index cd2a801994c..4e5b9a88833 100644
--- a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/common.js
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/common.js
@@ -38,7 +38,8 @@ function makeVideo() {
video.oncanplaythrough = function() {
resolve(video);
};
- video.src = "/images/pattern.ogv";
+ video.onerror = reject;
+ video.src = getVideoURI("/images/pattern");
});
}
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
index 98b656e78b4..d527b4c2adb 100644
--- a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
@@ -4,6 +4,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
+<script src="/common/media.js"></script>
<script src="common.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body>
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
index 1fe71856fc4..12f9974a687 100644
--- a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
@@ -1,6 +1,7 @@
<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
<script src="common.js"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/FileAPI/file/File-constructor.html b/tests/wpt/web-platform-tests/FileAPI/file/File-constructor.html
index 9c1a940662a..646ed99c212 100644
--- a/tests/wpt/web-platform-tests/FileAPI/file/File-constructor.html
+++ b/tests/wpt/web-platform-tests/FileAPI/file/File-constructor.html
@@ -47,7 +47,7 @@ test_first_argument(["bits", new Blob(["bits"]), new Blob(), new Uint8Array([0x5
test_first_argument([12], 2, "Number in fileBits");
test_first_argument([[1,2,3]], 5, "Array in fileBits");
test_first_argument([{}], 15, "Object in fileBits"); // "[object Object]"
-test_first_argument([document], 21, "HTMLDocument in fileBits"); // "[object HTMLDocument]"
+test_first_argument([document.body], 24, "HTMLBodyElement in fileBits"); // "[object HTMLBodyElement]"
test_first_argument([to_string_obj], 8, "Object with toString in fileBits");
test_first_argument({[Symbol.iterator]() {
let i = 0;
@@ -88,7 +88,7 @@ test_second_argument("dummy/foo", "dummy:foo", "Using special character in fileN
test_second_argument(null, "null", "Using null fileName");
test_second_argument(1, "1", "Using number fileName");
test_second_argument('', '', "Using empty string fileName");
-test_second_argument(document, '[object HTMLDocument]', "Using object fileName");
+test_second_argument(document.body, '[object HTMLBodyElement]', "Using object fileName");
// testing the third argument
[
diff --git a/tests/wpt/web-platform-tests/FileAPI/url/sandboxed-iframe.html b/tests/wpt/web-platform-tests/FileAPI/url/sandboxed-iframe.html
index e7a8a15daa9..3eca08da8a4 100644
--- a/tests/wpt/web-platform-tests/FileAPI/url/sandboxed-iframe.html
+++ b/tests/wpt/web-platform-tests/FileAPI/url/sandboxed-iframe.html
@@ -9,7 +9,6 @@
<script>
const iframe_scripts = [
- '/resources/testharness.js',
'resources/fetch-tests.js',
'url-format.any.js',
'url-with-xhr.any.js',
@@ -18,6 +17,8 @@ const iframe_scripts = [
];
let html = '<!doctype html>\n<meta charset="utf-8">\n<body>\n';
+html = html + '<script src="/resources/testharness.js"></' + 'script>\n';
+html = html + '<script>setup({"explicit_timeout": true});</' + 'script>\n';
for (const script of iframe_scripts)
html = html + '<script src="' + script + '"></' + 'script>\n';
@@ -27,4 +28,4 @@ frame.setAttribute('style', 'display:none;');
fetch_tests_from_window(frame.contentWindow);
-</script> \ No newline at end of file
+</script>
diff --git a/tests/wpt/web-platform-tests/FileAPI/url/url-format.any.js b/tests/wpt/web-platform-tests/FileAPI/url/url-format.any.js
index 88b82ce9b67..d485bfaac61 100644
--- a/tests/wpt/web-platform-tests/FileAPI/url/url-format.any.js
+++ b/tests/wpt/web-platform-tests/FileAPI/url/url-format.any.js
@@ -2,7 +2,7 @@ const blob = new Blob(['test']);
const file = new File(['test'], 'name');
test(() => {
- const url_count = 10000;
+ const url_count = 5000;
let list = [];
for (let i = 0; i < url_count; ++i)
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js
index 8ff0ac3053c..8ff0ac3053c 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js
index 488d60216fc..488d60216fc 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js
index b98b0f3502b..b98b0f3502b 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/hkdf.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js
index 1ab68d29efc..1ab68d29efc 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/derive_bits_keys/pbkdf2.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.https.worker.js
index 9b1072e1dd8..9b1072e1dd8 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js
index c0c0395fc32..c0c0395fc32 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js
index 6577525ee21..6577525ee21 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js
index 7a14b69a752..7a14b69a752 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js
index b0163262af9..b0163262af9 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.html b/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.html
deleted file mode 100644
index 53faef26d4d..00000000000
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<meta charset=utf-8>
-<title>IDL check of WebCrypto</title>
-<link rel="help" href="https://w3c.github.io/webcrypto/Overview.html#crypto-interface">
-
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/resources/WebIDLParser.js></script>
-<script src=/resources/idlharness.js></script>
-</head>
-<body>
-
-<h1 class="instructions">Description</h1>
-
-<p class="instructions">This test verifies that the implementations of the WebCrypto API match with its WebIDL definition.</p>
-
-<div id='log'></div>
-
-<script>
-var file_input;
-setup(function() {
- var idl_array = new IdlArray();
-
- var request = new XMLHttpRequest();
- request.open("GET", "WebCryptoAPI.idl");
- request.send();
- request.onload = function() {
- var idls = request.responseText;
-
- idl_array.add_idls(idls);
-
- idl_array.add_objects({"Crypto":["crypto"], "SubtleCrypto":["crypto.subtle"]});
-
- idl_array.test();
- done();
- };
-}, {explicit_done: true});
-</script>
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.html b/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.html
index 53faef26d4d..c4fd0f34092 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.html
@@ -24,7 +24,7 @@ setup(function() {
var idl_array = new IdlArray();
var request = new XMLHttpRequest();
- request.open("GET", "WebCryptoAPI.idl");
+ request.open("GET", "../interfaces/WebCryptoAPI.idl");
request.send();
request.onload = function() {
var idls = request.responseText;
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.worker.js
index ba033014e8f..b4bbdda4b29 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/idlharness.https.worker.js
@@ -2,7 +2,7 @@ importScripts("/resources/testharness.js");
importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
var request = new XMLHttpRequest();
-request.open("GET", "WebCryptoAPI.idl");
+request.open("GET", "../interfaces/WebCryptoAPI.idl");
request.send();
request.onload = function() {
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.https.worker.js
index 698df52e9d3..698df52e9d3 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/ec_importKey.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.https.worker.js
index 3b2435be010..3b2435be010 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js
index bedd082da49..bedd082da49 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.https.worker.js
index f379d466784..f379d466784 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/ecdsa.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.https.worker.js
index 79d8f21d730..79d8f21d730 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/hmac.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js
index 6b4dbee7987..6b4dbee7987 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js
index fdf7b998d95..fdf7b998d95 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js
index 4cf813ba5bf..4cf813ba5bf 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-disabled-by-feature-policy.https.html
index d849db13359..9476efb6a0f 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Accelerometer Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 7306ed58ce6..aa8ea10eb0b 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Accelerometer Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html
index 1ee0f42a510..860a027b55b 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Accelerometer Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy.https.html
index 6dc33c829ca..889047a0703 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Accelerometer Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html
index fddbca0f5bb..bf458529e84 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Accelerometer Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
index 2a9bc543cdf..9563270fcda 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
@@ -11,5 +11,6 @@
runGenericSensorTests(Accelerometer);
runGenericSensorTests(GravitySensor);
+runGenericSensorTests(LinearAccelerationSensor);
</script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer_insecure_context.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer_insecure_context.html
index 96eeef2daf7..ff1f0832c31 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer_insecure_context.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer_insecure_context.html
@@ -7,7 +7,7 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/generic-sensor/generic-sensor-tests.js"></script>
<div id="log"></div>
-<h2>Precondition</h2>
+<h2>Note:</h2>
<ol>
<li>
Run test in an insecure context, e.g. http://example.com/.
@@ -17,5 +17,6 @@
runGenericSensorInsecureContext("Accelerometer");
runGenericSensorInsecureContext("GravitySensor");
+runGenericSensorInsecureContext("LinearAccelerationSensor");
</script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer_onerror-manual.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer_onerror-manual.https.html
index 8778693ccb2..f69b1b6ce5c 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer_onerror-manual.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer_onerror-manual.https.html
@@ -17,5 +17,6 @@
runGenericSensorOnerror(Accelerometer);
runGenericSensorOnerror(GravitySensor);
+runGenericSensorOnerror(LinearAccelerationSensor);
</script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index f5d4b0fdde8..84bee557186 100644
--- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AmbientLightSensor Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html
index 13de3f8b4ee..a9810128956 100644
--- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AmbientLightSensor Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html
index f2c2c3bbae1..e4ce2566bf0 100644
--- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AmbientLightSensor Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html
index 33d36cb44e7..bb2c4a61841 100644
--- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AmbientLightSensor Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js b/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js
index de3846b6cbc..ed7f81ad9ff 100644
--- a/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js
+++ b/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js
@@ -39,6 +39,10 @@ var emptyFormDataTest = { id: "EmptyFormData", data: CreateEmptyFormDataPayload(
var smallFormDataTest = { id: "SmallFormData", data: CreateFormDataFromPayload(smallPayload) };
var mediumFormDataTest = { id: "MediumFormData", data: CreateFormDataFromPayload(mediumPayload) };
var largeFormDataTest = { id: "LargeFormData", data: CreateFormDataFromPayload(largePayload) };
+var smallSafeContentTypeEncodedTest = { id: "SmallSafeContentTypeEncoded", data: new Blob([smallPayload], { type: 'application/x-www-form-urlencoded' }) };
+var smallSafeContentTypeFormTest = { id: "SmallSafeContentTypeForm", data: new FormData() };
+var smallSafeContentTypeTextTest = { id: "SmallSafeContentTypeText", data: new Blob([smallPayload], { type: 'text/plain' }) };
+var smallCORSContentTypeTextTest = { id: "SmallCORSContentTypeText", data: new Blob([smallPayload], { type: 'text/html' }) };
// We don't test maxFormData because the extra multipart separators make it difficult to
// calculate a maxPayload.
@@ -57,7 +61,9 @@ var allTests = [].concat(stringTests, stringMaxTest, blobTests, blobMaxTest, buf
// This special cross section of test cases is meant to provide a slimmer but reasonably-
// representative set of tests for parameterization across variables (e.g. redirect codes,
// cors modes, etc.)
-var sampleTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, smallBlobTest, smallBufferSourceTest, smallFormDataTest];
+var sampleTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, smallBlobTest, smallBufferSourceTest, smallFormDataTest, smallSafeContentTypeEncodedTest, smallSafeContentTypeFormTest, smallSafeContentTypeTextTest];
+
+var preflightTests = [smallCORSContentTypeTextTest];
// Build a test lookup table, which is useful when instructing a web worker or an iframe
// to run a test, so that we don't have to marshal the entire test case across a process boundary.
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js b/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js
index ddfdfbfa0a2..f4bccf177e3 100644
--- a/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js
+++ b/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js
@@ -38,4 +38,30 @@
runTests(sampleTests);
});
+// Now test a cross-origin request that doesn't use a safelisted Content-Type and ensure
+// we are applying the proper restrictions. Since a non-safelisted Content-Type request
+// header is used there should be a preflight/options request and we should only succeed
+// send the payload if the proper CORS headers are used.
+{
+ // Implement the self.buildId extension to identify the parameterized
+ // test in the report.
+ self.buildId = function (baseId) {
+ return `${baseId}-PREFLIGHT-ALLOW`;
+ };
+
+ // Implement the self.buildBaseUrl and self.buildTargetUrl extensions
+ // to change the target URL to use a cross-origin domain name.
+ self.buildBaseUrl = function (baseUrl) {
+ return "http://{{domains[www]}}:{{ports[http][0]}}";
+ };
+
+ // Implement the self.buildTargetUrl extension to append a directive
+ // to the handler, that it should return CORS headers for the preflight we expect.
+ self.buildTargetUrl = function (targetUrl) {
+ return `${targetUrl}&origin=http://{{host}}:{{ports[http][0]}}&credentials=true&preflightExpected=true`;
+ }
+
+ runTests(preflightTests);
+}
+
done(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/beacon/resources/beacon.py b/tests/wpt/web-platform-tests/beacon/resources/beacon.py
index afa522a2a91..5f2553d3c4d 100644
--- a/tests/wpt/web-platform-tests/beacon/resources/beacon.py
+++ b/tests/wpt/web-platform-tests/beacon/resources/beacon.py
@@ -60,40 +60,52 @@ def main(request, response):
# with the unique session id, in order to retrieve a range of results
# later knowing the index range.
test_idx = request.GET.first("tidx")
-
- test_data_key = build_stash_key(session_id, test_idx)
test_data = { "id": test_id, "error": None }
- payload = ""
- if "Content-Type" in request.headers and \
- "form-data" in request.headers["Content-Type"]:
- if "payload" in request.POST:
- # The payload was sent as a FormData.
- payload = request.POST.first("payload")
+ # Only store the actual POST requests, not any preflight/OPTIONS requests we may get.
+ if request.method == "POST":
+ test_data_key = build_stash_key(session_id, test_idx)
+
+ payload = ""
+ if "Content-Type" in request.headers and \
+ "form-data" in request.headers["Content-Type"]:
+ if "payload" in request.POST:
+ # The payload was sent as a FormData.
+ payload = request.POST.first("payload")
+ else:
+ # A FormData was sent with an empty payload.
+ pass
else:
- # A FormData was sent with an empty payload.
- pass
- else:
- # The payload was sent as either a string, Blob, or BufferSource.
- payload = request.body
-
- payload_parts = filter(None, payload.split(":"))
- if len(payload_parts) > 0:
- payload_size = int(payload_parts[0])
-
- # Confirm the payload size sent matches with the number of characters sent.
- if payload_size != len(payload_parts[1]):
- test_data["error"] = "expected %d characters but got %d" % (payload_size, len(payload_parts[1]))
+ # The payload was sent as either a string, Blob, or BufferSource.
+ payload = request.body
+
+ payload_parts = filter(None, payload.split(":"))
+ if len(payload_parts) > 0:
+ payload_size = int(payload_parts[0])
+
+ # Confirm the payload size sent matches with the number of characters sent.
+ if payload_size != len(payload_parts[1]):
+ test_data["error"] = "expected %d characters but got %d" % (payload_size, len(payload_parts[1]))
+ else:
+ # Confirm the payload contains the correct characters.
+ for i in range(0, payload_size):
+ if payload_parts[1][i] != "*":
+ test_data["error"] = "expected '*' at index %d but got '%s''" % (i, payload_parts[1][i])
+ break
+
+ # Store the result in the stash so that it can be retrieved
+ # later with a 'stat' command.
+ request.server.stash.put(test_data_key, test_data)
+ elif request.method == "OPTIONS":
+ # If we expect a preflight, then add the cors headers we expect, otherwise log an error as we shouldn't
+ # send a preflight for all requests.
+ if "preflightExpected" in request.GET:
+ response.headers.set("Access-Control-Allow-Headers", "content-type")
+ response.headers.set("Access-Control-Allow-Methods", "POST")
else:
- # Confirm the payload contains the correct characters.
- for i in range(0, payload_size):
- if payload_parts[1][i] != "*":
- test_data["error"] = "expected '*' at index %d but got '%s''" % (i, payload_parts[1][i])
- break
-
- # Store the result in the stash so that it can be retrieved
- # later with a 'stat' command.
- request.server.stash.put(test_data_key, test_data)
+ test_data_key = build_stash_key(session_id, test_idx)
+ test_data["error"] = "Preflight not expected."
+ request.server.stash.put(test_data_key, test_data)
elif command == "stat":
test_idx_min = int(request.GET.first("tidx_min"))
test_idx_max = int(request.GET.first("tidx_max"))
diff --git a/tests/wpt/web-platform-tests/bluetooth/README.md b/tests/wpt/web-platform-tests/bluetooth/README.md
index 593967ee089..869dd4af446 100644
--- a/tests/wpt/web-platform-tests/bluetooth/README.md
+++ b/tests/wpt/web-platform-tests/bluetooth/README.md
@@ -10,3 +10,39 @@ The Chromium implementation is provided by
`../resources/chromium/web-bluetooth-test.js`.
[Web Bluetooth Testing API]: https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/
+
+# Generated gen-* files from generator.py
+
+`generator.py` builds `gen-*.html` tests using templates in
+`script-tests/*/*.js`.
+
+The subdirectory structure in `bluetooth/script-test/*` is recreated into
+`bluetooth/*`. The generator expands each CALL function from templates
+into new leaf directories and files.
+
+Example:
+
+`script-tests/server/get-same-object.js` contains:
+
+```
+gattServer.CALLS([
+ getPrimaryService('heart_rate')|
+ getPrimaryServices()|
+ getPrimaryServices('heart_rate')[UUID]]),
+```
+
+Generating:
+
+```
+server/getPrimaryService/gen-get-same-object.html
+server/getPrimaryServices/gen-get-same-object.html
+server/getPrimaryServices/gen-get-same-object-with-uuid.html
+```
+
+Usage:
+
+```
+$ python generate.py
+```
+
+More details documented in `generate.py`. \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.html
new file mode 100644
index 00000000000..d20d435999f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'HeartRate device properties';
+
+bluetooth_test(() => getHealthThermometerService()
+ .then(({service}) => Promise.all([
+ service.getCharacteristic('temperature_measurement'),
+ service.getCharacteristic('measurement_interval')]))
+ .then(([temperature_measurement, measurement_interval]) => {
+ let tm_expected_properties =
+ new TestCharacteristicProperties(['indicate']);
+ assert_properties_equal(temperature_measurement.properties,
+ tm_expected_properties);
+
+ let mi_expected_properties =
+ new TestCharacteristicProperties(['read', 'write', 'indicate']);
+ assert_properties_equal(measurement_interval.properties,
+ mi_expected_properties);
+ }), test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html
new file mode 100644
index 00000000000..02aaeccb022
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.getDescriptor(user_description.name), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html
new file mode 100644
index 00000000000..52b39c1e0cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html
@@ -0,0 +1,39 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getDescriptor should return the same object.';
+let characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic} = _))
+ .then(() => Promise.all([
+ characteristic.getDescriptor(user_description.alias),
+ characteristic.getDescriptor(user_description.name),
+ characteristic.getDescriptor(user_description.uuid)
+ ]))
+ .then(descriptors_arrays => {
+ assert_true(descriptors_arrays.length > 0)
+
+ // Convert to arrays if necessary.
+ for (let i = 0; i < descriptors_arrays.length; i++) {
+ descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
+ }
+
+ for (let i = 1; i < descriptors_arrays.length; i++) {
+ assert_equals(descriptors_arrays[0].length,
+ descriptors_arrays[i].length);
+ }
+
+ let base_set = new Set(descriptors_arrays[0]);
+ for (let descriptors of descriptors_arrays) {
+ descriptors.forEach(descriptor => assert_true(base_set.has(descriptor)));
+ }
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html
new file mode 100644
index 00000000000..c00d4cf5783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(user_description.name), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html
new file mode 100644
index 00000000000..a29548f3656
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.getDescriptors(), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html
new file mode 100644
index 00000000000..20df1d08002
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html
@@ -0,0 +1,39 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getDescriptors should return the same object.';
+let characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic} = _))
+ .then(() => Promise.all([
+ characteristic.getDescriptors(user_description.alias),
+ characteristic.getDescriptors(user_description.name),
+ characteristic.getDescriptors(user_description.uuid)
+ ]))
+ .then(descriptors_arrays => {
+ assert_true(descriptors_arrays.length > 0)
+
+ // Convert to arrays if necessary.
+ for (let i = 0; i < descriptors_arrays.length; i++) {
+ descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
+ }
+
+ for (let i = 1; i < descriptors_arrays.length; i++) {
+ assert_equals(descriptors_arrays[0].length,
+ descriptors_arrays[i].length);
+ }
+
+ let base_set = new Set(descriptors_arrays[0]);
+ for (let descriptors of descriptors_arrays) {
+ descriptors.forEach(descriptor => assert_true(base_set.has(descriptor)));
+ }
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.html
new file mode 100644
index 00000000000..35f5ee974fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic is removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.remove())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.startNotifications(),
+ expected,
+ 'Characteristic got removed.')),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html
new file mode 100644
index 00000000000..c0d4328a0e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Add multiple event listeners then readValue().';
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.setNextReadResponse(GATT_SUCCESS, [0,1,2]))
+ .then(() => assert_promise_resolves_after_event(
+ characteristic,
+ 'readValue',
+ 'characteristicvaluechanged',
+ 3 /* attach 3 listeners */))
+ .then(results => {
+ let read_value = new Uint8Array(results[0].buffer);
+ let event_values = results.slice(1).map(v => new Uint8Array(v.buffer));
+ for (let event_value of event_values) {
+ assert_equals(event_value.buffer, read_value.buffer);
+ assert_array_equals(event_value, read_value);
+ }
+ }), test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.html
new file mode 100644
index 00000000000..3c963c3c9fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.remove())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.readValue(),
+ expected,
+ 'Characteristic got removed.')),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.html
new file mode 100644
index 00000000000..a217bdd36aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Reading a characteristic should fire an event.';
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.setNextReadResponse(
+ GATT_SUCCESS, [0, 1, 2]))
+ .then(() => assert_promise_resolves_after_event(
+ characteristic,
+ 'readValue',
+ 'characteristicvaluechanged'))
+ .then(results => new Promise(resolve => {
+ let read_value = new Uint8Array(results[0].buffer);
+ let event_value = new Uint8Array(results[1].buffer);
+ assert_equals(event_value.buffer, read_value.buffer);
+ assert_array_equals(event_value, read_value);
+ resolve();
+ })), test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html
new file mode 100644
index 00000000000..a80bccfe469
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.readValue(), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.html
new file mode 100644
index 00000000000..4dca3ed5a57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'A read request succeeds and returns the characteristic\'s ' +
+ 'value.';
+const EXPECTED_VALUE = [0, 1, 2];
+
+let characteristic, fake_characteristic;
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.setNextReadResponse(
+ GATT_SUCCESS,
+ EXPECTED_VALUE))
+ .then(() => characteristic.readValue())
+ .then(value => assert_array_equals(
+ new Uint8Array(value.buffer),
+ EXPECTED_VALUE)),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.html
new file mode 100644
index 00000000000..11bb9391b62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Succesful read should update characteristic.value';
+const EXPECTED_VALUE = [0, 1, 2];
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => assert_equals(characteristic.value, null))
+ .then(() => fake_characteristic.setNextReadResponse(
+ GATT_SUCCESS, EXPECTED_VALUE))
+ .then(() => characteristic.readValue())
+ .then(() => assert_array_equals(
+ new Uint8Array(characteristic.value.buffer),
+ EXPECTED_VALUE)),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html
new file mode 100644
index 00000000000..d9a9594320d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.startNotifications(), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.html
new file mode 100644
index 00000000000..f79c21916fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => fake_characteristic.remove())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.writeValue(new ArrayBuffer(1 /* length */)),
+ expected,
+ 'Characteristic got removed.')),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html
new file mode 100644
index 00000000000..16520704630
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html
@@ -0,0 +1,25 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.writeValue(new Uint8Array(1)), expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.html
new file mode 100644
index 00000000000..f2cf577e4f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'A regular write request to a writable characteristic ' +
+ 'should succeed.';
+let typed_array = Uint8Array.of(1, 2);
+let array_buffer = Uint8Array.of(3, 4).buffer;
+let data_view = new DataView(new ArrayBuffer(2));
+let characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic, fake_characteristic} = _))
+ .then(() => new Promise(resolve => {
+ data_view.setUint8(0, 5);
+ data_view.setUint8(1, 6);
+ resolve();
+ }))
+ .then(() => fake_characteristic.getLastWrittenValue())
+ .then(last_value => assert_true(last_value === null))
+
+ .then(() => fake_characteristic.setNextWriteResponse(GATT_SUCCESS))
+ .then(() => characteristic.writeValue(typed_array))
+ .then(() => fake_characteristic.getLastWrittenValue())
+ .then(last_value => assert_array_equals(last_value, [1, 2]))
+
+ .then(() => fake_characteristic.setNextWriteResponse(GATT_SUCCESS))
+ .then(() => characteristic.writeValue(array_buffer))
+ .then(() => fake_characteristic.getLastWrittenValue())
+ .then(last_value => assert_array_equals(last_value, [3, 4]))
+
+ .then(() => fake_characteristic.setNextWriteResponse(GATT_SUCCESS))
+ .then(() => characteristic.writeValue(data_view))
+ .then(() => fake_characteristic.getLastWrittenValue())
+ .then(last_value => assert_array_equals(last_value, [5, 6])),
+ test_desc);
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/generate.py b/tests/wpt/web-platform-tests/bluetooth/generate.py
new file mode 100644
index 00000000000..034ca22c619
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/generate.py
@@ -0,0 +1,189 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# TODO(509038): Delete the file in LayoutTests/bluetooth after all the script
+# tests have been migrated to this directory.
+"""Generator script for Web Bluetooth LayoutTests.
+
+For each script-tests/X.js creates the following test files depending on the
+contents of X.js
+- getPrimaryService/X.html
+- getPrimaryServices/X.html
+- getPrimaryServices/X-with-uuid.html
+
+script-tests/X.js files should contain "CALLS([variation1 | variation2 | ...])"
+tokens that indicate what files to generate. Each variation in CALLS([...])
+should corresponds to a js function call and its arguments. Additionally a
+variation can end in [UUID] to indicate that the generated file's name should
+have the -with-uuid suffix.
+
+The PREVIOUS_CALL token will be replaced with the function that replaced CALLS.
+
+The FUNCTION_NAME token will be replaced with the name of the function that
+replaced CALLS.
+
+For example, for the following template file:
+
+// script-tests/example.js
+promise_test(() => {
+ return navigator.bluetooth.requestDevice(...)
+ .then(device => device.gatt.CALLS([
+ getPrimaryService('heart_rate')|
+ getPrimaryServices('heart_rate')[UUID]]))
+ .then(device => device.gatt.PREVIOUS_CALL);
+}, 'example test for FUNCTION_NAME');
+
+this script will generate:
+
+// getPrimaryService/example.html
+promise_test(() => {
+ return navigator.bluetooth.requestDevice(...)
+ .then(device => device.gatt.getPrimaryService('heart_rate'))
+ .then(device => device.gatt.getPrimaryService('heart_rate'));
+}, 'example test for getPrimaryService');
+
+// getPrimaryServices/example-with-uuid.html
+promise_test(() => {
+ return navigator.bluetooth.requestDevice(...)
+ .then(device => device.gatt.getPrimaryServices('heart_rate'))
+ .then(device => device.gatt.getPrimaryServices('heart_rate'));
+}, 'example test for getPrimaryServices');
+
+Run
+$ python //third_party/WebKit/LayoutTests/bluetooth/generate.py
+and commit the generated files.
+"""
+
+import fnmatch
+import os
+import re
+import sys
+import logging
+
+TEMPLATES_DIR = 'script-tests'
+
+
+class GeneratedTest:
+
+ def __init__(self, data, path, template):
+ self.data = data
+ self.path = path
+ self.template = template
+
+
+def GetGeneratedTests():
+ """Yields a GeneratedTest for each call in templates in script-tests."""
+ bluetooth_tests_dir = os.path.dirname(os.path.realpath(__file__))
+
+ # Read Base Test Template.
+ base_template_file_handle = open(
+ os.path.join(
+ bluetooth_tests_dir,
+ TEMPLATES_DIR,
+ 'base_test_html.template'
+ ), 'r')
+ base_template_file_data = base_template_file_handle.read().decode('utf-8')
+ base_template_file_handle.close()
+
+ # Get Templates.
+
+ template_path = os.path.join(bluetooth_tests_dir, TEMPLATES_DIR)
+
+ available_templates = []
+ for root, _, files in os.walk(template_path):
+ for template in files:
+ if template.endswith('.js'):
+ available_templates.append(os.path.join(root, template))
+
+ # Generate Test Files
+ for template in available_templates:
+ # Read template
+ template_file_handle = open(template, 'r')
+ template_file_data = template_file_handle.read().decode('utf-8')
+ template_file_handle.close()
+
+ template_name = os.path.splitext(os.path.basename(template))[0]
+
+ # Find function names in multiline pattern: CALLS( [ function_name,function_name2[UUID] ])
+ result = re.search(
+ r'CALLS\(' + # CALLS(
+ r'[^\[]*' + # Any characters not [, allowing for new lines.
+ r'\[' + # [
+ r'(.*?)' + # group matching: function_name(), function_name2[UUID]
+ r'\]\)', # adjacent closing characters: ])
+ template_file_data, re.MULTILINE | re.DOTALL)
+
+ if result is None:
+ raise Exception('Template must contain \'CALLS\' tokens')
+
+ new_test_file_data = base_template_file_data.replace('TEST',
+ template_file_data)
+ # Replace CALLS([...]) with CALLS so that we don't have to replace the
+ # CALLS([...]) for every new test file.
+ new_test_file_data = new_test_file_data.replace(result.group(), 'CALLS')
+
+ # Replace 'PREVIOUS_CALL' with 'CALLS' so that we can replace it while
+ # replacing CALLS.
+ new_test_file_data = new_test_file_data.replace('PREVIOUS_CALL', 'CALLS')
+
+ for call in result.group(1).split('|'):
+ # Parse call
+ call = call.strip()
+ function_name, args, uuid_suffix = re.search(r'(.*?)\((.*)\)(\[UUID\])?', call).groups()
+
+ # Replace template tokens
+ call_test_file_data = new_test_file_data
+ call_test_file_data = call_test_file_data.replace('CALLS', '{}({})'.format(function_name, args))
+ call_test_file_data = call_test_file_data.replace('FUNCTION_NAME', function_name)
+
+ # Get test file name
+ group_dir = os.path.basename(os.path.abspath(os.path.join(template, os.pardir)))
+
+ call_test_file_name = 'gen-{}{}.https.html'.format(template_name, '-with-uuid' if uuid_suffix else '')
+ call_test_file_path = os.path.join(bluetooth_tests_dir, group_dir, function_name, call_test_file_name)
+
+ yield GeneratedTest(call_test_file_data, call_test_file_path, template)
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+ previous_generated_files = set()
+ current_path = os.path.dirname(os.path.realpath(__file__))
+ for root, _, filenames in os.walk(current_path):
+ for filename in fnmatch.filter(filenames, 'gen-*.https.html'):
+ previous_generated_files.add(os.path.join(root, filename))
+
+ generated_files = set()
+ for generated_test in GetGeneratedTests():
+ prev_len = len(generated_files)
+ generated_files.add(generated_test.path)
+ if prev_len == len(generated_files):
+ logging.info('Generated the same test twice for template:\n%s',
+ generated_test.template)
+
+ # Create or open test file
+ directory = os.path.dirname(generated_test.path)
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+ test_file_handle = open(generated_test.path, 'wb')
+
+ # Write contents
+ test_file_handle.write(generated_test.data.encode('utf-8'))
+ test_file_handle.close()
+
+ new_generated_files = generated_files - previous_generated_files
+ if len(new_generated_files) != 0:
+ logging.info('Newly generated tests:')
+ for generated_file in new_generated_files:
+ logging.info(generated_file)
+
+ obsolete_files = previous_generated_files - generated_files
+ if len(obsolete_files) != 0:
+ logging.warning('The following files might be obsolete:')
+ for generated_file in obsolete_files:
+ logging.warning(generated_file)
+
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tests/wpt/web-platform-tests/bluetooth/generate_test.py b/tests/wpt/web-platform-tests/bluetooth/generate_test.py
new file mode 100755
index 00000000000..881f7dbcb73
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/generate_test.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# TODO(50903): Delete the file in LayoutTests/bluetooth after all the tests have
+# been migrated to this directory.
+"""Test that the set of gen-* files is the same as the generated files."""
+
+import fnmatch
+import os
+import sys
+import generate
+import logging
+
+UPDATE_TIP = 'To update the generated tests, run:\n' \
+ '$ python third_party/WebKit/LayoutTests/bluetooth/generate.py'
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+ logging.info(UPDATE_TIP)
+ generated_files = set()
+ # Tests data in gen-* files is the same as the data generated.
+ for generated_test in generate.GetGeneratedTests():
+ generated_files.add(generated_test.path)
+ try:
+ with open(generated_test.path, 'r') as f:
+ data = f.read().decode('utf-8')
+ if data != generated_test.data:
+ logging.error('%s does not match template', generated_test.path)
+ return -1
+ except IOError, e:
+ if e.errno == 2:
+ logging.error('Missing generated test:\n%s\nFor template:\n%s',
+ generated_test.path,
+ generated_test.template)
+ return -1
+
+ # Tests that there are no obsolete generated files.
+ previous_generated_files = set()
+ current_path = os.path.dirname(os.path.realpath(__file__))
+ for root, _, filenames in os.walk(current_path):
+ for filename in fnmatch.filter(filenames, 'gen-*.https.html'):
+ previous_generated_files.add(os.path.join(root, filename))
+
+ if previous_generated_files != generated_files:
+ logging.error('There are extra generated tests. Please remove them.')
+ for test_path in previous_generated_files - generated_files:
+ logging.error('%s', test_path)
+ return -1
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tests/wpt/web-platform-tests/bluetooth/idl/idl-Bluetooth.html b/tests/wpt/web-platform-tests/bluetooth/idl/idl-Bluetooth.html
index b0263f980a8..2835236d3b5 100644
--- a/tests/wpt/web-platform-tests/bluetooth/idl/idl-Bluetooth.html
+++ b/tests/wpt/web-platform-tests/bluetooth/idl/idl-Bluetooth.html
@@ -4,6 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
+const test_desc = 'Bluetooth IDL test';
test(() => {
assert_throws(new TypeError(), () => new Bluetooth(),
@@ -14,6 +15,5 @@ test(() => {
// Bluetooth implements BluetoothDiscovery;
assert_true('requestDevice' in navigator.bluetooth);
assert_equals(navigator.bluetooth.requestDevice.length, 0);
-}, 'Bluetooth IDL test');
-
+}, test_desc);
</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/idl/idl-NavigatorBluetooth.html b/tests/wpt/web-platform-tests/bluetooth/idl/idl-NavigatorBluetooth.html
index 9449cf1ec88..b8649f11abe 100644
--- a/tests/wpt/web-platform-tests/bluetooth/idl/idl-NavigatorBluetooth.html
+++ b/tests/wpt/web-platform-tests/bluetooth/idl/idl-NavigatorBluetooth.html
@@ -3,6 +3,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
+const test_desc = '[SameObject] test for navigator.bluetooth';
test(() => {
assert_true('bluetooth' in navigator,
@@ -11,5 +12,5 @@ test(() => {
test(() => {
assert_equals(navigator.bluetooth, navigator.bluetooth);
-}, '[SameObject] test for navigator.bluetooth');
+}, test_desc);
</script>
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 56e905c6140..033570d842e 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
@@ -6,12 +6,11 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return setUpPreconnectedDevice({name: ''})
+const test_desc = 'Device with empty name and no UUIDs nearby. Should be ' +
+ 'found if acceptAllDevices is true.';
+
+bluetooth_test(() => setUpPreconnectedDevice({name: ''})
.then(() => requestDeviceWithTrustedClick({acceptAllDevices: true}))
- .then(device => {
- assert_equals(device.name, '');
- });
-}, 'Device with empty name and no UUIDs nearby. Should be found if ' +
- 'acceptAllDevices is true.');
+ .then(device => assert_equals(device.name, '')),
+ test_desc);
</script>
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 8c271df5005..d990dbf05b4 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
@@ -5,13 +5,12 @@
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
-bluetooth_test(() => {
- let device_name = 'LE Device';
- return setUpPreconnectedDevice({name: device_name})
+const test_desc = 'A device with name and no UUIDs nearby. Should be found if ' +
+ 'acceptAllDevices is true.';
+const name = 'LE Device';
+
+bluetooth_test(() => setUpPreconnectedDevice({name: name})
.then(() => requestDeviceWithTrustedClick({acceptAllDevices: true}))
- .then(device => {
- assert_equals(device.name, device_name);
- });
-}, 'A device with name and no UUIDs nearby. Should be found if ' +
- 'acceptAllDevices is true.');
+ .then(device => assert_equals(device.name, name)),
+ test_desc);
</script>
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 adf77ba23ef..5a1dca7c97b 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
@@ -6,15 +6,17 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getHealthThermometerDevice({acceptAllDevices: true})
+const test_desc = 'requestDevice called with acceptAllDevices: true and ' +
+ 'with no optionalServices. Should not get access to any services.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. ' +
+ 'Tip: Add the service UUID to \'optionalServices\' in ' +
+ 'requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({acceptAllDevices: true})
.then(({device}) => assert_promise_rejects_with_message(
device.gatt.getPrimaryServices(),
- new DOMException(
- 'Origin is not allowed to access any service. ' +
- 'Tip: Add the service UUID to \'optionalServices\' in ' +
- 'requestDevice() options. https://goo.gl/HxfxSQ',
- 'SecurityError')));
-}, 'requestDevice called with acceptAllDevices: true and with no ' +
- 'optionalServices. Should not get access to any services.');
+ expected)),
+ test_desc);
</script>
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 e202e741f97..3c0f4c1164b 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
@@ -9,19 +9,18 @@
const test_desc = 'requestDevice called with acceptAllDevices: true and with ' +
'optionalServices. Should get access to services.';
-bluetooth_test(() =>
- getTwoHealthThermometerServicesDevice()
- .then(() => requestDeviceWithTrustedClick({
- acceptAllDevices: true,
- optionalServices: ['health_thermometer']
- }))
- .then(device => device.gatt.connect())
- .then(gattServer => gattServer.getPrimaryServices())
- .then(services => {
- assert_equals(services.length, 2);
- services.forEach(service => {
- assert_equals(service.uuid,
- BluetoothUUID.getService('health_thermometer'));
- });
-}), test_desc);
+bluetooth_test(() => getTwoHealthThermometerServicesDevice()
+ .then(() => requestDeviceWithTrustedClick({
+ acceptAllDevices: true,
+ optionalServices: ['health_thermometer']
+ }))
+ .then(device => device.gatt.connect())
+ .then(gattServer => gattServer.getPrimaryServices())
+ .then(services => {
+ assert_equals(services.length, 2);
+ services.forEach(service => {
+ assert_equals(service.uuid,
+ BluetoothUUID.getService('health_thermometer'));
+ });
+ }), test_desc);
</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
index ac577ad5ef2..c94ba55bbfd 100644
--- a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
+++ b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html
@@ -4,27 +4,27 @@ let device;
function requestDeviceWithOptionsAndConnect(options) {
return navigator.bluetooth.requestDevice(options)
- .then(device => device.gatt.connect());
+ .then(device => device.gatt.connect());
}
window.onmessage = messageEvent => {
switch (messageEvent.data.type) {
case 'RequestAndConnect':
requestDeviceWithOptionsAndConnect(messageEvent.data.options)
- .then(gatt => {
- device = gatt.device;
- parent.postMessage('Connected', '*');
- }).catch(err => {
- parent.postMessage(`FAIL: ${err}`, '*');
- });
+ .then(gatt => {
+ device = gatt.device;
+ parent.postMessage('Connected', '*');
+ }).catch(err => {
+ parent.postMessage(`FAIL: ${err}`, '*');
+ });
break;
case 'DiscoverServices':
requestDeviceWithOptionsAndConnect(messageEvent.data.options)
- .then(gatt => gatt.getPrimaryServices())
- .then(() => parent.postMessage('DiscoveryComplete', '*'))
- .catch(err => {
- parent.postMessage(`FAIL: ${err}`, '*');
- });
+ .then(gatt => gatt.getPrimaryServices())
+ .then(() => parent.postMessage('DiscoveryComplete', '*'))
+ .catch(err => {
+ parent.postMessage(`FAIL: ${err}`, '*');
+ });
break;
default:
parent.postMessage(`FAIL: Bad message type: ${messageEvent.data.type}`,
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template
new file mode 100644
index 00000000000..714333c5e13
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template
@@ -0,0 +1,10 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+TEST
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/characteristic-is-removed.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/characteristic-is-removed.js
new file mode 100644
index 00000000000..8ff747c588d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/characteristic-is-removed.js
@@ -0,0 +1,22 @@
+'use strict';
+const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
+const expected = new DOMException('GATT Characteristic no longer exists.',
+ 'InvalidStateError');
+let fake_peripheral, characteristic, fake_characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _))
+ .then(() => characteristic.getDescriptor(user_description.name))
+ .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e))
+ .then(() => fake_characteristic.remove())
+ .then(() => fake_peripheral.simulateGATTServicesChanged())
+ .then(() => assert_promise_rejects_with_message(
+ characteristic.CALLS([
+ getDescriptor(user_description.name)|
+ getDescriptors(user_description.name)[UUID]|
+ getDescriptors()|
+ readValue()|
+ writeValue(new Uint8Array(1))|
+ startNotifications()
+ ]), expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/descriptor-get-same-object.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/descriptor-get-same-object.js
new file mode 100644
index 00000000000..4e6bc3519bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/characteristic/descriptor-get-same-object.js
@@ -0,0 +1,32 @@
+'use strict';
+const test_desc = 'Calls to FUNCTION_NAME should return the same object.';
+let characteristic;
+
+bluetooth_test(() => getMeasurementIntervalCharacteristic()
+ .then(_ => ({characteristic} = _))
+ .then(() => Promise.all([
+ characteristic.CALLS([
+ getDescriptor(user_description.alias)|
+ getDescriptors(user_description.alias)
+ ]),
+ characteristic.FUNCTION_NAME(user_description.name),
+ characteristic.FUNCTION_NAME(user_description.uuid)
+ ]))
+ .then(descriptors_arrays => {
+ assert_true(descriptors_arrays.length > 0)
+
+ // Convert to arrays if necessary.
+ for (let i = 0; i < descriptors_arrays.length; i++) {
+ descriptors_arrays[i] = [].concat(descriptors_arrays[i]);
+ }
+
+ for (let i = 1; i < descriptors_arrays.length; i++) {
+ assert_equals(descriptors_arrays[0].length,
+ descriptors_arrays[i].length);
+ }
+
+ let base_set = new Set(descriptors_arrays[0]);
+ for (let descriptors of descriptors_arrays) {
+ descriptors.forEach(descriptor => assert_true(base_set.has(descriptor)));
+ }
+ }), test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-before.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-before.js
new file mode 100644
index 00000000000..fabc74ffb30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-before.js
@@ -0,0 +1,22 @@
+'use strict';
+const test_desc = 'disconnect() called before FUNCTION_NAME. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(() => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]]),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-error.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-error.js
new file mode 100644
index 00000000000..edabb07bccb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-error.js
@@ -0,0 +1,22 @@
+'use strict';
+const test_desc = 'disconnect() called during a FUNCTION_NAME ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.', 'NetworkError');
+let device;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(_ => ({device} = _))
+ .then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]
+ ]),
+ expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-success.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-success.js
new file mode 100644
index 00000000000..84157a0693b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-called-during-success.js
@@ -0,0 +1,23 @@
+'use strict';
+const test_desc = 'disconnect() called during a FUNCTION_NAME call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]
+ ]),
+ expected);
+ device.gatt.disconnect();
+ return promise;
+ }), test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-invalidates-objects.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-invalidates-objects.js
new file mode 100644
index 00000000000..995fda34411
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnect-invalidates-objects.js
@@ -0,0 +1,39 @@
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. '+
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]]))
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }), test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnected-device.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnected-device.js
new file mode 100644
index 00000000000..2b6011642b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/disconnected-device.js
@@ -0,0 +1,20 @@
+'use strict';
+const test_desc = 'FUNCTION_NAME called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]
+ ]),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js
new file mode 100644
index 00000000000..e9e972359a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-no-permission-absent-service.js
@@ -0,0 +1,25 @@
+'use strict';
+const test_desc = 'Request for absent service without permission. Should ' +
+ 'Reject with SecurityError even if services have been discovered already.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService(glucose.alias)|
+ getPrimaryServices(glucose.alias)[UUID]
+ ]), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(glucose.uuid), expected)])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-service-not-found.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-service-not-found.js
new file mode 100644
index 00000000000..6b745d7e2a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/discovery-complete-service-not-found.js
@@ -0,0 +1,16 @@
+'use strict';
+const test_desc = 'Request for absent service. Must reject with ' +
+ 'NotFoundError even when the services have previously been discovered.';
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('glucose')|
+ getPrimaryServices('glucose')[UUID]
+ ]),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-error.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-error.js
new file mode 100644
index 00000000000..35e838e92e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-error.js
@@ -0,0 +1,25 @@
+'use strict';
+const test_desc = 'Garbage Collection ran during a FUNCTION_NAME ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]
+ ]),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-success.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-success.js
new file mode 100644
index 00000000000..7976bbd990b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/garbage-collection-ran-during-success.js
@@ -0,0 +1,24 @@
+'use strict';
+const test_desc = 'Garbage Collection ran during a FUNCTION_NAME call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer') |
+ getPrimaryServices() |
+ getPrimaryServices('health_thermometer')[UUID]]),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-different-service-after-reconnection.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-different-service-after-reconnection.js
new file mode 100644
index 00000000000..e72128a76ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-different-service-after-reconnection.js
@@ -0,0 +1,35 @@
+'use strict';
+const test_desc = 'Calls to FUNCTION_NAME after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]]))
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.PREVIOUS_CALL)
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection = [].concat(services_first_connection);
+ services_second_connection = [].concat(services_second_connection);
+
+ assert_equals(services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }), test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-same-object.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-same-object.js
new file mode 100644
index 00000000000..3b3bdd19d20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/get-same-object.js
@@ -0,0 +1,33 @@
+'use strict';
+const test_desc = 'Calls to FUNCTION_NAME should return the same object.';
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']})
+ .then(({device}) => Promise.all([
+ device.gatt.CALLS([
+ getPrimaryService('health_thermometer')|
+ getPrimaryServices()|
+ getPrimaryServices('health_thermometer')[UUID]]),
+ device.gatt.PREVIOUS_CALL]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(service => {
+ assert_true(second_call_set.has(service))
+ });
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }), test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/invalid-service-name.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/invalid-service-name.js
new file mode 100644
index 00000000000..56e67f0ac13
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/invalid-service-name.js
@@ -0,0 +1,22 @@
+'use strict';
+const test_desc = 'Wrong Service name. Reject with TypeError.';
+const expected = new DOMException(
+ "Failed to execute 'FUNCTION_NAME' on " +
+ "'BluetoothRemoteGATTServer': Invalid Service name: " +
+ "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " +
+ "UUID (lowercase hex characters e.g. " +
+ "'00001234-0000-1000-8000-00805f9b34fb'), " +
+ "or recognized standard name from " +
+ "https://www.bluetooth.com/specifications/gatt/services" +
+ " e.g. 'alert_notification'.",
+ 'TypeError');
+
+bluetooth_test(() => getHealthThermometerDevice()
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('wrong_name')|
+ getPrimaryServices('wrong_name')
+ ]),
+ expected,
+ 'Wrong Service name passed.')),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-absent-service.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-absent-service.js
new file mode 100644
index 00000000000..9bab3be8046
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-absent-service.js
@@ -0,0 +1,23 @@
+'use strict';
+const test_desc = 'Request for absent service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService(glucose.alias)|
+ getPrimaryServices(glucose.alias)[UUID]
+ ]), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(glucose.uuid), expected)])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-for-any-service.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-for-any-service.js
new file mode 100644
index 00000000000..52b07cc48ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-for-any-service.js
@@ -0,0 +1,17 @@
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({acceptAllDevices: true})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('heart_rate')|
+ getPrimaryServices()|
+ getPrimaryServices('heart_rate')[UUID]]),
+ expected)),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-present-service.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-present-service.js
new file mode 100644
index 00000000000..67081ae56be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/no-permission-present-service.js
@@ -0,0 +1,22 @@
+'use strict';
+const test_desc = 'Request for present service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService(generic_access.alias)|
+ getPrimaryServices(generic_access.alias)[UUID]
+ ]), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(generic_access.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.FUNCTION_NAME(generic_access.uuid), expected)])),
+ test_desc);
diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/server/service-not-found.js b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/service-not-found.js
new file mode 100644
index 00000000000..0fd2dace787
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/server/service-not-found.js
@@ -0,0 +1,16 @@
+'use strict';
+const test_desc = 'Request for absent service. Reject with NotFoundError.';
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.CALLS([
+ getPrimaryService('glucose')|
+ getPrimaryServices('glucose')[UUID]
+ ]),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
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 8b158862d3b..aebd681c2ad 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
@@ -6,12 +6,14 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- return fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS})
- .then(() => device.gatt.connect())
- .then(gatt => assert_true(gatt.connected));
- });
-}, 'Device will connect');
+const test_desc = 'Device will connect';
+let device, fake_peripheral;
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ .then(gatt => assert_true(gatt.connected)),
+ test_desc);
</script>
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 3d83683e0eb..f70befcb4b4 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
@@ -6,17 +6,17 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- return fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS})
- .then(() => {
- // Don't return the promise and let |device| go out of scope
- // so that it gets garbage collected.
- device.gatt.connect();
- });
- })
- .then(runGarbageCollection)
-}, 'Garbage Collection ran during a connect call that succeeds. ' +
- 'Should not crash.');
+const test_desc = 'Garbage Collection ran during a connect call that ' +
+ 'succeeds. Should not crash.';
+let device, fake_peripheral;
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ // Don't return the promise and let |device| go out of scope
+ // so that it gets garbage collected.
+ .then(() => device.gatt.connect())
+ .then(runGarbageCollection),
+ test_desc);
</script>
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 09e3ac522e5..c3e35532835 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
@@ -6,20 +6,20 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- return fake_peripheral
- .setNextGATTConnectionResponse({code: HCI_SUCCESS})
- .then(() => device.gatt.connect())
- .then(gatt1 => {
- // No second response is necessary because an ATT Bearer
- // already exists from the first connection.
- // See https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-connect
- // step 5.1.
- return device.gatt.connect().then(gatt2 => [gatt1, gatt2]);
- });
- })
- .then(([gatt1, gatt2]) => assert_equals(gatt1, gatt2));
-}, 'Multiple connects should return the same gatt object.');
+const test_desc = 'Multiple connects should return the same gatt object.';
+let device, fake_peripheral;
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ // No second response is necessary because an ATT Bearer
+ // already exists from the first connection.
+ // See https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-connect
+ // step 5.1.
+ .then(gatt1 => device.gatt.connect()
+ .then(gatt2 => [gatt1, gatt2]))
+ .then(([gatt1, gatt2]) => assert_equals(gatt1, gatt2)),
+ test_desc);
</script>
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 89590fa147c..cfd4bc5a202 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
@@ -6,14 +6,14 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- return fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS})
- .then(() => device.gatt.connect());
- })
- .then(gatt => {
- assert_equals(gatt.device, gatt.device);
- });
-}, "[SameObject] test for BluetoothRemoteGATTServer's device.");
+const test_desc = '[SameObject] test for BluetoothRemoteGATTServer\'s device.';
+let device, fake_peripheral;
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ .then(gatt => assert_equals(gatt.device, gatt.device)),
+ test_desc);
</script>
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 65ed1aa2b8a..e0d8439ab66 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
@@ -12,18 +12,18 @@ let device, fake_peripheral;
// TODO(569716): Test that the disconnect signal was sent to the device.
bluetooth_test(() => getDiscoveredHealthThermometerDevice()
- .then(_ => ({device, fake_peripheral} = _))
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => device.gatt.connect()
- .then(gattServer => {
- gattServer.disconnect();
- assert_false(gattServer.connected);
- })
- .then(() => device.gatt.connect())
- .then(gattServer => {
- gattServer.disconnect();
- assert_false(gattServer.connected);
- })), test_desc);
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => device.gatt.connect()
+ .then(gattServer => {
+ gattServer.disconnect();
+ assert_false(gattServer.connected);
+ })
+ .then(() => device.gatt.connect())
+ .then(gattServer => {
+ gattServer.disconnect();
+ assert_false(gattServer.connected);
+ })), test_desc);
</script>
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 030abf783f0..8b1459db192 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
@@ -11,26 +11,26 @@ const test_desc = 'Detach frame then garbage collect. We shouldn\'t crash.';
let iframe = document.createElement('iframe');
bluetooth_test(() => setUpConnectableHealthThermometerDevice()
- // 1. Load the iframe.
- .then(() => new Promise(resolve => {
- iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
- document.body.appendChild(iframe);
- iframe.addEventListener('load', resolve);
- }))
- // 2. Connect device, detach the iframe, and run garbage collection.
- .then(() => new Promise(resolve => {
- callWithTrustedClick(() => {
- iframe.contentWindow.postMessage({
- type: 'RequestAndConnect',
- options: {filters: [{services: ['health_thermometer']}]}
- }, '*');
- });
+ // 1. Load the iframe.
+ .then(() => new Promise(resolve => {
+ iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
+ document.body.appendChild(iframe);
+ iframe.addEventListener('load', resolve);
+ }))
+ // 2. Connect device, detach the iframe, and run garbage collection.
+ .then(() => new Promise(resolve => {
+ callWithTrustedClick(() => {
+ iframe.contentWindow.postMessage({
+ type: 'RequestAndConnect',
+ options: {filters: [{services: ['health_thermometer']}]}
+ }, '*');
+ });
- window.onmessage = messageEvent => {
- assert_equals(messageEvent.data, 'Connected');
- iframe.remove();
- runGarbageCollection().then(resolve);
- }
-})), test_desc)
+ window.onmessage = messageEvent => {
+ assert_equals(messageEvent.data, 'Connected');
+ iframe.remove();
+ runGarbageCollection().then(resolve);
+ }
+ })), test_desc)
</script>
</body>
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 d0e830496fe..5dada7a9c99 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
@@ -12,15 +12,15 @@ let device, fake_peripheral;
// TODO(569716): Test that the disconnect signal was sent to the device.
bluetooth_test(() => getDiscoveredHealthThermometerDevice()
- .then(_ => ({device, fake_peripheral} = _))
- .then(() => fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS,
- }))
- .then(() => device.gatt.connect())
- .then(gattServer => {
- gattServer.disconnect();
- assert_false(gattServer.connected);
- gattServer.disconnect();
- assert_false(gattServer.connected);
-}), test_desc);
+ .then(_ => ({device, fake_peripheral} = _))
+ .then(() => fake_peripheral.setNextGATTConnectionResponse({
+ code: HCI_SUCCESS,
+ }))
+ .then(() => device.gatt.connect())
+ .then(gattServer => {
+ gattServer.disconnect();
+ assert_false(gattServer.connected);
+ gattServer.disconnect();
+ assert_false(gattServer.connected);
+ }), test_desc);
</script>
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 d95c52d38c4..04ccedeb5e9 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
@@ -11,28 +11,28 @@ const test_desc = 'Garbage collect then detach frame. We shouldn\'t crash.';
let iframe = document.createElement('iframe');
bluetooth_test(() => setUpConnectableHealthThermometerDevice()
- // 1. Load the iframe.
- .then((f) => new Promise(resolve => {
- iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
- document.body.appendChild(iframe);
- iframe.addEventListener('load', resolve);
- }))
- // 2. Connect device, run garbage collection, and detach iframe.
- .then(() => new Promise(resolve => {
- callWithTrustedClick(() => {
- iframe.contentWindow.postMessage({
- type: 'RequestAndConnect',
- options: {filters: [{services: ['health_thermometer']}]}
- }, '*');
- });
-
- window.onmessage = messageEvent => {
- assert_equals(messageEvent.data, 'Connected');
- runGarbageCollection().then(() => {
- iframe.remove();
- resolve();
+ // 1. Load the iframe.
+ .then((f) => new Promise(resolve => {
+ iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
+ document.body.appendChild(iframe);
+ iframe.addEventListener('load', resolve);
+ }))
+ // 2. Connect device, run garbage collection, and detach iframe.
+ .then(() => new Promise(resolve => {
+ callWithTrustedClick(() => {
+ iframe.contentWindow.postMessage({
+ type: 'RequestAndConnect',
+ options: {filters: [{services: ['health_thermometer']}]}
+ }, '*');
});
- }
-})), test_desc)
+
+ window.onmessage = messageEvent => {
+ assert_equals(messageEvent.data, 'Connected');
+ runGarbageCollection().then(() => {
+ iframe.remove();
+ resolve();
+ });
+ }
+ })), test_desc)
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html
new file mode 100644
index 00000000000..8a7e08f139f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryService. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(() => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html
new file mode 100644
index 00000000000..6656ff16a14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html
@@ -0,0 +1,28 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryService ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.', 'NetworkError');
+let device;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(_ => ({device} = _))
+ .then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html
new file mode 100644
index 00000000000..760be97ebd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryService call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return promise;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html
new file mode 100644
index 00000000000..4c3c577fcc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html
@@ -0,0 +1,46 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. '+
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html
new file mode 100644
index 00000000000..abfd1a9c2da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html
@@ -0,0 +1,26 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'getPrimaryService called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html
new file mode 100644
index 00000000000..098eec4113b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html
@@ -0,0 +1,32 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service without permission. Should ' +
+ 'Reject with SecurityError even if services have been discovered already.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html
new file mode 100644
index 00000000000..233a45adf06
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html
@@ -0,0 +1,23 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service. Must reject with ' +
+ 'NotFoundError even when the services have previously been discovered.';
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('glucose'),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html
new file mode 100644
index 00000000000..ab93d334818
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryService ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html
new file mode 100644
index 00000000000..647aa504a20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryService call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html
new file mode 100644
index 00000000000..f09e4e65c27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html
@@ -0,0 +1,42 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryService after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection = [].concat(services_first_connection);
+ services_second_connection = [].concat(services_second_connection);
+
+ assert_equals(services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html
new file mode 100644
index 00000000000..35893d24a60
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html
@@ -0,0 +1,40 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryService should return the same object.';
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']})
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryService('health_thermometer'),
+ device.gatt.getPrimaryService('health_thermometer')]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(service => {
+ assert_true(second_call_set.has(service))
+ });
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html
new file mode 100644
index 00000000000..f055cb30751
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Wrong Service name. Reject with TypeError.';
+const expected = new DOMException(
+ "Failed to execute 'getPrimaryService' on " +
+ "'BluetoothRemoteGATTServer': Invalid Service name: " +
+ "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " +
+ "UUID (lowercase hex characters e.g. " +
+ "'00001234-0000-1000-8000-00805f9b34fb'), " +
+ "or recognized standard name from " +
+ "https://www.bluetooth.com/specifications/gatt/services" +
+ " e.g. 'alert_notification'.",
+ 'TypeError');
+
+bluetooth_test(() => getHealthThermometerDevice()
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('wrong_name'),
+ expected,
+ 'Wrong Service name passed.')),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html
new file mode 100644
index 00000000000..ced2bc653c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html
@@ -0,0 +1,30 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(glucose.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html
new file mode 100644
index 00000000000..99d5c234044
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html
@@ -0,0 +1,24 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({acceptAllDevices: true})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('heart_rate'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html
new file mode 100644
index 00000000000..2a578365e03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for present service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService(generic_access.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html
new file mode 100644
index 00000000000..aca14c5fd40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html
@@ -0,0 +1,23 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service. Reject with NotFoundError.';
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryService('glucose'),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html
new file mode 100644
index 00000000000..bdf55a6a0aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryServices. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(() => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html
new file mode 100644
index 00000000000..45f13382f3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called before getPrimaryServices. ' +
+ 'Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.disconnect())
+ .then(() => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html
new file mode 100644
index 00000000000..d7cb43725ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html
@@ -0,0 +1,28 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.', 'NetworkError');
+let device;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(_ => ({device} = _))
+ .then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html
new file mode 100644
index 00000000000..27440af9162
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html
@@ -0,0 +1,28 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices ' +
+ 'call that fails. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.', 'NetworkError');
+let device;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(_ => ({device} = _))
+ .then(() => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected)
+ device.gatt.disconnect();
+ return promise;
+ }),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html
new file mode 100644
index 00000000000..7b9955ade44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return promise;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html
new file mode 100644
index 00000000000..4b09bce4eee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'disconnect() called during a getPrimaryServices call that ' +
+ 'succeeds. Reject with NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => {
+ let promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected);
+ device.gatt.disconnect();
+ return promise;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html
new file mode 100644
index 00000000000..2ef6b5904ac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html
@@ -0,0 +1,46 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. '+
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html
new file mode 100644
index 00000000000..bc21ea1f2db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html
@@ -0,0 +1,46 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls on services after we disconnect and connect again. '+
+ 'Should reject with InvalidStateError.';
+let device, services;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices())
+ // Convert to array if necessary.
+ .then(s => services = [].concat(s))
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => {
+ let promises = Promise.resolve();
+ for (let service of services) {
+ let error = new DOMException(
+ `Service with UUID ${service.uuid} is no longer valid. Remember ` +
+ `to retrieve the service again after reconnecting.`,
+ 'InvalidStateError');
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristic('measurement_interval'),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics(),
+ error));
+ promises = promises.then(() =>
+ assert_promise_rejects_with_message(
+ service.getCharacteristics('measurement_interval'),
+ error));
+ }
+ return promises;
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html
new file mode 100644
index 00000000000..0a87bce2d03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html
@@ -0,0 +1,26 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html
new file mode 100644
index 00000000000..dbc4428665c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html
@@ -0,0 +1,26 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'getPrimaryServices called before connecting. Reject with ' +
+ 'NetworkError.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' +
+ 'first with `device.gatt.connect`.',
+ 'NetworkError');
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html
new file mode 100644
index 00000000000..460b94d2565
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html
@@ -0,0 +1,32 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service without permission. Should ' +
+ 'Reject with SecurityError even if services have been discovered already.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+let device;
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html
new file mode 100644
index 00000000000..38e0d455b46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html
@@ -0,0 +1,23 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service. Must reject with ' +
+ 'NotFoundError even when the services have previously been discovered.';
+
+bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('glucose'),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html
new file mode 100644
index 00000000000..31ab862e82c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html
new file mode 100644
index 00000000000..a79060adc56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices ' +
+ 'call that failed. Should not crash.'
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' +
+ 'with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getEmptyHealthThermometerDevice()
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected);
+ // Disconnect called to clear attributeInstanceMap and allow the
+ // object to get garbage collected.
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html
new file mode 100644
index 00000000000..b6f0e4a3eef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('health_thermometer'),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html
new file mode 100644
index 00000000000..baf7865b2f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html
@@ -0,0 +1,31 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' +
+ 'succeeds. Should not crash.';
+const expected = new DOMException(
+ 'GATT Server is disconnected. Cannot retrieve services. ' +
+ '(Re)connect first with `device.gatt.connect`.',
+ 'NetworkError');
+let promise;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => {
+ promise = assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected);
+ device.gatt.disconnect();
+ return runGarbageCollection();
+ })
+ .then(() => promise),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html
new file mode 100644
index 00000000000..b87a24a5e0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html
@@ -0,0 +1,42 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryServices('health_thermometer'))
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection = [].concat(services_first_connection);
+ services_second_connection = [].concat(services_second_connection);
+
+ assert_equals(services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html
new file mode 100644
index 00000000000..9ed3c50e6be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html
@@ -0,0 +1,42 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' +
+ 'a different object.';
+let device, services_first_connection, services_second_connection;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryServices())
+ .then(services => services_first_connection = services)
+ .then(() => device.gatt.disconnect())
+ .then(() => device.gatt.connect())
+ .then(() => device.gatt.getPrimaryServices())
+ .then(services => services_second_connection = services)
+ .then(() => {
+ // Convert to arrays if necessary.
+ services_first_connection = [].concat(services_first_connection);
+ services_second_connection = [].concat(services_second_connection);
+
+ assert_equals(services_first_connection.length,
+ services_second_connection.length);
+
+ let first_connection_set = new Set(services_first_connection);
+ let second_connection_set = new Set(services_second_connection);
+
+ // The two sets should be disjoint.
+ let common_services = services_first_connection.filter(
+ val => second_connection_set.has(val));
+ assert_equals(common_services.length, 0);
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html
new file mode 100644
index 00000000000..9d213d5dfd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html
@@ -0,0 +1,40 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryServices should return the same object.';
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']})
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryServices('health_thermometer'),
+ device.gatt.getPrimaryServices('health_thermometer')]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(service => {
+ assert_true(second_call_set.has(service))
+ });
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html
new file mode 100644
index 00000000000..258bda0ec68
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html
@@ -0,0 +1,40 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Calls to getPrimaryServices should return the same object.';
+let device;
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['generic_access']})
+ .then(({device}) => Promise.all([
+ device.gatt.getPrimaryServices(),
+ device.gatt.getPrimaryServices()]))
+ .then(([services_first_call, services_second_call]) => {
+ // Convert to arrays if necessary.
+ services_first_call = [].concat(services_first_call);
+ services_second_call = [].concat(services_second_call);
+
+ assert_equals(services_first_call.length, services_second_call.length);
+
+ let first_call_set = new Set(services_first_call);
+ assert_equals(services_first_call.length, first_call_set.size);
+ let second_call_set = new Set(services_second_call);
+ assert_equals(services_second_call.length, second_call_set.size);
+
+ services_first_call.forEach(service => {
+ assert_true(second_call_set.has(service))
+ });
+
+ services_second_call.forEach(service => {
+ assert_true(first_call_set.has(service));
+ });
+ }), test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html
new file mode 100644
index 00000000000..c497a0ab119
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Wrong Service name. Reject with TypeError.';
+const expected = new DOMException(
+ "Failed to execute 'getPrimaryServices' on " +
+ "'BluetoothRemoteGATTServer': Invalid Service name: " +
+ "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " +
+ "UUID (lowercase hex characters e.g. " +
+ "'00001234-0000-1000-8000-00805f9b34fb'), " +
+ "or recognized standard name from " +
+ "https://www.bluetooth.com/specifications/gatt/services" +
+ " e.g. 'alert_notification'.",
+ 'TypeError');
+
+bluetooth_test(() => getHealthThermometerDevice()
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('wrong_name'),
+ expected,
+ 'Wrong Service name passed.')),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html
new file mode 100644
index 00000000000..0251ea02fbf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html
@@ -0,0 +1,30 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(glucose.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html
new file mode 100644
index 00000000000..332f016ea45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html
@@ -0,0 +1,24 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({acceptAllDevices: true})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('heart_rate'),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html
new file mode 100644
index 00000000000..34d7043caf6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html
@@ -0,0 +1,24 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for present service without permission to access ' +
+ 'any service. Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access any service. Tip: Add the service ' +
+ 'UUID to \'optionalServices\' in requestDevice() options. ' +
+ 'https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({acceptAllDevices: true})
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(),
+ expected)),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html
new file mode 100644
index 00000000000..1f3f291a129
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html
@@ -0,0 +1,29 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for present service without permission. ' +
+ 'Reject with SecurityError.';
+const expected = new DOMException(
+ 'Origin is not allowed to access the service. Tip: Add the service UUID ' +
+ 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ',
+ 'SecurityError');
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}]
+ })
+ .then(({device}) => Promise.all([
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.alias), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.name), expected),
+ assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices(generic_access.uuid), expected)])),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html
new file mode 100644
index 00000000000..cb5e0941f66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html
@@ -0,0 +1,23 @@
+<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+const test_desc = 'Request for absent service. Reject with NotFoundError.';
+
+bluetooth_test(() => getHealthThermometerDevice({
+ filters: [{services: ['health_thermometer']}],
+ optionalServices: ['glucose']
+ })
+ .then(({device}) => assert_promise_rejects_with_message(
+ device.gatt.getPrimaryServices('glucose'),
+ new DOMException(
+ `No Services matching UUID ${glucose.uuid} found in Device.`,
+ 'NotFoundError'))),
+ test_desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html
index 9cf34c202f2..9746f4b058c 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
@@ -6,24 +6,24 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getHealthThermometerDevice()
- .then(({device}) => device.gatt.getPrimaryService('health_thermometer'))
- .then(service => {
- return Promise.all([
+const test_desc = 'Request for characteristic. Should return right ' +
+ 'characteristic.';
+let device, service;
+
+bluetooth_test(() => getHealthThermometerDevice()
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ .then(_ => service = _)
+ .then(() => Promise.all([
service.getCharacteristic(measurement_interval.alias),
service.getCharacteristic(measurement_interval.name),
- service.getCharacteristic(measurement_interval.uuid)])
- .then(characteristics => {
- characteristics.forEach(characteristic => {
- assert_equals(
- characteristic.uuid, measurement_interval.uuid,
- 'Characteristic UUID should be the same as requested UUID.');
- assert_equals(
- characteristic.service, service,
- 'Characteristic service should be the same as service.');
- });
- });
- });
-}, 'Request for characteristic. Should return right characteristic');
+ service.getCharacteristic(measurement_interval.uuid)]))
+ .then(characteristics => characteristics.forEach(characteristic => {
+ assert_equals(
+ characteristic.uuid, measurement_interval.uuid,
+ 'Characteristic UUID should be the same as requested UUID.');
+ assert_equals(
+ characteristic.service, service,
+ 'Characteristic service should be the same as service.');
+ })), test_desc);
</script>
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 48c3c28e02a..5620f2c9245 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
@@ -6,13 +6,19 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getHIDDevice({filters: [{services: ['device_information']}]})
- .then(({device}) => device.gatt.getPrimaryService('device_information'))
+const test_desc = 'The Device Information service is composed of blocklisted ' +
+ 'characteristics so we shouldn\'t find any.';
+const expected = new DOMException('No Characteristics found in service.',
+ 'NotFoundError');
+let device;
+
+bluetooth_test(() => getHIDDevice({
+ filters: [{services: ['device_information']}]
+ })
+ .then(_ => ({device} = _))
+ .then(() => device.gatt.getPrimaryService('device_information'))
.then(service => assert_promise_rejects_with_message(
service.getCharacteristics(),
- new DOMException('No Characteristics found in service.',
- 'NotFoundError')));
-}, 'The Device Information service is composed of blocklisted ' +
- 'characteristics so we shouldn\'t find any.');
+ expected)),
+ test_desc);
</script>
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 868476a88c9..9139ae10f89 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
@@ -6,43 +6,39 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- // Setup a device with two measurement intervals.
- return fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS})
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.addFakeService({
- uuid: 'health_thermometer'}))
- .then(fake_health_thermometer => Promise.all([
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'measurement_interval',
- properties: ['read', 'write', 'indicate']}),
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'measurement_interval',
- properties: ['read', 'write', 'indicate']}),
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'temperature_measurement',
- properties: ['indicate']})
- ]))
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS}))
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- // Actual test starts.
- .then((service) => Promise.all([
- service.getCharacteristics(measurement_interval.alias),
- service.getCharacteristics(measurement_interval.name),
- service.getCharacteristics(measurement_interval.uuid)]))
- .then(characteristics_arrays => {
- characteristics_arrays.forEach(characteristics => {
- assert_equals(characteristics.length, 2);
- assert_equals(characteristics[0].uuid,
- measurement_interval.uuid);
- assert_equals(characteristics[1].uuid,
- measurement_interval.uuid);
- });
- });
- });
-}, 'Find characteristics with UUID in service.');
+const test_desc = 'Find characteristics with UUID in service.';
+let device, fake_peripheral;
+
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _ ))
+ // Setup a device with two measurement intervals.
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
+ .then(fake_health_thermometer => Promise.all([
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'measurement_interval',
+ properties: ['read', 'write', 'indicate']}),
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'measurement_interval',
+ properties: ['read', 'write', 'indicate']}),
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'temperature_measurement',
+ properties: ['indicate']})
+ ]))
+ .then(() =>
+ fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ // Actual test starts.
+ .then(service => Promise.all([
+ service.getCharacteristics(measurement_interval.alias),
+ service.getCharacteristics(measurement_interval.name),
+ service.getCharacteristics(measurement_interval.uuid)]))
+ .then(characteristics_arrays => characteristics_arrays.forEach(
+ characteristics => {
+ assert_equals(characteristics.length, 2);
+ assert_equals(characteristics[0].uuid, measurement_interval.uuid);
+ assert_equals(characteristics[1].uuid, measurement_interval.uuid);
+ })), test_desc);
</script>
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 b1b0fb4e648..952e3e6b5e9 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
@@ -6,44 +6,43 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getDiscoveredHealthThermometerDevice()
- .then(({device, fake_peripheral}) => {
- // Setup a device with two measurement intervals.
- return fake_peripheral.setNextGATTConnectionResponse({
- code: HCI_SUCCESS})
- .then(() => device.gatt.connect())
- .then(() => fake_peripheral.addFakeService({
- uuid: 'health_thermometer'}))
- .then(fake_health_thermometer => Promise.all([
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'measurement_interval',
- properties: ['read', 'write', 'indicate']}),
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'measurement_interval',
- properties: ['read', 'write', 'indicate']}),
- fake_health_thermometer.addFakeCharacteristic({
- uuid: 'temperature_measurement',
- properties: ['indicate']})
- ]))
- .then(() => fake_peripheral.setNextGATTDiscoveryResponse({
- code: HCI_SUCCESS}))
- .then(() => device.gatt.getPrimaryService('health_thermometer'))
- // Actual test starts.
- .then(service => service.getCharacteristics())
- .then(characteristics => {
- // Expect three characteristic instances.
- assert_equals(characteristics.length, 3);
+const test_desc = 'Find all characteristics in a service.';
+let device, fake_peripheral;
- let uuid_set = new Set(characteristics.map(c => c.uuid));
- // Two of the expected characteristics are 'measurement_interval',
- // so only 2 unique UUID.
- assert_equals(uuid_set.size, 2);
- assert_true(uuid_set.has(BluetoothUUID.getCharacteristic(
- 'measurement_interval')));
- assert_true(uuid_set.has(BluetoothUUID.getCharacteristic(
- 'temperature_measurement')));
- });
- });
-}, 'Find all characteristics in a service.');
+bluetooth_test(() => getDiscoveredHealthThermometerDevice()
+ .then(_ => ({device, fake_peripheral} = _))
+ // Setup a device with two measurement intervals.
+ .then(() =>
+ fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.connect())
+ .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
+ .then(fake_health_thermometer => Promise.all([
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'measurement_interval',
+ properties: ['read', 'write', 'indicate']}),
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'measurement_interval',
+ properties: ['read', 'write', 'indicate']}),
+ fake_health_thermometer.addFakeCharacteristic({
+ uuid: 'temperature_measurement',
+ properties: ['indicate']})
+ ]))
+ .then(() =>
+ fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
+ .then(() => device.gatt.getPrimaryService('health_thermometer'))
+ // Actual test starts.
+ .then(service => service.getCharacteristics())
+ .then(characteristics => {
+ // Expect three characteristic instances.
+ assert_equals(characteristics.length, 3);
+
+ let uuid_set = new Set(characteristics.map(c => c.uuid));
+ // Two of the expected characteristics are 'measurement_interval',
+ // so only 2 unique UUID.
+ assert_equals(uuid_set.size, 2);
+ assert_true(uuid_set.has(BluetoothUUID.getCharacteristic(
+ 'measurement_interval')));
+ assert_true(uuid_set.has(BluetoothUUID.getCharacteristic(
+ 'temperature_measurement')));
+ }), test_desc);
</script>
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 f9c8efbfd74..6401740681a 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
@@ -6,11 +6,15 @@
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
-bluetooth_test(() => {
- return getEmptyHealthThermometerService()
- .then(({service}) => assert_promise_rejects_with_message(
- service.getCharacteristics(),
- new DOMException('No Characteristics found in service.',
- 'NotFoundError')))
-}, 'Request for absent characteristics. Reject with NotFoundError.');
+const test_desc = 'Request for absent characteristics. Reject with ' +
+ 'NotFoundError.';
+const expected = new DOMException('No Characteristics found in service.',
+ 'NotFoundError');
+let service;
+
+bluetooth_test(() => getEmptyHealthThermometerService()
+ .then(_ => ({service} = _))
+ .then(() => assert_promise_rejects_with_message(
+ service.getCharacteristics(), expected)),
+ test_desc);
</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/form-action/form-action-self-allowed-target-blank.html b/tests/wpt/web-platform-tests/content-security-policy/form-action/form-action-self-allowed-target-blank.html
new file mode 100644
index 00000000000..673174c1f03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/form-action/form-action-self-allowed-target-blank.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta http-equiv="Content-Security-Policy" content="form-action 'self'">
+</head>
+
+<body>
+ <form action='/content-security-policy/support/postmessage-pass-to-opener.html'
+ id='form_id'
+ target="_blank">
+ </form>
+
+ <p>
+ Test that "form-action 'self'" works correctly when the form uses
+ target="_blank". If this test passes, a new window must open after pressing
+ "submit".
+ </p>
+</body>
+
+<script>
+ async_test(t => {
+ document.addEventListener('securitypolicyviolation', function(e) {
+ t.unreached_func("Form submission was blocked.");
+ });
+
+ window.addEventListener('message', function(event) {
+ t.done();
+ })
+
+ window.addEventListener("load", function() {
+ document.getElementById("form_id").submit();
+ });
+ }, "The form submission should not be blocked by the iframe's CSP.");
+</script>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-allowed.html b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-allowed.html
new file mode 100644
index 00000000000..e103a9fb246
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-allowed.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Security-Policy" content="prefetch-src 'self'">
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+ <script src='/content-security-policy/support/testharness-helper.js'></script>
+ <script src='/content-security-policy/support/prefetch-helper.js'></script>
+ <script>
+ async_test(t => {
+ let url = window.origin + '/content-security-policy/support/pass.png';
+
+ let link = document.createElement('link');
+ link.rel = 'prefetch';
+ link.href = url;
+
+ assert_link_prefetches(t, link);
+ }, 'Prefetch succeeds when allowed by prefetch-src');
+ </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-blocked.html b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-blocked.html
new file mode 100644
index 00000000000..890a65f82cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-blocked.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Security-Policy" content="prefetch-src 'none';">
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+ <script src='/content-security-policy/support/testharness-helper.js'></script>
+ <script src='/content-security-policy/support/prefetch-helper.js'></script>
+ <script>
+ async_test(t => {
+ let url = window.origin + '/content-security-policy/support/fail.png';
+
+ let link = document.createElement('link');
+ link.rel = 'prefetch';
+ link.href = url;
+
+ assert_link_does_not_prefetch(t, link);
+ }, "Blocked prefetch generates report.");
+ </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html
new file mode 100644
index 00000000000..dd8071b66ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <!-- Headers:
+ Content-Security-Policy: prefetch-src 'self'
+ Link: </content-security-policy/support/pass.png>;rel=prefetch
+ -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+ <script src='/content-security-policy/support/testharness-helper.js'></script>
+ <script src='/content-security-policy/support/prefetch-helper.js'></script>
+ <script>
+ async_test(t => {
+ let url = window.origin + '/content-security-policy/support/pass.png';
+ assert_no_csp_event_for_url(t, url);
+
+ waitUntilResourceDownloaded(url)
+ .then(t.step_func_done());
+ }, 'Prefetch via `Link` header succeeds when allowed by prefetch-src');
+ </script>
+</head>
+<body>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html.headers b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html.headers
new file mode 100644
index 00000000000..2b1d42a8d16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-allowed.html.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: prefetch-src 'self'
+Link: </content-security-policy/support/pass.png>;rel=prefetch
diff --git a/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-blocked.html b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-blocked.html
new file mode 100644
index 00000000000..382c99a80d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/prefetch-src/prefetch-header-blocked.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Security-Policy" content="prefetch-src 'none'">
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+ <script src='/content-security-policy/support/testharness-helper.js'></script>
+ <script src='/content-security-policy/support/prefetch-helper.js'></script>
+ <script>
+ async_test(t => {
+ let url = window.origin + '/content-security-policy/support/fail.png';
+ waitUntilCSPEventForURL(t, url)
+ .then(t.step_func_done(e => {
+ assert_equals(e.violatedDirective, 'prefetch-src');
+ assert_resource_not_downloaded(t, url);
+ }));
+
+ // Load a stylesheet that tries to trigger a prefetch:
+ let link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = '/content-security-policy/support/prefetch-subresource.css';
+ document.head.appendChild(link);
+ }, 'Prefetch via `Link` header succeeds when allowed by prefetch-src');
+ </script>
+</head>
+<body>
+</body>
+</html>
+
+
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/checkReport.sub.js b/tests/wpt/web-platform-tests/content-security-policy/support/checkReport.sub.js
index ba179d6bab4..7e5417b5e68 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/support/checkReport.sub.js
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/checkReport.sub.js
@@ -13,9 +13,16 @@
var reportValue = "{{GET[reportValue]}}";
var reportExists = "{{GET[reportExists]}}";
var noCookies = "{{GET[noCookies]}}";
+ var reportCookieName = "{{GET[reportCookieName]}}"
+ var testName = "{{GET[testName]}}"
+ var cookiePresent = "{{GET[cookiePresent]}}"
+ var reportCount = "{{GET[reportCount]}}"
var location = window.location;
- var thisTestName = location.pathname.split('/')[location.pathname.split('/').length - 1].split('.')[0];
+ if (reportCookieName == "") {
+ // fallback on test file name if cookie name not specified
+ reportCookieName = location.pathname.split('/')[location.pathname.split('/').length - 1].split('.')[0];
+ }
var reportID = "";
@@ -24,7 +31,7 @@
var cookieName = cookies[i].split('=')[0].trim();
var cookieValue = cookies[i].split('=')[1].trim();
- if (cookieName == thisTestName) {
+ if (cookieName == reportCookieName) {
reportID = cookieValue;
var cookieToDelete = cookieName + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=" + document.location.pathname.substring(0, document.location.pathname.lastIndexOf('/') + 1);
document.cookie = cookieToDelete;
@@ -33,9 +40,10 @@
}
var timeout = document.querySelector("meta[name=timeout][content=long]") ? 50 : 5;
- var reportLocation = location.protocol + "//" + location.host + "/content-security-policy/support/report.py?op=take&timeout=" + timeout + "&reportID=" + reportID;
+ var reportLocation = location.protocol + "//" + location.host + "/content-security-policy/support/report.py?op=retrieve_report&timeout=" + timeout + "&reportID=" + reportID;
- var reportTest = async_test("Violation report status OK.");
+ if (testName == "") testName = "Violation report status OK.";
+ var reportTest = async_test(testName);
function assert_field_value(field, value, field_name) {
assert_true(field.indexOf(value.split(" ")[0]) != -1,
@@ -77,17 +85,38 @@
report.send();
});
- if (noCookies) {
- var cookieTest = async_test("No cookies sent with report.");
+ if (noCookies || cookiePresent) {
+ var cookieTest = async_test("Test report cookies.");
var cookieReport = new XMLHttpRequest();
cookieReport.onload = cookieTest.step_func(function () {
- var data = JSON.parse(cookieReport.responseText);
- assert_equals(data.reportCookies, "None");
- cookieTest.done();
+ var data = JSON.parse(cookieReport.responseText);
+ if (noCookies) {
+ assert_equals(data.reportCookies, "None", "Report should not contain any cookies");
+ }
+
+ if (cookiePresent) {
+ assert_true(data.reportCookies.hasOwnProperty(cookiePresent), "Report should contain cookie: " + cookiePresent);
+ }
+ cookieTest.done();
});
- var cReportLocation = location.protocol + "//" + location.host + "/content-security-policy/support/report.py?op=cookies&timeout=" + timeout + "&reportID=" + reportID;
+ var cReportLocation = location.protocol + "//" + location.host + "/content-security-policy/support/report.py?op=retrieve_cookies&timeout=" + timeout + "&reportID=" + reportID;
cookieReport.open("GET", cReportLocation, true);
cookieReport.send();
- };
+ }
+
+ if (reportCount != "") {
+ var reportCountTest = async_test("Test number of sent reports.");
+ var reportCountReport = new XMLHttpRequest();
+ reportCountReport.onload = reportCountTest.step_func(function () {
+ var data = JSON.parse(reportCountReport.responseText);
+
+ assert_equals(data.report_count, reportCount, "Report count was not what was expected.");
+
+ reportCountTest.done();
+ });
+ var cReportLocation = location.protocol + "//" + location.host + "/content-security-policy/support/report.py?op=retrieve_count&timeout=" + timeout + "&reportID=" + reportID;
+ reportCountReport.open("GET", cReportLocation, true);
+ reportCountReport.send();
+ }
})();
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/postmessage-pass-to-opener.html b/tests/wpt/web-platform-tests/content-security-policy/support/postmessage-pass-to-opener.html
new file mode 100644
index 00000000000..e1bdf7102f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/postmessage-pass-to-opener.html
@@ -0,0 +1,3 @@
+<script>
+ window.top.opener.postMessage('PASS', '*');
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-helper.js b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-helper.js
new file mode 100644
index 00000000000..db6d87593df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-helper.js
@@ -0,0 +1,65 @@
+test(t => {
+ assert_true(document.createElement('link').relList.supports('prefetch'));
+}, "Browser supports prefetch.");
+
+test(t => {
+ assert_true(!!window.PerformanceResourceTiming);
+}, "Browser supports performance APIs.");
+
+async function waitUntilResourceDownloaded(url) {
+ await new Promise((resolve, reject) => {
+ if (performance.getEntriesByName(url).length >= 1)
+ resolve();
+
+ let observer = new PerformanceObserver(list => {
+ list.getEntries().forEach(entry => {
+ if (entry.name == url) {
+ resolve();
+ }
+ });
+ });
+ });
+}
+
+async function assert_resource_not_downloaded(test, url) {
+ if (performance.getEntriesByName(url).length >= 1) {
+ (test.unreached_func(`'${url}' should not have downloaded.`))();
+ }
+}
+
+function assert_link_prefetches(test, link) {
+ assert_no_csp_event_for_url(test, link.href);
+
+ link.onerror = test.unreached_func('onerror should not fire.');
+
+ // Test is finished when either the `load` event fires, or we get a performance
+ // entry showing that the resource loaded successfully.
+ link.onload = test.step_func(test.step_func_done());
+ waitUntilResourceDownloaded(link.href).then(test.step_func_done());
+
+ document.head.appendChild(link);
+}
+
+function assert_link_does_not_prefetch(test, link) {
+ let cspEvent = false;
+ let errorEvent = false;
+
+ waitUntilCSPEventForURL(test, link.href)
+ .then(test.step_func(e => {
+ cspEvent = true;
+ assert_equals(e.violatedDirective, "prefetch-src");
+ assert_equals(e.effectiveDirective, "prefetch-src");
+
+ if (errorEvent)
+ test.done();
+ }));
+
+ link.onerror = test.step_func(e => {
+ errorEvent = true;
+ if (cspEvent)
+ test.done();
+ });
+ link.onload = test.unreached_func('onload should not fire.');
+
+ document.head.appendChild(link);
+}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css
new file mode 100644
index 00000000000..4c4fa464420
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css
@@ -0,0 +1,3 @@
+/* This CSS file sends some headers:
+ * Link: </content-security-policy/support/fail.png>;rel=prefetch
+ */
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css.headers b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css.headers
new file mode 100644
index 00000000000..eaf7b166385
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/prefetch-subresource.css.headers
@@ -0,0 +1 @@
+Link: </content-security-policy/support/fail.png>;rel=prefetch
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/report.py b/tests/wpt/web-platform-tests/content-security-policy/support/report.py
index 193315fa07b..3b249f30b3e 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/support/report.py
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/report.py
@@ -2,33 +2,61 @@ import time
import json
import re
+def retrieve_from_stash(request, key, timeout, default_value):
+ t0 = time.time()
+ while time.time() - t0 < timeout:
+ time.sleep(0.5)
+ value = request.server.stash.take(key=key)
+ if value is not None:
+ return value
+
+ return default_value
+
def main(request, response):
- op = request.GET.first("op");
- key = request.GET.first("reportID")
+ op = request.GET.first("op");
+ key = request.GET.first("reportID")
+ cookie_key = re.sub('^....', 'cccc', key)
+ count_key = re.sub('^....', 'dddd', key)
- if op == "take":
- timeout = float(request.GET.first("timeout"))
- t0 = time.time()
- while time.time() - t0 < timeout:
- time.sleep(0.5)
- value = request.server.stash.take(key=key)
- if value is not None:
- return [("Content-Type", "application/json")], value
+ try:
+ timeout = request.GET.first("timeout")
+ except:
+ timeout = 0.5
+ timeout = float(timeout)
- return [("Content-Type", "application/json")], json.dumps({'error': 'No such report.' , 'guid' : key})
+ if op == "retrieve_report":
+ return [("Content-Type", "application/json")], retrieve_from_stash(request, key, timeout, json.dumps({'error': 'No such report.' , 'guid' : key}))
- if op == "cookies":
- cval = request.server.stash.take(key=re.sub('^...', 'ccc', key))
- if cval is None:
- cval = "\"None\""
+ if op == "retrieve_cookies":
+ return [("Content-Type", "application/json")], "{ \"reportCookies\" : " + str(retrieve_from_stash(request, cookie_key, timeout, "\"None\"")) + "}"
- return [("Content-Type", "application/json")], "{ \"reportCookies\" : " + cval + "}"
+ if op == "retrieve_count":
+ return [("Content-Type", "application/json")], json.dumps({'report_count': str(retrieve_from_stash(request, count_key, timeout, 0))})
- if hasattr(request, 'Cookies'):
- request.server.stash.put(key=re.sub('^...', 'ccc', key), value=request.Cookies)
+ # save cookies
+ if hasattr(request, 'cookies') and len(request.cookies.keys()) > 0:
+ # convert everything into strings and dump it into a dict so it can be jsoned
+ temp_cookies_dict = {}
+ for dict_key in request.cookies.keys():
+ temp_cookies_dict[str(dict_key)] = str(request.cookies.get_list(dict_key))
+ with request.server.stash.lock:
+ request.server.stash.take(key=cookie_key)
+ request.server.stash.put(key=cookie_key, value=json.dumps(temp_cookies_dict))
- report = request.body
- report.rstrip()
+ # save latest report
+ report = request.body
+ report.rstrip()
+ with request.server.stash.lock:
request.server.stash.take(key=key)
request.server.stash.put(key=key, value=report)
- return [("Content-Type", "text/plain")], "Recorded report " + report
+
+ with request.server.stash.lock:
+ # increment report count
+ count = request.server.stash.take(key=count_key)
+ if count is None:
+ count = 0
+ count += 1
+ request.server.stash.put(key=count_key, value=count)
+
+ # return acknowledgement report
+ return [("Content-Type", "text/plain")], "Recorded report " + report
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-001.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-001.xht
index 43179e6ce7c..825ab5ab2ee 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Class selectors with only a partial match of 'class' attribute</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/no-red-filler-text-ref.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Class selector need to match any or all of the values in the 'class' attribute." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-002.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-002.xht
index 7005634602f..1aac525555f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-002.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Class selectors with a type</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Class selector with a type, match the appropriate element." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-003.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-003.xht
index 9ed65d01135..f09716610fe 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-003.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Class selectors without a type</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Class selector without a type, match the appropriate element." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-004.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-004.xht
index 29b22615681..c7faefbce17 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-004.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Invalid class selectors with a space between the "." and the class name</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/no-red-filler-text-ref.xht"/>
<meta name="flags" content="invalid" />
<meta name="assert" content="The attribute value of a class selector followed by white space is invalid." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-005.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-005.xht
index ee809f3809e..a62adaee1cc 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-005.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Invalid class selectors with a carriage return between the "." and the class name</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/no-red-filler-text-ref.xht"/>
<meta name="flags" content="invalid" />
<meta name="assert" content="The attribute value of a class selector followed by white space is invalid." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-006.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-006.xht
index 2010fb8267b..c55443a9176 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-006.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Multiple class selectors</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="All class names in the selector need to match all of the 'class' attribute values." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-007.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-007.xht
index e336bf4c9de..c27f3f2edd5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-007.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Multiple class selectors and missing class values</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/no-red-filler-text-ref.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="All class names in the selector need to match all of the 'class' attribute values." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-008.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-008.xht
index 375a6d6ca0d..b4ceabb6a02 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-008.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/class/001.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
<link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
.teST { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-009.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-009.xht
index 29baaa748c8..cba3e082894 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-009.xht
@@ -5,13 +5,15 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/class/002.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
+ <link rel="match" href="../reference/ref-green-background.xht" />
<style type="text/css">
p { background: green; color: white; }
.fail.test { background: red; color: yellow; }
</style>
</head>
<body>
- <p class="pass test">This line should be green.</p>
+ <p class="pass test">This should have a green background.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-010.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-010.xht
index 99f3ebc7bf2..e0fd5bc19a3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-010.xht
@@ -5,13 +5,15 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/class/003.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
+ <link rel="match" href="../reference/ref-green-background.xht" />
<style type="text/css">
p { background: red; color: yellow; }
.pass.test { background: green; color: white; }
</style>
</head>
<body>
- <p class="pass test">This line should be green.</p>
+ <p class="pass test">This should have a green background.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-011.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-011.xht
index 2af242bde6a..ac49276ec29 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-011.xht
@@ -5,13 +5,15 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/class/004.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
+ <link rel="match" href="../reference/ref-green-background.xht" />
<style type="text/css">
p { background: red; color: yellow; }
.pass { background: green; color: white; }
</style>
</head>
<body>
- <p class="pass test">This line should be green.</p>
+ <p class="pass test">This should have a green background.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012-ref.html
new file mode 100644
index 00000000000..52f9a3abcec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ p {
+ color: white;
+ background: green;
+ }
+</style>
+<body>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+ <p>This line should be green.</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012.xht
index b822f1b2e7b..ea57e2b8a51 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/class-selector-012.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/class/005.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#class-html" />
+ <link rel="help" href="https://www.w3.org/TR/selectors/#class-html" />
+ <link rel="match" href="class-selector-012-ref.html" />
<style type="text/css">
p { background: red; color: yellow; }
.test { background: green; color: white; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001-ref.html
new file mode 100644
index 00000000000..8aa67fa12a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ .green {
+ color: green;
+ }
+</style>
+<body>
+ <div class="green">Filler Text</div>
+ <div>Filler Text</div>
+ <p>Test passes if the first "Filler Text" above is green and the second one is black.</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001.xht
index e8d4e6613fe..9f60cdc59e2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-child pseudo-class</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-child" />
+ <link rel="match" href="first-child-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="First-child pseudo-class matches only the first element of its type." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002-ref.html
new file mode 100644
index 00000000000..c2ee2e78bf8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ .green {
+ color: green;
+ }
+</style>
+<body>
+ Filler Text
+ <div class="green">Filler Text</div>
+ <div>Filler Text</div>
+ <p>Test passes if the second line of "Filler Text" above is green and the first and third lines are black.</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002.xht
index 588d8f931c9..d2c6512daba 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-002.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-child pseudo-class with text node</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-child" />
+ <link rel="match" href="first-child-selector-002-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="First-child pseudo-class matches only the first element of its type ignoring text nodes." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-003.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-003.xht
index c779c8bd0e9..a02e002777d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-child-selector-003.xht
@@ -5,12 +5,13 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/child/001.xml" type="application/xhtml+xml"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-child" />
+ <link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
- html { color: green; }
- html:first-child { color: red ! important; }
+ html { color: red; }
+ :root:first-child { color: green; }
</style>
</head>
<body>
- <p>This should be green.</p>
+ <p>This text should be green.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000-ref.html
new file mode 100644
index 00000000000..ea97ba2a174
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ div {
+ color: green;
+ font: 2em sans-serif;
+ }
+</style>
+<body>
+ <p>This next line should be green:</p>
+ <div>TESTING</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000.xht
index 1b2b6fff4d6..0fdef1893b9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-000.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-letter/001.xml" type="application/xhtml+xml"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-000-ref.html" />
<style type="text/css">
.test { float: left; font: 2em sans-serif; }
.test:first-letter { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001-ref.html
new file mode 100644
index 00000000000..625c2f5c151
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ span {
+ color: green;
+ }
+</style>
+<body>
+ <p>Test passes if the letter "F" below is green.</p>
+ <div><span>F</span>iller Text</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001.xht
index c386e3ef897..7ae5c3a05b1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter pseudo-element</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The :first-letter pseudo-element matches the first letter in a given element." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002-ref.html
new file mode 100644
index 00000000000..39d40455a75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<body>
+ <p>Test passes if there is no red visible on the page.</p>
+ <div><img alt="15x15 blue box" src="support/blue15x15.png" />Filler Text</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002.xht
index 3c556851715..982c64dbc2f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-002.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter pseudo-element with image missing alt text</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-002-ref.html" />
<meta name="flags" content="image" />
<meta name="assert" content="If there is preceding content (an image) or alt text the :first-letter pseudo-element does not match the first letter." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003-ref.html
new file mode 100644
index 00000000000..a818e1a7d51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ span {
+ color: green;
+ }
+</style>
+<body>
+ <p>Test passes if the number "4" below is green.</p>
+ <div><span>4</span>2 Filler Text</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003.xht
index 42ea44590b4..876f2ef7711 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-003.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter as a digit</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-003-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The ':first-letter' applies if the first letter is a digit." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-004.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-004.xht
index 9ac95877594..e350c74c9c4 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-004.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter and :before</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="If an element has ':before' or ':after' content, the ':first-letter applies to the first letter of the element including that content." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005-ref.html
new file mode 100644
index 00000000000..d64537c2388
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<body>
+ <p>Test passes if there is no red visible on the page.</p>
+ <div><br />Filler Text</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005.xht
index 3d0a622fb0e..7f0c7dc936c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-005.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter with leading line break</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-005-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The first letter occurs on the first formatted line." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007-ref.html
new file mode 100644
index 00000000000..4c2801b0aaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ span {
+ color: green;
+ }
+</style>
+<body>
+ <p>Test passes if the letter "F" below is green.</p>
+ <table>
+ <tr>
+ <td><span>F</span>iller Text</td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007.xht
index 45b7bb06101..2f19c5d58d8 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-007.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter with table cell elements</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-007-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The :first-letter pseudo-element applies to table-cells." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-008.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-008.xht
index 8380838f084..e7c9b660674 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-008.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter with inline-block elements</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The first-letter pseudo-element applies to inline-block elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-019.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-019.xht
index 228308a2d98..115d71698be 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-019.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-letter-selector-019.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter in descendents</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-letter" />
+ <link rel="match" href="first-letter-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="A user agent acts as if the fictional start tag of the first-letter pseudo-element is just before the first text of the element, even if that first text is in a descendant." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-017.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-017.xht
index f6e9033c19d..9f43eca8066 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-017.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-017.xht
@@ -12,6 +12,6 @@
</style>
</head>
<body>
- <p><span>This sentence should have a green background.</span></p>
+ <p><span>This should have a green background.</span></p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-019.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-019.xht
index c1bb6cddd44..3c29e0383aa 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-019.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-019.xht
@@ -6,11 +6,12 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-line/003.xml" type="application/xhtml+xml"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-line/003.html" type="type/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
:first-line { color: green; }
</style>
</head>
<body>
- <p>This line should be green.</p>
+ <p>This text should be green.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-020.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-020.xht
index 63acd1cc710..d0c8ddcc0f3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-020.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-020.xht
@@ -6,11 +6,12 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-line/004.xml" type="application/xhtml+xml"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-line/004.html" type="type/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
*:first-line { color: green; }
</style>
</head>
<body>
- <p>This line should be green.</p>
+ <p>This text should be green.</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-021.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-021.xht
index af425a0306e..d071fc00047 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-021.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-pseudo-021.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/selectors/first-line/005.html" type="type/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
p { color: red; }
p:first-line { color: green; }
@@ -12,6 +13,6 @@
</style>
</head>
<body>
- <p><span>This line should be green.</span></p>
+ <p><span>This text should be green.</span></p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-selector-010.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-selector-010.xht
index b64f927593a..bbfa65201e3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-selector-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/first-line-selector-010.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-line after a BR</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="first-letter-selector-005-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The :first-line pseudo-element start tag is inserted right after the start tag of the block element." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/id-selector-002.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/id-selector-002.xht
index 315b91639d5..8d82b3e4caa 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/id-selector-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/id-selector-002.xht
@@ -4,6 +4,7 @@
<title>CSS Test: ID selector syntax - Begins with hyphen</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#id-selectors" />
+ <link rel="match" href="../reference/filler-text-below-green.xht" />
<meta name="flags" content="" />
<meta name="assert" content="Identifier selectors starting with a hyphen are valid." />
<style type="text/css">
@@ -18,7 +19,7 @@
</style>
</head>
<body>
- <p>Test passes if there is no red visible on the page.</p>
+ <p>Test passes if the "Filler Text" below is green.</p>
<div id="-div1">Filler Text</div>
</body>
</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004-ref.html
new file mode 100644
index 00000000000..6f57dfc3917
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<style>
+ div {
+ color: green;
+ }
+</style>
+<body>
+ <p>Test passes if the "Filler Text" below is green.</p>
+ <div>Filler Text
+ <p>Filler Text</p>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004.xht
index 4b8ec89ddc4..d15c8eb502b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-004.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Inherited lang attribute selected</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#lang" />
+ <link rel="match" href="lang-selector-004-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Lang attribute is inherited and lang selector works on children." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-005.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-005.xht
index f149d7e36cc..916028cc6b5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-005.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Lang selector and document language set via server's content-language</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#lang" />
+ <link rel="match" href="../reference/filler-text-below-green.xht" />
<meta name="flags" content="http" />
<meta name="assert" content="Lang attribute is selectable when specified by HTTP header." />
<style type="text/css">
@@ -18,7 +19,6 @@
</style>
</head>
<body>
- <p id="prerequisite">PREREQUISITE: Set the page "content-language" header to "fr" (French).</p>
<p>Test passes if the "Filler Text" below is green.</p>
<div>Filler Text</div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-006.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-006.xht
index 244639c544d..e647695a5a0 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/lang-selector-006.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Lang selector and document language set via meta tag</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#lang" />
+ <link rel="match" href="../reference/filler-text-below-green.xht" />
<meta name="flags" content="" />
<meta http-equiv="content-language" content="fr" />
<meta name="assert" content="Lang attribute is selectable when specified in a meta tag." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-006.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-006.xht
index be667b078e3..d0bd9f9820d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-006.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-letter pseudo-element case sensitivity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="first-letter-selector-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="First-letter is case-insensitive." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-007.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-007.xht
index 1daca918e05..e00770959f3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-007.xht
@@ -4,6 +4,7 @@
<title>CSS Test: First-child pseudo-element case sensitivity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="universal-selector-002-ref.xht" />
<meta name="flags" content="" />
<meta name="assert" content="First-child is case-insensitive." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008-ref.html b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008-ref.html
new file mode 100644
index 00000000000..8297dc3d74e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Reftest Reference</title>
+<body>
+ <p>Test passes if the words "Filler Text" are below.</p>
+ <div>Filler Text</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008.xht
index 41c009e986e..be85608cf52 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/pseudo-008.xht
@@ -4,6 +4,7 @@
<title>CSS Test: After and before case sensitivity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo" />
+ <link rel="match" href="pseudo-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="After and before are case-insensitive." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-004.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-004.xht
index 7789f4880a2..6d23331e954 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-004.xht
@@ -8,7 +8,7 @@
<meta name="flags" content="http" />
<meta name="assert" content="The HTTP charset setting overrides the referring document's code page." />
<style type="text/css">
- @import "support/at-charset-004.css";
+ @import "support/at-charset-003.css";
div
{
color: red;
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-005.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-005.xht
index ba952a6e67f..d76f64f6505 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-005.xht
@@ -9,7 +9,7 @@
<meta name="assert" content="The HTTP charset setting overrides the charset designation in the referring document's meta tag." />
<meta http-equiv="Content-Type" content="text/html; windows-1252" />
<style type="text/css">
- @import "support/at-charset-005.css";
+ @import "support/at-charset-003.css";
div
{
color: red;
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-006.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-006.xht
index beba4fc56c1..d78b378b1a9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/at-charset-006.xht
@@ -8,7 +8,7 @@
<meta name="flags" content="http" />
<meta name="assert" content="The HTTP charset setting overrides the charset of referring document." />
<style type="text/css">
- @import "support/at-charset-006.css";
+ @import "support/at-charset-003.css";
div
{
color: red;
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/comments-005.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/comments-005.xht
index a7f22b21775..c192689a1b8 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/comments-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/comments-005.xht
@@ -16,7 +16,7 @@
</style>
</head>
<body>
- <p>Test passes if "Filler Text" is green.</p>
+ <p>Test passes if the "Filler Text" below is green.</p>
<div>Filler Text</div>
</body>
</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-003.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-003.xht
index 3002a970cb5..e09d9700693 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-003.xht
@@ -5,7 +5,7 @@
<link rel="author" title="L. David Baron" href="https://dbaron.org/"/>
<link rel="author" title="Ray Kiddy" href="mailto:ray@ganymede.org"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#characters"/>
- <link rel="match" href="ident-000-ref.xht"/>
+ <link rel="match" href="ident-003-ref.xht"/>
<meta name="flags" content="invalid"/>
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-020.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-020.xht
deleted file mode 100644
index d6cb0c98ea1..00000000000
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/ident-020.xht
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Test: Invalid Identifiers (starting with double -) as Classes and IDs</title>
- <link rel="author" title="L. David Baron" href="https://dbaron.org/"/>
- <link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#characters"/>
- <link rel="match" href="ident-000-ref.xht"/>
-
- <meta name="flags" content="invalid" />
- <style type="text/css">
-
- .one { color: green; background: white; }
- .--ident, .one { color: red; }
-
- .two { color: green; background: white; }
- #--ident, .two { color: red; }
-
- </style>
-
- </head>
- <body>
-
- <p class="one">This should be green.</p>
- <p class="two">This should be green.</p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/.htaccess b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/.htaccess
deleted file mode 100644
index 7760371a4d9..00000000000
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/.htaccess
+++ /dev/null
@@ -1,40 +0,0 @@
-<Files ~ "^plaintext.css$">
-ForceType text/plain
-</Files>
-
-<files character-encoding-031.css>
-AddCharset iso-8859-1 .css
-</files>
-
-<files character-encoding-032.css>
-AddCharset iso-8859-11 .css
-</files>
-
-<files character-encoding-033.css>
-AddCharset iso-8859-5 .css
-</files>
-
-<files character-encoding-034.css>
-AddCharset iso-8859-6 .css
-</files>
-
-<files character-encoding-035.css>
-AddCharset iso-8859-7 .css
-</files>
-
-<files character-encoding-036.css>
-AddCharset iso-8859-8 .css
-</files>
-
-<files character-encoding-037.css>
-AddCharset koi8-r .css
-</files>
-
-<files ~ '^at-charset-07[1234567]\.css$'>
-RemoveCharset .css
-</files>
-
-<files character-encoding-041.css>
-AddCharset utf-16be .css
-</files>
-
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-001.css.headers b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-001.css.headers
new file mode 100644
index 00000000000..b2d94d06995
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-001.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=Shift_JIS
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-002.css.headers b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-002.css.headers
new file mode 100644
index 00000000000..b2d94d06995
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-002.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=Shift_JIS
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-003.css.headers b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-003.css.headers
new file mode 100644
index 00000000000..b2d94d06995
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-003.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=Shift_JIS
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-004.css b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-004.css
deleted file mode 100644
index a9b14d8dfb8..00000000000
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-004.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.a, #div2
-{
- color: green;
-} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-005.css b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-005.css
deleted file mode 100644
index a9b14d8dfb8..00000000000
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-005.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.a, #div2
-{
- color: green;
-} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-006.css b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-006.css
deleted file mode 100644
index a9b14d8dfb8..00000000000
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/at-charset-006.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.a, #div2
-{
- color: green;
-} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/support/plaintext.css.headers b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/plaintext.css.headers
new file mode 100644
index 00000000000..a1f9e38d909
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/support/plaintext.css.headers
@@ -0,0 +1 @@
+Content-Type: text/plain
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001-ref.html
new file mode 100644
index 00000000000..117b41c2ab2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<body>
+ <p>Test passes if the words "Filler Text" below are all on the same line.</p>
+ <div>Filler Text Filler Text Filler Text</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001.xht
index d228b357b10..d575df64825 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-001.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: inline' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002-ref.html
new file mode 100644
index 00000000000..e60406befe7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ .blue {
+ background: blue;
+ }
+</style>
+<body>
+ <p>Test passes if there are three lines of "Filler Text" below and the middle line has a blue background.</p>
+ <div>Filler Text</div>
+ <div class="blue">Filler Text</div>
+ <div>Filler Text</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002.xht
index 4e8334e5870..bc7fd55873d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-002.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-002-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: block' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003-ref.html
new file mode 100644
index 00000000000..87bda4a9575
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ div {
+ margin-left: 2em;
+ }
+ .orange {
+ background: orange;
+ display: list-item;
+ }
+</style>
+<body>
+ <p>Test passes if there are three lines of "Filler Text" below and if the middle "Filler Text" has a orange background and a marker bullet on its left-hand side. The marker bullet should not have an orange background.</p>
+ <div>Filler Text</div>
+ <div class="orange">Filler Text</div>
+ <div>Filler Text</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003.xht
index 032e0c3e631..546dfd60f59 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-003.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-003-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: list-item' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-005.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-005.xht
index aa2a9af496f..8fbc0596c32 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-005.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: inline-block' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006-ref.html
new file mode 100644
index 00000000000..3426468f22d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ .box {
+ background: blue;
+ height: 1in;
+ width: 2in;
+ }
+</style>
+<body>
+ <p>Test passes if the "Filler Text" below is below the box.</p>
+ <div class="box"></div>
+ <div>Filler Text</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006.xht
index 28bdfdb0ccf..917f13e863a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-006.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-006-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-007.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-007.xht
index 607dfe7eaab..939967eb6c1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-007.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-006-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: inline-table' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008-ref.html
new file mode 100644
index 00000000000..7e2af4562f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ .box {
+ background: blue;
+ height: 1in;
+ width: 2in;
+ }
+</style>
+<body>
+ <p>Test passes if the "Filler Text" below is above the box.</p>
+ <div>Filler Text</div>
+ <div class="box"></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008.xht
index d6fe5e43149..c7b3644967b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-008.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-row-group' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-009.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-009.xht
index d45d9366607..de99f441873 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-009.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-header-group' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-010.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-010.xht
index 75afc688ba3..b37aa9470af 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-010.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-footer-group' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-011.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-011.xht
index 3db6e29a583..6f9f53bf046 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-011.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-column' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-012.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-012.xht
index a1cb7c0633c..1a65da40698 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-012.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-row' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-013.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-013.xht
index 3e4353e61a0..26360ab4e20 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-013.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-013.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-column-group' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-014.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-014.xht
index cd89de75e96..f55d8b78a51 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-014.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-014.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-008-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side does not apply to 'display: table-cell' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-015.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-015.xht
index f26658cb754..414db631448 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-015.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-015.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-006-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side applies to 'display: table-caption' elements." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017-ref.html
new file mode 100644
index 00000000000..4a19d9c9f3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ div {
+ background: blue;
+ width: 2in;
+ }
+ .box {
+ height: 1in;
+ }
+</style>
+<body>
+ <p>Test passes if the "Filler Text" below is inside the box.</p>
+ <div>Filler Text</div>
+ <div class="box"></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017.xht
index 4ebbe1d2b83..20f7e76bd7d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/caption-side-applies-to-017.xht
@@ -5,6 +5,7 @@
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#propdef-caption-side" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#caption-position" />
+ <link rel="match" href="caption-side-applies-to-017-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Caption-side applies to 'display: inherit' elements which do not inherit the value of 'table-caption'." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001-ref.html
new file mode 100644
index 00000000000..38308df01aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ div {
+ height: 120px;
+ width: 220px;
+ }
+ .orange {
+ background: orange;
+ }
+ .blue {
+ background: blue;
+ }
+</style>
+<body>
+ <p>Test passes if the orange and blue boxes below are the same width.</p>
+ <div class="orange"></div>
+ <div class="blue"></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001.xht
index 90e706e087a..4501b584f39 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Collapsing borders model row width equation (auto layout)</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The user agent adheres to the collapsing border model row width equation in auto table layout." />
<style type="text/css">
@@ -22,7 +23,7 @@
#div1
{
background: orange;
- height: 110px;
+ height: 120px;
width: 220px;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003-ref.html b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003-ref.html
new file mode 100644
index 00000000000..c9c30c2a3d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+ div {
+ height: 1.5in;
+ width: 100px;
+ }
+ .orange {
+ background: orange;
+ }
+ .blue {
+ background: blue;
+ width: 50px;
+ float: right;
+ }
+</style>
+<body>
+ <p>Test passes if the orange and blue boxes below are the same height.</p>
+ <div class="orange"><div class="blue"></div></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003.xht
index 9a0b5f05c9d..8616e697cd1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-003.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Top table border width under collapsing borders model</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-003-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The top border width of the table is half of the maximum collapsed top border width." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-004.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-004.xht
index 41e158f4a86..fa7c3c9196c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-004.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Tables under the collapsing borders model don't have padding</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="Padding doesn't apply to a table under the collapsing border model." />
<style type="text/css">
@@ -23,7 +24,7 @@
#div1
{
background: orange;
- height: 110px;
+ height: 120px;
width: 220px;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-007.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-007.xht
index d48fdffb66d..6fe47429e84 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-007.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Left table border width under collapsing borders model</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The left border width of the table is half of the first cell's collapsed left border width." />
<style type="text/css">
@@ -14,21 +15,22 @@
}
col
{
- width: 1in;
+ width: 165px;
}
td, #div1
{
- height: 1in;
+ height: 120px;
}
td
{
- border-left: 1in solid blue;
+ width: 110px;
+ border-left: 110px solid blue;
padding: 0;
}
#div1
{
background: orange;
- width: 1.5in;
+ width: 220px;
}
</style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-008.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-008.xht
index 65746589a26..23a4b31c14a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-008.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Right table border width under collapsing borders model</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-001-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The right border width of the table is half of the collapsed right border width of the last cell of the first row." />
<style type="text/css">
@@ -14,21 +15,22 @@
}
col
{
- width: 1in;
+ width: 165px;
}
td, #div1
{
- height: 1in;
+ height: 120px;
}
td
{
- border-right: 1in solid blue;
+ width: 110px;
+ border-right: 110px solid blue;
padding: 0;
}
#div1
{
background: orange;
- width: 1.5in;
+ width: 220px;
}
</style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-009.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-009.xht
index dfd35f2d6ac..6f0b864b694 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/collapsing-border-model-009.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Bottom table border width under collapsing borders model</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#collapsing-borders" />
+ <link rel="match" href="collapsing-border-model-003-ref.html" />
<meta name="flags" content="" />
<meta name="assert" content="The bottom border width of the table is half of the maximum collapsed bottom border width." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-001.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-001.xht
index 010318e2fad..4f91f23bc7b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Row and the 'visibility' property</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#dynamic-effects" />
+ <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta name="flags" content="" />
<meta name="assert" content="A 'visibility' value of 'collapse' applies to table rows." />
<style type="text/css">
@@ -27,13 +28,13 @@
.cell
{
display: table-cell;
- height: 1in;
- width: 1in;
+ height: 100px;
+ width: 100px;
}
</style>
</head>
<body>
- <p>Test passes if there is no red visible on the page.</p>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="table">
<div id="row1">
<div class="cell"></div>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-002.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-002.xht
index 5242ecdfa88..5b6309c2dd6 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/row-visibility-002.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Row group and the 'visibility' property</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#dynamic-effects" />
+ <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta name="flags" content="" />
<meta name="assert" content="The 'visibility' value of 'collapse' applies to table row groups." />
<style type="text/css">
@@ -31,13 +32,13 @@
.cell
{
display: table-cell;
- height: 1in;
- width: 1in;
+ height: 100px;
+ width: 100px;
}
</style>
</head>
<body>
- <p>Test passes if there is no red visible on the page.</p>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="table">
<div id="rowgroup1">
<div id="row">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/table-cell-001.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/table-cell-001.xht
index 3f095742f8a..3b64c7ac306 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/tables/table-cell-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/table-cell-001.xht
@@ -4,6 +4,7 @@
<title>CSS Test: Table-cell</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#table-display" />
+ <link rel="match" href="../reference/ref-filled-black-96px-square.xht" />
<meta name="flags" content="" />
<meta name="assert" content="An element with 'display: table-cell' is rendered as if it were a table cell." />
<style type="text/css">
@@ -19,13 +20,13 @@
{
background: black;
display: table-cell;
- height: 2em;
- width: 2em;
+ height: 48px;
+ width: 48px;
}
</style>
</head>
<body>
- <p>Test passes if there is a square below.</p>
+ <p>Test passes if there is a filled black square.</p>
<div class="table">
<div class="tr">
<div class="td"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-content/element-replacement-ref.html b/tests/wpt/web-platform-tests/css/css-content/element-replacement-ref.html
new file mode 100644
index 00000000000..d301f1d6a1b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-content/element-replacement-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<title>Reference for the content CSS attribute can replace an element's contents</title>
+
+<img src='resources/rect.svg' />
diff --git a/tests/wpt/web-platform-tests/css/css-content/element-replacement.html b/tests/wpt/web-platform-tests/css/css-content/element-replacement.html
new file mode 100644
index 00000000000..a78e9f713b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-content/element-replacement.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>The content CSS attribute can replace an element's contents</title>
+<link rel="match" href="element-replacement-ref.html" />
+<link rel="help" href="https://drafts.csswg.org/css-content-3/#content-property" />
+<meta name="assert" content"This test checks that the CSS content propertly can replace a normal element's contents" />
+
+<style>
+p {
+ margin: 0;
+ content: url('resources/rect.svg');
+}
+</style>
+
+<p>This text should not be visible</p>
diff --git a/tests/wpt/web-platform-tests/css/css-content/resources/rect.svg b/tests/wpt/web-platform-tests/css/css-content/resources/rect.svg
new file mode 100644
index 00000000000..d5de6b4c9da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-content/resources/rect.svg
@@ -0,0 +1,3 @@
+<svg width="100" height="100" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <rect x="0" y="0" width="100" height="100" fill="green" />
+</svg>
diff --git a/tests/wpt/web-platform-tests/css/css-display/display-contents-text-inherit-002.html b/tests/wpt/web-platform-tests/css/css-display/display-contents-text-inherit-002.html
new file mode 100644
index 00000000000..51bf96846c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-display/display-contents-text-inherit-002.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Display: Apply white-space property of display:contents element to inline children</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-display-3/#valdef-display-contents">
+<link rel="match" href="display-contents-text-inherit-ref.html">
+<p>The words "Two" and "lines" should not be on the same line.</p>
+<div id="div" style="background-color:red">
+ <span style="display:contents;white-space:pre-line">Two
+ lines
+ </span>
+</div>
+<script>
+ document.body.offsetTop;
+ div.style.backgroundColor = "transparent";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01-ref.html
index 4bde365dcf2..0ded6cd76cc 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01-ref.html
@@ -10,17 +10,15 @@
}
.test {
font-family: fwf;
- font-size: 3em;
+ font-size: 2em;
line-height: 1.1;
}
</style>
<body>
-<!-- very minimal test, only tests hist, does not test salt or stylistic sets -->
-
-<p>Test passes if the three lines below are identical, with one cross (✗)</p>
+<p>Test passes if the three lines below are identical, with twenty crosses (✗).</p>
<section class="test">
- <p class="ref">B</p>
- <p class="ref">B</p>
- <p class="ref">B</p>
-</section> \ No newline at end of file
+ <p class="ref">BBBBBBBBBBBBBBBBBBBB</p>
+ <p class="ref">BBBBBBBBBBBBBBBBBBBB</p>
+ <p class="ref">BBBBBBBBBBBBBBBBBBBB</p>
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01.html
index 89cfe2ba447..0cdd2f5ac15 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-01.html
@@ -28,10 +28,9 @@
</style>
<body>
-<p>Test passes if the three lines below are identical, with twenty crosses (✗)
-<!--, followed by one check mark (✓)-->. </p>
+<p>Test passes if the three lines below are identical, with twenty crosses (✗).</p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
- <p class="low">Xnophijklmqrstuvwxyz</p>
- <p class="ref">BBBBBBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+ <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="low">Xnophijklmqrstuvwxyz</p>
+ <p class="ref">BBBBBBBBBBBBBBBBBBBB</p>
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02-ref.html
index d27ffa25b76..a74c5206c0c 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02-ref.html
@@ -10,7 +10,7 @@
}
.test {
font-family: fwf;
- font-size: 3em;
+ font-size: 2em;
line-height: 1.1;
}
</style>
@@ -18,9 +18,9 @@
<!-- very minimal test, only tests hist, does not test salt or stylistic sets -->
-<p>Test passes if the three lines below are identical, with onecheck mark (✓). </p>
+<p>Test passes if the three lines below are identical, with one check mark (✓) followed by nineteen crosses (✗). </p>
<section class="test">
- <p class="ref">A</p>
- <p class="ref">A</p>
- <p class="ref">A</p>
-</section> \ No newline at end of file
+ <p class="ref">ABBBBBBBBBBBBBBBBBBB</p>
+ <p class="ref">ABBBBBBBBBBBBBBBBBBB</p>
+ <p class="ref">ABBBBBBBBBBBBBBBBBBB</p>
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02.html
index b9f777ea3f0..dfc76b9396d 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-02.html
@@ -20,7 +20,7 @@
.high {
font-variant-alternates: historical-forms;
}
- .low {
+ .low {
font-feature-settings: "hist" on, "salt" 00, "ss01" off, "ss02" off, "ss03" off,
"cv01" off, "cv02" off, "cv03" off, "swsh" 00, "cswh" 00, "ornm" 00, "nalt" 00;
}
@@ -29,7 +29,7 @@
<p>Test passes if the three lines below are identical, with one check mark (✓) followed by nineteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">ABBBBBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-03.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-03.html
index 6b2eba9b838..491b732d02c 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-03.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-03.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with one cross (✗), one check mark (✓) followed by eighteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BABBBBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-04.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-04.html
index 35b9940fb8c..526b616dafe 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-04.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-04.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with two crosses (✗), one check mark (✓) followed by seventeen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBABBBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05-ref.html
index 7cb557e20c0..49427186bee 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05-ref.html
@@ -16,9 +16,9 @@
</style>
<body>
-<p>Test passes if the three lines below are identical, with two crosses (✗), one check mark (✓) followed by seventeen crosses (✗). </p>
+<p>Test passes if the three lines below are identical, with three crosses (✗), one check mark (✓) followed by sixteen crosses (✗). </p>
<section class="test">
<p class="ref">BBBABBBBBBBBBBBBBBBB</p>
<p class="ref">BBBABBBBBBBBBBBBBBBB</p>
<p class="ref">BBBABBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05.html
index 4f900ccca53..eca5a3dc6ad 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-05.html
@@ -35,9 +35,9 @@
</style>
<body>
-<p>Test passes if the three lines below are identical, with two crosses (✗), one check mark (✓) followed by seventeen crosses (✗). </p>
+<p>Test passes if the three lines below are identical, with three crosses (✗), one check mark (✓) followed by sixteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBABBBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-06.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-06.html
index fe15c21e298..bf41b92a52c 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-06.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-06.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with four crosses (✗), one check mark (✓) followed by fifteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBABBBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-07.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-07.html
index 70c11383589..54359c277a5 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-07.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-07.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with five crosses (✗), one check mark (✓) followed by fourteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBABBBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-08.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-08.html
index 3228adbd9ea..5c5545cf8ed 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-08.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-08.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with six crosses (✗), one check mark (✓) followed by thirteen crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBABBBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-09.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-09.html
index 71fda689bc8..6c98e62a56c 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-09.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-09.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with seven crosses (✗), one check mark (✓) followed by twelve crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBABBBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-10.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-10.html
index d4054ac8f6d..3e30504f2b8 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-10.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-10.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with eight crosses (✗), one check mark (✓) followed by eleven crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBABBBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-11.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-11.html
index 19e38ed616e..0a8a2d72003 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-11.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-11.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with nine crosses (✗), one check mark (✓) followed by ten crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBABBBBBBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-12.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-12.html
index a0061a408e7..458840d7564 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-12.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-12.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with ten crosses (✗), one check mark (✓), two crosses (✗), one check mark (✓) followed by six crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBABBABBBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-13.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-13.html
index b9fdd496d6b..67b7e680a9d 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-13.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-13.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with eleven crosses (✗), one check mark (✓), two crosses (✗), one check mark (✓) followed by five crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBABBABBBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-14.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-14.html
index 1d57c2c3f92..0f78a5aca80 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-14.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-14.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with twelve crosses (✗), one check mark (✓), two crosses (✗), one check mark (✓) followed by four crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBBABBABBBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-15.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-15.html
index 95ec0fa041d..1c003a8e3cf 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-15.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-15.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with sixteen crosses (✗), one check mark (✓) followed by three crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBBBBBBABBB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-16.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-16.html
index 21215ddf401..176d8ff13e4 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-16.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-16.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with seventeen crosses (✗), one check mark (✓) followed by two crosses (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBBBBBBBABB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-17.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-17.html
index abbe8738fe5..558e2f45d04 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-17.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-17.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with eighteen crosses (✗), one check mark (✓) followed by one cross (✗). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBBBBBBBBAB</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-18.html b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-18.html
index f58ab12fd1e..109ff58d954 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-18.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-variant-alternates-18.html
@@ -37,7 +37,7 @@
<p>Test passes if the three lines below are identical, with nineteen crosses (✗), then one check mark (✓). </p>
<section class="test">
- <p class="high">Xnophijklmqrstuvwxyz</p>
+ <p class="high">Xnophijklmqrstuvwxyz</p>
<p class="low">Xnophijklmqrstuvwxyz</p>
<p class="ref">BBBBBBBBBBBBBBBBBBBA</p>
-</section> \ No newline at end of file
+</section>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-001.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-001.html
index c5c2cf50cec..2dec3c769a5 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-001.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-002.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-002.html
index f0dc1530aee..4463ebf121f 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-002.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-003.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-003.html
index 3ae1ba13638..f9e1c873fbd 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-003.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-004.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-004.html
index 12ca38d6078..ab532206f6a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-004.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-005.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-005.html
index e76a1525d59..3002c174e84 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-005.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-006.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-006.html
index 662260131fe..cf44e9f57b4 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-006.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-007.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-007.html
index 300ace54588..f8aa2da3fd2 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-007.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-008.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-008.html
index e3a8b47031b..24af744b95a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-008.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 80);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-009.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-009.html
index 3f7d675b9ce..bb33c4a2c2c 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-009.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-height", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-010.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-010.html
index fc284b015a7..876fdcd124d 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-010.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 80);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-011.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-011.html
index 1367dd4d707..ff184f16174 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-011.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-012.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-012.html
index cebc217f9b4..b9a9d9b43d3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-012.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-013.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-013.html
index b606c03be41..356220b336b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-013.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 200);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-014.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-014.html
index 61d6365c7d3..3561ae3d80f 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-014.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-015.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-015.html
index b264e36cd31..c56c1397553 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-015.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-016.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-016.html
index 86d5226946a..7815a05718f 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-016.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-017.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-017.html
index 543bd0af941..c8a2ed8b2cc 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-017.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-017.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 100);
grid.style.alignItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-height", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-018.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-018.html
index 33aaa6bf29e..547e6a42984 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-018.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-018.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-height", 80);
grid.style.alignItems = "start";
evaluateStyleChange(item, "after", "data-expected-height", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-019.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-019.html
index c98144c6e3d..53139cbe585 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-019.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-019.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 120);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-020.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-020.html
index d2fab320763..0b6a26f11d6 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-020.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-020.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 120);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-021.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-021.html
index 1a40142f49f..7b68964227f 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-021.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-021.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.alignItems = "normal";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-022.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-022.html
index 3ea469befdd..e4f9e7c3a2d 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-022.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-022.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-023.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-023.html
index e78986de53f..a1bfe9c0673 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-023.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-023.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 120);
grid.style.justifyItems = "normal";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-024.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-024.html
index 9f6c49c16b6..6d3136e00c6 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-024.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-024.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 120);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-025.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-025.html
index 471c2ef1148..917d1109a45 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-025.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-025.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 120);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-026.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-026.html
index facad8a4d28..382ef2523e2 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-026.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-026.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 80);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 120);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-027.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-027.html
index dc9c092797b..0bdedf74dcf 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-027.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-027.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 120);
grid.style.justifyItems = "normal";
evaluateStyleChange(item, "after", "data-expected-width", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-028.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-028.html
index 870538a332f..0def10e2b6e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-028.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-028.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 80);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 120);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-029.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-029.html
index cb067b652c7..766db6baa37 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-029.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-029.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-030.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-030.html
index c7033bb6b8f..3db3b8319f0 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-030.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-030.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 100);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-031.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-031.html
index 55bffbe1c6c..7b0c26d644d 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-031.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-031.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 200);
grid.style.justifyItems = "normal";
evaluateStyleChange(item, "after", "data-expected-width", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-032.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-032.html
index 006cb6a6a95..d161e19b018 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-032.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-032.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 100);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 200);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-033.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-033.html
index 157f43bbac9..92a74561889 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-033.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-033.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 100);
grid.style.justifyItems = "normal";
evaluateStyleChange(item, "after", "data-expected-width", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-034.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-034.html
index 6dbd653c067..78314406fe3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-034.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-034.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 100);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-035.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-035.html
index fbd8e6f8773..4293670f199 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-035.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-035.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 100);
grid.style.justifyItems = "stretch";
evaluateStyleChange(item, "after", "data-expected-width", 80);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-036.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-036.html
index 018b13c95dd..23b01906619 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-036.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-alignment-implies-size-change-036.html
@@ -26,12 +26,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/check-layout-th.js"></script>
-<script src="../support/style-change.js"></script>
+<script src="support/style-change.js"></script>
<script>
function runTest() {
evaluateStyleChange(item, "before", "data-expected-width", 80);
grid.style.justifyItems = "start";
evaluateStyleChange(item, "after", "data-expected-width", 100);
+ done();
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/web-platform-tests/css/css-grid/support/style-change.js b/tests/wpt/web-platform-tests/css/css-grid/alignment/support/style-change.js
index 636b08a3a01..5619394da2b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/support/style-change.js
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/support/style-change.js
@@ -1,5 +1,5 @@
function evaluateStyleChange(element, phase, expectedProperty, expectedResult) {
element.className += " " + phase;
element.setAttribute(expectedProperty, expectedResult);
- checkLayout("." + phase);
+ checkLayout("." + phase, false);
}
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-invalid.html
new file mode 100644
index 00000000000..1ac795be56b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-invalid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#clip-property">
+<meta name="assert" content="clip supports only the grammar 'rect() | auto'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("clip", "none");
+test_invalid_value("clip", "rect(10px, 20px, 30px)");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html
new file mode 100644
index 00000000000..3f5940a5f87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip-path with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<meta name="assert" content="clip-path supports only the grammar '<clip-source> | [ <basic-shape> || <geometry-box> ] | none'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("clip-path", "auto");
+test_invalid_value("clip-path", "ray(0deg)");
+
+test_invalid_value("clip-path", "inset()");
+test_invalid_value("clip-path", "inset(123)");
+test_invalid_value("clip-path", "inset(1% 2% 3% 4% 5%)");
+test_invalid_value("clip-path", "inset(round 0)");
+test_invalid_value("clip-path", "inset(0px round)");
+test_invalid_value("clip-path", "inset(0px round 123)");
+test_invalid_value("clip-path", "inset(0px round 1% 2% 3% 4% 5%)");
+test_invalid_value("clip-path", "inset(0px round / 1px)");
+test_invalid_value("clip-path", "inset(10px round -20px)");
+test_invalid_value("clip-path", "inset(30% round -40%)");
+
+test_invalid_value("clip-path", "circle(123)");
+test_invalid_value("clip-path", "circle(at)");
+test_invalid_value("clip-path", "circle(10% 20%)");
+test_invalid_value("clip-path", "circle(-10px at 20px 30px)");
+test_invalid_value("clip-path", "circle(-10% at 20% 30%)");
+test_invalid_value("clip-path", "circle(1% 2% at 0% 100%)");
+
+test_invalid_value("clip-path", "ellipse(farthest-side at)");
+test_invalid_value("clip-path", "ellipse(1% 2% top right)");
+test_invalid_value("clip-path", "ellipse(3% at 100% 0%)");
+test_invalid_value("clip-path", "ellipse(10% -20% at 30% 40%)");
+test_invalid_value("clip-path", "ellipse(-50px 60px at 70% 80%)");
+
+test_invalid_value("clip-path", "polygon(1%)");
+
+test_invalid_value("clip-path", "unknown-box");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html
new file mode 100644
index 00000000000..d7b2785907a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip-path with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<meta name="assert" content="clip-path supports the full grammar '<clip-source> | [ <basic-shape> || <geometry-box> ] | none'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("clip-path", "none");
+
+// <basic-shape>
+test_valid_value("clip-path", "inset(100%)");
+test_valid_value("clip-path", "inset(0 1px)", "inset(0px 1px)");
+test_valid_value("clip-path", "inset(0px 1px 2%)");
+test_valid_value("clip-path", "inset(0px 1px 2% 3em)");
+test_valid_value("clip-path", "inset(0px round 100%)");
+test_valid_value("clip-path", "inset(0px round 0 1px)", "inset(0px round 0px 1px)");
+test_valid_value("clip-path", "inset(0px round 0px 1px 2%)");
+test_valid_value("clip-path", "inset(0px round 0px 1px 2% 3em)");
+test_valid_value("clip-path", "inset(10px round 20% / 0px 1px 2% 3em)");
+
+test_valid_value("clip-path", "circle()", "circle(at 50% 50%)");
+test_valid_value("clip-path", "circle(1px)", "circle(1px at 50% 50%)");
+test_valid_value("clip-path", "circle(closest-side)", "circle(at 50% 50%)");
+test_valid_value("clip-path", "circle(at 10% 20%)");
+test_valid_value("clip-path", "circle(farthest-side at center top)", "circle(farthest-side at 50% 0%)");
+test_valid_value("clip-path", "circle(4% at top right)", "circle(4% at 100% 0%)");
+
+test_valid_value("clip-path", "ellipse()", "ellipse(at 50% 50%)");
+test_valid_value("clip-path", "ellipse(1px closest-side)", "ellipse(1px at 50% 50%)");
+test_valid_value("clip-path", "ellipse(at 10% 20%)");
+test_valid_value("clip-path", "ellipse(farthest-side 4% at bottom left)", "ellipse(farthest-side 4% at 0% 100%)");
+
+test_valid_value("clip-path", "polygon(1% 2%)");
+test_valid_value("clip-path", "polygon(nonzero, 1px 2px, 3em 4em)", "polygon(1px 2px, 3em 4em)");
+test_valid_value("clip-path", "polygon(evenodd, 1px 2px, 3em 4em, 5pt 6%)");
+
+// <geometry-box>
+test_valid_value("clip-path", "border-box");
+test_valid_value("clip-path", "padding-box");
+test_valid_value("clip-path", "content-box");
+test_valid_value("clip-path", "margin-box");
+test_valid_value("clip-path", "fill-box");
+test_valid_value("clip-path", "stroke-box");
+test_valid_value("clip-path", "view-box");
+
+// basic-shape> <geometry-box>
+test_valid_value("clip-path", "circle(7% at 8% 9%) border-box");
+
+// <geometry-box> basic-shape>
+test_valid_value("clip-path", "border-box circle(7% at 8% 9%)");
+
+// <clip-source>
+test_valid_value("clip-path", "url(https://example.com/)", ["url(https://example.com/)", "url(\"https://example.com/\")"]);
+test_valid_value("clip-path", "url(\"https://example.com/\")", ["url(https://example.com/)", "url(\"https://example.com/\")"]);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-invalid.html
new file mode 100644
index 00000000000..10f6aeef256
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-invalid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip-rule with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-rule">
+<meta name="assert" content="clip-rule supports only the grammar 'nonzero | evenodd'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("clip-rule", "auto");
+test_invalid_value("clip-rule", "1");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-valid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-valid.html
new file mode 100644
index 00000000000..db22680cb14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-rule-valid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip-rule with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-rule">
+<meta name="assert" content="clip-rule supports the full grammar 'nonzero | evenodd'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("clip-rule", "nonzero");
+test_valid_value("clip-rule", "evenodd");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-valid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-valid.html
new file mode 100644
index 00000000000..24bb782d332
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-valid.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Masking Module Level 1: parsing clip with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#clip-property">
+<meta name="assert" content="clip supports the full grammar 'rect() | auto'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("clip", "auto");
+test_valid_value("clip", "rect(10px, 20px, -30px, 40px)", ["rect(10px, 20px, -30px, 40px)", "rect(10px 20px -30px 40px)"]);
+test_valid_value("clip", "rect(10%, -20%, auto, auto)");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/resources/parsing-testcommon.js b/tests/wpt/web-platform-tests/css/css-masking/parsing/resources/parsing-testcommon.js
new file mode 100644
index 00000000000..9427f53d81b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/resources/parsing-testcommon.js
@@ -0,0 +1,39 @@
+'use strict';
+
+// serializedValue can be the expected serialization of value,
+// or an array of permitted serializations,
+// or omitted if value should serialize as value.
+function test_valid_value(property, value, serializedValue) {
+ if (arguments.length < 3)
+ serializedValue = value;
+
+ var stringifiedValue = JSON.stringify(value);
+
+ test(function(){
+ var div = document.createElement('div');
+ div.style[property] = value;
+ assert_not_equals(div.style[property], "", "property should be set");
+
+ var div = document.createElement('div');
+ div.style[property] = value;
+ var readValue = div.style[property];
+ if (serializedValue instanceof Array)
+ assert_true(serializedValue.includes(readValue), "serialization should be sound");
+ else
+ assert_equals(readValue, serializedValue, "serialization should be canonical");
+
+ div.style[property] = readValue;
+ assert_equals(div.style[property], readValue, "serialization should round-trip");
+
+ }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value");
+}
+
+function test_invalid_value(property, value) {
+ var stringifiedValue = JSON.stringify(value);
+
+ test(function(){
+ var div = document.createElement('div');
+ div.style[property] = value;
+ assert_equals(div.style[property], "");
+ }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value");
+}
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001-ref.xht
index e373c9a60b6..495ca5d52e4 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001-ref.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001-ref.xht
@@ -7,6 +7,6 @@
<meta name="flags" content="" />
</head>
<body>
- <div style="font: 1.25em/1 Ahem; width:12em; height:3em; margin-left:12em; border-left:1em solid blue; border-right:1em solid blue;"></div>
+ <div style="font: 1.25em/1 Ahem; width:8em; height:3em; margin-left:9em; border-left:1em solid blue; border-right:1em solid blue;"></div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001.xht b/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001.xht
index 322551e185f..78fde1fbf9e 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-nested-column-rule-001.xht
@@ -18,7 +18,7 @@
{
column-rule: blue solid 1em;
font: 1.25em/1 Ahem;
- width: 36em;
+ width: 26em;
}
/*
@@ -26,47 +26,47 @@
N == 3;
W == max(0, (available-width - ((N - 1) * column-gap)) / N);
- W == max(0, (42em - ((3 - 1) * 3em)) / 3);
- W == max(0, (42em - (2 * 3em)) / 3);
- W == max(0, (42em - 6em) / 3);
- W == max(0, 36em / 3);
- W == max(0, 12em);
- W == 12em;
+ W == max(0, (26em - ((3 - 1) * 1em)) / 3);
+ W == max(0, (26em - (2 * 1em)) / 3);
+ W == max(0, (26em - 2em) / 3);
+ W == max(0, 24em / 3);
+ W == max(0, 8em);
+ W == 8em;
So, the first column-rule should be at:
1.0em : margin-left of outer div
- 12.0em : width of 1st column box
- 1.0em : (3.0em / 2) - (1.0em / 2) : left edge of 1st column-rule
+ 8.0em : width of 1st column box
+ 0.0em : (1.0em / 2) - (1.0em / 2) : left edge of 1st column-rule
=========
- 14.0em
+ 9.0em
The 2nd column-rule should be at:
1.0em : margin-left of outer div
- 12.0em : width of 1st column box
- 3.0em : first column-gap
- 12.0em : width of 2nd column box
- 1.0em : (3.0em / 2) - (1.0em / 2) : left edge of 2nd column-rule
+ 8.0em : width of 1st column box
+ 1.0em : first -moz-column-gap
+ 8.0em : width of 2nd column box
+ 0.0em : (1.0em / 2) - (1.0em / 2) : left edge of 2nd column-rule
=========
- 29.0em
+ 18.0em
The height of column rule depends on number of line boxes in
each outer column box which depends on number of line boxes
in each inner column box. So:
- 12em : width of each outer column box
+ 8em : width of each outer column box
-
2em : horizontal margin of each div inside
=======
- 10em : width of each inner multi-column elements
+ 6em : width of each inner multi-column elements
N == 3;
- W == max(0, (available-width - ((N - 1) * column-gap)) / N);
- W == max(0, (10em - ((3 - 1) * 3em)) / 3);
- W == max(0, (10em - (2 * 3em)) / 3);
- W == max(0, (10em - 6em) / 3);
+ W == max(0, (available-width - ((N - 1) * -column-gap)) / N);
+ W == max(0, (6em - ((3 - 1) * 1em)) / 3);
+ W == max(0, (6em - (2 * 1em)) / 3);
+ W == max(0, (6em - 2em) / 3);
W == max(0, 4em / 3);
W == max(0, 1.33333em);
W == 1.33333em;
@@ -90,7 +90,7 @@
widows: 1;
column-count: 3;
- column-gap: 3em;
+ column-gap: 1em;
}
]]></style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image-ref.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image-ref.html
index 31c9f3f5f03..90c62e5421b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image-ref.html
@@ -1,12 +1,15 @@
<!DOCTYPE html>
-<canvas id="canvas" width="300" height="300"></canvas>
-
-<script>
- var canvas = document.getElementById("canvas");
- var ctx = canvas.getContext("2d");
- var img = new Image;
- img.src = "resources/html5.png";
- img.onload = function() {
- ctx.drawImage(img, 0, 0);
- };
-</script>
+<html>
+<style>
+div {
+ width: 300px;
+ height: 300px;
+ background-image: url("./resources/html5.png");
+ background-repeat: no-repeat;
+ background-color: green;
+}
+</style>
+<body>
+<div></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
index 5dc7ebf8a8f..ba8943012c2 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
@@ -2,12 +2,12 @@
<html class="reftest-wait">
<link rel="match" href="paint2d-image-ref.html">
<style>
- #output {
- width: 300px;
- height: 300px;
- background-image: paint(image);
- border-image: url("resources/html5.png");
- }
+#output {
+ width: 300px;
+ height: 300px;
+ background-image: paint(image);
+ border-image: url("./resources/html5.png");
+}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/css-paint-tests.js"></script>
@@ -17,6 +17,8 @@
registerPaint('image', class {
static get inputProperties() { return [ 'border-image-source' ]; };
paint(ctx, geom, styleMap) {
+ ctx.fillStyle = 'green';
+ ctx.fillRect(0, 0, geom.width, geom.height);
ctx.drawImage(styleMap.get('border-image-source'), 0, 0);
}
});
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/resources/html5.png b/tests/wpt/web-platform-tests/css/css-paint-api/resources/html5.png
new file mode 100644
index 00000000000..e34419263f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/resources/html5.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-scoping/css-scoping-shadow-nested-slot-display-override.html b/tests/wpt/web-platform-tests/css/css-scoping/css-scoping-shadow-nested-slot-display-override.html
new file mode 100644
index 00000000000..f194e469f05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-scoping/css-scoping-shadow-nested-slot-display-override.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>CSS Scoping: Dynamically overriding nested slot display value</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#slots-in-shadow-tree">
+<link rel="match" href="reference/green-box.html"/>
+<style>
+ #outerHost {
+ width: 100px;
+ height: 100px;
+ background: red;
+ }
+</style>
+<p>Test passes if you see a single 100px by 100px green box below.</p>
+<div id="outerHost"> </div>
+<script>
+ let outerRoot = outerHost.attachShadow({mode:"open"});
+ outerRoot.innerHTML = '<div id="innerHost"><slot></slot></div>';
+ let innerHost = outerRoot.querySelector("#innerHost");
+ let innerRoot = innerHost.attachShadow({mode:"open"});
+ innerRoot.innerHTML = '<slot style="display:none; border:solid 50px green"></slot>';
+ document.body.offsetTop;
+ innerRoot.querySelector("slot").style.display = "block";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/resources/parsing-testcommon.js b/tests/wpt/web-platform-tests/css/css-shapes/parsing/resources/parsing-testcommon.js
new file mode 100644
index 00000000000..9427f53d81b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/resources/parsing-testcommon.js
@@ -0,0 +1,39 @@
+'use strict';
+
+// serializedValue can be the expected serialization of value,
+// or an array of permitted serializations,
+// or omitted if value should serialize as value.
+function test_valid_value(property, value, serializedValue) {
+ if (arguments.length < 3)
+ serializedValue = value;
+
+ var stringifiedValue = JSON.stringify(value);
+
+ test(function(){
+ var div = document.createElement('div');
+ div.style[property] = value;
+ assert_not_equals(div.style[property], "", "property should be set");
+
+ var div = document.createElement('div');
+ div.style[property] = value;
+ var readValue = div.style[property];
+ if (serializedValue instanceof Array)
+ assert_true(serializedValue.includes(readValue), "serialization should be sound");
+ else
+ assert_equals(readValue, serializedValue, "serialization should be canonical");
+
+ div.style[property] = readValue;
+ assert_equals(div.style[property], readValue, "serialization should round-trip");
+
+ }, "e.style['" + property + "'] = " + stringifiedValue + " should set the property value");
+}
+
+function test_invalid_value(property, value) {
+ var stringifiedValue = JSON.stringify(value);
+
+ test(function(){
+ var div = document.createElement('div');
+ div.style[property] = value;
+ assert_equals(div.style[property], "");
+ }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value");
+}
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-invalid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-invalid.html
new file mode 100644
index 00000000000..e3871d869b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-invalid.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-image-threshold with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-image-threshold-property">
+<meta name="assert" content="shape-image-threshold supports only the grammar '<number>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("shape-image-threshold", "auto");
+test_invalid_value("shape-image-threshold", "10px");
+test_invalid_value("shape-image-threshold", "100%");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-valid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-valid.html
new file mode 100644
index 00000000000..5b77db8e507
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-image-threshold-valid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-image-threshold with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-image-threshold-property">
+<meta name="assert" content="shape-image-threshold supports the full grammar '<number>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("shape-image-threshold", "12.5");
+test_valid_value("shape-image-threshold", "-7");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-invalid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-invalid.html
new file mode 100644
index 00000000000..4f3b4f26fb7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-invalid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-margin with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-margin-property">
+<meta name="assert" content="shape-margin supports only the grammar '<length> | <percentage>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("shape-margin", "none");
+test_invalid_value("shape-margin", "10");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-valid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-valid.html
new file mode 100644
index 00000000000..68634b6b97a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-margin-valid.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-margin with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-margin-property">
+<meta name="assert" content="shape-margin supports the full grammar '<length> | <percentage>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("shape-margin", "0", "0px");
+test_valid_value("shape-margin", "10px");
+test_valid_value("shape-margin", "20em");
+test_valid_value("shape-margin", "37.5%");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-invalid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-invalid.html
new file mode 100644
index 00000000000..9f541cf2930
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-invalid.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-outside with invalid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-outside-property">
+<meta name="assert" content="shape-outside supports only the grammar 'none | [ <basic-shape> || <shape-box> ] | <image>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("shape-outside", "auto");
+test_invalid_value("shape-outside", "ray(0deg)");
+
+test_invalid_value("shape-outside", "inset()");
+test_invalid_value("shape-outside", "inset(123)");
+test_invalid_value("shape-outside", "inset(1% 2% 3% 4% 5%)");
+test_invalid_value("shape-outside", "inset(round 0)");
+test_invalid_value("shape-outside", "inset(0px round)");
+test_invalid_value("shape-outside", "inset(0px round 123)");
+test_invalid_value("shape-outside", "inset(0px round 1% 2% 3% 4% 5%)");
+test_invalid_value("shape-outside", "inset(0px round / 1px)");
+test_invalid_value("shape-outside", "inset(10px round -20px)");
+test_invalid_value("shape-outside", "inset(30% round -40%)");
+
+test_invalid_value("shape-outside", "circle(123)");
+test_invalid_value("shape-outside", "circle(at)");
+test_invalid_value("shape-outside", "circle(10% 20%)");
+test_invalid_value("shape-outside", "circle(-10px at 20px 30px)");
+test_invalid_value("shape-outside", "circle(-10% at 20% 30%)");
+test_invalid_value("shape-outside", "circle(1% 2% at 0% 100%)");
+
+test_invalid_value("shape-outside", "ellipse(farthest-side at)");
+test_invalid_value("shape-outside", "ellipse(1% 2% top right)");
+test_invalid_value("shape-outside", "ellipse(3%)");
+test_invalid_value("shape-outside", "ellipse(3% at 100% 0%)");
+test_invalid_value("shape-outside", "ellipse(10% -20% at 30% 40%)");
+test_invalid_value("shape-outside", "ellipse(-50px 60px at 70% 80%)");
+
+test_invalid_value("shape-outside", "polygon(1%)");
+
+// <geometry-box> other than <shape-box>
+test_invalid_value("shape-outside", "fill-box");
+test_invalid_value("shape-outside", "stroke-box");
+test_invalid_value("shape-outside", "view-box");
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-valid.html b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-valid.html
new file mode 100644
index 00000000000..ae0e0bfe29e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/parsing/shape-outside-valid.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Shapes Module Level 1: parsing shape-outside with valid values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-outside-property">
+<meta name="assert" content="shape-outside supports the full grammar 'none | [ <basic-shape> || <shape-box> ] | <image>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("shape-outside", "none");
+
+// <basic-shape>
+test_valid_value("shape-outside", "inset(100%)");
+test_valid_value("shape-outside", "inset(0 1px)", "inset(0px 1px)");
+test_valid_value("shape-outside", "inset(0px 1px 2%)");
+test_valid_value("shape-outside", "inset(0px 1px 2% 3em)");
+test_valid_value("shape-outside", "inset(0px round 100%)");
+test_valid_value("shape-outside", "inset(0px round 0 1px)", "inset(0px round 0px 1px)");
+test_valid_value("shape-outside", "inset(0px round 0px 1px 2%)");
+test_valid_value("shape-outside", "inset(0px round 0px 1px 2% 3em)");
+test_valid_value("shape-outside", "inset(10px round 20% / 0px 1px 2% 3em)");
+
+test_valid_value("shape-outside", "circle()", "circle(at 50% 50%)");
+test_valid_value("shape-outside", "circle(1px)", "circle(1px at 50% 50%)");
+test_valid_value("shape-outside", "circle(closest-side)", "circle(at 50% 50%)");
+test_valid_value("shape-outside", "circle(at 10% 20%)");
+test_valid_value("shape-outside", "circle(farthest-side at center top)", "circle(farthest-side at 50% 0%)");
+test_valid_value("shape-outside", "circle(4% at top right)", "circle(4% at 100% 0%)");
+
+test_valid_value("shape-outside", "ellipse()", "ellipse(at 50% 50%)");
+test_valid_value("shape-outside", "ellipse(3% 2%)", "ellipse(3% 2% at 50% 50%)");
+test_valid_value("shape-outside", "ellipse(closest-side 1px)", "ellipse(closest-side 1px at 50% 50%)");
+test_valid_value("shape-outside", "ellipse(at 10% 20%)");
+test_valid_value("shape-outside", "ellipse(farthest-side 4% at bottom left)", "ellipse(farthest-side 4% at 0% 100%)");
+
+test_valid_value("shape-outside", "polygon(1% 2%)");
+test_valid_value("shape-outside", "polygon(nonzero, 1px 2px, 3em 4em)", "polygon(1px 2px, 3em 4em)");
+test_valid_value("shape-outside", "polygon(evenodd, 1px 2px, 3em 4em, 5pt 6%)");
+
+// <shape-box>
+test_valid_value("shape-outside", "border-box");
+test_valid_value("shape-outside", "padding-box");
+test_valid_value("shape-outside", "content-box");
+test_valid_value("shape-outside", "margin-box");
+
+// basic-shape> <shape-box>
+test_valid_value("shape-outside", "circle(7% at 8% 9%) border-box");
+
+// <shape-box> basic-shape>
+test_valid_value("shape-outside", "border-box circle(7% at 8% 9%)");
+
+// <image>
+// Spec is silent about url serialization.
+// Blink, Edge, Firefox add quotes. WebKit removes quotes.
+test_valid_value("shape-outside", "url(https://example.com/)", ["url(https://example.com/)", "url(\"https://example.com/\")"]);
+test_valid_value("shape-outside", "url(\"https://example.com/\")", ["url(https://example.com/)", "url(\"https://example.com/\")"]);
+test_valid_value("shape-outside", "cross-fade(url(\"https://example.com/\"), green)");
+test_valid_value("shape-outside", "linear-gradient(yellow, blue)");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/resources/1x1-green.png b/tests/wpt/web-platform-tests/css/css-typed-om/resources/1x1-green.png
new file mode 100644
index 00000000000..b98ca0ba0a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/resources/1x1-green.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/resources/testhelper.js b/tests/wpt/web-platform-tests/css/css-typed-om/resources/testhelper.js
new file mode 100644
index 00000000000..50b93302525
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/resources/testhelper.js
@@ -0,0 +1,146 @@
+// Compares two CSSStyleValues to check if they're the same type
+// and have the same attributes.
+function assert_style_value_equals(a, b) {
+ if (a == null || b == null) {
+ assert_equals(a, b);
+ return;
+ }
+
+ assert_equals(a.constructor.name, b.constructor.name);
+ const className = a.constructor.name;
+ switch (className) {
+ case 'CSSKeywordValue':
+ assert_equals(a.value, b.value);
+ break;
+ case 'CSSUnitValue':
+ assert_approx_equals(a.value, b.value, 1e-6);
+ assert_equals(a.unit, b.unit);
+ break;
+ case 'CSSMathSum':
+ case 'CSSMathProduct':
+ case 'CSSMathMin':
+ case 'CSSMathMax':
+ assert_style_value_array_equals(a.values, b.values);
+ break;
+ case 'CSSMathInvert':
+ case 'CSSMathNegate':
+ assert_style_value_equals(a.value, b.value);
+ break;
+ case 'CSSUnparsedValue':
+ assert_style_value_array_equals(a, b);
+ break;
+ case 'CSSVariableReferenceValue':
+ assert_equals(a.variable, b.variable);
+ assert_style_value_equals(a.fallback, b.fallback);
+ break;
+ case 'CSSPositionValue':
+ assert_style_value_equals(a.x, b.x);
+ assert_style_value_equals(a.y, b.y);
+ break;
+ case 'CSSTransformValue':
+ assert_style_value_array_equals(a, b);
+ break;
+ case 'CSSRotation':
+ assert_style_value_equals(a.angle, b.angle);
+ // fallthrough
+ case 'CSSTranslation':
+ case 'CSSScale':
+ assert_style_value_equals(a.x, b.x);
+ assert_style_value_equals(a.y, b.y);
+ assert_style_value_equals(a.z, b.z);
+ assert_style_value_equals(a.is2D, b.is2D);
+ break;
+ case 'CSSSkew':
+ assert_style_value_equals(a.ax, b.ax);
+ assert_style_value_equals(a.ay, b.ay);
+ break;
+ case 'CSSPerspective':
+ assert_style_value_equals(a.length, b.length);
+ break;
+ case 'CSSMatrixComponent':
+ assert_matrix_approx_equals(a.matrix, b.matrix, 1e-6);
+ break;
+ case 'CSSURLImageValue':
+ assert_equals(a.instrinsicWidth, b.instrinsicWidth);
+ assert_equals(a.instrinsicHeight, b.instrinsicHeight);
+ assert_equals(a.instrinsicRatio, b.instrinsicRatio);
+ assert_equals(a.url, b.url);
+ break;
+ default:
+ assert_equals(a, b);
+ break;
+ }
+}
+
+// Compares two arrays of CSSStyleValues to check if every element is equal
+function assert_style_value_array_equals(a, b) {
+ assert_equals(a.length, b.length);
+ for (let i = 0; i < a.length; i++) {
+ assert_style_value_equals(a[i], b[i]);
+ }
+}
+
+const gValidUnits = [
+ 'number', 'percent', 'em', 'ex', 'ch',
+ 'ic', 'rem', 'lh', 'rlh', 'vw',
+ 'vh', 'vi', 'vb', 'vmin', 'vmax',
+ 'cm', 'mm', 'Q', 'in', 'pt',
+ 'pc', 'px', 'deg', 'grad', 'rad',
+ 'turn', 's', 'ms', 'Hz', 'kHz',
+ 'dpi', 'dpcm', 'dppx', 'fr',
+];
+
+// Creates a new div element with specified inline style |cssText|.
+// The created element is deleted during test cleanup.
+function createDivWithStyle(test, cssText) {
+ let element = document.createElement('div');
+ element.style = cssText || '';
+ document.body.appendChild(element);
+ test.add_cleanup(() => {
+ element.remove();
+ });
+ return element;
+}
+
+// Creates a new div element with inline style |cssText| and returns
+// its inline style property map.
+function createInlineStyleMap(test, cssText) {
+ return createDivWithStyle(test, cssText).attributeStyleMap;
+}
+
+// Creates a new div element with inline style |cssText| and returns
+// its computed style property map.
+function createComputedStyleMap(test, cssText) {
+ return createDivWithStyle(test, cssText).computedStyleMap();
+}
+
+// Creates a new style element with a rule |cssText| and returns
+// its declared style property map.
+function createDeclaredStyleMap(test, cssText) {
+ const style = document.createElement('style');
+ document.head.appendChild(style);
+ const rule = style.sheet.cssRules[style.sheet.insertRule('#test { ' + cssText + '}')];
+ test.add_cleanup(() => {
+ style.remove();
+ });
+ return rule.attributeStyleMap;
+}
+
+// Creates a new element with background image set to |imageValue|
+// and returns a new Image element that can be used to attach
+// event listeners regarding the image.
+function loadImageResource(test, imageValue) {
+ // Set a CSSURLImageValue on an element so it can be loaded.
+ let styleMap = createInlineStyleMap(test, '');
+ styleMap.set('background-image', imageValue);
+
+ // add a new Image element to know if the image resource has been loaded
+ let image = new Image();
+ image.src = imageValue.url;
+ return image;
+}
+
+function assert_matrix_approx_equals(actual, expected, epsilon) {
+ assert_array_approx_equals(
+ actual.toFloat64Array(), expected.toFloat64Array(), epsilon);
+}
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html
new file mode 100644
index 00000000000..d118dda4a2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-ident.tentative.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Identifier normalization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#normalize-ident">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(() => {
+ assert_style_value_equals(CSSStyleValue.parse('width', 'auto'),
+ new CSSKeywordValue('auto'));
+}, 'CSS identifiers are normalized from String to CSSKeywordValues');
+
+test(t => {
+ assert_style_value_equals(
+ createDivWithStyle(t, 'width: auto').attributeStyleMap.get('width'),
+ new CSSKeywordValue('auto'));
+}, 'CSS identifiers are normalized from CSSOM to CSSKeywordValues');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html
new file mode 100644
index 00000000000..1ba07606a2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-numeric.tentative.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Numeric normalization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#normalize-numeric">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+function test_numeric_normalization(test, property, cssText, expected) {
+ assert_style_value_equals(CSSNumericValue.parse(cssText), expected);
+ assert_style_value_equals(CSSStyleValue.parse(property, cssText), expected);
+ assert_style_value_equals(
+ createInlineStyleMap(test, property + ': ' + cssText).get(property),
+ expected);
+}
+
+test(t => {
+ test_numeric_normalization(t, 'line-height', '3.14', CSS.number(3.14));
+}, 'Normalizing a <number> returns a number CSSUnitValue');
+
+test(t => {
+ test_numeric_normalization(t, 'width', '3.14%', CSS.percent(3.14));
+}, 'Normalizing a <percentage> returns a percent CSSUnitValue');
+
+test(t => {
+ test_numeric_normalization(t, 'width', '3.14px', CSS.px(3.14));
+}, 'Normalizing a <dimension> returns a CSSUnitValue with the correct unit');
+
+test(t => {
+ test_numeric_normalization(t, 'z-index', '0', CSS.number(0));
+}, 'Normalizing a <number> with a unitless zero returns 0');
+
+test(t => {
+ test_numeric_normalization(t, 'width',
+ 'calc(1px + calc(1px) + calc(1px * 2) + 1%)',
+ new CSSMathSum(CSS.px(4), CSS.percent(1)));
+}, 'Normalizing a <calc> returns simplified expression');
+
+test(t => {
+ assert_style_value_equals(CSSStyleValue.parse('width', '0px'), CSS.px(0));
+ assert_style_value_equals(
+ createInlineStyleMap(t, 'width: 0').get('width'),
+ CSS.px(0));
+}, 'Normalizing a <dimension> with a unitless zero returns 0px');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html
new file mode 100644
index 00000000000..d5082aa0b25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSSResourceValue normalization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#resourcevalue-normalization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gTestUrl = '../resources/1x1-green.png';
+const gBadTestUrl = document.location.href;
+
+async_test(t => {
+ const result = CSSStyleValue.parse('background-image', 'url("' + gTestUrl + '")');
+ assert_equals(result.constructor.name, 'CSSURLImageValue');
+ assert_equals(result.intrinsicWidth, null);
+ assert_equals(result.intrinsicHeight, null);
+ assert_equals(result.intrinsicRatio, null);
+ assert_equals(result.state, 'unloaded');
+
+ let image = loadImageResource(t, result);
+ image.addEventListener('load', t.step_func_done(() => {
+ assert_equals(result.url, gTestUrl);
+ assert_equals(result.state, 'loaded');
+ assert_equals(result.intrinsicWidth, 1);
+ assert_equals(result.intrinsicHeight, 1);
+ assert_equals(result.intrinsicRatio, 1);
+ }));
+}, 'Normalizing a valid <url> returns a CSSURLImageValue that eventually loads');
+
+async_test(t => {
+ const result = CSSStyleValue.parse('background-image', 'url("' + gBadTestUrl + '")');
+ assert_equals(result.constructor.name, 'CSSURLImageValue');
+
+ let image = loadImageResource(t, result);
+ image.addEventListener('error', t.step_func_done(() => {
+ assert_equals(result.url, gBadTestUrl);
+ assert_equals(result.state, 'error');
+ assert_equals(result.intrinsicWidth, null);
+ assert_equals(result.intrinsicHeight, null);
+ assert_equals(result.intrinsicRatio, null);
+ }));
+}, 'Normalizing a bad <url> returns a CSSURLImageValue in error state');
+
+test(t => {
+ const result = CSSStyleValue.parse('background-image', 'linear-gradient(red, orange)');
+ assert_equals(result.constructor.name, 'CSSImageValue');
+ assert_equals(result.state, 'loaded');
+ assert_equals(result.intrinsicWidth, null);
+ assert_equals(result.intrinsicHeight, null);
+ assert_equals(result.intrinsicRatio, null);
+}, 'Normalizing a <gradient> returns a CSSImageValue');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
new file mode 100644
index 00000000000..33113805414
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Normalization of raw CSS tokens tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#normalize-tokens">
+<script src="//resources/testharness.js"></script>
+<script src="//resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+function assert_string_normalizes_to(test, property, str, expected) {
+ // From string
+ assert_style_value_equals(CSSStyleValue.parse(property, str), expected);
+ // From CSSOM
+ assert_style_value_equals(
+ createInlineStyleMap(test, property + ':' + str).get(property),
+ expected
+ );
+}
+
+const gTestCases = [
+ {
+ value: 'var(--A)',
+ expectedResult: [
+ new CSSVariableReferenceValue('--A'),
+ ]
+ },
+ {
+ value: 'var(--A, 1em)',
+ expectedResult: [
+ new CSSVariableReferenceValue('--A', new CSSUnparsedValue(' 1em')),
+ ]
+ },
+ {
+ value: 'var(--A, var(--B))',
+ expectedResult: [
+ new CSSVariableReferenceValue('--A', new CSSUnparsedValue(' ', new CSSVariableReferenceValue('--B'))),
+ ]
+ },
+ {
+ value: 'calc(42px + var(--foo, 15em) + var(--bar, var(--far) + 15px))',
+ expectedResult: [
+ 'calc(42px + ',
+ new CSSVariableReferenceValue('--foo', new CSSUnparsedValue(' 15em')),
+ ' + ',
+ new CSSVariableReferenceValue('--bar', new CSSUnparsedValue(' ', new CSSVariableReferenceValue('--far'), ' + 15px')),
+ ')',
+ ]
+ },
+];
+
+for (const {value, expectedResult} of gTestCases) {
+ test(t => {
+ assert_string_normalizes_to(t, 'color', value, new CSSUnparsedValue(...expectedResult));
+ }, 'Normalizing "' + value + '" on a CSS property returns correct CSSUnparsedValue');
+
+ test(t => {
+ assert_string_normalizes_to(t, '--X', value, new CSSUnparsedValue(...expectedResult));
+ }, 'Normalizing "' + value + '" on a custom property returns correct CSSUnparsedValue');
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html
new file mode 100644
index 00000000000..15f67429edb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSSPositionValue normalization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#positionvalue-normalization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gSingleTestCases = [
+ { cssText: 'left', x: CSS.percent(0), y: CSS.percent(50) },
+ { cssText: 'right', x: CSS.percent(100), y: CSS.percent(50) },
+ { cssText: 'center', x: CSS.percent(50), y: CSS.percent(50) },
+ { cssText: 'top', x: CSS.percent(50), y: CSS.percent(0) },
+ { cssText: 'bottom', x: CSS.percent(50), y: CSS.percent(100) },
+ { cssText: '3.14px', x: CSS.px(3.14), y: CSS.percent(50) },
+ { cssText: '25%', x: CSS.percent(25), y: CSS.percent(50) },
+];
+
+const gXTestCases = [
+ { cssText: 'left', x: CSS.percent(0), type: 'ident' },
+ { cssText: 'center', x: CSS.percent(50), type: 'ident' },
+ { cssText: 'right', x: CSS.percent(100), type: 'ident' },
+ { cssText: '3.14px', x: CSS.px(3.14), type: 'length' },
+ { cssText: '10%', x: CSS.percent(10), type: 'length' },
+ { cssText: 'calc(1px + 1em)', x: new CSSMathSum(CSS.px(1), CSS.em(1)), type: 'length' },
+ { cssText: 'left 3.14px', x: CSS.px(3.14), type: 'offset' },
+ { cssText: 'right 3.14px', x: CSS.percent(100).sub(CSS.px(3.14)), type: 'offset' },
+];
+
+const gYTestCases = [
+ { cssText: 'top', y: CSS.percent(0), type: 'ident' },
+ { cssText: 'center', y: CSS.percent(50), type: 'ident' },
+ { cssText: 'bottom', y: CSS.percent(100), type: 'ident' },
+ { cssText: '3.14px', y: CSS.px(3.14), type: 'length' },
+ { cssText: '10%', y: CSS.percent(10), type: 'length' },
+ { cssText: 'calc(1px + 1em)', y: new CSSMathSum(CSS.px(1), CSS.em(1)), type: 'length' },
+ { cssText: 'top 3.14px', y: CSS.px(3.14), type: 'offset' },
+ { cssText: 'bottom 3.14px', y: CSS.percent(100).sub(CSS.px(3.14)), type: 'offset' },
+];
+
+for (const {cssText, x, y} of gSingleTestCases) {
+ test(t => {
+ const styleMap = createInlineStyleMap(t, 'object-position: ' + cssText);
+ assert_style_value_equals(styleMap.get('object-position'), new CSSPositionValue(x, y));
+ }, 'CSS <position> value "' + cssText + '" normalizes to CSSPositionValue');
+}
+
+for (const {cssText: xCssText, x, type: xType} of gXTestCases) {
+ for (const {cssText: yCssText, y, type: yType} of gYTestCases) {
+ const cssText = xCssText + ' ' + yCssText;
+
+ // Can't have things like left 10px 20px
+ if ((xType == 'offset' && yType == 'length') ||
+ (xType == 'length' && yType == 'offset'))
+ continue;
+
+ test(t => {
+ const styleMap = createInlineStyleMap(t, 'object-position: ' + cssText);
+ assert_style_value_equals(styleMap.get('object-position'), new CSSPositionValue(x, y));
+ }, 'CSS <position> value "' + cssText + '" normalizes to CSSPositionValue');
+ }
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html
new file mode 100644
index 00000000000..5725f4677d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html
@@ -0,0 +1,175 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Transform normalization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#transformvalue-normalization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/comparisons.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+function test_transform_normalization(test, cssText, expected) {
+ assert_style_value_equals(CSSStyleValue.parse('transform', cssText), expected);
+ assert_style_value_equals(
+ createInlineStyleMap(test, 'transform: ' + cssText).get('transform'),
+ expected);
+}
+
+test(t => {
+ test_transform_normalization(t, 'matrix(1, 2, 3, 4, 5, 6)',
+ new CSSTransformValue([
+ new CSSMatrixComponent(new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6]))
+ ]));
+}, 'Normalizing a matrix() returns a CSSMatrixComponent');
+
+test(t => {
+ test_transform_normalization(t,
+ 'matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)',
+ new CSSTransformValue([
+ new CSSMatrixComponent(new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]))
+ ]));
+}, 'Normalizing a matrix3d() returns a CSSMatrixComponent');
+
+const gTestCases = [
+ {
+ cssText: 'translate(1px)',
+ expected: new CSSTranslation(CSS.px(1), CSS.px(0)),
+ desc: 'translate() with X'
+ },
+ {
+ cssText: 'translate(1%, 1px)',
+ expected: new CSSTranslation(CSS.percent(1), CSS.px(1)),
+ desc: 'translate() with X and Y'
+ },
+ {
+ cssText: 'translateX(1%)',
+ expected: new CSSTranslation(CSS.percent(1), CSS.px(0)),
+ desc: 'translateX()'
+ },
+ {
+ cssText: 'translateY(1px)',
+ expected: new CSSTranslation(CSS.px(0), CSS.px(1)),
+ desc: 'translateY()'
+ },
+ {
+ cssText: 'translate3d(1px, 2%, 3px)',
+ expected: new CSSTranslation(CSS.px(1), CSS.percent(2), CSS.px(3)),
+ desc: 'translate3d()'
+ },
+ {
+ cssText: 'translateZ(1px)',
+ expected: new CSSTranslation(CSS.px(0), CSS.px(0), CSS.px(1)),
+ desc: 'translateZ()'
+ },
+ {
+ cssText: 'scale(2)',
+ expected: new CSSScale(CSS.number(2), CSS.number(2)),
+ desc: 'scale() with one argument'
+ },
+ {
+ cssText: 'scale(2, 3)',
+ expected: new CSSScale(CSS.number(2), CSS.number(3)),
+ desc: 'scale() with two arguments'
+ },
+ {
+ cssText: 'scaleX(2)',
+ expected: new CSSScale(CSS.number(2), CSS.number(1)),
+ desc: 'scaleX()'
+ },
+ {
+ cssText: 'scaleY(2)',
+ expected: new CSSScale(CSS.number(1), CSS.number(2)),
+ desc: 'scaleY()'
+ },
+ {
+ cssText: 'scale3d(1, 2, 3)',
+ expected: new CSSScale(CSS.number(1), CSS.number(2), CSS.number(3)),
+ desc: 'scale3d()'
+ },
+ {
+ cssText: 'scaleZ(2)',
+ expected: new CSSScale(CSS.number(1), CSS.number(1), CSS.number(2)),
+ desc: 'scaleZ()'
+ },
+ {
+ cssText: 'rotate(90deg)',
+ expected: new CSSRotation(CSS.deg(90)),
+ desc: 'rotate()'
+ },
+ {
+ cssText: 'rotate3d(1, 2, 3, 90deg)',
+ expected: new CSSRotation(CSS.number(1), CSS.number(2), CSS.number(3), CSS.deg(90)),
+ desc: 'rotate3d()'
+ },
+ {
+ cssText: 'rotateX(90deg)',
+ expected: new CSSRotation(CSS.number(1), CSS.number(0), CSS.number(0), CSS.deg(90)),
+ desc: 'rotateX()'
+ },
+ {
+ cssText: 'rotateY(90deg)',
+ expected: new CSSRotation(CSS.number(0), CSS.number(1), CSS.number(0), CSS.deg(90)),
+ desc: 'rotateY()'
+ },
+ {
+ cssText: 'rotateZ(90deg)',
+ expected: new CSSRotation(CSS.number(0), CSS.number(0), CSS.number(1), CSS.deg(90)),
+ desc: 'rotateZ()'
+ },
+ {
+ cssText: 'skew(90deg)',
+ expected: new CSSSkew(CSS.deg(90), CSS.deg(0)),
+ desc: 'skew() with only X'
+ },
+ {
+ cssText: 'skew(90deg, 45deg)',
+ expected: new CSSSkew(CSS.deg(90), CSS.deg(45)),
+ desc: 'skew() with X and Y'
+ },
+ {
+ cssText: 'skewX(90deg)',
+ expected: new CSSSkew(CSS.deg(90), CSS.deg(0)),
+ desc: 'skewX()'
+ },
+ {
+ cssText: 'skewY(90deg)',
+ expected: new CSSSkew(CSS.deg(0), CSS.deg(90)),
+ desc: 'skewY()'
+ },
+ {
+ cssText: 'perspective(1px)',
+ expected: new CSSPerspective(CSS.px(1)),
+ desc: 'perspective()'
+ },
+];
+
+for (const {cssText, expected, desc} of gTestCases) {
+ test(t => {
+ test_transform_normalization(t, cssText, new CSSTransformValue([expected]));
+ }, 'Normalizing a ' + desc + ' returns a ' + expected.constructor.name);
+}
+
+test(t => {
+ test_transform_normalization(t,
+ 'translate(1px) rotateX(90deg) perspective(1px) skew(90deg) scale3d(1, 2, 3)',
+ new CSSTransformValue([
+ new CSSTranslation(CSS.px(1), CSS.px(0)),
+ new CSSRotation(CSS.number(1), CSS.number(0), CSS.number(0), CSS.deg(90)),
+ new CSSPerspective(CSS.px(1)),
+ new CSSSkew(CSS.deg(90), CSS.deg(0)),
+ new CSSScale(CSS.number(1), CSS.number(2), CSS.number(3)),
+ ]));
+}, 'Normalizing a <transform-list> returns a CSSTransformValue containing all the transforms');
+
+test(t => {
+ test_transform_normalization(t,
+ 'translate(calc(1px + 1em)) perspective(calc(1px + 1em))',
+ new CSSTransformValue([
+ new CSSTranslation(new CSSMathSum(CSS.px(1), CSS.em(1)), CSS.px(0)),
+ new CSSPerspective(new CSSMathSum(CSS.px(1), CSS.em(1))),
+ ]));
+}, 'Normalizing transforms with calc values contains CSSMathValues');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html
new file mode 100644
index 00000000000..1e2041d80dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssKeywordValue.tentative.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSKeywordValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#unparsedvalue-serialization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(() => {
+ assert_equals(new CSSKeywordValue('auto').toString(), 'auto');
+ assert_equals(new CSSKeywordValue('inherit').toString(), 'inherit');
+ assert_equals(new CSSKeywordValue('lemon').toString(), 'lemon');
+}, 'CSSKeywordValue constructed from IDL serializes correctly');
+
+test(() => {
+ assert_equals(new CSSKeywordValue(' Hello World').toString(), CSS.escape(' Hello World'));
+ assert_equals(new CSSKeywordValue('3').toString(), CSS.escape('3'));
+}, 'CSSKeywordValue constructed from IDL serializes to escaped strings');
+
+test(() => {
+ let result = CSSStyleValue.parse('width', 'auto');
+ result.value = 'lemon';
+ assert_equals(result.toString(), 'lemon');
+}, 'CSSKeywordValue from DOMString modified through "value" setter serializes correctly');
+
+test(t => {
+ let result = createInlineStyleMap(t, 'width: auto').get('width');
+ result.value = 'lemon';
+ assert_equals(result.toString(), 'lemon');
+}, 'CSSKeywordValue from CSSOM modified through "value" setter serializes correctly');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html
new file mode 100644
index 00000000000..6ce739b6943
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssMathValue.tentative.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSMathValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#calc-serialization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<script>
+'use strict';
+
+const gTestCases = [
+ {
+ value: new CSSMathSum(CSS.px(1)),
+ cssText: 'calc(1px)',
+ desc: 'CSSMathSum with 1 argument'
+ },
+ {
+ value: new CSSMathSum(CSS.px(1), CSS.px(2)),
+ cssText: 'calc(1px + 2px)',
+ desc: 'CSSMathSum with 2 arguments'
+ },
+ {
+ value: new CSSMathSum(CSS.px(1), CSS.px(2), CSS.px(3)),
+ cssText: 'calc((1px + 2px) + 3px)',
+ desc: 'CSSMathSum with more than 2 arguments'
+ },
+ {
+ value: new CSSMathProduct(CSS.px(1)),
+ cssText: 'calc(1px)',
+ desc: 'CSSMathProduct with 1 argument'
+ },
+ {
+ value: new CSSMathProduct(CSS.px(1), 2),
+ cssText: 'calc(1px * 2)',
+ desc: 'CSSMathProduct with 2 arguments'
+ },
+ {
+ value: new CSSMathProduct(CSS.px(1), 2, 3),
+ cssText: 'calc((1px * 2) * 3)',
+ desc: 'CSSMathProduct with more than 2 arguments'
+ },
+];
+
+for (const {value, cssText, desc} of gTestCases) {
+ test(() => {
+ assert_equals(value.toString(), cssText);
+ }, desc + ' serializes correctly');
+}
+
+// TODO(crbug.com/782103): Convert these to actual tests once we have spec
+// for these. For now, let's just test that they don't crash.
+const gInvalidTestCases = [
+ {
+ value: new CSSMathProduct(CSS.px(1), CSS.s(1)),
+ desc: 'CSSMathProduct of two different base types'
+ },
+ {
+ value: new CSSMathMax(CSS.px(2), CSS.px(1)),
+ desc: 'CSSMathMax'
+ },
+ {
+ value: new CSSMathMin(CSS.px(1), CSS.px(2)),
+ desc: 'CSSMathMin'
+ },
+ {
+ value: new CSSMathNegate(CSS.px(1)),
+ desc: 'CSSMathNegate'
+ },
+ {
+ value: new CSSMathInvert(CSS.px(1)),
+ desc: 'CSSMathInvert'
+ },
+];
+
+for (const {value, desc} of gInvalidTestCases) {
+ test(() => {
+ value.toString();
+ }, 'Serializing ' + desc + ' does not crash');
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssPositionValue.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssPositionValue.html
new file mode 100644
index 00000000000..c93b2f1a9b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssPositionValue.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSPositionValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#positionvalue-serialization">
+<meta name="assert" content="Test CSSPositionValues are serialized by concatenating their coordinate values" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<div id="log">
+<script>
+'use strict';
+
+test(() => {
+ assert_equals(new CSSPositionValue(CSS.px(1), CSS.percent(-3.14)).toString(), '1px -3.14%');
+}, 'CSSPositionValue with length and percent serializes by concantenating x and y');
+
+test(() => {
+ let result = CSSStyleValue.parse('object-position', '1px 1px');
+ result.x = CSS.percent(-3.14);
+ assert_equals(result.toString(), '-3.14% 1px');
+}, 'CSSPositionValue from DOMString modified by "x" setter serializes to its new value');
+
+test(() => {
+ let result = CSSStyleValue.parse('object-position', '1px 1px');
+ result.y = CSS.percent(-3.14);
+ assert_equals(result.toString(), '1px -3.14%');
+}, 'CSSPositionValue from DOMString modified by "y" setter serializes to its new value');
+
+test(t => {
+ let result = createInlineStyleMap(t, 'object-position: 1px 1px').get('object-position');
+ result.x = CSS.percent(-3.14);
+ assert_equals(result.toString(), '-3.14% 1px');
+}, 'CSSPositionValue from CSSOM modified by "x" setter serializes to its new value');
+
+test(t => {
+ let result = createInlineStyleMap(t, 'object-position: 1px 1px').get('object-position');
+ result.y = CSS.percent(-3.14);
+ assert_equals(result.toString(), '1px -3.14%');
+}, 'CSSPositionValue from CSSOM modified by "y" setter serializes to its new value');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html
new file mode 100644
index 00000000000..5f09cfdc77e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSTransformValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#positionvalue-serialization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<script>
+'use strict';
+
+const gTestCases = [
+ {
+ value: new CSSTranslation(CSS.percent(1), CSS.px(1)),
+ cssText: 'translate(1%, 1px)',
+ desc: 'CSSTranslation with 2 arguments'
+ },
+ {
+ value: new CSSTranslation(CSS.px(1), CSS.percent(2), CSS.px(3)),
+ cssText: 'translate3d(1px, 2%, 3px)',
+ desc: 'CSSTranslation with 3 arguments'
+ },
+ {
+ value: new CSSScale(CSS.number(2), CSS.number(3)),
+ cssText: 'scale(2, 3)',
+ desc: 'CSSScale with 2 arguments'
+ },
+ {
+ value: new CSSScale(CSS.number(1), CSS.number(2), CSS.number(3)),
+ cssText: 'scale3d(1, 2, 3)',
+ desc: 'CSSScale with 3 arguments'
+ },
+ {
+ value: new CSSRotation(CSS.deg(90)),
+ cssText: 'rotate(90deg)',
+ desc: 'CSSRotation with 1 argument'
+ },
+ {
+ value: new CSSRotation(CSS.number(1), CSS.number(2), CSS.number(3), CSS.deg(90)),
+ cssText: 'rotate3d(1, 2, 3, 90deg)',
+ desc: 'CSSRotation with 4 arguments'
+ },
+ {
+ value: new CSSSkew(CSS.deg(90), CSS.deg(45)),
+ cssText: 'skew(90deg, 45deg)',
+ desc: 'CSSSkew'
+ },
+ {
+ value: new CSSPerspective(CSS.px(1)),
+ cssText: 'perspective(1px)',
+ desc: 'CSSPerspective'
+ },
+ {
+ value: new CSSTransformValue([new CSSPerspective(CSS.px(1))]),
+ cssText: 'perspective(1px)',
+ desc: 'CSSTransformValue with a single transform'
+ },
+ {
+ value: new CSSTransformValue([
+ new CSSTranslation(CSS.px(1), CSS.px(0)),
+ new CSSRotation(CSS.deg(90)),
+ new CSSPerspective(CSS.px(1)),
+ new CSSSkew(CSS.deg(90), CSS.deg(45)),
+ new CSSScale(CSS.number(1), CSS.number(2), CSS.number(3)),
+ ]),
+ cssText: 'translate(1px, 0px) rotate(90deg) perspective(1px) skew(90deg, 45deg) scale3d(1, 2, 3)',
+ desc: 'CSSTransformValue with multiple transforms'
+ },
+ {
+ value: new CSSTransformValue([
+ new CSSTranslation(new CSSMathSum(CSS.px(1), CSS.em(1)), CSS.px(0)),
+ new CSSRotation(new CSSMathSum(CSS.deg(90), CSS.turn(1))),
+ new CSSPerspective(new CSSMathSum(CSS.px(1), CSS.em(1))),
+ new CSSSkew(new CSSMathProduct(CSS.deg(90), 2), new CSSMathProduct(CSS.turn(1), 2)),
+ new CSSScale(
+ new CSSMathProduct(CSS.number(1), CSS.number(2)),
+ new CSSMathSum(CSS.number(1), CSS.number(1)),
+ new CSSMathProduct(CSS.number(3))
+ ),
+ ]),
+ cssText: 'translate(calc(1px + 1em), 0px) rotate(calc(90deg + 1turn)) perspective(calc(1px + 1em)) skew(calc(90deg * 2), calc(1turn * 2)) scale3d(calc(1 * 2), calc(1 + 1), calc(3))',
+ desc: 'CSSTransformValue containing CSSMathValues'
+ },
+ {
+ value: new CSSMatrixComponent(new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6])),
+ cssText: 'matrix(1, 2, 3, 4, 5, 6)',
+ desc: 'CSSMatrixComponent with 6 elements'
+ },
+ {
+ value: new CSSMatrixComponent(new DOMMatrixReadOnly([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])),
+ cssText: 'matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)',
+ desc: 'CSSMatrixComponent with 16 elements'
+ },
+];
+
+for (const {value, cssText, desc} of gTestCases) {
+ test(() => {
+ assert_equals(value.toString(), cssText);
+ }, desc + ' serializes correctly');
+}
+
+test(() => {
+ let result = new CSSTransformValue([
+ new CSSTranslation(CSS.px(1), CSS.px(2), CSS.px(3)),
+ new CSSRotation(1, 2, 3, CSS.deg(90)),
+ new CSSScale(1, 2, 3),
+ ]);
+
+ for (const transform of result) {
+ transform.is2D = true;
+ }
+
+ assert_equals(result.toString(), 'translate(1px, 2px) rotate(90deg) scale(1, 2)');
+}, 'CSSTransformValue with updated is2D serializes as 2D transforms');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html
new file mode 100644
index 00000000000..652e0e61350
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSUnitValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#numericvalue-serialization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(() => {
+ assert_equals(new CSSUnitValue(3.14, 'px').toString(), '3.14px');
+ assert_equals(CSS.px(3.14).toString(), '3.14px');
+}, 'CSSUnitValue with length unit constructed from IDL serializes correctly');
+
+test(() => {
+ assert_equals(new CSSUnitValue(3.14, 'percent').toString(), '3.14%');
+ assert_equals(CSS.percent(3.14).toString(), '3.14%');
+}, 'CSSUnitValue with unit "percent" constructed from IDL serializes correctly');
+
+test(() => {
+ assert_equals(new CSSUnitValue(3.14, 'number').toString(), '3.14');
+ assert_equals(CSS.number(3.14).toString(), '3.14');
+}, 'CSSUnitValue with unit "number" constructed from IDL serializes correctly');
+
+test(() => {
+ assert_equals(new CSSUnitValue(3, 'number').toString(), '3');
+}, 'CSSUnitValue with integer values constructed from IDL serializes correctly');
+
+test(() => {
+ let result = CSSStyleValue.parse('width', '1px');
+ result.value = 3.14;
+ assert_equals(result.toString(), '3.14px');
+}, 'CSSKeywordValue from DOMString modified by "value" setter serializes correctly');
+
+test(() => {
+ let result = CSSStyleValue.parse('width', '1px');
+ result.unit = 's';
+ assert_equals(result.toString(), '1s');
+}, 'CSSKeywordValue from DOMString modified by "unit" setter serializes correctly');
+
+test(t => {
+ let result = createInlineStyleMap(t, 'width: 1px').get('width');
+ result.value = 3.14;
+ assert_equals(result.toString(), '3.14px');
+}, 'CSSKeywordValue from CSSOM modified by "value" setter serializes correctly');
+
+test(t => {
+ let result = createInlineStyleMap(t, 'width: 1px').get('width');
+ result.unit = 's';
+ assert_equals(result.toString(), '1s');
+}, 'CSSKeywordValue from CSSOM modified by "unit" setter serializes correctly');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html
new file mode 100644
index 00000000000..8b7a8681244
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSUnparsedValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#unparsedvalue-serialization">
+<meta name="assert" content="Test CSSUnparsedValue are serialized by concatenating its contents" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<div id="tag">
+<script>
+'use strict';
+
+test(() => {
+ assert_equals(new CSSUnparsedValue('lem', 'on', 'ade').toString(), 'lemonade');
+}, 'CSSUnparsedValue containing strings serializes to its concatenated contents');
+
+test(() => {
+ assert_equals(new CSSUnparsedValue(
+ new CSSVariableReferenceValue('--A',
+ new CSSUnparsedValue(new CSSVariableReferenceValue('--B'))),
+ new CSSVariableReferenceValue('--C')).toString(),
+ 'var(--A,var(--B))var(--C)');
+}, 'CSSUnparsedValue containing variable references serializes its ' +
+ 'concatenated contents');
+
+test(() => {
+ assert_equals(new CSSUnparsedValue('foo', 'bar ',
+ new CSSVariableReferenceValue('--A',
+ new CSSUnparsedValue('baz ',
+ new CSSVariableReferenceValue('--B'), 'lemon')),
+ new CSSVariableReferenceValue('--C',
+ new CSSUnparsedValue('ade'))).toString(),
+ 'foobar var(--A,baz var(--B)lemon)var(--C,ade)');
+}, 'CSSUnparsedValue containing mix of strings and variable references ' +
+ 'serializes to its concatenated contents');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html
new file mode 100644
index 00000000000..c97ed0d1b41
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>IDL-constructed CSSURLImageValue serialization tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#urlimagevalue-serialization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testhelper.js"></script>
+<script>
+'use strict';
+
+test(() => {
+ assert_equals(new CSSURLImageValue('http://foo.bar').toString(), 'url("http://foo.bar")');
+}, 'CSSUrlImageValue constructed from IDL serializes correctly');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html
new file mode 100644
index 00000000000..b6b0de59e75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSSKeywordValue Error Handling</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#csskeywordvalue">
+<meta name="assert" content="Test CSSKeywordValue constructor and attributes error handling" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<div id="log">
+<script>
+'use strict';
+
+test(() => {
+ assert_throws(new TypeError(), () => new CSSKeywordValue(''));
+}, 'Constructing CSSKeywordValue with an empty string throws a TypeError');
+
+test(() => {
+ let result = new CSSKeywordValue('lemon');
+ assert_throws(new TypeError(), () => result.value = '');
+ assert_equals(result.value, 'lemon');
+}, 'Updating CSSKeywordValue.value with an empty string throws a TypeError');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html
new file mode 100644
index 00000000000..fe163681ee9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssKeywordValue.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSSKeywordValue</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#csskeywordvalue">
+<meta name="assert" content="Test CSSKeywordValue constructor and attributes" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<div id="log">
+<script>
+'use strict';
+
+const gTestArguments = [
+ { keyword: 'initial', description: 'a CSS wide keyword' },
+ { keyword: 'auto', description: 'a CSS keyword' },
+ { keyword: 'lemon', description: 'an unsupported CSS keyword' },
+ { keyword: '3! + 4@', description: 'a string containing multiple tokens' },
+ { keyword: '☺', description: 'a unicode string' },
+];
+
+for (const {keyword, description} of gTestArguments) {
+ test(() => {
+ const result = new CSSKeywordValue(keyword);
+
+ assert_not_equals(result, null,
+ 'A CSSKeywordValue should be created');
+ assert_equals(result.value, keyword,
+ 'Value attribute should be same as passed in the constructor');
+ }, 'CSSKeywordValue can be constructed from ' + description);
+
+ test(() => {
+ let result = new CSSKeywordValue('auto');
+ result.value = keyword;
+
+ assert_equals(result.value, keyword,
+ 'Value attribute should be same as passed in the setter');
+ }, 'CSSKeywordValue.value can be updated to ' + description);
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html
new file mode 100644
index 00000000000..0ea8632ce48
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssPositionValue-interface.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>CSSPositionValue IDL</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#positionvalue-objects">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script type="text/plain" id="idl">
+[Constructor(CSSNumericValue x, CSSNumericValue y)]
+interface CSSPositionValue : CSSStyleValue {
+ attribute CSSNumericValue x;
+ attribute CSSNumericValue y;
+};
+</script>
+<script>
+'use strict';
+const idlArray = new IdlArray();
+idlArray.add_untested_idls('interface CSSStyleValue { stringifier; };');
+idlArray.add_untested_idls('interface CSSNumericValue : CSSStyleValue { };');
+idlArray.add_idls(document.getElementById('idl').textContent);
+idlArray.add_objects({
+ CSSPositionValue: ['new CSSPositionValue(new CSSUnitValue(0, "px"), new CSSUnitValue(0, "px"))']
+});
+idlArray.test();
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html
new file mode 100644
index 00000000000..d2a68e7d001
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Computed StylePropertyMap tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#computed-stylepropertymapreadonly-objects">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<style>#target { height: 10px; --foo: auto; }</style>
+<div style="width: 50px">
+ <div id="target" style="top: 5px; --bar: 5; width: 50%;"></div>
+</div>
+<script>
+'use strict';
+
+const target = document.getElementById('target');
+const styleMap = target.computedStyleMap();
+
+// FIXME(crbug.com/788904): Test currently fails because the 'content' property returns
+// incorrect initial CSS value.
+test(() => {
+ const computedStyle = [...getComputedStyle(target)].sort();
+ const properties = styleMap.getProperties();
+
+ // Two extra entries for custom properties
+ assert_equals(properties.length, computedStyle.length + 2);
+ for (let i = 0; i < computedStyle.length; i++) {
+ assert_equals(properties[i], computedStyle[i]);
+ assert_not_equals(styleMap.get(computedStyle[i]), null);
+ assert_not_equals(styleMap.getAll(computedStyle[i]).length, 0);
+ assert_true(styleMap.has(computedStyle[i]));
+ }
+}, 'Computed StylePropertyMap contains every CSS property');
+
+test(() => {
+ const result = styleMap.get('height');
+ assert_style_value_equals(result, CSS.px(10));
+}, 'Computed StylePropertyMap contains CSS property declarations in style rules');
+
+test(() => {
+ const result = styleMap.get('--foo');
+ assert_style_value_equals(result, new CSSUnparsedValue(' auto'));
+}, 'Computed StylePropertyMap contains custom property declarations in style rules');
+
+test(() => {
+ const result = styleMap.get('top');
+ assert_style_value_equals(result, CSS.px(5));
+}, 'Computed StylePropertyMap contains CSS property declarations in inline styles');
+
+test(() => {
+ const result = styleMap.get('--bar');
+ assert_style_value_equals(result, new CSSUnparsedValue(' 5'));
+}, 'Computed StylePropertyMap contains custom property declarations in inline rules');
+
+test(() => {
+ const computedStyle = getComputedStyle(target);
+ assert_equals(computedStyle.width, '25px');
+
+ const result = styleMap.get('width');
+ assert_style_value_equals(result, CSS.percent(50));
+}, 'Computed StylePropertyMap contains computed values and not resolved values');
+
+test(t => {
+ let target = createDivWithStyle(t, 'width: 10px');
+ const styleMap = target.attributeStyleMap;
+ assert_style_value_equals(styleMap.get('width'), CSS.px(10));
+
+ target.style.width = '20px';
+ assert_style_value_equals(styleMap.get('width'), CSS.px(20));
+}, 'Computed StylePropertyMap is live');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/get.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/get.tentative.html
new file mode 100644
index 00000000000..98a519ad827
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/get.tentative.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.get tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#get-a-value-from-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createComputedStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.get('lemon'));
+}, 'Calling StylePropertyMap.get with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--foo: auto');
+ assert_equals(styleMap.get('--Foo'), null);
+}, 'Calling StylePropertyMap.get with a custom property not in the property model returns null');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_equals(styleMap.get('width'), CSS.px(10));
+}, 'Calling StylePropertyMap.get with a valid property returns the correct entry');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'height: 20px; width: 10px;');
+ assert_style_value_equals(styleMap.get('wIdTh'), CSS.px(10));
+}, 'StylePropertyMap.get with a valid property in mixed case returns the correct entry');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue(' auto'));
+}, 'Calling StylePropertyMap.get with a valid custom property returns the correct entry');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 10px;');
+ assert_style_value_equals(styleMap.get('transition-duration'), CSS.s(1));
+}, 'Calling StylePropertyMap.get with a list-valued property returns only the first value');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html
new file mode 100644
index 00000000000..cd8dcd0c693
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getAll tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createComputedStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.getAll('lemon'));
+}, 'Calling StylePropertyMap.getAll with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--foo: auto');
+ assert_style_value_array_equals(styleMap.getAll('--Foo'), []);
+}, 'Calling StylePropertyMap.getAll with a custom property not in the property model returns an empty list');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('width'), [CSS.px(10)]);
+}, 'Calling StylePropertyMap.getAll with a valid property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'height: 20px; width: 10px');
+ assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
+}, 'StylePropertyMap.getAll is case-insensitive');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
+}, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html
new file mode 100644
index 00000000000..3c63c918697
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getProperties tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-getproperties">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--A: A; width: 0px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ const expectedProperties = [...getComputedStyle(document.body)].sort().concat('--A', '--B', '--C');
+ assert_array_equals(styleMap.getProperties(), expectedProperties);
+}, 'StylePropertyMap.getProperties returns property names in correct order');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/has.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/has.tentative.html
new file mode 100644
index 00000000000..6992689caaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/has.tentative.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.has tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#check-if-stylepropertymap-has-a-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createComputedStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.has('lemon'));
+}, 'Calling StylePropertyMap.has with an unsupported property throws a TypeError');
+
+const gTestCases = [
+ { property: '--Foo', expected: false, desc: 'a custom property not in the property model' },
+ { property: 'width', expected: true, desc: 'a valid property' },
+ { property: 'wIdTh', expected: true, desc: 'a valid property in mixed case' },
+ { property: '--foo', expected: true, desc: 'a valid custom property' },
+ { property: 'transition-duration', expected: true, desc: 'a valid list-valued property' },
+];
+
+for (const {property, expected, desc} of gTestCases) {
+ test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; --foo: auto; transition-duration: 1s, 2s');
+ assert_equals(styleMap.has(property), expected);
+ }, 'Calling StylePropertyMap.has with ' + desc + ' returns ' + expected);
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
new file mode 100644
index 00000000000..07d59d82995
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap iterable tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#the-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+function findInStyleMap(styleMap, property) {
+ const index = [...styleMap.keys()].indexOf(property);
+ if (index == -1)
+ return null;
+ return [...styleMap.values()][index];
+}
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--A: A; width: 10px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ const expectedKeys = [...getComputedStyle(document.body)].sort().concat('--A', '--B', '--C');
+ assert_array_equals([...styleMap.keys()], expectedKeys);
+}, 'StylePropertyMap iterates properties in correct order');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
+ assert_style_value_equals(findInStyleMap(styleMap, 'width'), CSS.px(10));
+}, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
+ assert_style_value_array_equals(findInStyleMap(styleMap, 'transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createComputedStyleMap(t, '--A: A; --C: C; color: red; --B: B;');
+ assert_style_value_equals(findInStyleMap(styleMap, '--A'), new CSSUnparsedValue(' A'));
+ assert_style_value_equals(findInStyleMap(styleMap, '--B'), new CSSUnparsedValue(' B'));
+ assert_style_value_equals(findInStyleMap(styleMap, '--C'), new CSSUnparsedValue(' C'));
+}, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/append.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/append.tentative.html
new file mode 100644
index 00000000000..ce18b80faaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/append.tentative.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.append tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#append-to-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', values: ['ade'], desc: 'an unsupported property name' },
+ { property: null, values: ['foo'], desc: 'an null property name' },
+ { property: 'width', values: ['10px'], desc: 'a property that is not list valued' },
+ { property: 'transition-duration', values: [CSS.px(10)], desc: 'an invalid CSSStyleValue' },
+ { property: 'transition-duration', values: ['10px'], desc: 'an invalid String value' },
+ { property: 'transition-duration', values: [CSS.s(1), '10px', CSS.px(10)], desc: 'a mix of valid and invalid values' },
+];
+
+for (const {property, values, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.append(property, ...values));
+ }, 'Calling StylePropertyMap.append with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.append('transition-duration', CSS.s(1), '2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'),
+ [CSS.s(1), CSS.s(2)]);
+
+ styleMap.append('transition-duration', '3s', CSS.s(4));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'),
+ [CSS.s(1), CSS.s(2), CSS.s(3), CSS.s(4)]);
+}, 'Appending a list-valued property with CSSStyleValue or String updates its values');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.append('transition-duration', '1s, 2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'),
+ [CSS.s(1), CSS.s(2)]);
+
+ styleMap.append('transition-duration', '3s, 4s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'),
+ [CSS.s(1), CSS.s(2), CSS.s(3), CSS.s(4)]);
+}, 'Appending a list-valued property with list-valued string updates its values');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, 'transition-duration: 5s, 10s');
+
+ styleMap.append('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
+ const result = styleMap.getAll('transition-duration');
+ assert_style_value_array_equals(result,
+ [CSS.s(5), CSS.s(10), CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap.append is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html
new file mode 100644
index 00000000000..96c1e3e8ff6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Declared StylePropertyMap tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#declared-stylepropertymap-objects">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<style>
+div {
+ height: 10px;
+ width: 50%;
+ width: 'lemon';
+ --foo: auto;
+ transition-duration: 1s, 2s;
+ color: 10;
+}
+
+#target {
+ height: 20px;
+ --foo: 1s;
+ width: 10%;
+}
+</style>
+<div style="width: 50px">
+ <div id="target" style="top: 5px; --bar: auto;"></div>
+</div>
+<script>
+'use strict';
+
+const target = document.getElementById('target');
+const styleMap = document.styleSheets[0].rules[0].attributeStyleMap;
+
+test(() => {
+ const properties = styleMap.getProperties();
+ assert_array_equals(properties, ['height', 'transition-duration', 'width', '--foo']);
+}, 'Declared StylePropertyMap only contains properties in the style rule');
+
+test(() => {
+ assert_style_value_equals(styleMap.get('height'), CSS.px(10));
+}, 'Declared StylePropertyMap contains CSS property declarations in style rules');
+
+test(() => {
+ assert_equals(styleMap.get('top'), null);
+ assert_equals(styleMap.get('--bar'), null);
+}, 'Declared StylePropertyMap does not contain inline styles');
+
+test(() => {
+ assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue(' auto'));
+}, 'Declared StylePropertyMap contains custom property declarations');
+
+test(() => {
+ assert_equals(styleMap.get('color'), null);
+}, 'Declared StylePropertyMap does not contain properties with invalid values');
+
+test(() => {
+ assert_style_value_equals(styleMap.get('width'), CSS.percent(50));
+}, 'Declared StylePropertyMap contains properties with their last valid value');
+
+test(() => {
+ const style = document.createElement('style');
+ document.head.appendChild(style);
+
+ style.sheet.insertRule('.test { width: 10px; }');
+ let rule = style.sheet.rules[0];
+
+ let styleMap = rule.attributeStyleMap;
+ assert_style_value_equals(styleMap.get('width'), CSS.px(10));
+
+ rule.style.width = '20px';
+ assert_style_value_equals(styleMap.get('width'), CSS.px(20));
+
+ styleMap.set('width', CSS.px(30));
+ assert_equals(rule.cssText, '.test { width: 30px; }');
+}, 'Declared StylePropertyMap is live');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/get.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/get.tentative.html
new file mode 100644
index 00000000000..e50fb6ea9ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/get.tentative.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.get tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#get-a-value-from-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.get('lemon'));
+}, 'Calling StylePropertyMap.get with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t);
+ assert_equals(styleMap.get('height'), null);
+}, 'Calling StylePropertyMap.get with a property not in the property model returns null');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--foo: auto');
+ assert_equals(styleMap.get('--Foo'), null);
+}, 'Calling StylePropertyMap.get with a custom property not in the property model returns null');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_equals(styleMap.get('width'), CSS.px(10));
+}, 'Calling StylePropertyMap.get with a valid property returns the correct entry');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'height: 20px; width: 10px;');
+ assert_style_value_equals(styleMap.get('wIdTh'), CSS.px(10));
+}, 'StylePropertyMap.get with a valid property in mixed case returns the correct entry');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue(' auto'));
+}, 'Calling StylePropertyMap.get with a valid custom property returns the correct entry');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 10px;');
+ assert_style_value_equals(styleMap.get('transition-duration'), CSS.s(1));
+}, 'Calling StylePropertyMap.get with a list-valued property returns only the first value');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html
new file mode 100644
index 00000000000..5fe635c7134
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getAll tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.getAll('lemon'));
+}, 'Calling StylePropertyMap.getAll with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t);
+ assert_style_value_array_equals(styleMap.getAll('height'), []);
+}, 'Calling StylePropertyMap.getAll with a property not in the property model returns an empty list');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--foo: auto');
+ assert_style_value_array_equals(styleMap.getAll('--Foo'), []);
+}, 'Calling StylePropertyMap.getAll with a custom property not in the property model returns an empty list');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('width'), [CSS.px(10)]);
+}, 'Calling StylePropertyMap.getAll with a valid property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'height: 20px; width: 10px');
+ assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
+}, 'StylePropertyMap.getAll is case-insensitive');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
+}, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html
new file mode 100644
index 00000000000..0f59a60c002
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getProperties tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-getproperties">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '');
+ assert_array_equals(styleMap.getProperties(), []);
+}, 'Calling StylePropertyMap.getProperties on an empty property model returns a zero-length array');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--A: A; width: 0px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ assert_array_equals(styleMap.getProperties(),
+ ['color', 'transition-duration', 'width', '--A', '--B', '--C']);
+}, 'StylePropertyMap.getProperties returns CSS properties in alphabetical order then custom properties by codepoint');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/has.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/has.tentative.html
new file mode 100644
index 00000000000..7304f802d84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/has.tentative.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.has tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#check-if-stylepropertymap-has-a-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.has('lemon'));
+}, 'Calling StylePropertyMap.has with an unsupported property throws a TypeError');
+
+const gTestCases = [
+ { property: 'height', expected: false, desc: 'a property not in the property model' },
+ { property: '--Foo', expected: false, desc: 'a custom property not in the property model' },
+ { property: 'width', expected: true, desc: 'a valid property' },
+ { property: 'wIdTh', expected: true, desc: 'a valid property in mixed case' },
+ { property: '--foo', expected: true, desc: 'a valid custom property' },
+ { property: 'transition-duration', expected: true, desc: 'a valid list-valued property' },
+];
+
+for (const {property, expected, desc} of gTestCases) {
+ test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'width: 10px; --foo: auto; transition-duration: 1s, 2s');
+ assert_equals(styleMap.has(property), expected);
+ }, 'Calling StylePropertyMap.has with ' + desc + ' returns ' + expected);
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
new file mode 100644
index 00000000000..be61e2520f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap iterable tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#the-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '');
+ assert_array_equals([...styleMap.entries()], []);
+}, 'Iterating over an empty StylePropertyMap gives a zero-length array');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--A: A; width: 10px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ assert_array_equals([...styleMap.keys()],
+ ['color', 'transition-duration', 'width', '--A', '--B', '--C']);
+}, 'StylePropertyMap iterates properties in correct order');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'height: 5px; width: 10px;');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['height', 'width']);
+ assert_style_value_array_equals(values, [CSS.px(5), CSS.px(10)]);
+}, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, 'transition-duration: 1s, 2s');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['transition-duration']);
+ assert_style_value_array_equals(values[0], [CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createDeclaredStyleMap(t, '--A: A; --B: B; --C: C');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['--A', '--B', '--C']);
+ assert_style_value_array_equals(values, [
+ new CSSUnparsedValue(' A'),
+ new CSSUnparsedValue(' B'),
+ new CSSUnparsedValue(' C'),
+ ])
+}, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html
new file mode 100644
index 00000000000..fe4cced258f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.set</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#set-a-value-on-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', values: ['ade'], desc: 'an unsupported property name' },
+ { property: null, values: ['foo'], desc: 'an null property name' },
+ { property: 'width', values: [CSS.deg(0)], desc: 'an invalid CSSStyleValue' },
+ { property: 'width', values: ['10s'], desc: 'an invalid String' },
+];
+
+for (const {property, values, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set(property, ...values));
+ }, 'Setting a StylePropertyMap with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set('width', CSS.px(10), CSS.px(10)));
+}, 'Setting a non list-valued property with multiple arguments throws TypeError');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set('width', '1s, 2s'));
+}, 'Setting a non list-valued property with list-valued string throws TypeError');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.set('width', CSS.px(10));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(10));
+
+ styleMap.set('width', '20px');
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(20));
+}, 'Setting a property with CSSStyleValue or String updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.set('transition-duration', CSS.s(1), '2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+
+ styleMap.set('transition-duration', '3s', CSS.s(4));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(3), CSS.s(4)]);
+}, 'Setting a list-valued property with CSSStyleValue or String updates its values');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.set('transition-duration', '1s, 2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'Setting a list-valued property with a list-valued string updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.set('--foo', new CSSUnparsedValue('auto'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
+
+ styleMap.set('--foo', '20px');
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
+}, 'Setting a custom property with CSSStyleValue or String updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, 'transition-duration: 5s, 10s');
+
+ styleMap.set('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
+ const result = styleMap.getAll('transition-duration');
+ assert_style_value_array_equals(result, [CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap.set is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/test.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/test.tentative.html
new file mode 100644
index 00000000000..c171769dc17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/test.tentative.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Declared StylePropertyMap tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#declared-stylepropertymap-objects">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<style>
+#target { width: 100px; height: 100px; background: red; }
+</style>
+<body>
+<div id="target">
+<script>
+'use strict';
+
+test(() => {
+ let rule = document.styleSheets[0].rules[0];
+ rule.attributeStyleMap.set('width', CSS.px(200));
+ assert_equals(getComputedStyle(target).width, '200px')
+ rule.attributeStyleMap.set('width', CSS.px(150));
+ assert_equals(getComputedStyle(target).width, '150px')
+});
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html
new file mode 100644
index 00000000000..a5ee95e66de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.update tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#update-a-value-in-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', value: 'ade', desc: 'an unsupported property name' },
+ { property: null, value: 'foo', desc: 'an null property name' },
+ { property: 'width', value: CSS.deg(0), desc: 'an invalid CSSStyleValue' },
+ { property: 'width', value: '10px', desc: 'a String' },
+];
+
+for (const {property, value, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.update(property, () => value));
+ }, 'Updating a StylePropertyMap with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.update('width', () => CSS.px(10));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(10));
+
+ styleMap.update('width', () => CSS.px(20));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(20));
+}, 'Updating a property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.update('transition-duration', () => CSS.s(1));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1)]);
+
+ styleMap.update('transition-duration', () => CSS.s(2));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(2)]);
+}, 'Updating a list-valued property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+
+ styleMap.update('--foo', () => new CSSUnparsedValue('auto'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
+
+ styleMap.update('--foo', () => new CSSUnparsedValue('20px'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
+}, 'Updating a custom property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, '');
+ styleMap.update('width', oldValue => {
+ assert_equals(oldValue, null);
+ return CSS.px(10);
+ });
+}, 'Calling StylePropertyMap.update on an empty property model calls update function with null');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, 'width: 10px');
+ styleMap.update('width', oldValue => {
+ assert_style_value_equals(oldValue, CSS.px(10));
+ return CSS.px(20);
+ });
+}, 'Calling StylePropertyMap.update on an existing property calls update function with old value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, 'transition-duration: 1s, 2s');
+ styleMap.update('transition-duration', oldValue => {
+ assert_style_value_equals(oldValue, CSS.s(1));
+ return CSS.s(2);
+ });
+}, 'Calling StylePropertyMap.update on an existing list-valued property calls update function with first value');
+
+test(t => {
+ let styleMap = createDeclaredStyleMap(t, 'width: 10px');
+
+ styleMap.update('wIdTh', () => CSS.px(20));
+ const result = styleMap.get('width');
+ assert_style_value_equals(result, CSS.px(20));
+}, 'StylePropertyMap.update is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html
new file mode 100644
index 00000000000..9573b7967c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.append tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#append-to-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', values: ['ade'], desc: 'an unsupported property name' },
+ { property: null, values: ['foo'], desc: 'an null property name' },
+ { property: 'width', values: ['10px'], desc: 'a property that is not list valued' },
+ { property: 'transition-duration', values: [CSS.px(10)], desc: 'an invalid CSSStyleValue' },
+ { property: 'transition-duration', values: ['10px'], desc: 'an invalid String value' },
+ { property: 'transition-duration', values: [CSS.s(1), '10px', CSS.px(10)], desc: 'a mix of valid and invalid values' },
+];
+
+for (const {property, values, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.append(property, ...values));
+ }, 'Calling StylePropertyMap.append with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.append('transition-duration', CSS.s(1), '2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+
+ styleMap.append('transition-duration', '3s', CSS.s(4));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2), CSS.s(3), CSS.s(4)]);
+}, 'Appending a list-valued property with CSSStyleValue or String updates its values');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.append('transition-duration', '1s, 2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+
+ styleMap.append('transition-duration', '3s, 4s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2), CSS.s(3), CSS.s(4)]);
+}, 'Appending a list-valued property with list-valued string updates its values');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, 'transition-duration: 5s, 10s');
+
+ styleMap.append('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
+ const result = styleMap.getAll('transition-duration');
+ assert_style_value_array_equals(result, [CSS.s(5), CSS.s(10), CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap.append is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html
new file mode 100644
index 00000000000..1f6ec74aad7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/delete.tentative.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.delete tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#delete-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.delete('lemon'));
+ assert_throws(new TypeError(), () => styleMap.delete(null));
+}, 'Calling StylePropertyMap.delete with an unsupported property name throws a TypeError');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '');
+ assert_false(styleMap.has('width'));
+ styleMap.delete('width');
+ assert_false(styleMap.has('width'));
+}, 'Deleting a property not in a StylePropertyMap is a no-op');
+
+const gTestCases = [
+ { style: 'width: 10px', property: 'width', desc: 'a property' },
+ { style: '--foo: auto', property: '--foo', desc: 'a custom property' },
+ { style: 'transition-duration: 1s, 2s, 3s', property: 'transition-duration', desc: 'a list-valued property' },
+ { style: 'width: 10px', property: 'wIdTh', desc: 'a mixed-case property' },
+];
+
+for (const {style, property, desc} of gTestCases) {
+ test(t => {
+ const styleMap = createInlineStyleMap(t, style);
+ assert_true(styleMap.has(property));
+ styleMap.delete(property);
+ assert_false(styleMap.has(property));
+ }, 'Deleting ' + desc + ' in the property model removes it from the property model');
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/get.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/get.tentative.html
new file mode 100644
index 00000000000..6494a26d1bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/get.tentative.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.get tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#get-a-value-from-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createInlineStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.get('lemon'));
+}, 'Calling StylePropertyMap.get with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t);
+ assert_equals(styleMap.get('height'), null);
+}, 'Calling StylePropertyMap.get with a property not in the property model returns null');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--foo: auto');
+ assert_equals(styleMap.get('--Foo'), null);
+}, 'Calling StylePropertyMap.get with a custom property not in the property model returns null');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_equals(styleMap.get('width'), CSS.px(10));
+}, 'Calling StylePropertyMap.get with a valid property returns the correct entry');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'height: 20px; width: 10px;');
+ assert_style_value_equals(styleMap.get('wIdTh'), CSS.px(10));
+}, 'StylePropertyMap.get with a valid property in mixed case returns the correct entry');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue(' auto'));
+}, 'Calling StylePropertyMap.get with a valid custom property returns the correct entry');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 10px;');
+ assert_style_value_equals(styleMap.get('transition-duration'), CSS.s(1));
+}, 'Calling StylePropertyMap.get with a list-valued property returns only the first value');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html
new file mode 100644
index 00000000000..62cbec37c1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getAll tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createInlineStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.getAll('lemon'));
+}, 'Calling StylePropertyMap.getAll with an unsupported property throws a TypeError');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t);
+ assert_style_value_array_equals(styleMap.getAll('height'), []);
+}, 'Calling StylePropertyMap.getAll with a property not in the property model returns an empty list');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--foo: auto');
+ assert_style_value_array_equals(styleMap.getAll('--Foo'), []);
+}, 'Calling StylePropertyMap.getAll with a custom property not in the property model returns an empty list');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'width: 10px; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('width'), [CSS.px(10)]);
+}, 'Calling StylePropertyMap.getAll with a valid property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'height: 20px; width: 10px');
+ assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
+}, 'StylePropertyMap.getAll is case-insensitive');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--foo: auto; --bar: 10px');
+ assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
+}, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html
new file mode 100644
index 00000000000..a6dfade280d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.getProperties tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-getproperties">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '');
+ assert_array_equals(styleMap.getProperties(), []);
+}, 'Calling StylePropertyMap.getProperties on an empty property model returns a zero-length array');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--A: A; width: 0px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ assert_array_equals(styleMap.getProperties(),
+ ['color', 'transition-duration', 'width', '--A', '--B', '--C']);
+}, 'StylePropertyMap.getProperties returns property names in correct order');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/has.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/has.tentative.html
new file mode 100644
index 00000000000..1f4e4f90bbf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/has.tentative.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.has tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#check-if-stylepropertymap-has-a-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createInlineStyleMap(t);
+ assert_throws(new TypeError(), () => styleMap.has('lemon'));
+}, 'Calling StylePropertyMap.has with an unsupported property throws a TypeError');
+
+const gTestCases = [
+ { property: 'height', expected: false, desc: 'a property not in the property model' },
+ { property: '--Foo', expected: false, desc: 'a custom property not in the property model' },
+ { property: 'width', expected: true, desc: 'a valid property' },
+ { property: 'wIdTh', expected: true, desc: 'a valid property in mixed case' },
+ { property: '--foo', expected: true, desc: 'a valid custom property' },
+ { property: 'transition-duration', expected: true, desc: 'a valid list-valued property' },
+];
+
+for (const {property, expected, desc} of gTestCases) {
+ test(t => {
+ const styleMap = createInlineStyleMap(t, 'width: 10px; --foo: auto; transition-duration: 1s, 2s');
+ assert_equals(styleMap.has(property), expected);
+ }, 'Calling StylePropertyMap.has with ' + desc + ' returns ' + expected);
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
new file mode 100644
index 00000000000..cbf76d8901f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap iterable tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#the-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '');
+ assert_array_equals([...styleMap.entries()], []);
+}, 'Iterating over an empty StylePropertyMap gives a zero-length array');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--A: A; width: 10px; --C: C; transition-duration: 1s, 2s; color: red; --B: B;');
+ assert_array_equals([...styleMap.keys()],
+ ['color', 'transition-duration', 'width', '--A', '--B', '--C']);
+}, 'StylePropertyMap iterates properties in correct order');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'height: 5px; width: 10px;');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['height', 'width']);
+ assert_style_value_array_equals(values, [CSS.px(5), CSS.px(10)]);
+}, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, 'transition-duration: 1s, 2s');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['transition-duration']);
+ assert_style_value_array_equals(values[0], [CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
+
+test(t => {
+ const styleMap = createInlineStyleMap(t, '--A: A; --B: B; --C: C');
+ const keys = [...styleMap.keys()], values = [...styleMap.values()];
+
+ assert_array_equals(keys, ['--A', '--B', '--C']);
+ assert_style_value_array_equals(values, [
+ new CSSUnparsedValue(' A'),
+ new CSSUnparsedValue(' B'),
+ new CSSUnparsedValue(' C'),
+ ])
+}, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html
new file mode 100644
index 00000000000..dc8ccc57bcc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.set</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#set-a-value-on-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', values: ['ade'], desc: 'an unsupported property name' },
+ { property: null, values: ['foo'], desc: 'an null property name' },
+ { property: 'width', values: [CSS.deg(0)], desc: 'an invalid CSSStyleValue' },
+ { property: 'width', values: ['10s'], desc: 'an invalid String' },
+];
+
+for (const {property, values, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set(property, ...values));
+ }, 'Setting a StylePropertyMap with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set('width', CSS.px(10), CSS.px(10)));
+}, 'Setting a non list-valued property with multiple arguments throws TypeError');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.set('width', '1s, 2s'));
+}, 'Setting a non list-valued property with list-valued string throws TypeError');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.set('width', CSS.px(10));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(10));
+
+ styleMap.set('width', '20px');
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(20));
+}, 'Setting a property with CSSStyleValue or String updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.set('transition-duration', CSS.s(1), '2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+
+ styleMap.set('transition-duration', '3s', CSS.s(4));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(3), CSS.s(4)]);
+}, 'Setting a list-valued property with CSSStyleValue or String updates its values');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.set('transition-duration', '1s, 2s');
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
+}, 'Setting a list-valued property with a list-valued string updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.set('--foo', new CSSUnparsedValue('auto'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
+
+ styleMap.set('--foo', '20px');
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
+}, 'Setting a custom property with CSSStyleValue or String updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, 'transition-duration: 5s, 10s');
+
+ styleMap.set('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
+ const result = styleMap.getAll('transition-duration');
+ assert_style_value_array_equals(result, [CSS.s(1), CSS.s(2)]);
+}, 'StylePropertyMap.set is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html
new file mode 100644
index 00000000000..ac2d83411c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>StylePropertyMap.update tests</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#update-a-value-in-a-stylepropertymap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<body>
+<script>
+'use strict';
+
+const gInvalidTestCases = [
+ { property: 'lemon', value: 'ade', desc: 'an unsupported property name' },
+ { property: null, value: 'foo', desc: 'an null property name' },
+ { property: 'width', value: CSS.deg(0), desc: 'an invalid CSSStyleValue' },
+ { property: 'width', value: '10px', desc: 'a String' },
+];
+
+for (const {property, value, desc} of gInvalidTestCases) {
+ test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ assert_throws(new TypeError(), () => styleMap.update(property, () => value));
+ }, 'Updating a StylePropertyMap with ' + desc + ' throws TypeError');
+}
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.update('width', () => CSS.px(10));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(10));
+
+ styleMap.update('width', () => CSS.px(20));
+ assert_style_value_array_equals(styleMap.get('width'), CSS.px(20));
+}, 'Updating a property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.update('transition-duration', () => CSS.s(1));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1)]);
+
+ styleMap.update('transition-duration', () => CSS.s(2));
+ assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(2)]);
+}, 'Updating a list-valued property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+
+ styleMap.update('--foo', () => new CSSUnparsedValue('auto'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
+
+ styleMap.update('--foo', () => new CSSUnparsedValue('20px'));
+ assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
+}, 'Updating a custom property with CSSStyleValue updates its value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, '');
+ styleMap.update('width', oldValue => {
+ assert_equals(oldValue, null);
+ return CSS.px(10);
+ });
+}, 'Calling StylePropertyMap.update on an empty property model calls update function with null');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, 'width: 10px');
+ styleMap.update('width', oldValue => {
+ assert_style_value_equals(oldValue, CSS.px(10));
+ return CSS.px(20);
+ });
+}, 'Calling StylePropertyMap.update on an existing property calls update function with old value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, 'transition-duration: 1s, 2s');
+ styleMap.update('transition-duration', oldValue => {
+ assert_style_value_equals(oldValue, CSS.s(1));
+ return CSS.s(2);
+ });
+}, 'Calling StylePropertyMap.update on an existing list-valued property calls update function with first value');
+
+test(t => {
+ let styleMap = createInlineStyleMap(t, 'width: 10px');
+
+ styleMap.update('wIdTh', () => CSS.px(20));
+ const result = styleMap.get('width');
+ assert_style_value_equals(result, CSS.px(20));
+}, 'StylePropertyMap.update is case-insensitive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/lh-rlh-on-root-001.html b/tests/wpt/web-platform-tests/css/css-values/lh-rlh-on-root-001.html
new file mode 100644
index 00000000000..228da4e3897
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/lh-rlh-on-root-001.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Values and Units Test: using lh and rlh units on the root element</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#font-relative-lengths">
+<style>
+#measure_me { position: absolute; }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id=measure_me>&nbsp;</div>
+
+<script>
+ function get_root_font_size() {
+ return parseFloat(window.getComputedStyle(window.document.documentElement).fontSize);
+ }
+ function get_root_line_height() {
+ /* getComputedStyle returns the computed value (not the used value) for the line-height property,
+ and the computed value of line-height:normal is normal,
+ so we cannot just query the value fo the proerty directly on the root element.
+ However the height of an abspos that only contains a single character from the first available font
+ and doesn't have any ancestor that changes the font-size or line-height property
+ gives us an indirect way to measure the root line-height in px.
+ */
+ return parseFloat(window.getComputedStyle(document.getElementById("measure_me")).height);
+ }
+
+ window.document.documentElement.style="font-size: initial; line-height:initial;";
+ initial_f_s = get_root_font_size();
+ initial_l_h = get_root_line_height();
+
+ test(function() {
+ window.document.documentElement.style="font-size: 142px; line-height: 1lh;";
+ l_h = get_root_line_height();
+ assert_approx_equals( l_h, initial_l_h, 1, "the lh unit on the root element's line-height property uses font metrics corresponding to the initial values of the font or line-height properties");
+ }, "lh in line-height on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 142px; line-height: 1rlh;";
+ l_h = get_root_line_height();
+ assert_approx_equals( l_h, initial_l_h, 1, "the rlh unit on the root element's line-height property uses font metrics corresponding to the initial values of the font or line-height properties");
+ }, "rlh in line-height on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 1lh; line-height: 142px;";
+ f_s = get_root_font_size();
+ assert_approx_equals( f_s, initial_f_s, 1, "the lh unit on the root element's font-size property uses font metrics corresponding to the initial values of the font or line-height properties");
+ }, "lh in font-size on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 1rlh; line-height: 142px;";
+ f_s = get_root_font_size();
+ assert_approx_equals( f_s, initial_f_s, 1, "the rlh unit on the root element's font-size property uses font metrics corresponding to the initial values of the font or line-height properties");
+
+ }, "rlh in font-size on root");
+
+
+ test(function() {
+ window.document.documentElement.style="font-size: 142px; line-height: 2lh;";
+ l_h = get_root_line_height();
+ assert_approx_equals( l_h, initial_l_h * 2, 1, "the lh unit on the root element's line-height property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account");
+ }, "2lh in line-height on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 142px; line-height: 2rlh;";
+ l_h = get_root_line_height();
+ assert_approx_equals( l_h, initial_l_h * 2, 1, "the rlh unit on the root element's line-height property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account");
+ }, "2rlh in line-height on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 2lh; line-height: 142px;";
+ f_s = get_root_font_size();
+ assert_approx_equals( f_s, initial_f_s * 2, 1, "the lh unit on the root element's font-size property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account");
+ }, "2lh in font-size on root");
+
+ test(function() {
+ window.document.documentElement.style="font-size: 2rlh; line-height: 142px;";
+ f_s = get_root_font_size();
+ assert_approx_equals( f_s, initial_f_s * 2, 1, "the rlh unit on the root element's font-size property actually works as a unit and doesn't merely cause a fallback that doesn't take the number of units into account");
+
+ }, "2rlh in font-size on root");
+
+ /*make the test result page readable again*/
+ window.document.documentElement.style="font-size: initial; line-height: initial;";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-values/lh-unit-001.html b/tests/wpt/web-platform-tests/css/css-values/lh-unit-001.html
new file mode 100644
index 00000000000..f7a6fc9551b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/lh-unit-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Values and Units Test: using lh in line-height</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#font-relative-lengths">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="The lh unit resolves against the parent when used in the line-height property.">
+<style>
+div {
+ font-size: 50px;
+ line-height: 1;
+ width: 100px;
+ height: 100px;
+ background: red;
+}
+aside {
+ background: green;
+ font-size: 42px; /* number doesn't matter, as long as it's neither 100 nor 50 */
+ line-height: 2lh;
+}
+
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div><aside>&nbsp;</aside></div>
diff --git a/tests/wpt/web-platform-tests/css/css-values/lh-unit-002.html b/tests/wpt/web-platform-tests/css/css-values/lh-unit-002.html
new file mode 100644
index 00000000000..316637a18a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values/lh-unit-002.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Values and Units Test: using lh in font-size</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#font-relative-lengths">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="The lh unit resolves against the parent when used in the font-size property.">
+<style>
+div {
+ width: 100px;
+ height: 100px;
+ background: red;
+ line-height: 50px;
+}
+aside {
+ background: green;
+ height: 1em;
+ line-height: 42px; /* number doesn't matter, as long as it's neither 50 nor 100*/
+ font-size: 2lh;
+}
+
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div><aside>&nbsp;</aside></div>
diff --git a/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-ref.html b/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-ref.html
new file mode 100644
index 00000000000..f718ea6abfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box.html b/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box.html
new file mode 100644
index 00000000000..563ffdaf1a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Motion Path: offset-anchor with transform-box: fill-box</title>
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property">
+<link rel="match" href="offset-anchor-transform-box-fill-box-ref.html">
+<meta name="assert" content="Tests offset-anchor together with a fill-box transform-box">
+<style>
+#target {
+ transform-box: fill-box;
+ transform-origin: 50% 50%;
+ offset-anchor: 25% 25%;
+ offset-path: path("M75,-25v100");
+ offset-distance: 50%;
+}
+</style>
+<svg width="400" height="400">
+ <rect width="100" height="100" fill="red"/>
+ <rect id="target" x="150" y="100" width="100" height="100" fill="green"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html
new file mode 100644
index 00000000000..5f8bcaf539f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001-ref.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<meta charset="utf-8">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+.parent {
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: block;
+ width: 200px;
+ height: 200px;
+ background: yellow;
+}
+
+.child {
+ position: absolute;
+ left: 50px;
+ top: 50px;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+<div class="parent"><div class="child"></div></div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html
new file mode 100644
index 00000000000..1edfdb04caa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-001.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<title>CSS Test: Absolutely positioned children of flex container with CSS align</title>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654">
+<link rel="match" href="position-absolute-containing-block-001-ref.html">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+.parent {
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 200px;
+ height: 200px;
+ background: yellow;
+}
+
+.child {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+<div class="parent"><div class="child"></div></div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html
new file mode 100644
index 00000000000..90ee38856cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002-ref.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<meta charset="utf-8">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+.parent {
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: block;
+ width: 200px;
+ height: 200px;
+ background: yellow;
+}
+
+.child {
+ position: absolute;
+ left: 60px;
+ top: 60px;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+<div class="parent"><div class="child"></div></div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html
new file mode 100644
index 00000000000..aecbf0b4c99
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/position-absolute-containing-block-002.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<title>CSS Test: Absolutely positioned children of flex container with CSS align</title>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654">
+<link rel="match" href="position-absolute-containing-block-002-ref.html">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+.parent {
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 180px;
+ height: 180px;
+
+ /* Expand the background area to 200px, without touching the content-box,
+ which is what flex absolute children should be aligned relative to. */
+ border-top: 5px solid yellow;
+ padding-top: 15px;
+ border-left: 5px solid yellow;
+ padding-left: 15px;
+
+ background: yellow;
+}
+
+.child {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+<div class="parent"><div class="child"></div></div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list
index bff3a67a796..3e20fefed4f 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list
@@ -213,3 +213,7 @@
== flexbox-single-line-clamp-1.html flexbox-single-line-clamp-1-ref.html
== flexbox-single-line-clamp-2.html flexbox-single-line-clamp-2-ref.html
== flexbox-single-line-clamp-3.html flexbox-single-line-clamp-3-ref.html
+
+# Flexbox as an absolute containing block.
+== position-absolute-containing-block-001.html position-absolute-containing-block-001-ref.html
+== position-absolute-containing-block-002.html position-absolute-containing-block-002-ref.html
diff --git a/tests/wpt/web-platform-tests/docs/_running-tests/chrome_android.md b/tests/wpt/web-platform-tests/docs/_running-tests/chrome_android.md
new file mode 100644
index 00000000000..f707995033d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/docs/_running-tests/chrome_android.md
@@ -0,0 +1,35 @@
+To run WPT on Chrome on an android device, some additional set up is required.
+First until we find a better way, we need to root the android device and update
+the /etc/hosts file to include
+
+```
+127.0.0.1 web-platform.test
+127.0.0.1 www.web-platform.test
+127.0.0.1 www1.web-platform.test
+127.0.0.1 www2.web-platform.test
+127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
+127.0.0.1 xn--lve-6lad.web-platform.test
+0.0.0.0 nonexistent-origin.web-platform.test
+```
+
+Next, we need to start adb and reverse forward the web-platform.tests ports
+
+```
+adb start-server
+```
+
+Add any ports that you need based on your config. For example:
+```
+adb reverse tcp:8000 tcp:8000
+adb reverse tcp:8001 tcp:8001
+adb reverse tcp:8081 tcp:8081
+adb reverse tcp:8444 tcp:8444
+adb reverse tcp:9001 tcp:9001
+adb reverse tcp:9444 tcp:9444
+```
+
+After this, we may run wpt with the `chrome_android` product
+
+```
+./wpt run chrome_android <test>
+```
diff --git a/tests/wpt/web-platform-tests/fetch/security/redirect-to-url-with-credentials.https.html b/tests/wpt/web-platform-tests/fetch/security/redirect-to-url-with-credentials.https.html
new file mode 100644
index 00000000000..c5c32d3963e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/security/redirect-to-url-with-credentials.https.html
@@ -0,0 +1,69 @@
+<html>
+<header>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+</header>
+<body>
+<script>
+var host = get_host_info();
+
+var sameOriginImageURL = "/common/redirect.py?location=" + host.HTTPS_ORIGIN_WITH_CREDS + "/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin= " + host.HTTPS_ORIGIN + "%26PNGIMAGE%26ACACredentials=true";
+var imageURL = "/common/redirect.py?location=" + host.HTTPS_REMOTE_ORIGIN_WITH_CREDS + "/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin= " + host.HTTPS_ORIGIN + "%26PNGIMAGE%26ACACredentials=true";
+var frameURL = "/common/redirect.py?location=" + host.HTTPS_REMOTE_ORIGIN_WITH_CREDS + "/common/blank.html";
+
+promise_test((test) => {
+ return fetch(imageURL, {mode: "no-cors"});
+}, "No CORS fetch after a redirect with an URL containing credentials");
+
+promise_test((test) => {
+ return promise_rejects(test, new TypeError, fetch(imageURL, {mode: "cors"}));
+}, "CORS fetch after a redirect with a cross origin URL containing credentials");
+
+promise_test((test) => {
+ return fetch(sameOriginImageURL, {mode: "cors"});
+}, "CORS fetch after a redirect with a same origin URL containing credentials");
+
+promise_test((test) => {
+ return new Promise((resolve, reject) => {
+ var image = new Image();
+ image.onload = resolve;
+ image.onerror = (e) => reject(e);
+ image.src = imageURL;
+ });
+}, "Image loading after a redirect with an URL containing credentials");
+
+promise_test((test) => {
+ return new Promise((resolve, reject) => {
+ var image = new Image();
+ image.crossOrigin = "use-credentials";
+ image.onerror = resolve;
+ image.onload = () => reject("Image should not load");
+ image.src = imageURL;
+ });
+}, "CORS Image loading after a redirect with a cross origin URL containing credentials");
+
+promise_test((test) => {
+ return new Promise((resolve, reject) => {
+ var image = new Image();
+ image.crossOrigin = "use-credentials";
+ image.onload = resolve;
+ image.onerror = (e) => reject(e);
+ image.src = sameOriginImageURL;
+ });
+}, "CORS Image loading after a redirect with a same origin URL containing credentials");
+
+promise_test(async (test) => {
+ var iframe = document.createElement("iframe");
+ document.body.appendChild(iframe);
+ await new Promise((resolve, reject) => {
+ iframe.src = frameURL;
+ iframe.onload = resolve;
+ iframe.onerror = (e) => reject(e);
+ test.step_timeout(() => reject("Frame loading timed out"), 5000);
+ });
+ document.body.removeChild(iframe);
+}, "Frame loading after a redirect with an URL containing credentials");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html b/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
index 3b96073790c..8bb740af724 100644
--- a/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
+++ b/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
@@ -1,78 +1,32 @@
<!doctype html>
-<html>
-<head>
<title>Manual Gamepad IDL tests</title>
-<link rel="help" href="https://w3c.github.io/gamepad/#gamepad-interface">
-<link rel="help" href="https://w3c.github.io/gamepad/#gamepadbutton-interface">
-<link rel="help" href="https://w3c.github.io/gamepad/#gamepadevent-interface">
-<link rel="help" href="https://w3c.github.io/gamepad/#navigator-interface-extension">
+<link rel="help" href="https://w3c.github.io/gamepad/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
+<p id="instructions">This test requires a gamepad. Connect one and press any button to start the test.</p>
<script>
-setup({explicit_done: true, explicit_timeout: true});
+"use strict";
+
+setup({explicit_timeout: true});
+
+promise_test(async t => {
+ const eventWatcher = new EventWatcher(t, window, "gamepadconnected");
+ let e = await eventWatcher.wait_for("gamepadconnected");
+ const idl_array = new IdlArray();
+ const gamepad_idl = await fetch("/interfaces/gamepad.idl").then(r => r.text());
+
+ idl_array.add_untested_idls('interface Event {};');
+ idl_array.add_untested_idls('interface Navigator {};');
+ idl_array.add_idls(gamepad_idl);
-addEventListener("gamepadconnected", function (e) {
- var idl_array = new IdlArray();
- idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
- idl_array.add_idls(document.getElementById("idl").textContent);
idl_array.add_objects({
GamepadEvent: [e],
Gamepad: [e.gamepad],
GamepadButton: [e.gamepad.buttons[0]],
- Navigator: ["navigator"],
+ Navigator: ["navigator"]
});
idl_array.test();
- done();
-});
+}, "Test IDL implementation of Gamepad API");
</script>
-</head>
-<body>
-<pre id="untested_idl" style="display: none">
-interface Navigator {
-};
-
-interface Event {
-};
-</pre>
-<pre id="idl" style="display: none">
-interface Gamepad {
- readonly attribute DOMString id;
- readonly attribute long index;
- readonly attribute boolean connected;
- readonly attribute DOMHighResTimeStamp timestamp;
- readonly attribute GamepadMappingType mapping;
- readonly attribute FrozenArray<double> axes;
- readonly attribute FrozenArray<GamepadButton> buttons;
-};
-
-enum GamepadMappingType {
- "",
- "standard"
-};
-
-interface GamepadButton {
- readonly attribute boolean pressed;
- readonly attribute double value;
-};
-
-[Constructor(DOMString type, optional GamepadEventInit eventInitDict)]
-interface GamepadEvent : Event
-{
- readonly attribute Gamepad? gamepad;
-};
-
-dictionary GamepadEventInit : EventInit
-{
- Gamepad? gamepad = null;
-};
-
-partial interface Navigator {
- Gamepad[] getGamepads();
-};
-</pre>
-<p id="instructions">This test requires a gamepad. Connect one and press any button to start the test.</p>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/gamepad/idlharness.html b/tests/wpt/web-platform-tests/gamepad/idlharness.html
index e78a56be498..833449d72b6 100644
--- a/tests/wpt/web-platform-tests/gamepad/idlharness.html
+++ b/tests/wpt/web-platform-tests/gamepad/idlharness.html
@@ -1,6 +1,4 @@
<!doctype html>
-<html>
-<head>
<title>Gamepad IDL tests</title>
<link rel="help" href="https://w3c.github.io/gamepad/#gamepad-interface">
<link rel="help" href="https://w3c.github.io/gamepad/#gamepadbutton-interface">
@@ -10,61 +8,21 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-</head>
-<body>
-<pre id="untested_idl" style="display: none">
-interface Navigator {
-};
-
-interface Event {
-};
-</pre>
-<pre id="idl" style="display: none">
-interface Gamepad {
- readonly attribute DOMString id;
- readonly attribute long index;
- readonly attribute boolean connected;
- readonly attribute DOMHighResTimeStamp timestamp;
- readonly attribute GamepadMappingType mapping;
- readonly attribute FrozenArray<double> axes;
- readonly attribute FrozenArray<GamepadButton> buttons;
-};
-
-enum GamepadMappingType {
- "",
- "standard"
-};
-
-interface GamepadButton {
- readonly attribute boolean pressed;
- readonly attribute double value;
-};
+<script>
+"use strict";
-[Constructor(DOMString type, optional GamepadEventInit eventInitDict)]
-interface GamepadEvent : Event
-{
- readonly attribute Gamepad? gamepad;
-};
+promise_test(async () => {
+ const idl_array = new IdlArray();
+ const gamepad_idl = await fetch("/interfaces/gamepad.idl").then(r => r.text());
-dictionary GamepadEventInit : EventInit
-{
- Gamepad? gamepad = null;
-};
+ idl_array.add_untested_idls('interface Event {};');
+ idl_array.add_untested_idls('interface Navigator {};');
+ idl_array.add_idls(gamepad_idl);
-partial interface Navigator {
- sequence<Gamepad?> getGamepads();
-};
-</pre>
-<script>
-var idl_array = new IdlArray();
-idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
-idl_array.add_idls(document.getElementById("idl").textContent);
-idl_array.add_objects({
+ idl_array.add_objects({
GamepadEvent: [new GamepadEvent("something")],
- Navigator: ["navigator"],
+ Navigator: ["navigator"]
});
-idl_array.test();
+ idl_array.test();
+}, "Test IDL implementation of Gamepad API");
</script>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js b/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
index cde23741d68..59cb3e3f5b8 100644
--- a/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
+++ b/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
@@ -146,6 +146,25 @@ function runGenericSensorTests(sensorType) {
promise_test(async t => {
const sensor = new sensorType();
const sensorWatcher = new EventWatcher(t, sensor, ["reading", "error"]);
+ sensor.start();
+
+ await sensorWatcher.wait_for("reading");
+ assert_true(sensor.hasReading);
+ const timestamp = sensor.timestamp;
+ sensor.stop();
+ assert_false(sensor.hasReading);
+
+ sensor.start();
+ await sensorWatcher.wait_for("reading");
+ assert_true(sensor.hasReading);
+ assert_greater_than(timestamp, 0);
+ assert_greater_than(sensor.timestamp, timestamp);
+ sensor.stop();
+ }, `${sensorType.name}: Test that fresh reading is fetched on start()`);
+
+ promise_test(async t => {
+ const sensor = new sensorType();
+ const sensorWatcher = new EventWatcher(t, sensor, ["reading", "error"]);
const visibilityChangeWatcher = new EventWatcher(t, document, "visibilitychange");
sensor.start();
@@ -159,8 +178,69 @@ function runGenericSensorTests(sensorType) {
win.close();
sensor.stop();
- assert_array_equals(cachedSensor1, cachedSensor2);
+ assert_object_equals(cachedSensor1, cachedSensor2);
}, `${sensorType.name}: sensor readings can not be fired on the background tab`);
+
+ promise_test(async t => {
+ const fastSensor = new sensorType({frequency: 30});
+ const slowSensor = new sensorType({frequency: 5});
+ slowSensor.start();
+
+ const fastCounter = await new Promise((resolve, reject) => {
+ let fastCounter = 0;
+ let slowCounter = 0;
+
+ fastSensor.onreading = () => {
+ fastCounter++;
+ }
+ slowSensor.onreading = () => {
+ slowCounter++;
+ if (slowCounter == 1) {
+ fastSensor.start();
+ } else if (slowCounter == 3) {
+ fastSensor.stop();
+ slowSensor.stop();
+ resolve(fastCounter);
+ }
+ }
+ fastSensor.onerror = reject;
+ slowSensor.onerror = reject;
+ });
+ assert_greater_than(fastCounter, 2,
+ "Fast sensor overtakes the slow one");
+ }, `${sensorType.name}: frequency hint works`);
+
+ promise_test(async t => {
+ // Create a focused editbox inside a cross-origin iframe,
+ // sensor notification must suspend.
+ const iframeSrc = 'data:text/html;charset=utf-8,<html><body>'
+ + '<input type="text" autofocus></body></html>';
+ const iframe = document.createElement('iframe');
+ iframe.src = encodeURI(iframeSrc);
+
+ const sensor = new sensorType();
+ const sensorWatcher = new EventWatcher(t, sensor, ["reading", "error"]);
+ sensor.start();
+
+ await sensorWatcher.wait_for("reading");
+ assert_reading_not_null(sensor);
+ const cachedTimestamp = sensor.timestamp;
+ const cachedSensor1 = reading_to_array(sensor);
+
+ const iframeWatcher = new EventWatcher(t, iframe, "load");
+ document.body.appendChild(iframe);
+ await iframeWatcher.wait_for("load");
+ const cachedSensor2 = reading_to_array(sensor);
+ assert_array_equals(cachedSensor1, cachedSensor2);
+
+ iframe.remove();
+ await sensorWatcher.wait_for("reading");
+ const cachedSensor3 = reading_to_array(sensor);
+ assert_greater_than(sensor.timestamp, cachedTimestamp);
+
+ sensor.stop();
+ }, `${sensorType.name}: sensor receives suspend / resume notifications when\
+ cross-origin subframe is focused`);
}
function runGenericSensorInsecureContext(sensorType) {
diff --git a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html
index 7d5d47fe6c6..9680b875d62 100644
--- a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>GeolocationSensor Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 62c5d456f0c..66b7832e45f 100644
--- a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>GeolocationSensor Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html
index 1e5bfb36a2b..5ea2518af63 100644
--- a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>GeolocationSensor Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html
index afe935efeb0..46ef9b7ce86 100644
--- a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>GeolocationSensor Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html
index 46be7fba6f6..1694ed00fdf 100644
--- a/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/geolocation-sensor/GeolocationSensor-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>GeolocationSensor Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-disabled-by-feature-policy.https.html
index 70add9b38bd..de4aee2dacc 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Gyroscope Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 6d8c48645ed..3c831bb7c7e 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Gyroscope Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html
index 07624624ce7..46473c3a9d0 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Gyroscope Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy.https.html
index 1f1418b2014..95eee330b39 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Gyroscope Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html
index 19ab572b382..ae5a63d1484 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Gyroscope Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html
index d7fae15c35a..f1be0439df3 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_2.html
@@ -6,25 +6,21 @@
<pre id="step_log"></pre>
<iframe id="test"></iframe>
<script>
-
var t = async_test(undefined, {timeout:10000});
var f = document.getElementById("test");
var l = document.getElementById("step_log");
-var navigated = false;
log = function(t) {l.textContent += ("\n" + t)}
var steps = [
function() {f.src = "browsing_context_name-1.html"},
function() {
- navigated = true;
assert_equals(f.contentWindow.name, "test", "Initial load");
setTimeout(next, 0);
},
function() {f.src = "browsing_context_name-3.html"},
function() {
- var navigated = true;
- assert_equals(f.contentWindow.name, "test3", "Initial load");
+ assert_equals(f.contentWindow.name, "test3", "After navigation 1");
setTimeout(next, 0);
},
function() {f.src = f.src.replace("http://", "http://www.").replace("browsing_context_name-3", "browsing_context_name-2");},
@@ -33,10 +29,10 @@ var steps = [
},
function() {history.go(-2); setTimeout(next, 500)},
function() {
- assert_equals(f.contentWindow.name, "test3", "After navigation");
+ assert_equals(f.contentWindow.name, "test3", "After navigation 2");
t.done();
}
-].map(function(x) {return t.step_func(function() {log("Step " + step); x()})});
+].map(function(x) {return t.step_func(function() {log("Step " + step + " " + f.contentWindow.location); x()})});
var step = 0;
next = t.step_func(function() {steps[step++]()});
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html
index ea4cd0c602e..88b05789de4 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin_3.html
@@ -9,31 +9,28 @@
var t = async_test(undefined, {timeout:10000});
var f = document.getElementById("test");
var l = document.getElementById("step_log");
-var navigated = false;
log = function(t) {l.textContent += ("\n" + t)}
var steps = [
function() {f.src = "browsing_context_name-1.html"},
function() {
- navigated = true;
assert_equals(f.contentWindow.name, "test", "Initial load");
setTimeout(next, 0);
},
function() {f.src = "browsing_context_name-3.html"},
function() {
- var navigated = true;
- assert_equals(f.contentWindow.name, "test3", "Initial load");
+ assert_equals(f.contentWindow.name, "test3", "After navigation 1");
setTimeout(next, 0);
},
function() {f.src = f.src.replace("http://", "http://www.").replace("browsing_context_name-1", "browsing_context_name-2");},
function() {f.src = f.src.replace("http://www.", "http://").replace("browsing_context_name-2", "browsing_context_name-4");},
function() {
- assert_equals(f.contentWindow.name, "test3", "After navigation");
+ assert_equals(f.contentWindow.name, "test3", "After navigation 2");
history.go(-3); setTimeout(next, 500)
},
function() {
- assert_equals(f.contentWindow.name, "test3", "After navigation");
+ assert_equals(f.contentWindow.name, "test3", "After navigation 3");
t.done();
}
].map(function(x) {return t.step_func(function() {log("Step " + step + " " + f.contentWindow.location); x()})});
diff --git a/tests/wpt/web-platform-tests/html/dom/usvstring-reflection.html b/tests/wpt/web-platform-tests/html/dom/usvstring-reflection.html
index 0f5559af1ae..7b408e08136 100644
--- a/tests/wpt/web-platform-tests/html/dom/usvstring-reflection.html
+++ b/tests/wpt/web-platform-tests/html/dom/usvstring-reflection.html
@@ -10,7 +10,14 @@
test(() => {
location.hash = '\uD999';
assert_equals(location.hash, '#%EF%BF%BD');
-}, "location : unpaired surrogate codepoint should be replaced with U+FFFD");
+}, "location.hash : unpaired surrogate codepoint should be replaced with U+FFFD");
+
+test(() => {
+ var w = window.open("about:blank#\uD800");
+ assert_equals(w.location.href, 'about:blank#%EF%BF%BD');
+ w.location.href = 'about:blank#\uD999';
+ assert_equals(w.location.href, 'about:blank#%EF%BF%BD');
+}, "location.href : unpaired surrogate codepoint should be replaced with U+FFFD");
test(() => {
var w = window.open("about:blank#\uD800");
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html
new file mode 100644
index 00000000000..33049822c46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/conditionally-block-rendering-on-link-media-attr.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+
+<link rel=stylesheet href=stylesheet.py>
+<link rel=stylesheet media="screen and (max-width:10px)" href=stylesheet.py?stylesNotMatchingEnvironment&delay=2>
+<h1>Dominic Farolino</h1>
+<script>
+ function styleExists(styleText) {
+ for (let styleRule of document.styleSheets) {
+ let currentStyleText = styleRule.cssRules["0"].cssText;
+ if (currentStyleText == styleText) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ test(() => {
+ const h1 = document.querySelector('h1');
+ const computedColor = getComputedStyle(h1).color;
+ const expectedColor = "rgb(128, 0, 128)";
+
+ assert_equals(computedColor, expectedColor);
+ assert_true(styleExists("h1 { color: purple; }")); // first style sheet
+ assert_false(styleExists("h1 { color: brown; }")); // second style sheet (should not be loaded yet)
+ }, "Only the style sheet loaded via a link element whose media attribute matches the environment should block following script execution");
+
+ const secondStylesheetTest = async_test("Both style sheets loaded via the link elements should be registered as style sheets for the document after 2 seconds");
+ secondStylesheetTest.step_timeout(() => {
+ assert_true(styleExists("h1 { color: purple; }")); // first style sheet
+ assert_true(styleExists("h1 { color: brown; }")); // second style sheet (loaded now!)
+ secondStylesheetTest.done();
+ }, 3000);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py b/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py
new file mode 100644
index 00000000000..9befce9e60c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/interactions-of-styling-and-scripting/stylesheet.py
@@ -0,0 +1,10 @@
+from time import sleep
+def main(request, response):
+ if "delay" in request.GET:
+ delay = int(request.GET["delay"])
+ sleep(delay)
+
+ if "stylesNotMatchingEnvironment" in request.GET:
+ return 'h1 {color: brown;}'
+ else:
+ return 'h1 {color: purple;}'
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt
new file mode 100644
index 00000000000..fd6d484f888
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/cues-chrono-order.vtt
@@ -0,0 +1,14 @@
+WEBVTT
+Cues that have overlapping time ranges.
+
+1
+00:00:01.000 --> 00:00:02.000
+Bear is Coming!!!!!
+
+2
+00:00:02.500 --> 00:00:03.500
+I said Bear is coming!!!!
+
+3
+00:00:04.000 --> 00:00:05.000
+I said Bear is coming now!!!! \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html
new file mode 100644
index 00000000000..e2f78900a75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-duration.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Enter, Exit events for a cue with negative duration</title>
+<script src="/common/media.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<video>
+ <script>
+ async_test(function(t) {
+ var video = document.querySelector("video");
+ var track = video.addTextTrack("subtitles");
+
+ // Add a cue with negative duration.
+ var cue = new VTTCue(1, -10, "Sausage?");
+ track.addCue(cue);
+ assert_equals(track.cues.length, 1);
+
+ // Verify that enter and exit events are fired.
+ var enterEvent = false;
+ cue.onenter = t.step_func(function() {
+ enterEvent = true;
+ });
+ cue.onexit = t.step_func_done(function() {
+ assert_true(enterEvent);
+ });
+
+ video.src = getVideoURI("/media/test");
+ video.play();
+ });
+ </script>
+</video> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html
new file mode 100644
index 00000000000..ebd7877f78a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Enter, Exit events for cues with negative timestamps</title>
+<script src="/common/media.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<video>
+ <script>
+ async_test(function(t) {
+ var video = document.querySelector("video");
+ var track = video.addTextTrack("subtitles");
+
+ // Add cue with negative startTime.
+ var cue = new VTTCue(-10, 1, "Sausage?");
+ track.addCue(cue);
+ assert_equals(track.cues.length, 1);
+ cue.onenter = t.step_func(function() {
+ cue.onexit = t.step_func_done();
+ });
+
+ // Add cue with negative startTime and negative endTime.
+ // This cue should never be active.
+ var missedCue = new VTTCue(-110, -3.4, "Pepperoni?");
+ track.addCue(missedCue);
+ assert_equals(track.cues.length, 2);
+ missedCue.onenter = t.unreached_func();
+ missedCue.onexit = t.unreached_func();
+
+ video.src = getVideoURI("/media/test");
+ video.play();
+ });
+ </script>
+</video> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html
index c63d55062ee..5dc54ed25bf 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp.html
@@ -9,25 +9,33 @@
var testTrack = document.querySelector("track");
testTrack.onload = t.step_func_done(function() {
+ var cues = testTrack.track.cues;
assert_equals(testTrack.track.cues.length, 4);
// Add cue with negative startTime.
var cue = new VTTCue(-3439332606, 3.4, "Sausage?");
testTrack.track.addCue(cue);
- assert_equals(testTrack.track.cues.length, 5);
+ assert_equals(cues.length, 5);
// Add cue with negative startTime and negative endTime.
cue = new VTTCue(-110, -3.4, "Pepperoni?");
testTrack.track.addCue(cue);
- assert_equals(testTrack.track.cues.length, 6);
+ assert_equals(cues.length, 6);
// Set startTime and endTime to negative values.
- var testCue = testTrack.track.cues[2];
+ var testCue = cues[2];
assert_equals(testCue.startTime, 0);
testCue.startTime = -5;
assert_equals(testCue.startTime, -5);
assert_equals(testCue.endTime, 30.5);
testCue.endTime = -3439332606;
assert_equals(testCue.endTime, -3439332606);
+
+ // Check negative cues ordering.
+ testCue = cues[3];
+ assert_equals(testCue.startTime, 31);
+ testCue.startTime = -200;
+ // Verify that this cue is moved to 2nd position.
+ assert_equals(cues[1].startTime, -200);
});
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html
new file mode 100644
index 00000000000..8354041eb2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit-ref.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script src="/common/reftest-wait.js"></script>
+<style>
+.container {
+ position: relative;
+ display: inline-block;
+ width: 320px;
+ height: 240px;
+}
+.cue {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ overflow: hidden;
+}
+.cue > span {
+ font-family: sans-serif;
+ background: green;
+ color: green;
+ font-size: 120px;
+ padding: 2px;
+}
+</style>
+<div class="container">
+ <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+ </video>
+ <div class="cue"><span>PAS</span></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html
new file mode 100644
index 00000000000..d3dcee10373
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-line-doesnt-fit.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script src="/common/reftest-wait.js"></script>
+<link rel="match" href="track-cue-rendering-line-doesnt-fit-ref.html">
+<script>
+function addCue(track, cueData) {
+ var cue = new VTTCue(0, 10, 'XXX');
+ for (var prop in cueData)
+ cue[prop] = cueData[prop];
+ track.addCue(cue);
+}
+</script>
+<style>
+video::cue {
+ font-size: 120px;
+ color: green;
+ background-color: green;
+}
+</style>
+<video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+ <script>
+ var video = document.querySelector("video");
+ var track = video.addTextTrack('subtitles');
+ addCue(track, { line: 0, align: 'start', text: 'PAS' });
+ // This cue will not fit, and will not be displayed.
+ addCue(track, { line: 1, align: 'start', text: 'FAI' });
+ track.mode = 'showing';
+ </script>
+</video>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html
new file mode 100644
index 00000000000..39461350b08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script src="/common/reftest-wait.js"></script>
+<style>
+.container {
+ transform: translate(1px, 0px);
+ position: relative;
+ display: inline-block;
+ width: 320px;
+ height: 240px;
+}
+.cue {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ overflow: hidden;
+ text-align: start;
+}
+.cue > span {
+ font-family: sans-serif;
+ background: green;
+ color: green;
+ font-size: 50px;
+ padding: 2px;
+}
+</style>
+<div class="container">
+ <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+ </video>
+ <div class="cue"><span>XXX</span></div>
+</div>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html
new file mode 100644
index 00000000000..69ca92e845b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-transformed-video.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script src="/common/reftest-wait.js"></script>
+<link rel="match" href="track-cue-rendering-transformed-video-ref.html">
+<style>
+video {
+ transform: translate(1px, 0px);
+}
+video::cue {
+ font-size: 50px;
+ color: green;
+ background-color: green;
+}
+</style>
+<video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+ <script>
+ var video = document.querySelector('video');
+ var track = video.addTextTrack('subtitles');
+ var cue = new VTTCue(0, 10, 'XXX');
+ cue.align = 'start';
+ cue.line = 0;
+ track.addCue(cue);
+ track.mode = 'showing';
+ </script>
+</video>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html
new file mode 100644
index 00000000000..b9c8412bab0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-cuechange.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<title>TextTrack's cues are indexed and updated in order during video playback</title>
+<script src="/common/media.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<video>
+ <track src="resources/cues-chrono-order.vtt" kind="captions" default>
+ <script>
+ // Use the cuechange event on TextTrack.
+ async_test(function(t) {
+ var video = document.querySelector("video");
+ var testTrack = document.querySelector("track");
+
+ video.src = getVideoURI("/media/test");
+ video.oncanplaythrough = t.step_func(attemptTests);
+
+ function attemptTests() {
+ assert_equals(testTrack.track.cues.length, 3);
+ testTrack.oncuechange = t.step_func(cueChangedFromTrackElement);
+ video.play();
+ }
+
+ var currentCueIndex;
+ var cueChangeCount = 0;
+ function cueChangedFromTrackElement() {
+ currentCueIndex = Math.floor(cueChangeCount / 2);
+ currentCue = event.target.track.cues[currentCueIndex];
+ if (cueChangeCount % 2 == 0) {
+ // Cue entered.
+ assert_equals(currentCue, testTrack.track.activeCues[0]);
+ assert_equals(currentCue.id, (currentCueIndex + 1).toString());
+ }
+
+ ++cueChangeCount;
+ if (cueChangeCount == testTrack.track.cues.length * 2)
+ t.done();
+ }
+ });
+ </script>
+</video> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html
new file mode 100644
index 00000000000..970666793a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cues-enter-exit.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>TextTrack's cues are indexed and updated in order during video playback</title>
+<script src="/common/media.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<video>
+ <track src="resources/cues-chrono-order.vtt" kind="captions" default>
+ <script>
+ // Use the enter and exit events on TextTrackCue.
+ async_test(function(t) {
+ var video = document.querySelector("video");
+ var testTrack = document.querySelector("track");
+
+ video.src = getVideoURI("/media/test");
+
+ video.oncanplaythrough = t.step_func(attemptTests);
+
+ function attemptTests() {
+ assert_equals(testTrack.track.cues.length, 3);
+ for (var i = 0; i < testTrack.track.cues.length; i++) {
+ testTrack.track.cues[i].onenter = t.step_func(cueEntered);
+ testTrack.track.cues[i].onexit = t.step_func(cueExited);
+ }
+ video.play();
+ }
+
+ var cueCount = 0;
+ function cueEntered() {
+ var currentCue = event.target;
+
+ // This cue is the currently active cue.
+ assert_equals(currentCue, testTrack.track.activeCues[0]);
+ assert_equals(currentCue.id, (cueCount + 1).toString());
+ }
+
+ function cueExited() {
+ ++cueCount;
+ if (cueCount == testTrack.track.cues.length)
+ t.done();
+ }
+ });
+ </script>
+</video> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html
index e03fcc0ecbb..8fa2b8b8d3f 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html
@@ -28,4 +28,4 @@
<script type="module" src="./cycle-unresolvable-a.js"
onerror="unreachable()" onload="log.push(2)"></script>
<script type="module" src="./cycle-unresolvable.js"
- onerror="unreachable()" onload="log.push(3)" async></script>
+ onerror="unreachable()" onload="log.push(3)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html
index 8946eaab4eb..5af9a5e4c02 100644
--- a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html
+++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/rellist-feature-detection.html
@@ -32,6 +32,10 @@ test(function() {
assert_equals(element.relList.length, 2);
assert_equals(element.relList[0], "first");
assert_equals(element.relList[1], "second");
+ // Test that relList is [SameObject].
+ let savedRelList = element.relList;
+ element.rel = "something";
+ assert_equals(element.relList, savedRelList);
// Test that supports() is returning true for valid values
// and false for invalid ones.
diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html
index 1c818760a11..1099819cd94 100644
--- a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html
+++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-area-element/rellist-feature-detection.html
@@ -32,6 +32,10 @@ test(function() {
assert_equals(element.relList.length, 2);
assert_equals(element.relList[0], "first");
assert_equals(element.relList[1], "second");
+ // Test that relList is [SameObject].
+ let savedRelList = element.relList;
+ element.rel = "something";
+ assert_equals(element.relList, savedRelList);
// Test that supports() is returning true for valid values
// and false for invalid ones.
diff --git a/tests/wpt/web-platform-tests/images/pattern.mp4 b/tests/wpt/web-platform-tests/images/pattern.mp4
new file mode 100644
index 00000000000..c866bfedf91
--- /dev/null
+++ b/tests/wpt/web-platform-tests/images/pattern.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/interfaces/OWNERS b/tests/wpt/web-platform-tests/interfaces/OWNERS
index 7ccc510535f..8a9a649b729 100644
--- a/tests/wpt/web-platform-tests/interfaces/OWNERS
+++ b/tests/wpt/web-platform-tests/interfaces/OWNERS
@@ -1,4 +1,3 @@
@domenic
@jensl
-@tobie
@yuki3
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/WebCryptoAPI.idl b/tests/wpt/web-platform-tests/interfaces/WebCryptoAPI.idl
index 132c6d076ca..132c6d076ca 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/WebCryptoAPI.idl
+++ b/tests/wpt/web-platform-tests/interfaces/WebCryptoAPI.idl
diff --git a/tests/wpt/web-platform-tests/interfaces/gamepad.idl b/tests/wpt/web-platform-tests/interfaces/gamepad.idl
new file mode 100644
index 00000000000..0f7ca2c4702
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/gamepad.idl
@@ -0,0 +1,33 @@
+interface Gamepad {
+ readonly attribute DOMString id;
+ readonly attribute long index;
+ readonly attribute boolean connected;
+ readonly attribute DOMHighResTimeStamp timestamp;
+ readonly attribute GamepadMappingType mapping;
+ readonly attribute FrozenArray<double> axes;
+ readonly attribute FrozenArray<GamepadButton> buttons;
+};
+
+interface GamepadButton {
+ readonly attribute boolean pressed;
+ readonly attribute boolean touched;
+ readonly attribute double value;
+};
+
+enum GamepadMappingType {
+ "",
+ "standard",
+};
+
+partial interface Navigator {
+ sequence<Gamepad?> getGamepads();
+};
+
+[Constructor(GamepadEventInit eventInitDict)]
+interface GamepadEvent : Event {
+ readonly attribute Gamepad gamepad;
+};
+
+dictionary GamepadEventInit : EventInit {
+ required Gamepad gamepad;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index e272fb823bc..b2a1ec30d82 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -1133,7 +1133,7 @@ dictionary AssignedNodesOptions {
boolean flatten = false;
};
-typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;
+typedef (CanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext) RenderingContext;
[Exposed=Window,
HTMLConstructor]
diff --git a/tests/wpt/web-platform-tests/interfaces/proximity.idl b/tests/wpt/web-platform-tests/interfaces/proximity.idl
new file mode 100644
index 00000000000..89397290544
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/proximity.idl
@@ -0,0 +1,6 @@
+[Constructor(optional SensorOptions sensorOptions), SecureContext, Exposed=Window]
+interface ProximitySensor : Sensor {
+ readonly attribute double? distance;
+ readonly attribute double? max;
+ readonly attribute boolean? near;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl
new file mode 100644
index 00000000000..4d16ddbe282
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl
@@ -0,0 +1,180 @@
+[SecureContext, Exposed=Window] interface XR : EventTarget {
+ // Methods
+ Promise<XRDevice?> requestDevice();
+
+ // Events
+ attribute EventHandler ondevicechange;
+};
+
+[SecureContext]
+partial interface Navigator {
+ [SameObject] readonly attribute XR xr;
+};
+
+[SecureContext, Exposed=Window] interface XRDevice : EventTarget {
+ // Attributes
+ readonly attribute boolean external;
+
+ // Methods
+ Promise<void> supportsSession(optional XRSessionCreationOptions options);
+ Promise<XRSession> requestSession(optional XRSessionCreationOptions options);
+};
+
+dictionary XRSessionCreationOptions {
+ boolean exclusive = false;
+ XRPresentationContext outputContext;
+};
+
+[SecureContext, Exposed=Window] interface XRSession : EventTarget {
+ // Attributes
+ readonly attribute XRDevice device;
+ readonly attribute boolean exclusive;
+ readonly attribute XRPresentationContext outputContext;
+
+ attribute double depthNear;
+ attribute double depthFar;
+ attribute XRLayer baseLayer;
+
+ // Methods
+ Promise<XRFrameOfReference> requestFrameOfReference(XRFrameOfReferenceType type, optional XRFrameOfReferenceOptions options);
+
+ long requestAnimationFrame(XRFrameRequestCallback callback);
+ void cancelAnimationFrame(long handle);
+
+ Promise<void> end();
+
+ // Events
+ attribute EventHandler onblur;
+ attribute EventHandler onfocus;
+ attribute EventHandler onresetpose;
+ attribute EventHandler onend;
+};
+
+callback XRFrameRequestCallback = void (DOMHighResTimeStamp time, XRPresentationFrame frame);
+
+[SecureContext, Exposed=Window] interface XRPresentationFrame {
+ readonly attribute FrozenArray<XRView> views;
+
+ XRDevicePose? getDevicePose(XRCoordinateSystem coordinateSystem);
+};
+
+[SecureContext, Exposed=Window] interface XRCoordinateSystem : EventTarget {
+ Float32Array? getTransformTo(XRCoordinateSystem other);
+};
+
+enum XRFrameOfReferenceType {
+ "headModel",
+ "eyeLevel",
+ "stage",
+};
+
+dictionary XRFrameOfReferenceOptions {
+ boolean disableStageEmulation = false;
+ double stageEmulationHeight = 0.0;
+};
+
+[SecureContext, Exposed=Window] interface XRFrameOfReference : XRCoordinateSystem {
+ readonly attribute XRStageBounds? bounds;
+ readonly attribute double emulatedHeight;
+
+ attribute EventHandler onboundschange;
+};
+
+[SecureContext, Exposed=Window] interface XRStageBounds {
+ readonly attribute FrozenArray<XRStageBoundsPoint> geometry;
+};
+
+[SecureContext, Exposed=Window] interface XRStageBoundsPoint {
+ readonly attribute double x;
+ readonly attribute double z;
+};
+
+enum XREye {
+ "left",
+ "right"
+};
+
+[SecureContext, Exposed=Window] interface XRView {
+ readonly attribute XREye eye;
+ readonly attribute Float32Array projectionMatrix;
+
+ XRViewport? getViewport(XRLayer layer);
+};
+
+[SecureContext, Exposed=Window] interface XRViewport {
+ readonly attribute long x;
+ readonly attribute long y;
+ readonly attribute long width;
+ readonly attribute long height;
+};
+
+[SecureContext, Exposed=Window] interface XRDevicePose {
+ readonly attribute Float32Array poseModelMatrix;
+
+ Float32Array getViewMatrix(XRView view);
+};
+
+[SecureContext, Exposed=Window] interface XRLayer {};
+
+typedef (WebGLRenderingContext or
+ WebGL2RenderingContext) XRWebGLRenderingContext;
+
+dictionary XRWebGLLayerInit {
+ boolean antialias = true;
+ boolean depth = false;
+ boolean stencil = false;
+ boolean alpha = true;
+ boolean multiview = false;
+ double framebufferScaleFactor;
+};
+
+[SecureContext, Exposed=Window, Constructor(XRSession session,
+ XRWebGLRenderingContext context,
+ optional XRWebGLLayerInit layerInit)]
+interface XRWebGLLayer : XRLayer {
+ // Attributes
+ readonly attribute XRWebGLRenderingContext context;
+
+ readonly attribute boolean antialias;
+ readonly attribute boolean depth;
+ readonly attribute boolean stencil;
+ readonly attribute boolean alpha;
+ readonly attribute boolean multiview;
+
+ readonly attribute WebGLFramebuffer framebuffer;
+ readonly attribute unsigned long framebufferWidth;
+ readonly attribute unsigned long framebufferHeight;
+
+ // Methods
+ void requestViewportScaling(double viewportScaleFactor);
+};
+
+partial dictionary WebGLContextAttributes {
+ XRDevice compatibleXRDevice = null;
+};
+
+partial interface mixin WebGLRenderingContextBase {
+ Promise<void> setCompatibleXRDevice(XRDevice device);
+};
+
+[SecureContext, Exposed=Window] interface XRPresentationContext {
+ readonly attribute HTMLCanvasElement canvas;
+};
+
+[SecureContext, Exposed=Window, Constructor(DOMString type, XRSessionEventInit eventInitDict)]
+interface XRSessionEvent : Event {
+ readonly attribute XRSession session;
+};
+
+dictionary XRSessionEventInit : EventInit {
+ required XRSession session;
+};
+
+[SecureContext, Exposed=Window, Constructor(DOMString type, XRCoordinateSystemEventInit eventInitDict)]
+interface XRCoordinateSystemEvent : Event {
+ readonly attribute XRCoordinateSystem coordinateSystem;
+};
+
+dictionary XRCoordinateSystemEventInit : EventInit {
+ required XRCoordinateSystem coordinateSystem;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/xhr.idl b/tests/wpt/web-platform-tests/interfaces/xhr.idl
new file mode 100644
index 00000000000..707e3550962
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/xhr.idl
@@ -0,0 +1,91 @@
+/*[Exposed=(Window,Worker)]*/
+interface XMLHttpRequestEventTarget : EventTarget {
+ // event handlers
+ attribute EventHandler onloadstart;
+ attribute EventHandler onprogress;
+ attribute EventHandler onabort;
+ attribute EventHandler onerror;
+ attribute EventHandler onload;
+ attribute EventHandler ontimeout;
+ attribute EventHandler onloadend;
+};
+
+/*[Exposed=(Window,Worker)]*/
+interface XMLHttpRequestUpload : XMLHttpRequestEventTarget {
+};
+
+enum XMLHttpRequestResponseType {
+ "",
+ "arraybuffer",
+ "blob",
+ "document",
+ "json",
+ "text"
+};
+
+[Constructor/*,
+ Exposed=(Window,Worker)*/]
+interface XMLHttpRequest : XMLHttpRequestEventTarget {
+ // event handler
+ attribute EventHandler onreadystatechange;
+
+ // states
+ const unsigned short UNSENT = 0;
+ const unsigned short OPENED = 1;
+ const unsigned short HEADERS_RECEIVED = 2;
+ const unsigned short LOADING = 3;
+ const unsigned short DONE = 4;
+ readonly attribute unsigned short readyState;
+
+ // request
+ void open(ByteString method, USVString url);
+ void open(ByteString method, USVString url, boolean async, optional USVString? username = null, optional USVString? password = null);
+ void setRequestHeader(ByteString name, ByteString value);
+ attribute unsigned long timeout;
+ attribute boolean withCredentials;
+ readonly attribute XMLHttpRequestUpload upload;
+ void send(optional (Document or BodyInit)? body = null);
+ void abort();
+
+ // response
+ readonly attribute USVString responseURL;
+ readonly attribute unsigned short status;
+ readonly attribute ByteString statusText;
+ ByteString? getResponseHeader(ByteString name);
+ ByteString getAllResponseHeaders();
+ void overrideMimeType(DOMString mime);
+ attribute XMLHttpRequestResponseType responseType;
+ readonly attribute any response;
+ readonly attribute USVString responseText;
+ [Exposed=Window] readonly attribute Document? responseXML;
+};
+
+typedef (File or USVString) FormDataEntryValue;
+
+[Constructor(optional HTMLFormElement form)/*,
+ Exposed=(Window,Worker)*/]
+interface FormData {
+ void append(USVString name, Blob value, optional USVString filename);
+ void append(USVString name, USVString value);
+ void delete(USVString name);
+ FormDataEntryValue? get(USVString name);
+ sequence<FormDataEntryValue> getAll(USVString name);
+ boolean has(USVString name);
+ void set(USVString name, Blob value, optional USVString filename);
+ void set(USVString name, USVString value);
+ /*iterable<USVString, FormDataEntryValue>;*/
+};
+
+[Constructor(DOMString type, optional ProgressEventInit eventInitDict)/*,
+ Exposed=(Window,Worker)*/]
+interface ProgressEvent : Event {
+ readonly attribute boolean lengthComputable;
+ readonly attribute unsigned long long loaded;
+ readonly attribute unsigned long long total;
+};
+
+dictionary ProgressEventInit : EventInit {
+ boolean lengthComputable = false;
+ unsigned long long loaded = 0;
+ unsigned long long total = 0;
+};
diff --git a/tests/wpt/web-platform-tests/keyboard-lock/idlharness.https.html b/tests/wpt/web-platform-tests/keyboard-lock/idlharness.https.html
index 4e06d57b6a3..9caa379f4f6 100644
--- a/tests/wpt/web-platform-tests/keyboard-lock/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/keyboard-lock/idlharness.https.html
@@ -14,7 +14,7 @@ interface Navigator {
};
</pre>
<!--
- The reason of the failure of requestKeyboardLock test looks like a code defect in
+ The reason of the failure of keyboardLock test looks like a code defect in
idlharness.js. media-capabilities/idlharness.html is also impacted by this
issue. See https://codereview.chromium.org/2805763004/#ps620001, which
includes a potential fix.
@@ -22,8 +22,8 @@ interface Navigator {
-->
<pre id="idl" style="display: none">
partial interface Navigator {
- [SecureContext] Promise<void> requestKeyboardLock(optional sequence<DOMString> keyCodes = []);
- [SecureContext] void cancelKeyboardLock();
+ [SecureContext] Promise<void> keyboardLock(optional sequence<DOMString> keyCodes = []);
+ [SecureContext] void keyboardUnlock();
};
</pre>
<script>
diff --git a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html
index 8e84d14d465..d553c064d50 100644
--- a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-parallel-requests.https.html
+++ b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-parallel-requests.https.html
@@ -5,11 +5,11 @@
'use strict';
promise_test((t) => {
- const p1 = navigator.requestKeyboardLock(['a', 'b']);
- const p2 = navigator.requestKeyboardLock(['c', 'd']);
+ const p1 = navigator.keyboardLock(['a', 'b']);
+ const p2 = navigator.keyboardLock(['c', 'd']);
return promise_rejects(t, null, p2,
- 'requestKeyboardLock() should only be ' +
+ 'keyboardLock() should only be ' +
'executed if another request has finished.');
-}, 'Keyboard Lock requestKeyboardLock twice in parallel');
+}, 'Keyboard Lock keyboardLock twice in parallel');
</script>
diff --git a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html
index 30f49054495..7670be4f383 100644
--- a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock-two-sequential-requests.https.html
+++ b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock-two-sequential-requests.https.html
@@ -5,10 +5,10 @@
'use strict';
promise_test(() => {
- return navigator.requestKeyboardLock(['a', 'b'])
+ return navigator.keyboardLock(['a', 'b'])
.then(() => {
- return navigator.requestKeyboardLock(['c', 'd']);
+ return navigator.keyboardLock(['c', 'd']);
});
-}, 'Keyboard Lock requestKeyboardLock twice sequentially');
+}, 'Keyboard Lock keyboardLock twice sequentially');
</script>
diff --git a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock.https.html b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock.https.html
index e6e0121e75e..6711decc121 100644
--- a/tests/wpt/web-platform-tests/keyboard-lock/navigator-requestKeyboardLock.https.html
+++ b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardLock.https.html
@@ -5,9 +5,9 @@
'use strict';
promise_test(() => {
- const p = navigator.requestKeyboardLock(['a', 'b']);
+ const p = navigator.keyboardLock(['a', 'b']);
assert_true(p instanceof Promise);
return p;
-}, 'Keyboard Lock requestKeyboardLock');
+}, 'Keyboard Lock keyboardLock');
</script>
diff --git a/tests/wpt/web-platform-tests/keyboard-lock/navigator-cancelKeyboardLock.https.html b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardUnlock.https.html
index 10fd50d3a79..ceb7a968949 100644
--- a/tests/wpt/web-platform-tests/keyboard-lock/navigator-cancelKeyboardLock.https.html
+++ b/tests/wpt/web-platform-tests/keyboard-lock/navigator-keyboardUnlock.https.html
@@ -5,8 +5,8 @@
'use strict';
test(() => {
- assert_equals(navigator.cancelKeyboardLock(),
+ assert_equals(navigator.keyboardUnlock(),
undefined);
-}, 'Keyboard Lock cancelKeyboardLock');
+}, 'Keyboard Lock keyboardUnlock');
</script>
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index dcabf436c52..b8728fefc35 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -38,6 +38,7 @@ TRAILING WHITESPACE: webaudio/*
TRAILING WHITESPACE: WebIDL/*
TRAILING WHITESPACE: webvtt/*
TRAILING WHITESPACE: encoding/legacy*/*
+TRAILING WHITESPACE: server-timing/resources/parsing/*.sub.headers
## File types that should never be checked ##
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-disabled-by-feature-policy.https.html
index f24b2b35646..56a1cc4f0f9 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Magnetometer Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 08369810f5f..b5f6798e248 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Magnetometer Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html
index 0086222cbc7..6cad267b6f5 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Magnetometer Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy.https.html
index 7f8ce1a9675..24e2554bca2 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Magnetometer Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html
index a967576eafc..59dfef5bf20 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>Magnetometer Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/media-source/generate-config-change-tests.py b/tests/wpt/web-platform-tests/media-source/generate-config-change-tests.py
new file mode 100755
index 00000000000..4edb925b448
--- /dev/null
+++ b/tests/wpt/web-platform-tests/media-source/generate-config-change-tests.py
@@ -0,0 +1,226 @@
+#!/usr/bin/python
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""
+This is a script that generates the content and HTML files for Media Source
+codec config change LayoutTests.
+"""
+import json
+import os
+
+DURATION = 2
+MEDIA_FORMATS = ['webm', 'mp4']
+ENCODE_SETTINGS = [
+ ## Video-only files
+ # Frame rate changes
+ {'fs': '320x240', 'fr': 24, 'kfr': 8, 'c': '#ff0000', 'vbr': 128, 'abr': 0, 'asr': 0, 'ach': 0, 'afreq': 0},
+ {'fs': '320x240', 'fr': 30, 'kfr': 10, 'c': '#ff0000', 'vbr': 128, 'abr': 0, 'asr': 0, 'ach': 0, 'afreq': 0},
+ # Frame size change
+ {'fs': '640x480', 'fr': 30, 'kfr': 10, 'c': '#00ff00', 'vbr': 128, 'abr': 0, 'asr': 0, 'ach': 0, 'afreq': 0},
+ # Bitrate change
+ {'fs': '320x240', 'fr': 30, 'kfr': 10, 'c': '#ff00ff', 'vbr': 256, 'abr': 0, 'asr': 0, 'ach': 0, 'afreq': 0},
+
+ ## Audio-only files
+ # Bitrate/Codebook changes
+ {'fs': '0x0', 'fr': 0, 'kfr': 0, 'c': '#000000', 'vbr': 0, 'abr': 128, 'asr': 44100, 'ach': 1, 'afreq': 2000},
+ {'fs': '0x0', 'fr': 0, 'kfr': 0, 'c': '#000000', 'vbr': 0, 'abr': 192, 'asr': 44100, 'ach': 1, 'afreq': 4000},
+
+ ## Audio-Video files
+ # Frame size change.
+ {'fs': '320x240', 'fr': 30, 'kfr': 10, 'c': '#ff0000', 'vbr': 256, 'abr': 128, 'asr': 44100, 'ach': 1, 'afreq': 2000},
+ {'fs': '640x480', 'fr': 30, 'kfr': 10, 'c': '#00ff00', 'vbr': 256, 'abr': 128, 'asr': 44100, 'ach': 1, 'afreq': 2000},
+ # Audio bitrate change.
+ {'fs': '640x480', 'fr': 30, 'kfr': 10, 'c': '#00ff00', 'vbr': 256, 'abr': 192, 'asr': 44100, 'ach': 1, 'afreq': 4000},
+ # Video bitrate change.
+ {'fs': '640x480', 'fr': 30, 'kfr': 10, 'c': '#00ffff', 'vbr': 512, 'abr': 128, 'asr': 44100, 'ach': 1, 'afreq': 2000},
+]
+
+CONFIG_CHANGE_TESTS = [
+ ["v-framerate", 0, 1, "Tests %s video-only frame rate changes."],
+ ["v-framesize", 1, 2, "Tests %s video-only frame size changes."],
+ ["v-bitrate", 1, 3, "Tests %s video-only bitrate changes."],
+ ["a-bitrate", 4, 5, "Tests %s audio-only bitrate changes."],
+ ["av-framesize", 6, 7, "Tests %s frame size changes in multiplexed content."],
+ ["av-audio-bitrate", 7, 8, "Tests %s audio bitrate changes in multiplexed content."],
+ ["av-video-bitrate", 7, 9, "Tests %s video bitrate changes in multiplexed content."]
+]
+
+CODEC_INFO = {
+ "mp4": {"audio": "mp4a.40.2", "video": "avc1.4D4001"},
+ "webm": {"audio": "vorbis", "video": "vp8"}
+}
+
+HTML_TEMPLATE = """<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/w3c/resources/testharness.js"></script>
+ <script src="/w3c/resources/testharnessreport.js"></script>
+ <script src="mediasource-util.js"></script>
+ <script src="mediasource-config-changes.js"></script>
+ <link rel="stylesheet" href="/w3c/resources/testharness.css">
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ mediaSourceConfigChangeTest("%(media_format)s", "%(idA)s", "%(idB)s", "%(description)s");
+ </script>
+ </body>
+</html>
+"""
+
+def run(cmd_line):
+ os.system(" ".join(cmd_line))
+
+def generate_manifest(filename, media_filename, media_format, has_audio, has_video):
+ major_type = "audio"
+ if has_video:
+ major_type = "video"
+
+ codecs = []
+ if has_video:
+ codecs.append(CODEC_INFO[media_format]["video"])
+
+ if has_audio:
+ codecs.append(CODEC_INFO[media_format]["audio"])
+
+ mimetype = "%s/%s;codecs=\"%s\"" % (major_type, media_format, ",".join(codecs))
+
+ manifest = { 'url': media_filename, 'type': mimetype}
+
+ f = open(filename, "wb")
+ f.write(json.dumps(manifest, indent=4, separators=(',', ': ')))
+ f.close()
+
+def generate_test_html(media_format, config_change_tests, encoding_ids):
+ for test_info in config_change_tests:
+ filename = "../../media-source/mediasource-config-change-%s-%s.html" % (media_format, test_info[0])
+ html = HTML_TEMPLATE % {'media_format': media_format,
+ 'idA': encoding_ids[test_info[1]],
+ 'idB': encoding_ids[test_info[2]],
+ 'description': test_info[3] % (media_format)}
+ f = open(filename, "wb")
+ f.write(html)
+ f.close()
+
+
+def main():
+ encoding_ids = []
+
+ for media_format in MEDIA_FORMATS:
+ run(["mkdir ", media_format])
+
+ for settings in ENCODE_SETTINGS:
+ video_bitrate = settings['vbr']
+ has_video = (video_bitrate > 0)
+
+ audio_bitrate = settings['abr']
+ has_audio = (audio_bitrate > 0)
+ bitrate = video_bitrate + audio_bitrate
+
+ frame_size = settings['fs']
+ frame_rate = settings['fr']
+ keyframe_rate = settings['kfr']
+ color = settings['c']
+
+ sample_rate = settings['asr']
+ channels = settings['ach']
+ frequency = settings['afreq']
+
+ cmdline = ["ffmpeg", "-y"]
+
+ id_prefix = ""
+ id_params = ""
+ if has_audio:
+ id_prefix += "a"
+ id_params += "-%sHz-%sch" % (sample_rate, channels)
+
+ channel_layout = "FC"
+ sin_func = "sin(%s*2*PI*t)" % frequency
+ func = sin_func
+ if channels == 2:
+ channel_layout += "|BC"
+ func += "|" + sin_func
+
+ cmdline += ["-f", "lavfi", "-i", "aevalsrc=\"%s:s=%s:c=%s:d=%s\"" % (func, sample_rate, channel_layout, DURATION)]
+
+ if has_video:
+ id_prefix += "v"
+ id_params += "-%s-%sfps-%skfr" % (frame_size, frame_rate, keyframe_rate)
+
+ cmdline += ["-f", "lavfi", "-i", "color=%s:duration=%s:size=%s:rate=%s" % (color, DURATION, frame_size, frame_rate)]
+
+ if has_audio:
+ cmdline += ["-b:a", "%sk" % audio_bitrate]
+
+ if has_video:
+ cmdline += ["-b:v", "%sk" % video_bitrate]
+ cmdline += ["-keyint_min", "%s" % keyframe_rate]
+ cmdline += ["-g", "%s" % keyframe_rate]
+
+
+ textOverlayInfo = "'drawtext=fontfile=Mono:fontsize=32:text=Time\\\\:\\\\ %{pts}"
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=32:text=Size\\\\:\\\\ %s" % (frame_size)
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=64:text=Bitrate\\\\:\\\\ %s" % (bitrate)
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=96:text=FrameRate\\\\:\\\\ %s" % (frame_rate)
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=128:text=KeyFrameRate\\\\:\\\\ %s" % (keyframe_rate)
+
+ if has_audio:
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=160:text=SampleRate\\\\:\\\\ %s" % (sample_rate)
+ textOverlayInfo += ",drawtext=fontfile=Mono:fontsize=32:y=192:text=Channels\\\\:\\\\ %s" % (channels)
+
+ textOverlayInfo += "'"
+ cmdline += ["-vf", textOverlayInfo]
+
+ encoding_id = "%s-%sk%s" % (id_prefix, bitrate, id_params)
+
+ if len(encoding_ids) < len(ENCODE_SETTINGS):
+ encoding_ids.append(encoding_id)
+
+ filename_base = "%s/test-%s" % (media_format, encoding_id)
+ media_filename = filename_base + "." + media_format
+ manifest_filename = filename_base + "-manifest.json"
+
+ cmdline.append(media_filename)
+ run(cmdline)
+
+ # Remux file so it conforms to MSE bytestream requirements.
+ if media_format == "webm":
+ tmp_filename = media_filename + ".tmp"
+ run(["mse_webm_remuxer", media_filename, tmp_filename])
+ run(["mv", tmp_filename, media_filename])
+ elif media_format == "mp4":
+ run(["MP4Box", "-dash", "250", "-rap", media_filename])
+ run(["mv", filename_base + "_dash.mp4", media_filename])
+ run(["rm", filename_base + "_dash.mpd"])
+
+ generate_manifest(manifest_filename, media_filename, media_format, has_audio, has_video)
+ generate_test_html(media_format, CONFIG_CHANGE_TESTS, encoding_ids)
+
+if '__main__' == __name__:
+ main()
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-config-changes.js b/tests/wpt/web-platform-tests/media-source/mediasource-config-changes.js
index ea99b8ba5e4..b28aa90f1f3 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-config-changes.js
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-config-changes.js
@@ -68,9 +68,10 @@ function mediaSourceConfigChangeTest(directory, idA, idB, description)
assert_false(sourceBuffer.updating, "updating");
// Truncate the presentation to a duration of 2 seconds.
+ // First, explicitly remove the media beyond 2 seconds.
sourceBuffer.remove(2, Infinity);
- assert_true(sourceBuffer.updating, "updating");
+ assert_true(sourceBuffer.updating, "sourceBuffer.updating during range removal");
test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
@@ -78,11 +79,13 @@ function mediaSourceConfigChangeTest(directory, idA, idB, description)
test.waitForExpectedEvents(function()
{
- assert_false(sourceBuffer.updating, "updating");
+ assert_false(sourceBuffer.updating, "sourceBuffer.updating prior to duration reduction");
assert_greater_than(mediaSource.duration, 2, "duration");
- // Truncate the presentation to a duration of 2 seconds.
+ // Complete the truncation of presentation to 2 second
+ // duration.
mediaSource.duration = 2;
+ assert_false(sourceBuffer.updating, "sourceBuffer.updating synchronously after duration reduction");
test.expectEvent(mediaElement, "durationchange");
});
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-play.html b/tests/wpt/web-platform-tests/media-source/mediasource-play.html
index 5bbfa29d7e8..62fb04681ae 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-play.html
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-play.html
@@ -19,15 +19,20 @@
test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
+ assert_false(sourceBuffer.updating, "sourceBuffer.updating");
+
sourceBuffer.appendBuffer(mediaData);
+ assert_true(sourceBuffer.updating, "sourceBuffer.updating");
+
test.waitForExpectedEvents(function()
{
- assert_false(sourceBuffer.updating, "updating");
+ assert_false(sourceBuffer.updating, "sourceBuffer.updating");
- sourceBuffer.remove(1, Infinity);
+ // Truncate the buffered media to about 1 second duration.
+ sourceBuffer.remove(1, +Infinity);
- assert_true(sourceBuffer.updating, "updating");
+ assert_true(sourceBuffer.updating, "sourceBuffer.updating");
test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
@@ -38,6 +43,7 @@
assert_false(sourceBuffer.updating, "updating");
assert_greater_than(mediaSource.duration, 1, "duration");
+ // Complete truncation of duration to 1 second.
mediaSource.duration = 1;
test.expectEvent(mediaElement, "durationchange");
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html
index cec214bbc26..ccefe2ea23e 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AbsoluteOrientationSensor Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 2a5debec2cc..6aed47d4ddf 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AbsoluteOrientationSensor Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html
index 0b5698f168a..51bbba1cae4 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AbsoluteOrientationSensor Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html
index 80ed027b09f..c0b4cc8ed30 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AbsoluteOrientationSensor Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
index 6e3e4d49ca7..9ce51ab6448 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/AbsoluteOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>AbsoluteOrientationSensor Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html
index 2c6318fb6af..9296af8ea6c 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-disabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>RelativeOrientationSensor Feature Policy Test: Disabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
index 71d261f0ea9..01b45b09935 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>RelativeOrientationSensor Feature Policy Test: Enabled by attribute redirect on load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html
index 88c023d6249..1bf41196663 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy-attribute.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>RelativeOrientationSensor Feature Policy Test: Enabled by attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html
index 7ec65e0609d..7ea2fb50f3b 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>RelativeOrientationSensor Feature Policy Test: Enabled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
index 4828d0bc905..6d677bf0d42 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/RelativeOrientationSensor-enabled-on-self-origin-by-feature-policy.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<body>
+<title>RelativeOrientationSensor Feature Policy Test: Enabled on self origin</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/resources/featurepolicy.js"></script>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html
index eb58b6a7ece..fd66493bf4f 100644
--- a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html
@@ -22,7 +22,7 @@ test(() => {
try {
new PaymentRequestUpdateEvent("test");
} catch (err) {
- assert_true(false, `Unexpected exception: ${err.message}`);
+ assert_unreached(`Unexpected exception: ${err.message}`);
}
}, "PaymentRequestUpdateEvent can be constructed in secure-context");
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
index 8fc4bafcf04..cfcdb75a66b 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
@@ -43,7 +43,7 @@ promise_test(async t => {
try {
await request.abort();
} catch (err) {
- assert_true(false, "Unexpected promise rejection: " + err.message);
+ assert_unreached("Unexpected promise rejection: " + err.message);
}
// The request is now "closed", so...
await promise_rejects(t, "InvalidStateError", request.abort());
@@ -55,7 +55,7 @@ promise_test(async t => {
try {
await request.abort();
} catch (err) {
- assert_true(false, "Unexpected promise rejection: " + err.message);
+ assert_unreached("Unexpected promise rejection: " + err.message);
}
await promise_rejects(t, "AbortError", acceptPromise);
// As request is now "closed", trying to show it will fail
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
index 1d0b88d2a1c..1325681a4ac 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
@@ -81,7 +81,7 @@ test(() => {
try {
new PaymentRequest(evilMethods, defaultDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, let's add an abusive amount of methods.
while (evilMethods.length < ABUSIVE_AMOUNT) {
@@ -92,7 +92,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if there is an abusive number of payment methods in the methodData sequence");
// PaymentMethodData.supportedMethods
@@ -102,18 +101,19 @@ test(() => {
try {
new PaymentRequest([{ supportedMethods }], defaultDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make supportedMethods super large
- const evilMethodData = [{
- supportedMethods: supportedMethods.repeat(ABUSIVE_AMOUNT),
- }];
+ const evilMethodData = [
+ {
+ supportedMethods: supportedMethods.repeat(ABUSIVE_AMOUNT),
+ },
+ ];
try {
new PaymentRequest(evilMethodData, defaultDetails);
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if PaymentMethodData.supportedMethods is an abusive length");
// PaymentDetailsInit.id
@@ -126,7 +126,7 @@ test(() => {
Object.assign({}, defaultDetails, { id })
);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make the id super large;
const evilDetails = Object.assign({}, defaultDetails, {
@@ -137,7 +137,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if the request id has an abusive length");
// PaymentDetailsInit.total.label
@@ -147,7 +146,7 @@ test(() => {
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make the label super large;
evilDetails.total = {
@@ -159,7 +158,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if PaymentDetailsInit.total.label is an abusive length");
test(() => {
@@ -168,7 +166,7 @@ test(() => {
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we can use evilAmount
evilDetails.total = evilAmount;
@@ -177,7 +175,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if total.amount.value is an abusive length");
for (const [prop, defaultValue] of [
@@ -191,7 +188,7 @@ for (const [prop, defaultValue] of [
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
while (evilDetails[prop].length < ABUSIVE_AMOUNT) {
evilDetails[prop] = evilDetails[prop].concat(evilDetails[prop]);
@@ -202,7 +199,6 @@ for (const [prop, defaultValue] of [
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, `Don't crash if details.${prop} has an abusive number of items`);
}
@@ -214,7 +210,7 @@ test(() => {
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make the label super large;
evilShippingOption.label = "l".repeat(ABUSIVE_AMOUNT);
@@ -223,7 +219,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if PaymentShippingOptions.label is an abusive length");
test(() => {
@@ -234,7 +229,7 @@ test(() => {
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make use of evilAmount;
evilShippingOption.amount = evilAmount;
@@ -243,7 +238,6 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if the PaymentShippingOptions.amount.value is an abusive length");
test(() => {
@@ -254,7 +248,7 @@ test(() => {
try {
new PaymentRequest(defaultMethods, evilDetails);
} catch (err) {
- assert_true(false, "failed smoke test: " + err.stack);
+ assert_unreached("failed smoke test: " + err.stack);
}
// Now, we make the label super large;
evilDisplayItem.label = "l".repeat(ABUSIVE_AMOUNT);
@@ -263,8 +257,5 @@ test(() => {
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
- assert_true(true, "Didn't crash");
}, "Don't crash if PaymentItem.label is an abusive length");
-
-
</script>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-takeRecords.html b/tests/wpt/web-platform-tests/performance-timeline/po-takeRecords.html
new file mode 100644
index 00000000000..eb660f7125a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-takeRecords.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>PerformanceObserver: takeRecords</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="performanceobservers.js"></script>
+<script>
+ async_test(function (t) {
+ const observer = new PerformanceObserver(function (entryList, observer) {
+ assert_unreached('This callback should not have been called.')
+ });
+ let entries = observer.takeRecords();
+ checkEntries(entries, [], 'No records before observe');
+ observer.observe({entryTypes: ['mark']});
+ assert_equals(typeof(observer.takeRecords), 'function');
+ entries = observer.takeRecords();
+ checkEntries(entries, [], 'No records just from observe');
+ performance.mark('a');
+ performance.mark('b');
+ entries = observer.takeRecords();
+ checkEntries(entries, [
+ {entryType: 'mark', name: 'a'},
+ {entryType: 'mark', name: 'b'}
+ ]);
+ performance.mark('c');
+ performance.mark('d');
+ performance.mark('e');
+ entries = observer.takeRecords();
+ checkEntries(entries, [
+ {entryType: 'mark', name: 'c'},
+ {entryType: 'mark', name: 'd'},
+ {entryType: 'mark', name: 'e'}
+ ]);
+ entries = observer.takeRecords();
+ checkEntries(entries, [], 'No entries right after takeRecords');
+ observer.disconnect();
+ t.done();
+ }, "Test PerformanceObserver's takeRecords()");
+</script>
diff --git a/tests/wpt/web-platform-tests/pointerlock/movementX_Y_basic-manual.html b/tests/wpt/web-platform-tests/pointerlock/movementX_Y_basic-manual.html
index 1e8fc1f53aa..c058d24a6e5 100644
--- a/tests/wpt/web-platform-tests/pointerlock/movementX_Y_basic-manual.html
+++ b/tests/wpt/web-platform-tests/pointerlock/movementX_Y_basic-manual.html
@@ -30,14 +30,14 @@
<div id="status-log">Waiting... Click to start loging.</div>
<div class="data-log">
- <table>
- <tr><td></td><td>X</td><td>Y</td></tr>
- <tr><td>client_init:</td><td id="clientX_init-log">X</td><td id="clientY_init-log">Y</td></tr>
- <tr><td>client_last:</td><td id="clientX_last-log">X</td><td id="clientY_last-log">Y</td></tr>
- <tr><td>client_delta:</td><td id="clientX_delta-log">X</td><td id="clientY_delta-log">Y</td></tr>
- <tr><td>movement_sum:</td><td id="movementX_sum-log">X</td><td id="movementY_sum-log">Y</td></tr>
- <tr><td>movement:</td><td id="movementX-log">X</td><td id="movementY-log">Y</td></tr>
- </table>
+ <table>
+ <tr><td></td><td>X</td><td>Y</td></tr>
+ <tr><td>screen_init:</td><td id="screenX_init-log">X</td><td id="screenY_init-log">Y</td></tr>
+ <tr><td>screen_last:</td><td id="screenX_last-log">X</td><td id="screenY_last-log">Y</td></tr>
+ <tr><td>screen_delta:</td><td id="screenX_delta-log">X</td><td id="screenY_delta-log">Y</td></tr>
+ <tr><td>movement_sum:</td><td id="movementX_sum-log">X</td><td id="movementY_sum-log">Y</td></tr>
+ <tr><td>movement:</td><td id="movementX-log">X</td><td id="movementY-log">Y</td></tr>
+ </table>
</div>
<hr/>
@@ -49,16 +49,16 @@
movementY_log = document.querySelector('#movementY-log'),
movementX_sum_log = document.querySelector('#movementX_sum-log'),
movementY_sum_log = document.querySelector('#movementY_sum-log'),
- clientX_init_log = document.querySelector('#clientX_init-log'),
- clientY_init_log = document.querySelector('#clientY_init-log'),
- clientX_last_log = document.querySelector('#clientX_last-log'),
- clientY_last_log = document.querySelector('#clientY_last-log');
- clientX_delta_log = document.querySelector('#clientX_delta-log'),
- clientY_delta_log = document.querySelector('#clientY_delta-log');
+ screenX_init_log = document.querySelector('#screenX_init-log'),
+ screenY_init_log = document.querySelector('#screenY_init-log'),
+ screenX_last_log = document.querySelector('#screenX_last-log'),
+ screenY_last_log = document.querySelector('#screenY_last-log');
+ screenX_delta_log = document.querySelector('#screenX_delta-log'),
+ screenY_delta_log = document.querySelector('#screenY_delta-log');
var click_counter = 0;
- var clientX_init, clientY_init, movementX, movementY, movementX_sum, movementY_sum, clientX_last, clientY_last;
+ var screenX_init, screenY_init, movementX, movementY, movementX_sum, movementY_sum, screenX_last, screenY_last;
var movementX_Y_inside_window_Test = async_test("Test that movementX/Y = eNow.screenX/Y-ePrevious.screenX/Y.");
@@ -72,11 +72,9 @@
case 2:
status_log.innerHTML = "inside window: done";
- // approximately(+/- 10)
- // a little drift should be tollerated
movementX_Y_inside_window_Test.step(function() {
- assert_equals(movementX_sum, clientX_last - clientX_init, "sum of movementX = clientX_init - clientX_last");
- assert_equals(movementY_sum, clientY_last - clientY_init, "sum of movementY = clientY_init - clientY_last");
+ assert_equals(movementX_sum, screenX_last - screenX_init, "sum of movementX = screenX_last - screenX_init");
+ assert_equals(movementY_sum, screenY_last - screenY_init, "sum of movementY = screenY_last - screenY_init");
});
movementX_Y_inside_window_Test.done();
break;
@@ -88,32 +86,39 @@
movementY = e.movementY;
if(click_counter === 1) {
- if(!clientX_init) {
- clientX_init = e.clientX;
- clientY_init = e.clientY;
- movementX_sum = movementX;
- movementY_sum = movementY;
+ if(!screenX_init) {
+ screenX_init = screenX_last = e.screenX;
+ screenY_init = screenY_last = e.screenY;
+ movementX_sum = 0;
+ movementY_sum = 0;
}
+ else {
+ movementX_sum += movementX;
+ movementY_sum += movementY;
- movementX_sum += movementX;
- movementY_sum += movementY;
+ screenX_delta = e.screenX - screenX_last;
+ screenY_delta = e.screenY - screenY_last;
- clientX_last = e.clientX;
- clientY_last = e.clientY;
- clientX_delta = clientX_last - clientX_init;
- clientY_delta = clientY_last - clientY_init;
+ movementX_Y_inside_window_Test.step(function() {
+ assert_equals(movementX, screenX_delta, "movementX = screen_delta");
+ assert_equals(movementY, screenY_delta, "movementY = screen_delta");
+ });
- updateData();
+ screenX_last = e.screenX;
+ screenY_last = e.screenY;
+
+ updateData();
+ }
}
});
function updateData() {
- clientX_init_log.innerHTML = clientX_init;
- clientY_init_log.innerHTML = clientY_init;
- clientX_last_log.innerHTML = clientX_last;
- clientY_last_log.innerHTML = clientY_last;
- clientX_delta_log.innerHTML = clientX_delta;
- clientY_delta_log.innerHTML = clientY_delta;
+ screenX_init_log.innerHTML = screenX_init;
+ screenY_init_log.innerHTML = screenY_init;
+ screenX_last_log.innerHTML = screenX_last;
+ screenY_last_log.innerHTML = screenY_last;
+ screenX_delta_log.innerHTML = screenX_delta;
+ screenY_delta_log.innerHTML = screenY_delta;
movementX_log.innerHTML = movementX;
movementY_log.innerHTML = movementY;
movementX_sum_log.innerHTML = movementX_sum;
diff --git a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html
index f1afb684cb0..74d8dfa0ed6 100644
--- a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html
+++ b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnectionList_onconnectionavailable_receiving-ua.html
@@ -31,7 +31,7 @@
return receiver.connectionList.then(list => {
connections = list.connections;
if (action === 'close') {
- assert_true(connections.length === number - 1 && connections.includes(connection),
+ assert_true(connections.length === number - 1 && !connections.includes(connection),
'A closed presentation connection is removed from the set of presentation controllers.');
} else if (action === 'connect') {
assert_true(connections.length === number + 1 && connections.includes(connection),
diff --git a/tests/wpt/web-platform-tests/proximity/idlharness.html b/tests/wpt/web-platform-tests/proximity/idlharness.html
deleted file mode 100644
index 4e30cca04ad..00000000000
--- a/tests/wpt/web-platform-tests/proximity/idlharness.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Proximity Events IDL tests</title>
-<link rel="author" title="Intel" href="http://www.intel.com">
-<link rel="help" href="http://www.w3.org/TR/proximity/">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
-<div id="log"></div>
-
-<pre id="untested_idl">
-[Global=Window, Exposed=Window]
-interface Window {
-};
-
-interface Event {
-};
-
-dictionary EventInit {
-};
-</pre>
-
-<pre id='idl'>
-partial interface Window {
- attribute EventHandler ondeviceproximity;
- attribute EventHandler onuserproximity;
-};
-
-dictionary DeviceProximityEventInit : EventInit {
- double value;
- double min;
- double max;
-};
-
-[Constructor (DOMString type, optional DeviceProximityEventInit eventInitDict)]
-interface DeviceProximityEvent : Event {
- readonly attribute unrestricted double value;
- readonly attribute unrestricted double min;
- readonly attribute unrestricted double max;
-};
-
-dictionary UserProximityEventInit : EventInit {
- boolean near;
-};
-
-[Constructor (DOMString type, optional UserProximityEventInit eventInitDict)]
-interface UserProximityEvent : Event {
- readonly attribute boolean near;
-};
-</pre>
-
-<script>
-(function() {
- "use strict";
- var idl_array = new IdlArray();
- // replace 'EventHandler' and 'unrestricted double' unrecognised by idlharness.js
- var idls = document.getElementById('idl').textContent.replace(/EventHandler/g, 'Function?').replace(/unrestricted double/g, 'double');
-
- idl_array.add_untested_idls(document.getElementById('untested_idl').textContent);
- idl_array.add_idls(idls);
-
- idl_array.add_objects({
- Window: ['window'],
- DeviceProximityEvent: ['new DeviceProximityEvent("foo")'],
- UserProximityEvent: ['new UserProximityEvent("foo")']
- });
-
- idl_array.test();
-})();
-</script>
-
diff --git a/tests/wpt/web-platform-tests/proximity/idlharness.https.html b/tests/wpt/web-platform-tests/proximity/idlharness.https.html
new file mode 100644
index 00000000000..2bfc7d1db3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/proximity/idlharness.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Proximity Sensor IDL tests</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="https://w3c.github.io/proximity/">
+<link rel="help" href="https://w3c.github.io/sensors/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script>
+"use strict";
+
+function doTest([dom, generic_sensor, proximity]) {
+ const idl_array = new IdlArray();
+ idl_array.add_untested_idls(dom);
+ idl_array.add_untested_idls('interface EventHandler {};');
+ idl_array.add_idls(generic_sensor, { only: ['Sensor'] });
+ idl_array.add_idls(proximity);
+ idl_array.add_objects({
+ ProximitySensor: ['new ProximitySensor();']
+ });
+ idl_array.test();
+}
+
+function fetchText(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+promise_test(() => {
+ return Promise.all([
+ "/interfaces/dom.idl",
+ "/interfaces/generic-sensor.idl",
+ "/interfaces/proximity.idl",
+ ].map(fetchText)).then(doTest);
+}, "Test IDL implementation of Proximity Sensor");
+</script>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html
index c918802bf32..d2bcab912ed 100644
--- a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html
@@ -11,12 +11,12 @@
<script src="resources/webperftestharnessextension.js"></script>
<script>
setup({explicit_done: true});
-var iframe;
-var d;
-var body;
+let iframe;
+let d;
+let body;
-// explicitly test the namespace before we start testing
-test_namespace("getEntriesByType");
+// Explicitly test the namespace before we start testing.
+test_namespace('getEntriesByType');
function setup_iframe() {
iframe = document.getElementById('frameContext');
@@ -30,17 +30,17 @@ function onload_test() {
done();
return;
}
- var context = new PerformanceContext(iframe.contentWindow.performance);
- var entries = context.getEntriesByType('resource');
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
- // when a persistent connection is used, follow-on resources should be included as PerformanceResourceTiming objects
+ // When a persistent connection is used, follow-on resources should be included as PerformanceResourceTiming objects.
test_equals(entries.length, 2, 'There should be 2 PerformanceEntries');
if (entries.length >= 2) {
- // when a persistent connection is used, for the resource that reuses the socket, connectStart and connectEnd should have the same value as fetchStart
- var entry = entries[1];
- test_equals(entry.fetchStart, entry.connectStart, "connectStart and fetchStart should be the same");
- test_equals(entry.fetchStart, entry.connectEnd, "connectEnd and fetchStart should be the same");
+ // When a persistent connection is used, for the resource that reuses the socket, connectStart and connectEnd should have the same value as fetchStart.
+ const entry = entries[1];
+ test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same');
+ test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same');
}
done();
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_dedicated_worker.html b/tests/wpt/web-platform-tests/resource-timing/resource_dedicated_worker.html
new file mode 100644
index 00000000000..6d27245ab9c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_dedicated_worker.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing in dedicated workers</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<link rel="stylesheet" href="resources/resource_timing_test0.css" />
+<script>
+setup({explicit_done: true});
+const worker = new Worker("resources/worker_with_images.js");
+worker.onmessage = function(event) {
+ const context = new PerformanceContext(window.performance);
+ const entries = context.getEntriesByType('resource');
+ test_equals(entries.length, 6, "There should be six entries: 4 scripts, 1 stylesheet, and the worker itself");
+ done();
+}
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that resources requested by dedicated workers don't appear in the main document.</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html b/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html
index c669a383803..de3c3d015d1 100644
--- a/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_dynamic_insertion.html
@@ -10,27 +10,27 @@
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>
<script>
-// explicitly test the namespace before we start testing
+// Explicitly test the namespace before we start testing.
test_namespace("getEntriesByType");
-var iframe;
+let iframe;
function setup_iframe() {
iframe = document.getElementById('frameContext');
- var d = iframe.contentWindow.document;
- var body = d.createElement('body');
+ const d = iframe.contentWindow.document;
+ const body = d.createElement('body');
d.getElementsByTagName('html')[0].appendChild(body);
- var style = d.createElement('link');
+ const style = d.createElement('link');
style.rel = 'stylesheet';
style.href = 'resource_timing_test0.css';
body.appendChild(style);
- var image = d.createElement('img');
+ const image = d.createElement('img');
image.src = 'resource_timing_test0.png';
body.appendChild(image);
- var subframe = d.createElement('iframe');
+ const subframe = d.createElement('iframe');
subframe.src = 'inject_resource_test.html';
body.appendChild(subframe);
}
@@ -39,13 +39,13 @@ function onload_test() {
done();
return;
}
- var context = new PerformanceContext(iframe.contentWindow.performance);
- var entries = context.getEntriesByType('resource');
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
- var index = window.location.pathname.lastIndexOf('/');
- var pathname = window.location.pathname.substring(0, index) + '/';
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index) + '/';
- var expected_entries = { };
+ let expected_entries = { };
expected_entries[ pathname + 'resources/resource_timing_test0.css' ] = 'link',
expected_entries[ pathname + 'resources/resource_timing_test0.png' ] = 'img',
expected_entries[ pathname + 'resources/inject_resource_test.html' ] = 'iframe',
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_frame_initiator_type.html b/tests/wpt/web-platform-tests/resource-timing/resource_frame_initiator_type.html
new file mode 100644
index 00000000000..f6471988624
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_frame_initiator_type.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing frame initiator type</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+setup({explicit_done: true});
+
+function onload_test() {
+ const iframe = document.getElementById('frameContext');
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index) +
+ '/resources/blank_page_green.htm';
+ const expected_entries = {};
+ expected_entries[pathname] = 'frame';
+
+ test_resource_entries(entries, expected_entries);
+ done();
+}
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that the frame initiator type is represented.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/green_frame.htm" style="width: 250px; height: 250px;"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_ignore_data_url.html b/tests/wpt/web-platform-tests/resource-timing/resource_ignore_data_url.html
new file mode 100644
index 00000000000..f8ca2f1187e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_ignore_data_url.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing ignores requests for data: URIs</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+let iframe;
+function setup_iframe() {
+ const iframe_content = '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAOTm7AAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="></img>';
+ iframe = document.getElementById('frameContext');
+ iframe.contentWindow.document.write(iframe_content);
+}
+function onload_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+ test_true(entries.length == 0, "entries.length == 0");
+}
+window.setup_iframe = setup_iframe;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that resources with data: URIs aren't present in the Resource Timing buffer.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_ignore_failures.html b/tests/wpt/web-platform-tests/resource-timing/resource_ignore_failures.html
new file mode 100644
index 00000000000..fa9e411ea98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_ignore_failures.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing ignores failed resources</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+let iframe;
+function setup_iframe() {
+ const iframe_content = '<img src="resources/non-existing-file.png"></img>';
+ iframe = document.getElementById('frameContext');
+ iframe.contentWindow.document.write(iframe_content);
+}
+function onload_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+ test_true(entries.length == 0, "entries.length == 0");
+}
+window.setup_iframe = setup_iframe;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that failed resources aren't present in the Resource Timing buffer.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_initiator_types.html b/tests/wpt/web-platform-tests/resource-timing/resource_initiator_types.html
new file mode 100644
index 00000000000..b7c4c8b257e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_initiator_types.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing initiator types</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+setup({explicit_done: true, timeout: 30000});
+
+let background_loaded = false;
+let page_loaded = false;
+let ol_font_loaded = false;
+let ul_font_loaded = false;
+let xhr_loaded = false;
+
+function check_finished() {
+ if (!ul_font_loaded) {
+ ul_font_loaded = check_font_loaded('ul');
+ }
+ if (!ol_font_loaded) {
+ ol_font_loaded = check_font_loaded('ol');
+ }
+ if (page_loaded && ol_font_loaded && ul_font_loaded && background_loaded && xhr_loaded) {
+ perform_test();
+ } else {
+ step_timeout(check_finished, 100);
+ }
+}
+
+function check_font_loaded(type) {
+ const width_var_name = 'original_width_' + type;
+ const element_var_name = 'element_' + type;
+ if (!this.hasOwnProperty(width_var_name)) {
+ const d = document.getElementById('frameContext').contentWindow.document;
+ const list = d.createElement(type);
+ const li = d.createElement('li');
+ li.innerHTML = 'width_test';
+ list.appendChild(li);
+ d.getElementsByTagName('body')[0].appendChild(list);
+ this[element_var_name] = list;
+ this[width_var_name] = li.offsetHeight;
+ }
+ return this[width_var_name] != this[element_var_name].offsetHeight;
+}
+
+function onload_test() {
+ page_loaded = true;
+
+ const image = document.createElement('img');
+ image.src = 'resources/blue.png?id=n1';
+ background_loaded = image.complete;
+ if (!background_loaded) {
+ image.onload = function() {
+ background_loaded = true;
+ }
+ }
+
+ step_timeout(check_finished, 100);
+}
+
+function perform_test() {
+ const context = new PerformanceContext(document.getElementById('frameContext').contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index) + '/resources/';
+ const font_pathname = window.location.pathname.substring(0, index - 15) + 'fonts/Ahem.ttf';
+
+ let expected_entries = {};
+ expected_entries[font_pathname] = 'css';
+ expected_entries[pathname + 'resource_timing_test0.png'] = 'img';
+ expected_entries[pathname + 'blank_page_green.htm'] = 'iframe';
+ expected_entries[pathname + 'empty_script.js'] = 'script';
+ expected_entries[pathname + 'resource_timing_test0.css?id=embed'] = 'embed';
+ expected_entries[pathname + 'resource_timing_test0.css?id=n1'] = 'css';
+ expected_entries[font_pathname + '?id=n1'] = 'css';
+ expected_entries[pathname + 'blue.png?id=1'] = 'css';
+ expected_entries[pathname + 'blue.png?id=2'] = 'css';
+ expected_entries[pathname + 'blue.png?id=async_xhr'] = 'xmlhttprequest';
+ expected_entries[pathname + 'blue.png?id=body'] = 'body';
+ expected_entries[pathname + 'blue.png?id=input'] = 'input';
+ expected_entries[pathname + 'blue.png?id=n1'] = 'css';
+ expected_entries[pathname + 'blue.png?id=object'] = 'object';
+ expected_entries[pathname + 'blue.png?id=poster'] = 'video';
+ expected_entries[pathname + 'nested.css'] = 'link';
+
+ test_resource_entries(entries, expected_entries);
+ done();
+}
+
+window.on_test_body_created = check_finished;
+window.on_async_xhr_done = function() {
+ xhr_loaded = true;
+ check_finished();
+}
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that all of the initiator types are represented.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/all_resource_types.htm" style="width: 250px; height: 250px;"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_memory_cached.sub.html b/tests/wpt/web-platform-tests/resource-timing/resource_memory_cached.sub.html
new file mode 100644
index 00000000000..236f69fba72
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_memory_cached.sub.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing memory cached resources</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+setup({explicit_done: true});
+let d;
+let iframe;
+let iframeBody;
+let count = 0;
+function onload_prep() {
+ iframe = document.getElementById('frameContext');
+ d = iframe.contentWindow.document;
+ iframeBody = d.body;
+
+ const image = d.createElement('img');
+ image.addEventListener('load', function() {
+ step_timeout(onload_test, 0); });
+ image.src = 'blue.png?id=cached';
+ iframeBody.appendChild(image);
+
+ const image2 = d.createElement('img');
+ image2.addEventListener('load', function() {
+ step_timeout(onload_test, 0); });
+ image2.src = 'blue.png?id=cached';
+ iframeBody.appendChild(image2);
+}
+
+function onload_test() {
+ ++count;
+ if (count < 2)
+ return;
+
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+ test_equals(entries.length, 1, "There should be only one entry");
+
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index);
+ let expected_entries = {};
+ expected_entries[pathname + '/resources/blue.png?id=cached'] = 'img';
+ test_resource_entries(entries, expected_entries);
+ test_greater_than(entries[0].requestStart, 0, 'requestStart should be non-zero on the same-origin request');
+ test_greater_or_equals(entries[0].responseEnd, entries[0].startTime, 'responseEnd should not be before startTime');
+ test_greater_or_equals(entries[0].duration, 0, 'duration should not be negative');
+
+ context.clearResourceTimings();
+ start_crossorigin_test();
+}
+function start_crossorigin_test() {
+ const image3 = d.createElement('img');
+ image3.addEventListener("load", function() { step_timeout(finish_crossorigin_test, 0); });
+ image3.src = 'http://{{domains[www1]}}:{{ports[http][1]}}{{location[path]}}/../resources/blue.png?id=cached';
+ iframeBody.appendChild(image3);
+}
+function finish_crossorigin_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+ test_equals(entries.length, 1, 'There should be one entry in second test');
+ test_true(entries[0].name.startsWith('http://{{domains[www1]}}:{{ports[http][1]}}'), 'Entry name should start with cross-origin domain');
+ test_true(entries[0].name.endsWith('/resources/blue.png?id=cached'), 'Entry name should end with file name');
+ test_equals(entries[0].requestStart, 0, 'requestStart should be 0 on the cross-origin request');
+ done();
+}
+window.setup_iframe = () => {};
+window.addEventListener('load', onload_prep);
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that a memory cached resource appears in the buffer once.</p>
+<div id="log"></div>
+<iframe id="frameContext" src="resources/inject_resource_test.html"></iframe>
+<img src="resources/blue.png?id=cached"></img>
+<img src="http://{{domains[www1]}}:{{ports[http][1]}}{{location[path]}}/../resources/blue.png?id=cached"></img>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_redirects.html b/tests/wpt/web-platform-tests/resource-timing/resource_redirects.html
new file mode 100644
index 00000000000..606662afda4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_redirects.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing redirect names</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+let iframe;
+function setup_iframe() {
+ const iframe_content =
+ '<link rel="stylesheet" href="/common/redirect.py?location=/resource-timing/resources/resource_timing_test0.css"></link>' +
+ '<img src="/common/redirect.py?location=/resource-timing/resources/blue.png"></img>' +
+ '<iframe src="/common/redirect.py?location=/resource-timing/resources/blank_page_green.htm"></iframe>' +
+ '<script src="/common/redirect.py?location=/resource-timing/resources/empty_script.js"></scr' + 'ipt>' +
+ '<scr' + 'ipt>' +
+ 'const xhr = new XMLHttpRequest;' +
+ 'xhr.open("GET", "/common/redirect.py?location=/resource-timing/resources/blank_page_green.htm?id=xhr", false);' +
+ 'xhr.send();' +
+ '</scr' + 'ipt>';
+ iframe = document.getElementById('frameContext');
+ iframe.contentWindow.document.write(iframe_content);
+}
+function onload_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+
+ const index = window.location.pathname.lastIndexOf('resource-timing');
+ const pathname = window.location.pathname.substring(0, index) +
+ 'common/redirect.py?location=/resource-timing/resources/';
+ let expected_entries = {};
+ expected_entries[pathname + 'resource_timing_test0.css'] = 'link';
+ expected_entries[pathname + 'blue.png'] = 'img';
+ expected_entries[pathname + 'blank_page_green.htm'] = 'iframe';
+ expected_entries[pathname + 'empty_script.js'] = 'script';
+ expected_entries[pathname + 'blank_page_green.htm?id=xhr'] = 'xmlhttprequest';
+
+ test_resource_entries(entries, expected_entries);
+}
+window.setup_iframe = setup_iframe;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that redirects do not alter the URL.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_reparenting.html b/tests/wpt/web-platform-tests/resource-timing/resource_reparenting.html
new file mode 100644
index 00000000000..7d4947fa770
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_reparenting.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing reparenting elements</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+let iframe;
+function setup_iframe() {
+ iframe = document.getElementById('frameContext');
+ const d = iframe.contentWindow.document;
+ const iframeBody = d.createElement('body');
+
+ const move_to_parent = d.createElement('img');
+ move_to_parent.src = 'blue.png?id=move_to_parent';
+ iframeBody.appendChild(move_to_parent);
+ iframeBody.removeChild(move_to_parent);
+
+ const parentBody = document.getElementsByTagName('body')[0];
+ parentBody.appendChild(move_to_parent);
+
+ const move_to_child = document.createElement('img');
+ move_to_child.src = 'blue.png?id=move_to_child';
+ parentBody.appendChild(move_to_child);
+ parentBody.removeChild(move_to_child);
+ iframeBody.appendChild(move_to_child);
+}
+function onload_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index);
+ let expected_entries = {};
+ expected_entries[pathname + '/resources/blue.png?id=move_to_child'] = 'img';
+
+ test_resource_entries(entries, expected_entries);
+}
+window.setup_iframe = setup_iframe;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that reparenting an element doesn't change the initiator document.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_script_types.html b/tests/wpt/web-platform-tests/resource-timing/resource_script_types.html
new file mode 100644
index 00000000000..898fa0cee2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resource_script_types.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing script initiator types</title>
+<link rel="author" title="Google" href="http://www.google.com/" />
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+setup({explicit_done: true});
+let iframe;
+function setup_iframe() {
+ const iframe_content =
+ '<script src="empty_script.js?id=1"></scr' + 'ipt>' +
+ '<script src="empty_script.js?id=2" async></scr' + 'ipt>' +
+ '<script src="empty_script.js?id=3" async=false></scr' + 'ipt>' +
+ '<script src="empty_script.js?id=4" defer></scr' + 'ipt>' +
+ '<script>' +
+ 'document.write("<script src=\\"empty_script.js?id=5\\"></scr" + "ipt>");' +
+ 'const s1 = document.createElement("script");' +
+ 's1.src = "empty_script.js?id=6";' +
+ 'document.getElementsByTagName("head")[0].appendChild(s1);' +
+ 'const s2 = document.createElement("script");' +
+ 's2.src = "empty_script.js?id=7";' +
+ 's2.async = true;' +
+ 'document.getElementsByTagName("head")[0].appendChild(s2);' +
+ 'const s3 = document.createElement("script");' +
+ 's3.src = "empty_script.js?id=8";' +
+ 's3.async = false;' +
+ 'document.getElementsByTagName("head")[0].appendChild(s3);' +
+ 'const s4 = document.createElement("script");' +
+ 's4.src = "empty_script.js?id=9";' +
+ 's4.defer = true;' +
+ 'document.getElementsByTagName("head")[0].appendChild(s4);' +
+ '</scr' + 'ipt>';
+ iframe = document.getElementById('frameContext');
+ iframe.contentWindow.document.write(iframe_content);
+}
+function onload_test() {
+ const context = new PerformanceContext(iframe.contentWindow.performance);
+ const entries = context.getEntriesByType('resource');
+
+ const index = window.location.pathname.lastIndexOf('/');
+ const pathname = window.location.pathname.substring(0, index) +
+ '/resources/empty_script.js?id=';
+ let expected_entries = {};
+ expected_entries[pathname + '1'] = 'script';
+ expected_entries[pathname + '2'] = 'script';
+ expected_entries[pathname + '3'] = 'script';
+ expected_entries[pathname + '4'] = 'script';
+ expected_entries[pathname + '5'] = 'script';
+ expected_entries[pathname + '6'] = 'script';
+ expected_entries[pathname + '7'] = 'script';
+ expected_entries[pathname + '8'] = 'script';
+ expected_entries[pathname + '9'] = 'script';
+
+ test_resource_entries(entries, expected_entries);
+ done();
+}
+window.setup_iframe = setup_iframe;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that all of the different types of script loads are reported with the correct initiator.</p>
+<div id="log"></div>
+<iframe id="frameContext" onload="onload_test();" src="resources/inject_resource_test.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/all_resource_types.htm b/tests/wpt/web-platform-tests/resource-timing/resources/all_resource_types.htm
new file mode 100644
index 00000000000..41789d869cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/all_resource_types.htm
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+ <title>All Resource Types Test Page</title>
+ </head>
+ <body background='blue.png?id=body'>
+ <script>
+ if (window.parent.hasOwnProperty('on_test_body_created'))
+ window.parent.on_test_body_created();
+ </script>
+ <link rel="stylesheet" href="nested.css"></link>
+ <img src="resource_timing_test0.png"></img>
+ <iframe src="blank_page_green.htm" width="100px" height="100px"></iframe>
+ <script src="empty_script.js"></script>
+ <script>
+ var async_xhr = new XMLHttpRequest;
+ async_xhr.open('GET', 'blue.png?id=async_xhr', true);
+ async_xhr.onreadystatechange = function() {
+ if (async_xhr.readyState == 4 && async_xhr.status == 200 && parent.hasOwnProperty('on_async_xhr_done'))
+ parent.on_async_xhr_done();
+ }
+ async_xhr.send();
+ </script>
+ <style>
+ @font-face {
+ font-family: remoteFontAhem;
+ src: url('/fonts/Ahem.ttf');
+ }
+ iframe {
+ background: url('blue.png?id=1');
+ }
+ ul {
+ font-family: remoteFontAhem;
+ list-style-image: url('blue.png?id=2');
+ }
+ </style>
+ <ul>
+ <li>Test</li>
+ </ul>
+ <ol>
+ <li>Test</li>
+ </ol>
+ <embed src="resource_timing_test0.css?id=embed" type="text/css"></embed>
+ <input type="image" src="blue.png?id=input"></input>
+ <object type="image/png" data="blue.png?id=object"></object>
+ <video poster="blue.png?id=poster"></video>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/blank_page_green.htm b/tests/wpt/web-platform-tests/resource-timing/resources/blank_page_green.htm
new file mode 100644
index 00000000000..b8a1947b77e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/blank_page_green.htm
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+ <title>Green Test Page</title>
+ </head>
+ <body style="background-color:#00FF00;">
+ <h1>Placeholder</h1>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/empty_script.js b/tests/wpt/web-platform-tests/resource-timing/resources/empty_script.js
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/empty_script.js
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/green_frame.htm b/tests/wpt/web-platform-tests/resource-timing/resources/green_frame.htm
new file mode 100644
index 00000000000..c91f44abf32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/green_frame.htm
@@ -0,0 +1,7 @@
+<html>
+ <head>
+ <frameset>
+ <frame src="blank_page_green.htm">
+ </frameset>
+ </head>
+</html>
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/nested.css b/tests/wpt/web-platform-tests/resource-timing/resources/nested.css
new file mode 100644
index 00000000000..90d61b04acc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/nested.css
@@ -0,0 +1,10 @@
+@import "resource_timing_test0.css?id=n1";
+
+@font-face {
+ font-family: remoteFont;
+ src: url('/fonts/Ahem.ttf?id=n1');
+}
+ol {
+ font-family: remoteFont;
+ list-style-image: url('blue.png?id=n1');
+}
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/worker_with_images.js b/tests/wpt/web-platform-tests/resource-timing/resources/worker_with_images.js
new file mode 100644
index 00000000000..2d7688fcf99
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/worker_with_images.js
@@ -0,0 +1,21 @@
+let numComplete = 0;
+
+function checkDone() {
+ ++numComplete;
+ if (numComplete == 2) {
+ postMessage('');
+ }
+}
+
+function makeRequest(request) {
+ var xhr = new XMLHttpRequest;
+ xhr.open('get', request, true);
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ checkDone();
+ }
+ }
+ xhr.send();
+}
+makeRequest('blue.png');
+makeRequest('resource_timing_test0.png');
diff --git a/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js b/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
index 51a3d2c1fc5..8e729e01356 100644
--- a/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
+++ b/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
@@ -183,7 +183,9 @@ function resource_load(expected)
});
t["timing_attrs"].step(function test() {
- var actual = window.performance.getEntriesByName(expected.name)[0];
+ const entries = window.performance.getEntriesByName(expected.name);
+ assert_equals(entries.length, 1, 'There should be a single matching entry');
+ const actual = entries[0];
// Debugging bug 1263428
// Feel free to remove/overwrite this piece of code
@@ -191,18 +193,18 @@ function resource_load(expected)
assert_true(false, "actual: "+JSON.stringify(actual));
}
- assert_equals(actual.redirectStart, 0, "redirectStart time");
- assert_equals(actual.redirectEnd, 0, "redirectEnd time");
+ assert_equals(actual.redirectStart, 0, 'redirectStart should be 0');
+ assert_equals(actual.redirectEnd, 0, 'redirectEnd should be 0');
assert_true(actual.secureConnectionStart == undefined ||
- actual.secureConnectionStart == 0, "secureConnectionStart time");
- assert_equals(actual.fetchStart, actual.startTime, "fetchStart is equal to startTime");
- assert_greater_than_equal(actual.domainLookupStart, actual.fetchStart, "domainLookupStart after fetchStart");
- assert_greater_than_equal(actual.domainLookupEnd, actual.domainLookupStart, "domainLookupEnd after domainLookupStart");
- assert_greater_than_equal(actual.connectStart, actual.domainLookupEnd, "connectStart after domainLookupEnd");
- assert_greater_than_equal(actual.connectEnd, actual.connectStart, "connectEnd after connectStart");
- assert_greater_than_equal(actual.requestStart, actual.connectEnd, "requestStart after connectEnd");
- assert_greater_than_equal(actual.responseStart, actual.requestStart, "responseStart after requestStart");
- assert_greater_than_equal(actual.responseEnd, actual.responseStart, "responseEnd after responseStart");
+ actual.secureConnectionStart == 0, 'secureConnectionStart should be 0 or undefined');
+ assert_equals(actual.fetchStart, actual.startTime, 'fetchStart is equal to startTime');
+ assert_greater_than_equal(actual.domainLookupStart, actual.fetchStart, 'domainLookupStart after fetchStart');
+ assert_greater_than_equal(actual.domainLookupEnd, actual.domainLookupStart, 'domainLookupEnd after domainLookupStart');
+ assert_greater_than_equal(actual.connectStart, actual.domainLookupEnd, 'connectStart after domainLookupEnd');
+ assert_greater_than_equal(actual.connectEnd, actual.connectStart, 'connectEnd after connectStart');
+ assert_greater_than_equal(actual.requestStart, actual.connectEnd, 'requestStart after connectEnd');
+ assert_greater_than_equal(actual.responseStart, actual.requestStart, 'responseStart after requestStart');
+ assert_greater_than_equal(actual.responseEnd, actual.responseStart, 'responseEnd after responseStart');
this.done();
});
diff --git a/tests/wpt/web-platform-tests/resources/check-layout-th.js b/tests/wpt/web-platform-tests/resources/check-layout-th.js
index 9b83df74ef2..928b0cf2a10 100644
--- a/tests/wpt/web-platform-tests/resources/check-layout-th.js
+++ b/tests/wpt/web-platform-tests/resources/check-layout-th.js
@@ -171,7 +171,6 @@ window.checkLayout = function(selectorList, callDone = true)
}
var nodes = document.querySelectorAll(selectorList);
nodes = Array.prototype.slice.call(nodes);
- nodes.reverse();
var checkedLayout = false;
Array.prototype.forEach.call(nodes, function(node) {
test(function(t) {
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js
index 08d97b57223..23b8651bb13 100644
--- a/tests/wpt/web-platform-tests/resources/testharness.js
+++ b/tests/wpt/web-platform-tests/resources/testharness.js
@@ -1257,11 +1257,22 @@ policies and contribution forms [3].
if (e instanceof AssertionError) {
throw e;
}
+
+ assert(typeof e === "object",
+ "assert_throws", description,
+ "${func} threw ${e} with type ${type}, not an object",
+ {func:func, e:e, type:typeof e});
+
+ assert(e !== null,
+ "assert_throws", description,
+ "${func} threw null, not an object",
+ {func:func});
+
if (code === null) {
throw new AssertionError('Test bug: need to pass exception to assert_throws()');
}
if (typeof code === "object") {
- assert(typeof e == "object" && "name" in e && e.name == code.name,
+ assert("name" in e && e.name == code.name,
"assert_throws", description,
"${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})",
{func:func, actual:e, actual_name:e.name,
@@ -1340,8 +1351,7 @@ policies and contribution forms [3].
var required_props = { code: name_code_map[name] };
if (required_props.code === 0 ||
- (typeof e == "object" &&
- "name" in e &&
+ ("name" in e &&
e.name !== e.name.toUpperCase() &&
e.name !== "DOMException")) {
// New style exception: also test the name property.
@@ -1353,13 +1363,8 @@ policies and contribution forms [3].
//in. It might be an instanceof the appropriate interface on some
//unknown other window. TODO: Work around this somehow?
- assert(typeof e == "object",
- "assert_throws", description,
- "${func} threw ${e} with type ${type}, not an object",
- {func:func, e:e, type:typeof e});
-
for (var prop in required_props) {
- assert(typeof e == "object" && prop in e && e[prop] == required_props[prop],
+ assert(prop in e && e[prop] == required_props[prop],
"assert_throws", description,
"${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}",
{func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js.sub.headers
new file mode 100644
index 00000000000..6f9cb19400b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/0.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing:
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js
new file mode 100644
index 00000000000..220cf1aa28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js.sub.headers
new file mode 100644
index 00000000000..d5ebb5fbffc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/1.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js
new file mode 100644
index 00000000000..220cf1aa28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js.sub.headers
new file mode 100644
index 00000000000..fc2300f8749
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/10.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric ;
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js
new file mode 100644
index 00000000000..220cf1aa28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js.sub.headers
new file mode 100644
index 00000000000..d5ed699c5c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/11.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric ,
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js
new file mode 100644
index 00000000000..c32491d0c01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4,"desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js.sub.headers
new file mode 100644
index 00000000000..7b89b475bdc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/12.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric ; dur = 123.4 ; desc = description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js
new file mode 100644
index 00000000000..9b767142e5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js.sub.headers
new file mode 100644
index 00000000000..dcb056faa88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/13.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric ; desc = description ; dur = 123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js
new file mode 100644
index 00000000000..153607bfc56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js.sub.headers
new file mode 100644
index 00000000000..7ebf8c3bfde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/14.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc = "description"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js
new file mode 100644
index 00000000000..311cabe5535
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1","dur":12.3,"desc":"description1"},{"name":"metric2","dur":45.6,"desc":"description2"},{"name":"metric3","dur":78.9,"desc":"description3"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js.sub.headers
new file mode 100644
index 00000000000..0389e997904
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/15.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1;dur=12.3;desc=description1,metric2;dur=45.6;desc=description2,metric3;dur=78.9;desc=description3
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js
new file mode 100644
index 00000000000..ab8597f9170
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1"},{"name":"metric2"},{"name":"metric3"},{"name":"metric4"},{"name":"metric5"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js.sub.headers
new file mode 100644
index 00000000000..b618a89de9a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/16.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1,metric2 ,metric3, metric4 , metric5
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js
new file mode 100644
index 00000000000..153607bfc56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js.sub.headers
new file mode 100644
index 00000000000..c083f605b37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/17.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="description"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js
new file mode 100644
index 00000000000..592475128d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"\t description \t"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js.sub.headers
new file mode 100644
index 00000000000..aa51ae040ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/18.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=" description "
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js
new file mode 100644
index 00000000000..d8cc6b72f5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"descr\"iption"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js.sub.headers
new file mode 100644
index 00000000000..d097b920299
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/19.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="descr\"iption"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js
new file mode 100644
index 00000000000..6fd97fa66df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js.sub.headers
new file mode 100644
index 00000000000..14eb2f07748
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/2.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js.sub.headers
new file mode 100644
index 00000000000..9b131fcb90a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/20.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js.sub.headers
new file mode 100644
index 00000000000..7134be2654a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/21.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js.sub.headers
new file mode 100644
index 00000000000..465a36b600f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/22.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js.sub.headers
new file mode 100644
index 00000000000..3b76de4a05c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/23.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js.sub.headers
new file mode 100644
index 00000000000..c54a4d85f52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/24.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js.sub.headers
new file mode 100644
index 00000000000..752441eb90d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/25.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js.sub.headers
new file mode 100644
index 00000000000..60dbdbb0471
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/26.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js.sub.headers
new file mode 100644
index 00000000000..feff2c042d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/27.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js.sub.headers
new file mode 100644
index 00000000000..3ca9b6b2603
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/28.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\"\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js.sub.headers
new file mode 100644
index 00000000000..ae0b8912905
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/29.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js
new file mode 100644
index 00000000000..6fd97fa66df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js.sub.headers
new file mode 100644
index 00000000000..8c6fb60f310
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/3.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur="123.4"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js.sub.headers
new file mode 100644
index 00000000000..24906f3c823
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/30.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js.sub.headers
new file mode 100644
index 00000000000..aaceb6babf4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/31.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js.sub.headers
new file mode 100644
index 00000000000..59e01cfa940
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/32.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=""\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js.sub.headers
new file mode 100644
index 00000000000..d81429ecad0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/33.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js.sub.headers
new file mode 100644
index 00000000000..bfb889515d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/34.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js.sub.headers
new file mode 100644
index 00000000000..ff41d80b69b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/35.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js.sub.headers
new file mode 100644
index 00000000000..a702069f7d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/36.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\"\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js.sub.headers
new file mode 100644
index 00000000000..ecc3756393e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/37.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\\""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js.sub.headers
new file mode 100644
index 00000000000..b13d9f419f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/38.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\"\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js.sub.headers
new file mode 100644
index 00000000000..02972236567
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/39.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\"\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js
new file mode 100644
index 00000000000..153607bfc56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js.sub.headers
new file mode 100644
index 00000000000..e929723eed6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/4.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js.sub.headers
new file mode 100644
index 00000000000..9dd5cd4a76d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/40.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\""\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js.sub.headers
new file mode 100644
index 00000000000..c5a006cd4a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/41.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=\"""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js.sub.headers
new file mode 100644
index 00000000000..8a04d7c7f67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/42.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js
new file mode 100644
index 00000000000..b318cb7299b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"\\"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js.sub.headers
new file mode 100644
index 00000000000..8208c16ff31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/43.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js.sub.headers
new file mode 100644
index 00000000000..e50f42b3777
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/44.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\"\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js
new file mode 100644
index 00000000000..993a69024cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"\""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js.sub.headers
new file mode 100644
index 00000000000..055df4fbd48
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/45.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="\""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js.sub.headers
new file mode 100644
index 00000000000..5d7ef807f6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/46.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=""\\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js.sub.headers
new file mode 100644
index 00000000000..f52c6e8ae27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/47.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=""\"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js.sub.headers
new file mode 100644
index 00000000000..9eeadd38d39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/48.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="""\
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js
new file mode 100644
index 00000000000..107695e9d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":""}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js.sub.headers
new file mode 100644
index 00000000000..2dbff3ca6cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/49.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=""""
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js
new file mode 100644
index 00000000000..153607bfc56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js.sub.headers
new file mode 100644
index 00000000000..c083f605b37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/5.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="description"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js
new file mode 100644
index 00000000000..61ec6915722
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":12.3,"desc":"description1"},{"name":"metric","dur":45.6,"desc":"description2"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js.sub.headers
new file mode 100644
index 00000000000..c8ac573fa21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/50.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=12.3;desc=description1,metric;dur=45.6;desc=description2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js
new file mode 100644
index 00000000000..c32491d0c01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4,"desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js.sub.headers
new file mode 100644
index 00000000000..5825a547c92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/51.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;DuR=123.4;DeSc=description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js
new file mode 100644
index 00000000000..6617af51776
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"MeTrIc","desc":"DeScRiPtIoN"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js.sub.headers
new file mode 100644
index 00000000000..f5fcff981c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/52.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: MeTrIc;desc=DeScRiPtIoN
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js
new file mode 100644
index 00000000000..40faf4106ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js.sub.headers
new file mode 100644
index 00000000000..3de0f19046d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/53.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=foo
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js
new file mode 100644
index 00000000000..40faf4106ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js.sub.headers
new file mode 100644
index 00000000000..78f670422c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/54.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur="foo"
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js
new file mode 100644
index 00000000000..4e2b14bbddd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1","desc":"description","dur":123.4},{"name":"metric2"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js.sub.headers
new file mode 100644
index 00000000000..578232a4ab7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/55.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1;foo=bar;desc=description;foo=bar;dur=123.4;foo=bar,metric2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js
new file mode 100644
index 00000000000..6fd97fa66df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js.sub.headers
new file mode 100644
index 00000000000..8a220ab50aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/56.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=123.4;dur=567.8
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js
new file mode 100644
index 00000000000..40faf4106ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js.sub.headers
new file mode 100644
index 00000000000..2614e2034cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/57.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=foo;dur=567.8
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js
new file mode 100644
index 00000000000..13250bbbc53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description1"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js.sub.headers
new file mode 100644
index 00000000000..e5ef56948b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/58.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=description1;desc=description2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js
new file mode 100644
index 00000000000..0282f7d51eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0,"desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js.sub.headers
new file mode 100644
index 00000000000..5b44836e706
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/59.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur;dur=123.4;desc=description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js
new file mode 100644
index 00000000000..c32491d0c01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":123.4,"desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js.sub.headers
new file mode 100644
index 00000000000..5dbc9d65524
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/6.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=123.4;desc=description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js
new file mode 100644
index 00000000000..0282f7d51eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0,"desc":"description"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js.sub.headers
new file mode 100644
index 00000000000..bfbddf111a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/60.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur=;dur=123.4;desc=description
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js
new file mode 100644
index 00000000000..62b744cc143
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js.sub.headers
new file mode 100644
index 00000000000..6d605ad8570
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/61.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc;desc=description;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js
new file mode 100644
index 00000000000..62b744cc143
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js.sub.headers
new file mode 100644
index 00000000000..182a81a7bfd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/62.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=;desc=description;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js
new file mode 100644
index 00000000000..839f8064e6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"d1","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js.sub.headers
new file mode 100644
index 00000000000..8e9b117988b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/63.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=d1 d2;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js
new file mode 100644
index 00000000000..d64ea0a9dd1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1","desc":"d1"},{"name":"metric2"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js.sub.headers
new file mode 100644
index 00000000000..b1dd0cc5b49
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/64.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1;desc=d1 d2,metric2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js
new file mode 100644
index 00000000000..839f8064e6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"d1","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js.sub.headers
new file mode 100644
index 00000000000..63946cdd084
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/65.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="d1" d2;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js
new file mode 100644
index 00000000000..d64ea0a9dd1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1","desc":"d1"},{"name":"metric2"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js.sub.headers
new file mode 100644
index 00000000000..bddbb2cbb6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/66.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1;desc="d1" d2,metric2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js
new file mode 100644
index 00000000000..220cf1aa28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js.sub.headers
new file mode 100644
index 00000000000..5fe55cc32ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/67.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric== ""foo;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js
new file mode 100644
index 00000000000..4077b26a610
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric1"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js.sub.headers
new file mode 100644
index 00000000000..27dabbe090a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/68.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric1== ""foo,metric2
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js
new file mode 100644
index 00000000000..40faf4106ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","dur":0}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js.sub.headers
new file mode 100644
index 00000000000..55282410e7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/69.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;dur foo=12
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js
new file mode 100644
index 00000000000..9b767142e5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"description","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js.sub.headers
new file mode 100644
index 00000000000..c6369005d8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/7.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc=description;dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js
new file mode 100644
index 00000000000..220cf1aa28d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js.sub.headers
new file mode 100644
index 00000000000..aa8f70bd90c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/70.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;foo dur=12
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js.sub.headers
new file mode 100644
index 00000000000..26fcf28e39e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/71.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing:
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js.sub.headers
new file mode 100644
index 00000000000..74e059fd74c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/72.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: =
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js.sub.headers
new file mode 100644
index 00000000000..eeaebdf48f1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/73.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: [
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js.sub.headers
new file mode 100644
index 00000000000..b4f3c562f6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/74.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ]
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js.sub.headers
new file mode 100644
index 00000000000..9a3684d48e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/75.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ;
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js.sub.headers
new file mode 100644
index 00000000000..79cbd0c4d59
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/76.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ,
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js.sub.headers
new file mode 100644
index 00000000000..888fa71e64b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/77.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: =;
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js.sub.headers
new file mode 100644
index 00000000000..fc40e706cde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/78.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ;=
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js.sub.headers
new file mode 100644
index 00000000000..0516c4cc057
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/79.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: =,
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js
new file mode 100644
index 00000000000..8581efd93ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"aB3!#$%&'*+-.^_`|~"}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js.sub.headers
new file mode 100644
index 00000000000..1d1bb026dd9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/8.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: aB3!#$%&'*+-.^_`|~
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js.sub.headers
new file mode 100644
index 00000000000..03b3909f558
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/80.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ,=
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js.sub.headers
new file mode 100644
index 00000000000..680d2a2422e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/81.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ;,
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js.sub.headers
new file mode 100644
index 00000000000..7ab1448b88e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/82.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: ,;
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js
new file mode 100644
index 00000000000..8de2c019353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js.sub.headers
new file mode 100644
index 00000000000..bd079bc62a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/83.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: =;,
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js b/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js
new file mode 100644
index 00000000000..e03b07a2af1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js
@@ -0,0 +1 @@
+testServerTiming(document.currentScript.src, [{"name":"metric","desc":"descr;,=iption","dur":123.4}])
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js.sub.headers
new file mode 100644
index 00000000000..c385706d334
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/resources/parsing/9.js.sub.headers
@@ -0,0 +1 @@
+Server-Timing: metric;desc="descr;,=iption";dur=123.4
diff --git a/tests/wpt/web-platform-tests/server-timing/server_timing_header-parsing.html b/tests/wpt/web-platform-tests/server-timing/server_timing_header-parsing.html
new file mode 100644
index 00000000000..a598a715b82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/server-timing/server_timing_header-parsing.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+tests generated by:
+ https://github.com/cvazac/generate-server-timing-tests
+-->
+
+<head>
+ <meta charset='utf-8' />
+ <script src="/resources/testharness.js"></script>
+ <script src='/resources/testharnessreport.js'></script>
+ <script src="/common/performance-timeline-utils.js"></script>
+ <script>
+ setup({explicit_done: true})
+ function testServerTiming(resource, expectedResults) {
+ const {serverTiming} = performance.getEntriesByName(resource)[0]
+ const fileName = resource.substring(resource.lastIndexOf('/') + 1)
+ test_equals(serverTiming.length, expectedResults.length, `${fileName} - count (${serverTiming.length} ?== ${expectedResults.length})`)
+
+ expectedResults.forEach(function(expectedResult, i) {
+ const dur = expectedResult.dur || 0
+ const desc = expectedResult.desc || ''
+ const index = expectedResults.length === 1 ? '' : `[${i}].`
+ test_equals(expectedResult.name, serverTiming[i].name,
+ `${fileName} - ${index}name (${expectedResult.name} ?== ${serverTiming[i].name})`)
+ test_equals(dur, serverTiming[i].duration,
+ `${fileName} - ${index}duration (${dur} ?== ${serverTiming[i].duration})`)
+ test_equals(desc, serverTiming[i].description,
+ `${fileName} - ${index}description (${desc} ?== ${serverTiming[i].description})`)
+ })
+ }
+ for (let i = 0; i <= 83; i++) {
+ var script = document.createElement('script')
+ script.src = `./resources/parsing/${i}.js`
+ document.getElementsByTagName('head')[0].appendChild(script)
+ }
+ window.addEventListener('load', done)
+ </script>
+</head>
diff --git a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
index fa100301f14..2d43aa2d43b 100644
--- a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
+++ b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
@@ -3,7 +3,6 @@
<meta charset='utf-8' />
<script src="/resources/testharness.js"></script>
<script src='/resources/testharnessreport.js'></script>
- <script src='resources/webperftestharness.js'></script>
<script src="/common/performance-timeline-utils.js"></script>
<script>
setup({explicit_done: true})
diff --git a/tests/wpt/web-platform-tests/svg/OWNERS b/tests/wpt/web-platform-tests/svg/OWNERS
index 852a7475d52..54ae635434f 100644
--- a/tests/wpt/web-platform-tests/svg/OWNERS
+++ b/tests/wpt/web-platform-tests/svg/OWNERS
@@ -2,3 +2,4 @@
@nikosandronikos
@boggydigital
@ewilligers
+@AmeliaBR
diff --git a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/properties.svg b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/properties.svg
index a89e1e59597..b92a6d1d15b 100644
--- a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/properties.svg
+++ b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/properties.svg
@@ -23,29 +23,34 @@
<script><![CDATA[
test(function() {
var first = document.getElementById('first');
- var second = document.getElementById('second');
- var third = document.getElementById('third');
- var fourth = document.getElementById('fourth');
-
assert_equals(getComputedStyle(first).x, "0px");
assert_equals(getComputedStyle(first).y, "0px");
assert_equals(getComputedStyle(first).width, "auto");
assert_equals(getComputedStyle(first).height, "auto");
+ }, 'width and height default to auto');
+ test(function() {
+ var second = document.getElementById('second');
assert_equals(getComputedStyle(second).x, "10px");
assert_equals(getComputedStyle(second).y, "20px");
assert_equals(getComputedStyle(second).width, "30px");
assert_equals(getComputedStyle(second).height, "40px");
+ }, 'style rules are applied');
+ test(function() {
+ var third = document.getElementById('third');
assert_equals(getComputedStyle(third).x, "50px");
assert_equals(getComputedStyle(third).y, "60px");
assert_equals(getComputedStyle(third).width, "70px");
assert_equals(getComputedStyle(third).height, "80px");
+ }, 'attributes set properties');
+ test(function() {
+ var fourth = document.getElementById('fourth');
assert_equals(getComputedStyle(fourth).x, "10px");
assert_equals(getComputedStyle(fourth).y, "20px");
assert_equals(getComputedStyle(fourth).width, "30px");
assert_equals(getComputedStyle(fourth).height, "40px");
- });
+ }, 'style rules override attributes');
]]></script>
</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing-ref.svg b/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing-ref.svg
new file mode 100644
index 00000000000..cc068cefe32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing-ref.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="300" height="200">
+ <style>
+ path {
+ stroke: blue;
+ }
+ </style>
+ <path d="M 10 10 z m 20 70 h 10 v 10 h -10 l 0 -10 M 70 30 q 20 0 20 20 t -20 20 t -20 -20 T 70 30" />
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing.svg b/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing.svg
new file mode 100644
index 00000000000..5b72c494b3b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/closepath/segment-completing.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ width="300" height="200">
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#paths-PathDataClosePathCommand"/>
+ <h:link rel="match" href="segment-completing-ref.svg"/>
+ <h:meta name="assert" content="initial subpath point used to complete segment."/>
+ </metadata>
+ <style>
+ path {
+ stroke: blue;
+ }
+ </style>
+ <path d="M 10 10 z m 20 70 h 10 v 10 h -10 l z M 70 30 q 20 0 20 20 t -20 20 t -20 -20 T z" />
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive-ref.svg b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive-ref.svg
new file mode 100644
index 00000000000..9a9a1a8d473
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive-ref.svg
@@ -0,0 +1,32 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="300" height="200" viewBox="0 0 300 200">
+
+ <defs>
+ <path id="track" stroke="lightblue" fill="none"
+ d="M 50 50 h 200"/>
+ </defs>
+
+ <g>
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="0%">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,50)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="50%">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,100)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="-50%">The quick brown fox</textPath>
+ </text>
+ </g>
+
+</svg>
+
diff --git a/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive.svg b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive.svg
new file mode 100644
index 00000000000..b40d6b82b55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-positive.svg
@@ -0,0 +1,39 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="300" height="200" viewBox="0 0 300 200">
+
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/paths.html#PathLengthAttribute"/>
+ <h:link rel="match" href="pathLength-positive-ref.svg"/>
+ <h:meta name="assert" content="pathLength scales distance along the path"/>
+ </metadata>
+
+ <defs>
+ <path id="track" stroke="lightblue" fill="none"
+ d="M 50 50 h 200" pathLength="2"/>
+ </defs>
+
+ <g>
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="0">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,50)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="1">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,100)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="-1">The quick brown fox</textPath>
+ </text>
+ </g>
+
+</svg>
+
diff --git a/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero-ref.svg b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero-ref.svg
new file mode 100644
index 00000000000..d5556add663
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero-ref.svg
@@ -0,0 +1,26 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="300" height="200" viewBox="0 0 300 200">
+
+ <defs>
+ <path id="track" stroke="lightblue" fill="none"
+ d="M 50 50 h 200"/>
+ </defs>
+
+ <g>
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="0%">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,50)">
+ <use xlink:href="#track"/>
+ </g>
+
+ <g transform="translate(0,100)">
+ <use xlink:href="#track"/>
+ </g>
+
+</svg>
+
diff --git a/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero.svg b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero.svg
new file mode 100644
index 00000000000..4ae0b836f7f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/distance/pathLength-zero.svg
@@ -0,0 +1,39 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="300" height="200" viewBox="0 0 300 200">
+
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/paths.html#PathLengthAttribute"/>
+ <h:link rel="match" href="pathLength-zero-ref.svg"/>
+ <h:meta name="assert" content="A value of zero is valid and must be treated as a scaling factor of infinity."/>
+ </metadata>
+
+ <defs>
+ <path id="track" stroke="lightblue" fill="none"
+ d="M 50 50 h 200" pathLength="0"/>
+ </defs>
+
+ <g>
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="0">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,50)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="1">The quick brown fox</textPath>
+ </text>
+ </g>
+
+ <g transform="translate(0,100)">
+ <use xlink:href="#track"/>
+ <text font-family="sans-serif" font-size="28">
+ <textPath xlink:href="#track" startOffset="-1">The quick brown fox</textPath>
+ </text>
+ </g>
+
+</svg>
+
diff --git a/tests/wpt/web-platform-tests/svg/path/error-handling/bounding.svg b/tests/wpt/web-platform-tests/svg/path/error-handling/bounding.svg
new file mode 100644
index 00000000000..85c089b25ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/error-handling/bounding.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml">
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#paths-PathDataErrorHandling"/>
+ <h:meta name="assert" content="render up to (but not including) the first error"/>
+ </metadata>
+ <g id="container">
+ <path transform="translate(90,10)" />
+ <path transform="translate(80,20)" d="none" />
+ <path transform="translate(70,30)" d="# invalid" />
+ <path transform="translate(60,40)" d="m 0 0 l 3 -4 z # ignored suffix v 123" />
+ <path transform="translate(50,50)" d="" />
+ <path transform="translate(40,60)" d="m 0 0 l -9 11 -123 z # ignore last l parameter" />
+ <polygon transform="translate(20,80)" />
+ <polyline transform="translate(10,90)" />
+ </g>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <script><![CDATA[
+ test(function() {
+ var container = document.getElementById('container');
+ var bbox = container.getBBox();
+
+ // The rendered paths are "m 0 0 l 3 -4 z" and "m 0 0 l -9 11"
+ assert_equals(bbox.x, 31);
+ assert_equals(bbox.y, 36);
+
+ assert_equals(bbox.width, 32);
+ assert_equals(bbox.height, 35);
+ });
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error-ref.svg b/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error-ref.svg
new file mode 100644
index 00000000000..dd2d7c32a6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error-ref.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="100" height="100">
+ <style>
+ path {
+ stroke: lime;
+ }
+ </style>
+ <g id="container">
+ <path transform="translate(60,40)" d="m 0 0 l 3 -4 z" />
+ <path transform="translate(40,60)" d="m 0 0 l -9 11" />
+ </g>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error.svg b/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error.svg
new file mode 100644
index 00000000000..6b8a50b4f2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/error-handling/render-until-error.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ width="100" height="100">
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#paths-PathDataErrorHandling"/>
+ <h:link rel="match" href="render-until-error-ref.svg"/>
+ <h:meta name="assert" content="render up to (but not including) the first error"/>
+ </metadata>
+ <style>
+ path {
+ stroke: lime;
+ }
+ </style>
+ <g id="container">
+ <path transform="translate(90,10)" />
+ <path transform="translate(80,20)" d="none" />
+ <path transform="translate(70,30)" d="# invalid" />
+ <path transform="translate(60,40)" d="m 0 0 l 3 -4 z # ignored suffix v 123" />
+ <path transform="translate(50,50)" d="" />
+ <path transform="translate(40,60)" d="m 0 0 l -9 11 -123 z # ignore last l parameter" />
+ <polygon transform="translate(20,80)" />
+ <polyline transform="translate(10,90)" />
+ </g>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/path/interfaces/SVGAnimatedPathData-removed.svg b/tests/wpt/web-platform-tests/svg/path/interfaces/SVGAnimatedPathData-removed.svg
new file mode 100644
index 00000000000..d321b8b0011
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/path/interfaces/SVGAnimatedPathData-removed.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml">
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#changes-paths"/>
+ <h:link rel="help" href="https://www.w3.org/TR/SVG11/paths.html#InterfaceSVGAnimatedPathData"/>
+ <h:meta name="assert" content="SVGAnimatedPathData interface is not supported."/>
+ </metadata>
+ <path id="track" d="m 10 20 h 30"/>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <script><![CDATA[
+ test(function() {
+ assert_true(window.SVGAnimatedPathData === undefined);
+
+ var track = document.getElementById('track');
+ assert_equals(track.__proto__, SVGPathElement.prototype);
+ assert_true(track.pathSegList === undefined);
+ assert_true(track.normalizedPathSegList === undefined);
+ assert_true(track.animatedPathSegList === undefined);
+ assert_true(track.animatedNormalizedPathSegList === undefined);
+ });
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/types/elements/SVGGeometryElement-rect.svg b/tests/wpt/web-platform-tests/svg/types/elements/SVGGeometryElement-rect.svg
new file mode 100644
index 00000000000..5391d91ad5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/types/elements/SVGGeometryElement-rect.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml">
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#types-InterfaceSVGGeometryElement"/>
+ <h:meta name="assert" content="SVGGeometryElement members work for rect elements."/>
+ </metadata>
+ <style>
+ rect {
+ stroke-width: 10;
+ }
+ </style>
+ <rect id="box" x="50" y="50" width="200" height="100" pathLength="6"/>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <script><![CDATA[
+ test(function() {
+ var box = document.getElementById('box');
+
+ assert_equals(box.pathLength.baseVal, 6);
+
+ assert_equals(box.getTotalLength(), 600);
+
+ assert_equals(box.getPointAtLength(210).x, 250);
+ assert_equals(box.getPointAtLength(210).y, 60);
+ }, 'getTotalLength and getPointAtLength do not take pathLength into account');
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/ci/check_stability.py b/tests/wpt/web-platform-tests/tools/ci/check_stability.py
index 169962a55e6..322a52140a2 100644
--- a/tests/wpt/web-platform-tests/tools/ci/check_stability.py
+++ b/tests/wpt/web-platform-tests/tools/ci/check_stability.py
@@ -132,11 +132,6 @@ def get_sha1():
return git("rev-parse", "HEAD").strip()
-def install_wptrunner():
- """Install wptrunner."""
- call("pip", "install", wptrunner_root)
-
-
def deepen_checkout(user):
"""Convert from a shallow checkout to a full one"""
fetch_args = [user, "+refs/heads/*:refs/remotes/origin/*"]
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh b/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh
index 6c74a251244..7a54d85ff0a 100755
--- a/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh
@@ -16,6 +16,7 @@ fi
if [[ $(./wpt test-jobs --includes wptrunner_unittest; echo $?) -eq 0 ]]; then
if [ $TOXENV == "py27" ] || [ $TOXENV == "pypy" ]; then
+ TOXENV="$TOXENV,py27-flake8"
cd tools/wptrunner
tox
fi
diff --git a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
index 5ceeb0b5f72..523f544b7c4 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
@@ -70,8 +70,8 @@ class XMLParser(object):
def _end(self, tag):
return self._target.end(_fixname(tag))
- def _external(self, context, base, systemId, publicId):
- if publicId in {
+ def _external(self, context, base, system_id, public_id):
+ if public_id in {
"-//W3C//DTD XHTML 1.0 Transitional//EN",
"-//W3C//DTD XHTML 1.1//EN",
"-//W3C//DTD XHTML 1.0 Strict//EN",
diff --git a/tests/wpt/web-platform-tests/tools/manifest/manifest.py b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
index b153798d6f9..e466e6ff56a 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/manifest.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
@@ -2,7 +2,7 @@ import json
import os
import re
from collections import defaultdict
-from six import iteritems, itervalues, viewkeys
+from six import iteritems, itervalues, viewkeys, string_types
from .item import ManualTest, WebdriverSpecTest, Stub, RefTestNode, RefTest, TestharnessTest, SupportFile, ConformanceCheckerTest, VisualTest
from .log import get_logger
@@ -20,14 +20,6 @@ class ManifestVersionMismatch(ManifestError):
pass
-def sourcefile_items(args):
- tests_root, url_base, rel_path, status = args
- source_file = SourceFile(tests_root,
- rel_path,
- url_base)
- return rel_path, source_file.manifest_items()
-
-
class Manifest(object):
def __init__(self, url_base="/"):
assert url_base is not None
@@ -221,7 +213,7 @@ def load(tests_root, manifest):
logger = get_logger()
# "manifest" is a path or file-like object.
- if isinstance(manifest, basestring):
+ if isinstance(manifest, string_types):
if os.path.exists(manifest):
logger.debug("Opening manifest at %s" % manifest)
else:
diff --git a/tests/wpt/web-platform-tests/tools/runner/report.py b/tests/wpt/web-platform-tests/tools/runner/report.py
index f4b3fa71661..952df08b805 100644
--- a/tests/wpt/web-platform-tests/tools/runner/report.py
+++ b/tests/wpt/web-platform-tests/tools/runner/report.py
@@ -1,3 +1,5 @@
+# flake8: noqa
+
from __future__ import print_function
import argparse
diff --git a/tests/wpt/web-platform-tests/tools/sslutils/base.py b/tests/wpt/web-platform-tests/tools/sslutils/base.py
index e78e1385c7b..237ae5f23cc 100644
--- a/tests/wpt/web-platform-tests/tools/sslutils/base.py
+++ b/tests/wpt/web-platform-tests/tools/sslutils/base.py
@@ -1,9 +1,3 @@
-def get_logger(name="ssl"):
- logger = structured.get_default_logger(name)
- if logger is None:
- logger = structured.structuredlog.StructuredLogger(name)
- return logger
-
class NoSSLEnvironment(object):
ssl_enabled = False
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index b154c471d6f..159a934eb1a 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -3,8 +3,12 @@ envlist = py27,py36,pypy
skipsdist=True
[testenv]
+# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
deps =
- flake8
+ flake8==3.5.0
+ pycodestyle==2.3.1
+ pyflakes==1.6.0
+ pep8-naming==0.4.1
pytest
pytest-cov
mock
@@ -19,6 +23,28 @@ passenv =
HYPOTHESIS_PROFILE
[flake8]
-ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841
+# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
+select = E,W,F,N
+# E128: continuation line under-indented for visual indent
+# E129: visually indented line with same indent as next logical line
+# E221: multiple spaces before operator
+# E226: missing whitespace around arithmetic operator
+# E231: missing whitespace after ‘,’, ‘;’, or ‘:’
+# E251: unexpected spaces around keyword / parameter equals
+# E265: block comment should start with ‘# ‘
+# E302: expected 2 blank lines, found 0
+# E303: too many blank lines (3)
+# E305: expected 2 blank lines after end of function or class
+# E402: module level import not at top of file
+# E731: do not assign a lambda expression, use a def
+# E901: SyntaxError or IndentationError
+# W601: .has_key() is deprecated, use ‘in’
+# F401: module imported but unused
+# F403: ‘from module import *’ used; unable to detect undefined names
+# F405: name may be undefined, or defined from star imports: module
+# F841: local variable name is assigned to but never used
+# N801: class names should use CapWords convention
+# N802: function name should be lowercase
+ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802
max-line-length = 141
exclude = .tox,html5lib,third_party/py,third_party/pytest,third_party/funcsigs,third_party/attrs,third_party/pluggy/,pywebsocket,six,_venv,webencodings,wptserve/docs,wptserve/tests/functional/docroot/,wpt,wptrunner
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
index ec7d6deccba..622c5fce76a 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
@@ -4,6 +4,8 @@ import error
import protocol
import transport
+from six import string_types
+
from mozlog import get_default_logger
logger = get_default_logger()
@@ -313,7 +315,7 @@ class Cookies(object):
cookie = {"name": name,
"value": None}
- if isinstance(name, (str, unicode)):
+ if isinstance(name, string_types):
cookie["value"] = value
elif hasattr(value, "value"):
cookie["value"] = value.value
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/protocol.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/protocol.py
index 80f358c8b0a..ea0c793accb 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/protocol.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/protocol.py
@@ -16,7 +16,7 @@ class Encoder(json.JSONEncoder):
return [self.default(x) for x in obj]
elif isinstance(obj, webdriver.Element):
return {webdriver.Element.identifier: obj.id}
- return super(ProtocolEncoder, self).default(obj)
+ return super(Encoder, self).default(obj)
class Decoder(json.JSONDecoder):
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/servo.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/servo.py
deleted file mode 100644
index 2e0b722abab..00000000000
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/servo.py
+++ /dev/null
@@ -1,18 +0,0 @@
-class ServoExtensionCommands(object):
- def __init__(self, session):
- self.session = session
-
- @command
- def get_prefs(self, *prefs):
- body = {"prefs": list(prefs)}
- return self.session.send_command("POST", "servo/prefs/get", body)
-
- @command
- def set_prefs(self, prefs):
- body = {"prefs": prefs}
- return self.session.send_command("POST", "servo/prefs/set", body)
-
- @command
- def reset_prefs(self, *prefs):
- body = {"prefs": list(prefs)}
- return self.session.send_command("POST", "servo/prefs/reset", body)
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
index b198b194b38..d62271fe957 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
@@ -4,6 +4,7 @@ import urlparse
import error
+from six import text_type
"""Implements HTTP transport for the WebDriver wire protocol."""
@@ -135,7 +136,7 @@ class HTTPWireProtocol(object):
except ValueError:
raise ValueError("Failed to encode request body as JSON:\n"
"%s" % json.dumps(body, indent=2))
- if isinstance(payload, unicode):
+ if isinstance(payload, text_type):
payload = body.encode("utf-8")
if headers is None:
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index 40d94d53179..c6cc38afd67 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -4,9 +4,12 @@ import platform
import re
import shutil
import stat
+import subprocess
+import sys
from abc import ABCMeta, abstractmethod
from ConfigParser import RawConfigParser
from distutils.spawn import find_executable
+from io import BytesIO
from utils import call, get, untar, unzip
@@ -278,6 +281,61 @@ class Chrome(Browser):
logger.critical("dbus not running and can't be started")
sys.exit(1)
+class ChromeAndroid(Browser):
+ """Chrome-specific interface for android.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "chrome_android"
+ requirements = "requirements_chrome_android.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def platform_string(self):
+ raise NotImplementedError
+
+ def find_webdriver(self):
+ return find_executable("chromedriver")
+
+ def install_webdriver(self, dest=None):
+ """Install latest Webdriver."""
+ if dest is None:
+ dest = os.pwd
+ latest = get("http://chromedriver.storage.googleapis.com/LATEST_RELEASE").text.strip()
+ url = "http://chromedriver.storage.googleapis.com/%s/chromedriver_%s.zip" % (latest,
+ self.platform_string())
+ unzip(get(url).raw, dest)
+
+ path = find_executable("chromedriver", dest)
+ st = os.stat(path)
+ os.chmod(path, st.st_mode | stat.S_IEXEC)
+ return path
+
+ def version(self, root):
+ raise NotImplementedError
+
+ def prepare_environment(self):
+ # https://bugs.chromium.org/p/chromium/issues/detail?id=713947
+ logger.debug("DBUS_SESSION_BUS_ADDRESS %s" % os.environ.get("DBUS_SESSION_BUS_ADDRESS"))
+ if "DBUS_SESSION_BUS_ADDRESS" not in os.environ:
+ if find_executable("dbus-launch"):
+ logger.debug("Attempting to start dbus")
+ dbus_conf = subprocess.check_output(["dbus-launch"])
+ logger.debug(dbus_conf)
+
+ # From dbus-launch(1):
+ #
+ # > When dbus-launch prints bus information to standard output,
+ # > by default it is in a simple key-value pairs format.
+ for line in dbus_conf.strip().split("\n"):
+ key, _, value = line.partition("=")
+ os.environ[key] = value
+ else:
+ logger.critical("dbus not running and can't be started")
+ sys.exit(1)
+
class Opera(Browser):
"""Opera-specific interface.
diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py
index 408744a4a40..d779651c990 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/install.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/install.py
@@ -39,8 +39,3 @@ def install(name, component, destination):
subclass = getattr(browser, name.title())
sys.stdout.write('Now installing %s %s...\n' % (name, component))
getattr(subclass(), method)(dest=destination)
-
-
-if __name__ == '__main__':
- args = parser.parse_args()
- run(None, **vars(args))
diff --git a/tests/wpt/web-platform-tests/tools/wpt/markdown.py b/tests/wpt/web-platform-tests/tools/wpt/markdown.py
index 87018910ac1..8b5ff8079df 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/markdown.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/markdown.py
@@ -38,18 +38,3 @@ def table(headings, data, log):
for row in data:
log("|%s|" % "|".join(" %s" % row[i].ljust(max_widths[i] - 1) for i in cols))
log("")
-
-
-def err_string(results_dict, iterations):
- """Create and return string with errors from test run."""
- rv = []
- total_results = sum(results_dict.values())
- for key, value in sorted(results_dict.items()):
- rv.append("%s%s" %
- (key, ": %s/%s" % (value, iterations) if value != iterations else ""))
- if total_results < iterations:
- rv.append("MISSING: %s/%s" % (iterations - total_results, iterations))
- rv = ", ".join(rv)
- if is_inconsistent(results_dict, iterations):
- rv = "**%s**" % rv
- return rv
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
index d1e3e49519c..f3fbcbdefb0 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -223,6 +223,28 @@ class Chrome(BrowserSetup):
else:
raise WptrunError("Unable to locate or install chromedriver binary")
+class ChromeAndroid(BrowserSetup):
+ name = "chrome_android"
+ browser_cls = browser.ChromeAndroid
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["webdriver_binary"] is None:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ install = self.prompt_install("chromedriver")
+
+ if install:
+ print("Downloading chromedriver")
+ webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
+ else:
+ print("Using webdriver binary %s" % webdriver_binary)
+
+ if webdriver_binary:
+ kwargs["webdriver_binary"] = webdriver_binary
+ else:
+ raise WptrunError("Unable to locate or install chromedriver binary")
+
class Opera(BrowserSetup):
name = "opera"
@@ -321,6 +343,7 @@ class Servo(BrowserSetup):
product_setup = {
"firefox": Firefox,
"chrome": Chrome,
+ "chrome_android": ChromeAndroid,
"edge": Edge,
"ie": InternetExplorer,
"servo": Servo,
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_stability.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_stability.py
new file mode 100644
index 00000000000..f2dd012087c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_stability.py
@@ -0,0 +1,7 @@
+from tools.wpt import stability
+
+def test_is_inconsistent():
+ assert stability.is_inconsistent({"PASS": 10}, 10) is False
+ assert stability.is_inconsistent({"PASS": 9}, 10) is True
+ assert stability.is_inconsistent({"PASS": 9, "FAIL": 1}, 10) is True
+ assert stability.is_inconsistent({"PASS": 8, "FAIL": 1}, 10) is True
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py
index d3402174c1a..127ed188f3e 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py
@@ -10,7 +10,8 @@ import pytest
from tools.wpt import wpt
-# Tests currently don't work on Windows for path reasons
+pytestmark = pytest.mark.skipif(os.name == "nt",
+ reason="Tests currently don't work on Windows for path reasons")
def test_missing():
with pytest.raises(SystemExit):
@@ -25,6 +26,9 @@ def test_help():
assert excinfo.value.code == 0
+@pytest.mark.slow
+@pytest.mark.system_dependent
+@pytest.mark.remote_network
def test_run_firefox():
# TODO: It seems like there's a bug in argparse that makes this argument order required
# should try to work around that
@@ -44,6 +48,8 @@ def test_run_firefox():
del os.environ["MOZ_HEADLESS"]
+@pytest.mark.slow
+@pytest.mark.system_dependent
def test_run_chrome():
with pytest.raises(SystemExit) as excinfo:
wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
@@ -52,6 +58,8 @@ def test_run_chrome():
assert excinfo.value.code == 0
+@pytest.mark.slow
+@pytest.mark.remote_network
def test_install_chromedriver():
chromedriver_path = os.path.join(wpt.localpaths.repo_root, "_venv", "bin", "chromedriver")
if os.path.exists(chromedriver_path):
@@ -63,6 +71,8 @@ def test_install_chromedriver():
os.unlink(chromedriver_path)
+@pytest.mark.slow
+@pytest.mark.remote_network
def test_install_firefox():
fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "firefox")
if os.path.exists(fx_path):
@@ -109,6 +119,8 @@ def test_files_changed_ignore_rules():
assert compile_ignore_rule("foobar/baz/**").pattern == "^foobar/baz/.*$"
+@pytest.mark.slow # this updates the manifest
+@pytest.mark.system_dependent
def test_tests_affected(capsys):
# This doesn't really work properly for random commits because we test the files in
# the current working directory for references to the changed files, not the ones at
@@ -121,6 +133,8 @@ def test_tests_affected(capsys):
assert "html/browsers/offline/appcache/workers/appcache-worker.html" in out
+@pytest.mark.slow
+@pytest.mark.system_dependent
def test_serve():
def test():
s = socket.socket()
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tox.ini b/tests/wpt/web-platform-tests/tools/wpt/tox.ini
index 5836a52ffa9..229bc4bfc5c 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/wpt/tox.ini
@@ -1,10 +1,9 @@
[tox]
-envlist = py27
+envlist = py27,py27-flake8
skipsdist=True
[testenv]
deps =
- flake8
pytest
pytest-cov
hypothesis
@@ -13,9 +12,41 @@ deps =
-r{toxinidir}/../wptrunner/requirements_firefox.txt
commands =
- pytest --cov
- flake8
+ pytest --cov {posargs}
+
+[testenv:py27-flake8]
+# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
+deps =
+ flake8==3.5.0
+ pycodestyle==2.3.1
+ pyflakes==1.6.0
+ pep8-naming==0.4.1
+
+commands =
+ flake8 {posargs}
[flake8]
-ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841
+# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
+select = E,W,F,N
+# E128: continuation line under-indented for visual indent
+# E129: visually indented line with same indent as next logical line
+# E221: multiple spaces before operator
+# E226: missing whitespace around arithmetic operator
+# E231: missing whitespace after ‘,’, ‘;’, or ‘:’
+# E251: unexpected spaces around keyword / parameter equals
+# E265: block comment should start with ‘# ‘
+# E302: expected 2 blank lines, found 0
+# E303: too many blank lines (3)
+# E305: expected 2 blank lines after end of function or class
+# E402: module level import not at top of file
+# E731: do not assign a lambda expression, use a def
+# E901: SyntaxError or IndentationError
+# W601: .has_key() is deprecated, use ‘in’
+# F401: module imported but unused
+# F403: ‘from module import *’ used; unable to detect undefined names
+# F405: name may be undefined, or defined from star imports: module
+# F841: local variable name is assigned to but never used
+# N801: class names should use CapWords convention
+# N802: function name should be lowercase
+ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802
max-line-length = 141
diff --git a/tests/wpt/web-platform-tests/tools/wpt/utils.py b/tests/wpt/web-platform-tests/tools/wpt/utils.py
index e1f4cd4bb5c..e8edc0be493 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/utils.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/utils.py
@@ -27,7 +27,7 @@ class Kwargs(dict):
value = value()
if not value:
if err_fn is not None:
- return err_fn(kwargs, "Failed to find %s" % desc)
+ return err_fn(self, "Failed to find %s" % desc)
else:
return
self[name] = value
diff --git a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
index 8f36aa93585..b8454c979c2 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
@@ -1,4 +1,5 @@
import os
+import shutil
import sys
import logging
from distutils.spawn import find_executable
@@ -21,7 +22,7 @@ class Virtualenv(object):
def create(self):
if os.path.exists(self.path):
shutil.rmtree(self.path)
- call(self.virtualenv, self.path)
+ call(self.virtualenv, self.path, "-p", sys.executable)
@property
def bin_path(self):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/MANIFEST.in b/tests/wpt/web-platform-tests/tools/wptrunner/MANIFEST.in
index 2be4d915be1..70839237889 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/MANIFEST.in
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/MANIFEST.in
@@ -1,6 +1,5 @@
exclude MANIFEST.in
include requirements.txt
-include wptrunner/browsers/b2g_setup/*
include wptrunner.default.ini
include wptrunner/testharness_runner.html
include wptrunner/*.js
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/README.rst b/tests/wpt/web-platform-tests/tools/wptrunner/README.rst
index 780518aae11..834e07ee41d 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/README.rst
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/README.rst
@@ -23,7 +23,7 @@ The ``wptrunner`` command takes multiple options, of which the
following are most significant:
``--product`` (defaults to `firefox`)
- The product to test against: `b2g`, `chrome`, `firefox`, or `servo`.
+ The product to test against: `chrome`, `firefox`, or `servo`.
``--binary`` (required if product is `firefox` or `servo`)
The path to a binary file for the product (browser) to test against.
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/docs/conf.py b/tests/wpt/web-platform-tests/tools/wptrunner/docs/conf.py
index 0c717f56536..b58f313e946 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/docs/conf.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/docs/conf.py
@@ -186,22 +186,22 @@ htmlhelp_basename = 'wptrunnerdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
+ # The paper size ('letterpaper' or 'a4paper').
+ #'papersize': 'letterpaper',
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
+ # The font size ('10pt', '11pt' or '12pt').
+ #'pointsize': '10pt',
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
+ # Additional stuff for the LaTeX preamble.
+ #'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- ('index', 'wptrunner.tex', u'wptrunner Documentation',
- u'James Graham', 'manual'),
+ ('index', 'wptrunner.tex', u'wptrunner Documentation',
+ u'James Graham', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -244,9 +244,9 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- ('index', 'wptrunner', u'wptrunner Documentation',
- u'James Graham', 'wptrunner', 'One line description of project.',
- 'Miscellaneous'),
+ ('index', 'wptrunner', u'wptrunner Documentation',
+ u'James Graham', 'wptrunner', 'One line description of project.',
+ 'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/docs/usage.rst b/tests/wpt/web-platform-tests/tools/wptrunner/docs/usage.rst
index 8e74a4320c8..258cca6eca9 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/docs/usage.rst
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/docs/usage.rst
@@ -54,7 +54,7 @@ A test run is started using the ``wptrunner`` command. The command
takes multiple options, of which the following are most significant:
``--product`` (defaults to `firefox`)
- The product to test against: `b2g`, `chrome`, `firefox`, or `servo`.
+ The product to test against: `chrome`, `firefox`, or `servo`.
``--binary`` (required if product is `firefox` or `servo`)
The path to a binary file for the product (browser) to test against.
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt
new file mode 100644
index 00000000000..a2f54425f3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt
@@ -0,0 +1,2 @@
+mozprocess >= 0.19
+selenium >= 2.41.0
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/setup.py b/tests/wpt/web-platform-tests/tools/wptrunner/setup.py
index 7ec189fefd9..7da51418327 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/setup.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/setup.py
@@ -53,13 +53,12 @@ setup(name=PACKAGE_NAME,
"config.json",
"wptrunner.default.ini",
"browsers/server-locations.txt",
- "browsers/b2g_setup/*",
"browsers/sauce_setup/*",
"prefs/*"]},
include_package_data=True,
data_files=[("requirements", requirements_files)],
install_requires=deps
- )
+ )
if "install" in sys.argv:
path = os.path.relpath(os.path.join(sys.prefix, "requirements"), os.curdir)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/test/test.py b/tests/wpt/web-platform-tests/tools/wptrunner/test/test.py
index 034e317bd52..622934a42b0 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/test/test.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/test/test.py
@@ -156,7 +156,8 @@ def main():
run(config, args)
except Exception:
if args.pdb:
- import pdb, traceback
+ import pdb
+ import traceback
print traceback.format_exc()
pdb.post_mortem()
else:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/tox.ini b/tests/wpt/web-platform-tests/tools/wptrunner/tox.ini
index 790970409f3..fa6aa3f7129 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/tox.ini
@@ -2,7 +2,7 @@
xfail_strict=true
[tox]
-envlist = {py27,pypy}-{base,b2g,chrome,firefox,servo}
+envlist = {py27,pypy}-{base,chrome,firefox,servo},py27-flake8
[testenv]
deps =
@@ -15,3 +15,40 @@ deps =
servo: -r{toxinidir}/requirements_servo.txt
commands = pytest --cov
+
+[testenv:py27-flake8]
+# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
+deps =
+ flake8==3.5.0
+ pycodestyle==2.3.1
+ pyflakes==1.6.0
+ pep8-naming==0.4.1
+
+commands =
+ flake8
+
+[flake8]
+# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini
+select = E,W,F,N
+# E128: continuation line under-indented for visual indent
+# E129: visually indented line with same indent as next logical line
+# E221: multiple spaces before operator
+# E226: missing whitespace around arithmetic operator
+# E231: missing whitespace after ‘,’, ‘;’, or ‘:’
+# E251: unexpected spaces around keyword / parameter equals
+# E265: block comment should start with ‘# ‘
+# E302: expected 2 blank lines, found 0
+# E303: too many blank lines (3)
+# E305: expected 2 blank lines after end of function or class
+# E402: module level import not at top of file
+# E731: do not assign a lambda expression, use a def
+# E901: SyntaxError or IndentationError
+# W601: .has_key() is deprecated, use ‘in’
+# F401: module imported but unused
+# F403: ‘from module import *’ used; unable to detect undefined names
+# F405: name may be undefined, or defined from star imports: module
+# F841: local variable name is assigned to but never used
+# N801: class names should use CapWords convention
+# N802: function name should be lowercase
+ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802
+max-line-length = 141
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
index a5c25335742..1e74863b733 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -23,6 +23,7 @@ module global scope.
"""
product_list = ["chrome",
+ "chrome_android",
"edge",
"firefox",
"ie",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/b2g_setup/certtest_app.zip b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/b2g_setup/certtest_app.zip
deleted file mode 100644
index f9cbd5300ad..00000000000
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/b2g_setup/certtest_app.zip
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
new file mode 100644
index 00000000000..9e53bc660e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -0,0 +1,98 @@
+from .base import Browser, ExecutorBrowser, require_arg
+from ..webdriver_server import ChromeDriverServer
+from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.executorselenium import (SeleniumTestharnessExecutor,
+ SeleniumRefTestExecutor)
+from ..executors.executorchrome import ChromeDriverWdspecExecutor
+
+
+__wptrunner__ = {"product": "chrome_android",
+ "check_args": "check_args",
+ "browser": "ChromeAndroidBrowser",
+ "executor": {"testharness": "SeleniumTestharnessExecutor",
+ "reftest": "SeleniumRefTestExecutor",
+ "wdspec": "ChromeDriverWdspecExecutor"},
+ "browser_kwargs": "browser_kwargs",
+ "executor_kwargs": "executor_kwargs",
+ "env_extras": "env_extras",
+ "env_options": "env_options"}
+
+
+def check_args(**kwargs):
+ require_arg(kwargs, "webdriver_binary")
+
+
+def browser_kwargs(test_type, run_info_data, **kwargs):
+ return {"binary": kwargs["binary"],
+ "webdriver_binary": kwargs["webdriver_binary"],
+ "webdriver_args": kwargs.get("webdriver_args")}
+
+
+def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
+ **kwargs):
+ from selenium.webdriver import DesiredCapabilities
+
+ executor_kwargs = base_executor_kwargs(test_type, server_config,
+ cache_manager, **kwargs)
+ executor_kwargs["close_after_done"] = True
+ capabilities = dict(DesiredCapabilities.CHROME.items())
+ capabilities["chromeOptions"] = {}
+ # required to start on mobile
+ capabilities["chromeOptions"]["androidPackage"] = "com.android.chrome"
+
+ for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
+ if kwargs[kwarg] is not None:
+ capabilities["chromeOptions"][capability] = kwargs[kwarg]
+ if test_type == "testharness":
+ capabilities["useAutomationExtension"] = False
+ capabilities["excludeSwitches"] = ["enable-automation"]
+ if test_type == "wdspec":
+ capabilities["chromeOptions"]["w3c"] = True
+ executor_kwargs["capabilities"] = capabilities
+ return executor_kwargs
+
+
+def env_extras(**kwargs):
+ return []
+
+
+def env_options():
+ return {"host": "web-platform.test",
+ "bind_hostname": "true"}
+
+
+class ChromeAndroidBrowser(Browser):
+ """Chrome is backed by chromedriver, which is supplied through
+ ``wptrunner.webdriver.ChromeDriverServer``.
+ """
+
+ def __init__(self, logger, binary, webdriver_binary="chromedriver",
+ webdriver_args=None):
+ """Creates a new representation of Chrome. The `binary` argument gives
+ the browser binary to use for testing."""
+ Browser.__init__(self, logger)
+ self.binary = binary
+ self.server = ChromeDriverServer(self.logger,
+ binary=webdriver_binary,
+ args=webdriver_args)
+
+ def start(self, **kwargs):
+ self.server.start(block=False)
+
+ def stop(self, force=False):
+ self.server.stop(force=force)
+
+ def pid(self):
+ return self.server.pid
+
+ def is_alive(self):
+ # TODO(ato): This only indicates the driver is alive,
+ # and doesn't say anything about whether a browser session
+ # is active.
+ return self.server.is_alive()
+
+ def cleanup(self):
+ self.stop()
+
+ def executor_browser(self):
+ return ExecutorBrowser, {"webdriver_url": self.server.url}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
index b324bccd91e..6d1f58d3791 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -96,15 +96,15 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
executor_kwargs["reftest_internal"] = kwargs["reftest_internal"]
executor_kwargs["reftest_screenshot"] = kwargs["reftest_screenshot"]
if test_type == "wdspec":
- fxOptions = {}
+ options = {}
if kwargs["binary"]:
- fxOptions["binary"] = kwargs["binary"]
+ options["binary"] = kwargs["binary"]
if kwargs["binary_args"]:
- fxOptions["args"] = kwargs["binary_args"]
- fxOptions["prefs"] = {
+ options["args"] = kwargs["binary_args"]
+ options["prefs"] = {
"network.dns.localDomains": ",".join(hostnames)
}
- capabilities["moz:firefoxOptions"] = fxOptions
+ capabilities["moz:firefoxOptions"] = options
if kwargs["certutil_binary"] is None:
capabilities["acceptInsecureCerts"] = True
if capabilities:
@@ -364,7 +364,7 @@ class FirefoxBrowser(Browser):
env[env_var] = (os.path.pathsep.join([certutil_dir, env[env_var]])
if env_var in env else certutil_dir).encode(
- sys.getfilesystemencoding() or 'utf-8', 'replace')
+ sys.getfilesystemencoding() or 'utf-8', 'replace')
def certutil(*args):
cmd = [self.certutil_binary] + list(args)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py
index 553372f390e..13f5827194d 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py
@@ -28,10 +28,10 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
**kwargs):
from selenium.webdriver import DesiredCapabilities
- ieOptions = {}
- ieOptions["requireWindowFocus"] = True
+ options = {}
+ options["requireWindowFocus"] = True
capabilities = {}
- capabilities["se:ieOptions"] = ieOptions
+ capabilities["se:ieOptions"] = options
executor_kwargs = base_executor_kwargs(test_type, server_config,
cache_manager, **kwargs)
executor_kwargs["close_after_done"] = True
@@ -51,7 +51,7 @@ class InternetExplorerBrowser(Browser):
def __init__(self, logger, webdriver_binary, webdriver_args=None):
Browser.__init__(self, logger)
- self.server = InterentExplorerDriverServer(self.logger,
+ self.server = InternetExplorerDriverServer(self.logger,
binary=webdriver_binary,
args=webdriver_args)
self.webdriver_host = "localhost"
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
index 874595cbff3..711534180dc 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
@@ -61,7 +61,7 @@ def get_ssl_kwargs(**kwargs):
elif kwargs["ssl_type"] == "pregenerated":
args = {"host_key_path": kwargs["host_key_path"],
"host_cert_path": kwargs["host_cert_path"],
- "ca_cert_path": kwargs["ca_cert_path"]}
+ "ca_cert_path": kwargs["ca_cert_path"]}
else:
args = {}
return args
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
index d87e4ab9924..7178b2e28c3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
@@ -13,7 +13,7 @@ here = os.path.split(__file__)[0]
# Extra timeout to use after internal test timeout at which the harness
# should force a timeout
-extra_timeout = 5 # seconds
+extra_timeout = 5 # seconds
def executor_kwargs(test_type, server_config, cache_manager, **kwargs):
@@ -67,8 +67,8 @@ class TestharnessResultConverter(object):
(result_url, test.url))
harness_result = test.result_cls(self.harness_codes[status], message)
return (harness_result,
- [test.subtest_result_cls(name, self.test_codes[status], message, stack)
- for name, status, message, stack in subtest_results])
+ [test.subtest_result_cls(st_name, self.test_codes[st_status], st_message, st_stack)
+ for st_name, st_status, st_message, st_stack in subtest_results])
testharness_result_converter = TestharnessResultConverter()
@@ -124,7 +124,7 @@ class TestExecutor(object):
self.debug_info = debug_info
self.last_environment = {"protocol": "http",
"prefs": {}}
- self.protocol = None # This must be set in subclasses
+ self.protocol = None # This must be set in subclasses
@property
def logger(self):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 2d0dc914d10..30930c3c2f9 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -304,7 +304,7 @@ class ExecuteAsyncScriptRun(object):
self.result_flag = threading.Event()
def run(self):
- index = self.url.rfind("/storage/");
+ index = self.url.rfind("/storage/")
if index != -1:
# Clear storage
self.protocol.clear_origin(self.url)
@@ -503,7 +503,7 @@ class MarionetteRefTestExecutor(RefTestExecutor):
assert viewport_size is None
assert dpi is None
- timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None
+ timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None
test_url = self.test_url(test)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
index 2e84ab6fd65..f905fac81e1 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
@@ -51,7 +51,7 @@ class SeleniumProtocol(Protocol):
self.webdriver = webdriver.Remote(command_executor=RemoteConnection(self.url.strip("/"),
resolve_ip=False),
desired_capabilities=self.capabilities)
- except:
+ except Exception:
self.logger.warning(
"Connecting to Selenium failed:\n%s" % traceback.format_exc())
else:
@@ -64,7 +64,7 @@ class SeleniumProtocol(Protocol):
else:
try:
self.after_connect()
- except:
+ except Exception:
print >> sys.stderr, traceback.format_exc()
self.logger.warning(
"Failed to connect to navigate initial page")
@@ -76,7 +76,7 @@ class SeleniumProtocol(Protocol):
self.logger.debug("Hanging up on Selenium session")
try:
self.webdriver.quit()
- except:
+ except Exception:
pass
del self.webdriver
@@ -103,7 +103,7 @@ class SeleniumProtocol(Protocol):
def wait(self):
while True:
try:
- self.webdriver.execute_async_script("");
+ self.webdriver.execute_async_script("")
except exceptions.TimeoutException:
pass
except (socket.timeout, exceptions.NoSuchWindowException,
@@ -220,7 +220,7 @@ class SeleniumTestharnessExecutor(TestharnessExecutor):
win_s = webdriver.execute_script("return window['%s'];" % self.window_id)
win_obj = json.loads(win_s)
test_window = win_obj["window-fcc6-11e5-b4f8-330a88ab9d7f"]
- except:
+ except Exception:
after = webdriver.window_handles
if len(after) == 2:
test_window = next(iter(set(after) - set([parent])))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
index 33ff10df928..ca8ec8a7eb5 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -28,7 +28,7 @@ from .executormarionette import WdspecRun
pytestrunner = None
webdriver = None
-extra_timeout = 5 # seconds
+extra_timeout = 5 # seconds
hosts_text = """127.0.0.1 web-platform.test
127.0.0.1 www.web-platform.test
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
index af09da6f178..ed7afaf1028 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
@@ -43,7 +43,7 @@ class ServoWebDriverProtocol(Protocol):
self.session = webdriver.Session(self.host, self.port,
extension=webdriver.servo.ServoCommandExtensions)
self.session.start()
- except:
+ except Exception:
self.logger.warning(
"Connecting with WebDriver failed:\n%s" % traceback.format_exc())
else:
@@ -60,7 +60,7 @@ class ServoWebDriverProtocol(Protocol):
self.logger.debug("Hanging up on WebDriver session")
try:
self.session.end()
- except:
+ except Exception:
pass
def is_alive(self):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
index fd3f82aeb11..1d3c173928f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
@@ -247,8 +247,8 @@ class TestNode(ManifestItem):
boolean_properties=self.root.boolean_properties)
except ConditionError as e:
if stability is not None:
- self.set("disabled", stability or "unstable", e.cond.children[0])
- self.new_disabled = True
+ self.set("disabled", stability or "unstable", e.cond.children[0])
+ self.new_disabled = True
else:
print "Conflicting test results for %s, cannot update" % self.root.test_path
return
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
index 923ac790733..9c31e4279ef 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
@@ -355,7 +355,7 @@ def load_expected(test_manifest, metadata_path, test_path, tests, property_order
# Remove expected data for tests that no longer exist
for test in expected_manifest.iterchildren():
- if not test.id in tests_by_id:
+ if test.id not in tests_by_id:
test.remove()
# Add tests that don't have expected data
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/stability.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/stability.py
index 6eb060485c2..e1709c5749a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/stability.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/stability.py
@@ -274,6 +274,6 @@ def check_stability(logger, repeat_loop=10, repeat_restart=5, chaos_mode=True, m
write_summary(logger, step_results, "FAIL")
return 1
- step_results.append((desc, "PASS"))
+ step_results.append((desc, "PASS"))
write_summary(logger, step_results, "PASS")
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
index 0eb78bb884f..199ed6c2666 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
@@ -93,7 +93,7 @@ class EqualTimeChunker(TestChunker):
for i, (test_type, test_path, tests) in enumerate(manifest_items):
test_dir = tuple(os.path.split(test_path)[0].split(os.path.sep)[:3])
- if not test_dir in by_dir:
+ if test_dir not in by_dir:
by_dir[test_dir] = PathData(test_dir)
data = by_dir[test_dir]
@@ -261,7 +261,7 @@ class EqualTimeChunker(TestChunker):
return self.paths.popleft()
@property
- def badness(self_):
+ def badness(self_): # noqa: N805
"""Badness metric for this chunk"""
return self._badness(self_.time)
@@ -587,6 +587,7 @@ class TestSource(object):
self.current_metadata = None
@abstractmethod
+ # noqa: N805
#@classmethod (doesn't compose with @abstractmethod)
def make_queue(cls, tests, **kwargs):
pass
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
index 75f4825f952..85ffbe3741a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
@@ -195,7 +195,7 @@ class BrowserManager(object):
self.logger.debug("Starting browser with settings %r" % self.browser_settings)
self.browser.start(**self.browser_settings)
self.browser_pid = self.browser.pid()
- except:
+ except Exception:
self.logger.warning("Failure during init %s" % traceback.format_exc())
if self.init_timer is not None:
self.init_timer.cancel()
@@ -566,7 +566,7 @@ class TestRunnerManager(threading.Thread):
expected = test.expected()
status = file_result.status if file_result.status != "EXTERNAL-TIMEOUT" else "TIMEOUT"
- if file_result.status in ("TIMEOUT", "EXTERNAL-TIMEOUT"):
+ if file_result.status in ("TIMEOUT", "EXTERNAL-TIMEOUT"):
if self.browser.check_for_crashes():
status = "CRASH"
@@ -585,8 +585,8 @@ class TestRunnerManager(threading.Thread):
restart_before_next = (test.restart_after or
file_result.status in ("CRASH", "EXTERNAL-TIMEOUT") or
- ((subtest_unexpected or is_unexpected)
- and self.restart_on_unexpected))
+ ((subtest_unexpected or is_unexpected) and
+ self.restart_on_unexpected))
if (self.pause_after_test or
(self.pause_on_unexpected and (subtest_unexpected or is_unexpected))):
@@ -689,7 +689,7 @@ class TestRunnerManager(threading.Thread):
break
else:
if cmd == "log":
- self.log(*data)
+ self.log(*data)
else:
self.logger.warning("%r: %r" % (cmd, data))
while True:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_hosts.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_hosts.py
index 808b81606ae..e7d41f3b420 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_hosts.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_hosts.py
@@ -42,15 +42,13 @@ class HostsTest(unittest.TestCase):
192.168.1.1 another_host another_alias
""","""127.0.0.1 localhost alias
192.168.1.1 another_host another_alias
-"""
-)
+""")
def test_multiple_same_name(self):
# The semantics are that we overwrite earlier entries with the same name
self.do_test("""127.0.0.1 \tlocalhost alias
192.168.1.1 localhost another_alias""","""192.168.1.1 localhost another_alias
-"""
-)
+""")
if __name__ == "__main__":
unittest.main()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/__init__.py
index 497cb34ad0c..99dac6bcccc 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/__init__.py
@@ -44,4 +44,3 @@ def main():
assert structuredlog.get_default_logger() is not None
success = run_update(logger, **args)
sys.exit(0 if success else 1)
-
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
index c1bff854349..f2660e5a33e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
@@ -109,7 +109,7 @@ class UpdateCheckout(Step):
state.sync["branch"],
state.local_branch)
sync_path = os.path.abspath(sync_tree.root)
- if not sync_path in sys.path:
+ if sync_path not in sys.path:
from update import setup_paths
setup_paths(sync_path)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/tree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/tree.py
index 01df0b4f94a..279ddba1f6f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/tree.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/tree.py
@@ -75,7 +75,7 @@ class HgTree(object):
kwargs["repo"] = path
try:
hg("root", **kwargs)
- except:
+ except Exception:
return False
return True
@@ -155,7 +155,7 @@ class GitTree(object):
kwargs["repo"] = path
try:
git("rev-parse", "--show-toplevel", **kwargs)
- except:
+ except Exception:
return False
return True
@@ -305,8 +305,8 @@ class GitTree(object):
def paths(self):
"""List paths in the tree"""
- repo_paths = [self.root] + [os.path.join(self.root, path)
- for path in self.submodules()]
+ repo_paths = [self.root] + [os.path.join(self.root, path)
+ for path in self.submodules()]
rv = []
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/vcs.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/vcs.py
index 16d53afc8be..a51312d3937 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/vcs.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/vcs.py
@@ -15,7 +15,7 @@ def vcs(bin_name):
repo = kwargs.pop("repo", None)
log_error = kwargs.pop("log_error", True)
if kwargs:
- raise TypeError, kwargs
+ raise TypeError(kwargs)
args = list(args)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
index fc853bfb97e..7b78898344f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
@@ -72,7 +72,7 @@ class WebDriverServer(object):
"Waiting for server to become accessible: %s" % self.url)
try:
wait_for_service((self.host, self.port))
- except:
+ except Exception:
self.logger.error(
"WebDriver HTTP server was not accessible "
"within the timeout:\n%s" % traceback.format_exc())
@@ -125,8 +125,6 @@ class SeleniumServer(WebDriverServer):
class ChromeDriverServer(WebDriverServer):
- default_base_path = "/"
-
def __init__(self, logger, binary="chromedriver", port=None,
base_path="", args=None):
WebDriverServer.__init__(
@@ -138,8 +136,6 @@ class ChromeDriverServer(WebDriverServer):
cmd_arg("url-base", self.base_path) if self.base_path else ""] + self._args
class EdgeDriverServer(WebDriverServer):
- default_base_path = "/"
-
def __init__(self, logger, binary="microsoftwebdriver.exe", port=None,
base_path="", args=None):
WebDriverServer.__init__(
@@ -147,8 +143,7 @@ class EdgeDriverServer(WebDriverServer):
def make_command(self):
return [self.binary,
- cmd_arg("port", str(self.port)),
- cmd_arg("url-base", self.base_path) if self.base_path else ""] + self._args
+ "--port=%s" % str(self.port)] + self._args
class OperaDriverServer(ChromeDriverServer):
def __init__(self, logger, binary="operadriver", port=None,
@@ -157,17 +152,6 @@ class OperaDriverServer(ChromeDriverServer):
self, logger, binary, port=port, base_path=base_path, args=args)
-class EdgeDriverServer(WebDriverServer):
- def __init__(self, logger, binary="MicrosoftWebDriver.exe", port=None,
- base_path="", host="localhost", args=None):
- WebDriverServer.__init__(
- self, logger, binary, host=host, port=port, args=args)
-
- def make_command(self):
- return [self.binary,
- "--port=%s" % str(self.port)] + self._args
-
-
class InternetExplorerDriverServer(WebDriverServer):
def __init__(self, logger, binary="IEDriverServer.exe", port=None,
base_path="", host="localhost", args=None):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
index b232462d915..ad18e424cd5 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -28,7 +28,7 @@ def require_arg(kwargs, name, value_func=None):
if value_func is None:
value_func = lambda x: x is not None
- if not name in kwargs or not value_func(kwargs[name]):
+ if name not in kwargs or not value_func(kwargs[name]):
print >> sys.stderr, "Missing required argument %s" % name
sys.exit(1)
@@ -97,7 +97,8 @@ scheme host and port.""")
test_selection_group.add_argument("--skip-timeout", action="store_true",
help="Skip tests that are expected to time out")
test_selection_group.add_argument("--tag", action="append", dest="tags",
- help="Labels applied to tests to include in the run. Labels starting dir: are equivalent to top-level directories.")
+ help="Labels applied to tests to include in the run. "
+ "Labels starting dir: are equivalent to top-level directories.")
debugging_group = parser.add_argument_group("Debugging")
debugging_group.add_argument('--debugger', const="__default__", nargs="?",
@@ -479,7 +480,8 @@ def create_parser_update(product_choices=None):
help="Don't create a VCS commit containing the changes.")
parser.add_argument("--sync", dest="sync", action="store_true", default=False,
help="Sync the tests with the latest from upstream (implies --patch)")
- parser.add_argument("--ignore-existing", action="store_true", help="When updating test results only consider results from the logfiles provided, not existing expectations.")
+ parser.add_argument("--ignore-existing", action="store_true",
+ help="When updating test results only consider results from the logfiles provided, not existing expectations.")
parser.add_argument("--stability", nargs="?", action="store", const="unstable", default=None,
help=("Reason for disabling tests. When updating test results, disable tests that have "
"inconsistent results across many runs with the given reason."))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
index 6db2cbbbb47..6908ea4c1e0 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
@@ -211,15 +211,15 @@ class TokenizerTest(unittest.TestCase):
""")
def test_atom_1(self):
- self.compare(r"""key: @True
+ self.compare(r"""key: @True
""")
def test_atom_2(self):
- self.compare(r"""key: @False
+ self.compare(r"""key: @False
""")
def test_atom_3(self):
- self.compare(r"""key: @Reset
+ self.compare(r"""key: @Reset
""")
def test_atom_4(self):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
index 88176c5a169..a64ce0c7bb7 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
@@ -145,8 +145,7 @@ class TokenizerTest(unittest.TestCase):
(token_types.string, r"\nb")])
def test_list_0(self):
- self.compare(
-"""
+ self.compare("""
key: []""",
[(token_types.string, "key"),
(token_types.separator, ":"),
@@ -154,8 +153,7 @@ key: []""",
(token_types.list_end, "]")])
def test_list_1(self):
- self.compare(
-"""
+ self.compare("""
key: [a, "b"]""",
[(token_types.string, "key"),
(token_types.separator, ":"),
@@ -165,8 +163,7 @@ key: [a, "b"]""",
(token_types.list_end, "]")])
def test_list_2(self):
- self.compare(
-"""
+ self.compare("""
key: [a,
b]""",
[(token_types.string, "key"),
@@ -177,8 +174,7 @@ key: [a,
(token_types.list_end, "]")])
def test_list_3(self):
- self.compare(
-"""
+ self.compare("""
key: [a, #b]
c]""",
[(token_types.string, "key"),
@@ -199,18 +195,16 @@ key: [a, #b]
c]""")
def test_list_6(self):
- self.compare(
-"""key: [a , b]""",
- [(token_types.string, "key"),
- (token_types.separator, ":"),
- (token_types.list_start, "["),
- (token_types.string, "a"),
- (token_types.string, "b"),
- (token_types.list_end, "]")])
+ self.compare("""key: [a , b]""",
+ [(token_types.string, "key"),
+ (token_types.separator, ":"),
+ (token_types.list_start, "["),
+ (token_types.string, "a"),
+ (token_types.string, "b"),
+ (token_types.list_end, "]")])
def test_expr_0(self):
- self.compare(
-"""
+ self.compare("""
key:
if cond == 1: value""",
[(token_types.string, "key"),
@@ -224,8 +218,7 @@ key:
(token_types.string, "value")])
def test_expr_1(self):
- self.compare(
-"""
+ self.compare("""
key:
if cond == 1: value1
value2""",
@@ -241,8 +234,7 @@ key:
(token_types.string, "value2")])
def test_expr_2(self):
- self.compare(
-"""
+ self.compare("""
key:
if cond=="1": value""",
[(token_types.string, "key"),
@@ -256,8 +248,7 @@ key:
(token_types.string, "value")])
def test_expr_3(self):
- self.compare(
-"""
+ self.compare("""
key:
if cond==1.1: value""",
[(token_types.string, "key"),
@@ -271,8 +262,7 @@ key:
(token_types.string, "value")])
def test_expr_4(self):
- self.compare(
- """
+ self.compare("""
key:
if cond==1.1 and cond2 == "a": value""",
[(token_types.string, "key"),
@@ -290,8 +280,7 @@ key:
(token_types.string, "value")])
def test_expr_5(self):
- self.compare(
-"""
+ self.compare("""
key:
if (cond==1.1 ): value""",
[(token_types.string, "key"),
@@ -307,8 +296,7 @@ key:
(token_types.string, "value")])
def test_expr_6(self):
- self.compare(
-"""
+ self.compare("""
key:
if "\\ttest": value""",
[(token_types.string, "key"),
@@ -322,27 +310,26 @@ key:
def test_expr_7(self):
with self.assertRaises(parser.ParseError):
self.tokenize(
-"""
+ """
key:
if 1A: value""")
def test_expr_8(self):
with self.assertRaises(parser.ParseError):
self.tokenize(
-"""
+ """
key:
if 1a: value""")
def test_expr_9(self):
with self.assertRaises(parser.ParseError):
self.tokenize(
-"""
+ """
key:
if 1.1.1: value""")
def test_expr_10(self):
- self.compare(
-"""
+ self.compare("""
key:
if 1.: value""",
[(token_types.string, "key"),
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
index 637cbe57b6f..6677902a49a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
@@ -307,7 +307,8 @@ def main():
return start(**kwargs)
except Exception:
if kwargs["pdb"]:
- import pdb, traceback
+ import pdb
+ import traceback
print traceback.format_exc()
pdb.post_mortem()
else:
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 d283e854205..9f4c1bed135 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
@@ -356,7 +356,7 @@ class ReftestTest(Test):
return node
def update_metadata(self, metadata):
- if not "url_count" in metadata:
+ if "url_count" not in metadata:
metadata["url_count"] = defaultdict(int)
for reference, _ in self.references:
# We assume a naive implementation in which a url with multiple
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst b/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst
index 39e98ab4f5e..8faeee489c9 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst
+++ b/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst
@@ -12,8 +12,8 @@ This would serve bytes 1 to 199, inclusive, of foo.txt with the HTTP status
code 404.
.. note::
- Pipes are only applied to static files, and will not work if applied to
- other types of handlers, such as Python File Handlers.
+ If you write directly to the response socket using ResponseWriter,
+ or when using the asis handler, only the trickle pipe will affect the response.
There are several built-in pipe functions, and it is possible to add
more using the `@pipe` decorator on a function, if required.
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py
index bd38f2ef18f..147ad156225 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_pipes.py
@@ -1,9 +1,11 @@
import os
import unittest
import time
+import json
import pytest
+wptserve = pytest.importorskip("wptserve")
from .base import TestUsingServer, doc_root
@@ -82,5 +84,72 @@ class TestTrickle(TestUsingServer):
self.assertEqual(resp.info()["Pragma"], "no-cache")
self.assertEqual(resp.info()["Expires"], "0")
+class TestPipesWithVariousHandlers(TestUsingServer):
+ def test_with_python_file_handler(self):
+ resp = self.request("/test_string.py", query="pipe=slice(null,2)")
+ self.assertEqual(resp.read(), "PA")
+
+ def test_with_python_func_handler(self):
+ @wptserve.handlers.handler
+ def handler(request, response):
+ return "PASS"
+ route = ("GET", "/test/test_pipes_1/", handler)
+ self.server.router.register(*route)
+ resp = self.request(route[1], query="pipe=slice(null,2)")
+ self.assertEqual(resp.read(), "PA")
+
+ def test_with_python_func_handler_using_response_writer(self):
+ @wptserve.handlers.handler
+ def handler(request, response):
+ response.writer.write_content("PASS")
+ route = ("GET", "/test/test_pipes_1/", handler)
+ self.server.router.register(*route)
+ resp = self.request(route[1], query="pipe=slice(null,2)")
+ # slice has not been applied to the response, because response.writer was used.
+ self.assertEqual(resp.read(), "PASS")
+
+ def test_header_pipe_with_python_func_using_response_writer(self):
+ @wptserve.handlers.handler
+ def handler(request, response):
+ response.writer.write_content("CONTENT")
+ route = ("GET", "/test/test_pipes_1/", handler)
+ self.server.router.register(*route)
+ resp = self.request(route[1], query="pipe=header(X-TEST,FAIL)")
+ # header pipe was ignored, because response.writer was used.
+ self.assertFalse(resp.info().get("X-TEST"))
+ self.assertEqual(resp.read(), "CONTENT")
+
+ def test_with_json_handler(self):
+ @wptserve.handlers.json_handler
+ def handler(request, response):
+ return json.dumps({'data': 'PASS'})
+ route = ("GET", "/test/test_pipes_2/", handler)
+ self.server.router.register(*route)
+ resp = self.request(route[1], query="pipe=slice(null,2)")
+ self.assertEqual(resp.read(), '"{')
+
+ def test_slice_with_as_is_handler(self):
+ resp = self.request("/test.asis", query="pipe=slice(null,2)")
+ self.assertEqual(202, resp.getcode())
+ self.assertEqual("Giraffe", resp.msg)
+ self.assertEqual("PASS", resp.info()["X-Test"])
+ # slice has not been applied to the response, because response.writer was used.
+ self.assertEqual("Content", resp.read())
+
+ def test_headers_with_as_is_handler(self):
+ resp = self.request("/test.asis", query="pipe=header(X-TEST,FAIL)")
+ self.assertEqual(202, resp.getcode())
+ self.assertEqual("Giraffe", resp.msg)
+ # header pipe was ignored.
+ self.assertEqual("PASS", resp.info()["X-TEST"])
+ self.assertEqual("Content", resp.read())
+
+ def test_trickle_with_as_is_handler(self):
+ t0 = time.time()
+ resp = self.request("/test.asis", query="pipe=trickle(1:d2:5:d1:r2)")
+ t1 = time.time()
+ self.assertTrue('Content' in resp.read())
+ self.assertGreater(6, t1-t0)
+
if __name__ == '__main__':
unittest.main()
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
index c962a6cd80a..7cd8479855d 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
@@ -237,6 +237,7 @@ class PythonScriptHandler(object):
if "main" in environ:
handler = FunctionHandler(environ["main"])
handler(request, response)
+ wrap_pipeline(path, request, response)
else:
raise HTTPException(500, "No main function in script %s" % path)
except IOError:
@@ -267,6 +268,7 @@ class FunctionHandler(object):
else:
content = rv
response.content = content
+ wrap_pipeline('', request, response)
#The generic name here is so that this can be used as a decorator
@@ -309,6 +311,7 @@ class AsIsHandler(object):
try:
with open(path) as f:
response.writer.write_content(f.read())
+ wrap_pipeline(path, request, response)
response.close_connection = True
except IOError:
raise HTTPException(404)
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
index 7203815b70c..b71c8afa309 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
@@ -6,6 +6,7 @@ import types
import uuid
from cStringIO import StringIO
+from six import text_type
def resolve_content(response):
return b"".join(item for item in response.iter_content(read_file=True))
@@ -276,18 +277,18 @@ def slice(request, response, start, end=None):
class ReplacementTokenizer(object):
- def ident(scanner, token):
+ def ident(self, token):
return ("ident", token)
- def index(scanner, token):
+ def index(self, token):
token = token[1:-1]
try:
token = int(token)
except ValueError:
- token = unicode(token, "utf8")
+ token = token.decode('utf8')
return ("index", token)
- def var(scanner, token):
+ def var(self, token):
token = token[:-1]
return ("var", token)
@@ -425,7 +426,7 @@ def template(request, content, escape_type="html"):
#Should possibly support escaping for other contexts e.g. script
#TODO: read the encoding of the response
- return escape_func(unicode(value)).encode("utf-8")
+ return escape_func(text_type(value)).encode("utf-8")
template_regexp = re.compile(r"{{([^}]*)}}")
new_content = template_regexp.sub(config_replacement, content)
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
index 50ff00dde94..20b7b426996 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
@@ -9,6 +9,8 @@ import socket
from .constants import response_codes
from .logger import get_logger
+from six import string_types, binary_type, text_type
+
missing = object()
class Response(object):
@@ -400,7 +402,7 @@ class ResponseWriter(object):
if name.lower() not in self._headers_seen:
self.write_header(name, f())
- if (type(self._response.content) in (str, unicode) and
+ if (isinstance(self._response.content, string_types) and
"content-length" not in self._headers_seen):
#Would be nice to avoid double-encoding here
self.write_header("Content-Length", len(self.encode(self._response.content)))
@@ -457,9 +459,9 @@ class ResponseWriter(object):
def encode(self, data):
"""Convert unicode to bytes according to response.encoding."""
- if isinstance(data, str):
+ if isinstance(data, binary_type):
return data
- elif isinstance(data, unicode):
+ elif isinstance(data, text_type):
return data.encode(self._response.encoding)
else:
raise ValueError
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
index 2a83bd8097e..f9ed238624b 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py
@@ -110,14 +110,15 @@ class WebTestServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
# Ensure that we don't hang on shutdown waiting for requests
daemon_threads = True
- def __init__(self, server_address, RequestHandlerClass, router, rewriter, bind_hostname,
+ def __init__(self, server_address, request_handler_cls,
+ router, rewriter, bind_hostname,
config=None, use_ssl=False, key_file=None, certificate=None,
encrypt_after_connect=False, latency=None, **kwargs):
"""Server for HTTP(s) Requests
:param server_address: tuple of (server_name, port)
- :param RequestHandlerClass: BaseHTTPRequestHandler-like class to use for
+ :param request_handler_cls: BaseHTTPRequestHandler-like class to use for
handling requests.
:param router: Router instance to use for matching requests to handler
@@ -161,7 +162,7 @@ class WebTestServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
hostname_port = ("",server_address[1])
#super doesn't work here because BaseHTTPServer.HTTPServer is old-style
- BaseHTTPServer.HTTPServer.__init__(self, hostname_port, RequestHandlerClass, **kwargs)
+ BaseHTTPServer.HTTPServer.__init__(self, hostname_port, request_handler_cls, **kwargs)
if config is not None:
Server.config = config
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py
index b6bd6eed442..69fa4418383 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py
@@ -2,7 +2,8 @@ import base64
import json
import os
import uuid
-from multiprocessing.managers import BaseManager, DictProxy
+import threading
+from multiprocessing.managers import AcquirerProxy, BaseManager, DictProxy
class ServerDictManager(BaseManager):
shared_data = {}
@@ -13,11 +14,13 @@ def _get_shared():
ServerDictManager.register("get_dict",
callable=_get_shared,
proxytype=DictProxy)
+ServerDictManager.register('Lock', threading.Lock, AcquirerProxy)
class ClientDictManager(BaseManager):
pass
ClientDictManager.register("get_dict")
+ClientDictManager.register("Lock")
class StashServer(object):
def __init__(self, address=None, authkey=None):
@@ -53,6 +56,22 @@ def start_server(address=None, authkey=None):
return (manager, manager._address, manager._authkey)
+class LockWrapper(object):
+ def __init__(self, lock):
+ self.lock = lock
+
+ def acquire(self):
+ self.lock.acquire()
+
+ def release(self):
+ self.lock.release()
+
+ def __enter__(self):
+ self.acquire()
+
+ def __exit__(self, *args, **kwargs):
+ self.release()
+
#TODO: Consider expiring values after some fixed time for long-running
#servers
@@ -81,21 +100,23 @@ class Stash(object):
"""
_proxy = None
+ lock = None
def __init__(self, default_path, address=None, authkey=None):
self.default_path = default_path
- self.data = self._get_proxy(address, authkey)
+ self._get_proxy(address, authkey)
+ self.data = Stash._proxy
def _get_proxy(self, address=None, authkey=None):
if address is None and authkey is None:
Stash._proxy = {}
+ Stash.lock = threading.Lock()
if Stash._proxy is None:
manager = ClientDictManager(address, authkey)
manager.connect()
Stash._proxy = manager.get_dict()
-
- return Stash._proxy
+ Stash.lock = LockWrapper(manager.Lock())
def _wrap_key(self, key, path):
if path is None:
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade.sub.https.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade.sub.https.html
new file mode 100644
index 00000000000..6b315c83df7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade.sub.https.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+
+ <body>
+ <script>
+ const test_data = [
+ {
+ url : './link-upgrade/basic-link-no-upgrade.sub.html',
+ done_message : 'basic-link-no-upgrade',
+ },
+ {
+ url : './link-upgrade/basic-link-upgrade.sub.html',
+ done_message : 'basic-link-upgrade',
+ },
+ {
+ url : './link-upgrade/iframe-link-upgrade.sub.html',
+ done_message : 'iframe-link-upgrade',
+ },
+ {
+ url : './link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html',
+ done_message : 'iframe-top-navigation-no-upgrade-1',
+ },
+ {
+ url : './link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html',
+ done_message : 'iframe-top-navigation-no-upgrade-2',
+ },
+ {
+ url : './link-upgrade/iframe-top-navigation-upgrade-1.sub.html',
+ done_message : 'iframe-top-navigation-upgrade-1',
+ },
+ {
+ url : './link-upgrade/iframe-top-navigation-upgrade-2.sub.html',
+ done_message : 'iframe-top-navigation-upgrade-2',
+ },
+ {
+ url : './link-upgrade/iframe-top-navigation-upgrade-meta.sub.html',
+ done_message : 'iframe-top-navigation-upgrade-meta',
+ },
+ ];
+ for(let i = 0; i<test_data.length; i+=1) {
+ let data = test_data[i];
+ let test = async_test(data.url);
+ test.step(function() {
+ let w = window.open(data.url, data.url);
+ this.add_cleanup(() => w.close());
+ assert_true(w != undefined, "Popup must not be blocked");
+
+ window.addEventListener("message", event => {
+ if (event.data == data.done_message)
+ test.done();
+ });
+ });
+
+ test.step_timeout(function(){test.force_timeout()}, 5000);
+ }
+ </script>
+ </body>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html
new file mode 100644
index 00000000000..c1a600f525e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html
@@ -0,0 +1,19 @@
+<html>
+ <title>Upgrade Insecure Requests: link no upgrade.</title>
+ <head>
+ <script>
+ function click() {
+ document.getElementById("link").click();
+ }
+ </script>
+ </head>
+ <body onload="click()">
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number. So if
+ the url is upgraded, the url becomes invalid (https over the http port).
+ The expected behavior is that the url is not upgraded and the page loads.
+ -->
+ <a id="link"
+ href="http://{{domains[www]}}:{{ports[http][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html?message=basic-link-no-upgrade"> Click me </a>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-no-upgrade.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html
new file mode 100644
index 00000000000..ef41d3e9c7f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html
@@ -0,0 +1,19 @@
+<html>
+ <title>Upgrade Insecure Requests: link upgrade.</title>
+ <head>
+ <script>
+ function click() {
+ document.getElementById("link").click();
+ }
+ </script>
+ </head>
+ <body onload="click()">
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number, so we
+ specify this non-existent URL ('http' over https port). If UPGRADE doesn't
+ work, it won't load. The expected behavior is that the url is upgraded and
+ the page loads.
+ -->
+ <a id="link" href="http://{{host}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html?message=basic-link-upgrade"> Click me </a>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/basic-link-upgrade.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html
new file mode 100644
index 00000000000..ed058b61545
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html
@@ -0,0 +1,11 @@
+<!--
+ This document has set "Content-Security-Policy: upgrade-insecure-requests". It
+ contains an iframe. This iframe clicks on a link to the same host. The link
+ must be upgraded.
+
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number. So if
+ the url is not upgraded, the url is invalid (http over the https port).
+ The expected behavior is that the url is upgraded and the page loads.
+-->
+<iframe src= "./resources/click-on-link.sub.html?url=http://{{host}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-link-upgrade">
+</iframe>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-link-upgrade.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html
new file mode 100644
index 00000000000..1b514e2da72
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html
@@ -0,0 +1,16 @@
+<html>
+ <head>
+ <title>Upgrade Insecure Requests: top-frame navigation inside iframe (no upgrade expected)</title>
+ </head>
+ <body>
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number. So if the
+ url is upgraded, the url becomes invalid (https over the http port). The
+ expected behavior is that the url is not upgraded and the page loads.
+ -->
+ <iframe
+ sandbox="allow-scripts allow-top-navigation"
+ src="https://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html?url=http://{{domains[www]}}:{{ports[http][1]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-top-navigation-no-upgrade-1"
+ ></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-1.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html
new file mode 100644
index 00000000000..386a86fdbdb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-no-upgrade-2.sub.html
@@ -0,0 +1,16 @@
+<html>
+ <head>
+ <title>Upgrade Insecure Requests: top-frame navigation inside iframe (no upgrade expected)</title>
+ </head>
+ <body>
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number. So if the
+ url is upgraded, the url becomes invalid (https over the http port). The
+ expected behavior is that the url is not upgraded and the page loads.
+ -->
+ <iframe
+ sandbox="allow-scripts allow-top-navigation"
+ src="https://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html?url=http://{{host}}:{{ports[http][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-top-navigation-no-upgrade-2"
+ ></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html
new file mode 100644
index 00000000000..13c76e82c86
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html
@@ -0,0 +1,17 @@
+<html>
+ <head>
+ <title>Upgrade Insecure Requests: top-frame navigation inside iframe (upgrade expected)</title>
+ </head>
+ <body>
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number, so we
+ specify this non-existent URL ('http' over https port). If UPGRADE doesn't
+ work, it won't load. The expected behavior is that the url is upgraded and
+ the page loads.
+ -->
+ <iframe
+ sandbox="allow-scripts allow-top-navigation"
+ src="https://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html?url=http://{{host}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-top-navigation-upgrade-1"
+ ></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-1.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html
new file mode 100644
index 00000000000..651d76d93b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html
@@ -0,0 +1,17 @@
+<html>
+ <head>
+ <title>Upgrade Insecure Requests: top-frame navigation inside iframe (upgrade expected)</title>
+ </head>
+ <body>
+ <!--
+ This is a bit of a hack. UPGRADE doesn't upgrade the port number, so we
+ specify this non-existent URL ('http' over https port). If UPGRADE doesn't
+ work, it won't load. The expected behavior is that the url is upgraded and
+ the page loads.
+ -->
+ <iframe
+ sandbox="allow-scripts allow-top-navigation"
+ src="https://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html?url=http://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-top-navigation-upgrade-2"
+ ></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-2.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html
new file mode 100644
index 00000000000..e43050eb5b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/iframe-top-navigation-upgrade-meta.sub.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title>Upgrade Insecure Requests: top-frame navigation inside iframe (upgrade expected)</title>
+ <script>
+ function iframe_onload() {
+ var iframe = document.getElementsByTagName("iframe")[0];
+ iframe.onload = null;
+
+ // Enable upgrade-insecure-requests dynamically.
+ var meta = document.createElement('meta');
+ meta.httpEquiv = "Content-Security-Policy";
+ meta.content = "upgrade-insecure-requests";
+ document.getElementsByTagName('head')[0].appendChild(meta);
+
+ // This is a bit of a hack. UPGRADE doesn't upgrade the port number,
+ // so we specify this non-existent URL ('http' over port https port). If
+ // UPGRADE doesn't work, it won't load. The expected behavior is that
+ // the url is upgraded and the page loads.
+ iframe.src =
+ "https://{{domains[www]}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html?url=http://{{host}}:{{ports[https][0]}}/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html%3Fmessage=iframe-top-navigation-upgrade-meta"
+ }
+ </script>
+ </head>
+ <body>
+ <iframe
+ sandbox = "allow-scripts allow-top-navigation"
+ src = "./resources/dummy.html"
+ onload = "iframe_onload()"
+ ></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html
new file mode 100644
index 00000000000..d2899c8873f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/click-on-link.sub.html
@@ -0,0 +1,10 @@
+<body>
+ coucou
+ <a href="{{GET[url]}}">Click me</a>
+</body>
+
+<script>
+ window.addEventListener("load", function() {
+ document.getElementsByTagName("a")[0].click();
+ })
+</script>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/dummy.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/dummy.html
new file mode 100644
index 00000000000..1c56b516659
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/dummy.html
@@ -0,0 +1 @@
+I am not an interesting file...
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html
new file mode 100644
index 00000000000..35332900d18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html
@@ -0,0 +1,5 @@
+<script>
+ window.addEventListener("load", function() {
+ window.top.location.href = "{{GET[url]}}";
+ })
+</script>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers
new file mode 100644
index 00000000000..602d9dc38d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame-upgrade.sub.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: upgrade-insecure-requests
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html
new file mode 100644
index 00000000000..35332900d18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/navigate-top-frame.sub.html
@@ -0,0 +1,5 @@
+<script>
+ window.addEventListener("load", function() {
+ window.top.location.href = "{{GET[url]}}";
+ })
+</script>
diff --git a/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html
new file mode 100644
index 00000000000..5cf2df57323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/upgrade-insecure-requests/link-upgrade/resources/post-message-to-opener.sub.html
@@ -0,0 +1,3 @@
+<script>
+ top.opener.postMessage("{{GET[message]}}", "*");
+</script>
diff --git a/tests/wpt/web-platform-tests/visual-viewport/viewport-resize-event-on-load-overflowing-page.html b/tests/wpt/web-platform-tests/visual-viewport/viewport-resize-event-on-load-overflowing-page.html
index b0603c8752d..c4b36879ad1 100644
--- a/tests/wpt/web-platform-tests/visual-viewport/viewport-resize-event-on-load-overflowing-page.html
+++ b/tests/wpt/web-platform-tests/visual-viewport/viewport-resize-event-on-load-overflowing-page.html
@@ -26,11 +26,13 @@
});
window.addEventListener('load', function() {
- requestAnimationFrame(
- t.step_func_done(function() {
- var isOverlay = calculateScrollbarThickness() == 0;
- assert_equals(numViewResizes, isOverlay ? 0 : 1);
- }));
+ requestAnimationFrame(function() {
+ requestAnimationFrame(
+ t.step_func_done(function() {
+ var isOverlay = calculateScrollbarThickness() == 0;
+ assert_equals(numViewResizes, isOverlay ? 0 : 1);
+ }));
+ });
});
}
</script>
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py
index 88da4f110cf..52f258243fa 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py
@@ -37,7 +37,7 @@ invalid_data = [
{"proxyType": 1}, {"proxyType": []}, {"proxyType": {"value": "system"}},
{" proxyType": "system"}, {"proxyType ": "system"}, {"proxyType ": " system"},
{"proxyType": "system "}]),
- ("timeouts", [1, [], "{}", {}, False, {"pageLOAD": 10}, {"page load": 10},
+ ("timeouts", [1, [], "{}", False, {"pageLOAD": 10}, {"page load": 10},
{"page load": 10}, {"pageLoad": "10"}, {"pageLoad": {"value": 10}},
{"invalid": 10}, {"pageLoad": -1}, {"pageLoad": 2**64},
{"pageLoad": None}, {"pageLoad": 1.1}, {"pageLoad": 10, "invalid": 10},
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/support/create.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/support/create.py
index 75ac3e8dc41..231199d120f 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/support/create.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/support/create.py
@@ -6,6 +6,10 @@ valid_data = [
("platformName", [None]),
("pageLoadStrategy", ["none", "eager", "normal", None]),
("proxy", [None]),
+ ("timeouts", [{"script": 0, "pageLoad": 2.0, "implicit": 2**64 - 1},
+ {"script": 50, "pageLoad": 25},
+ {"script": 500},
+ {}]),
("unhandledPromptBehavior", ["dismiss", "accept", None]),
("test:extension", [True, "abc", 123, [], {"key": "value"}, None]),
]
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html
new file mode 100644
index 00000000000..db177aebe38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html
@@ -0,0 +1,403 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.getStats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCStats-helper.js"></script>
+<script>
+ 'use strict';
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // doSignalingHandshake
+ // getUserMediaTracksAndStreams
+
+ // The following helper functions are called from RTCStats-helper.js
+ // (depends on dictionary-helper.js):
+ // validateRtcStats
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let track;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ track = tracks[0];
+ pc.addTrack(track);
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', track.id);
+ assert_true(trackStats != null, 'Has stats for track');
+ // TODO(hbos): Here and elsewhere, validateRtcStats() only tests id,
+ // timestamp and type is correct type. Should validate based on stats type
+ // but it expects both audio and video members.
+ // https://github.com/w3c/web-platform-tests/issues/9010
+ validateRtcStats(report, trackStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'addTrack() without setLocalDescription() yields track stats');
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let stream;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ let track = tracks[0];
+ stream = streams[0];
+ pc.addTrack(track, stream);
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let streamStats = findStatsByTypeAndId(report, 'stream', stream.id);
+ assert_true(streamStats != null, 'Has stats for stream');
+ validateRtcStats(report, streamStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'addTrack() without setLocalDescription() yields media stream stats');
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let track;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ track = tracks[0];
+ pc.addTrack(track);
+ return pc.createOffer();
+ }))
+ .then(t.step_func(offer => {
+ return pc.setLocalDescription(offer);
+ }))
+ .then(t.step_func(() => {
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', track.id);
+ assert_true(trackStats != null, 'Has stats for track');
+ validateRtcStats(report, trackStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'addTrack() with setLocalDescription() yields track stats');
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let stream;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ let track = tracks[0];
+ stream = streams[0];
+ pc.addTrack(track, stream);
+ return pc.createOffer();
+ }))
+ .then(t.step_func(offer => {
+ return pc.setLocalDescription(offer);
+ }))
+ .then(t.step_func(() => {
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let streamStats = findStatsByTypeAndId(report, 'stream', stream.id);
+ assert_true(streamStats != null, 'Has stats for stream');
+ validateRtcStats(report, streamStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'addTrack() with setLocalDescription() yields media stream stats');
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let track;
+ let stream;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ track = tracks[0];
+ stream = streams[0];
+ pc.addTrack(track, stream);
+ return pc.createOffer();
+ }))
+ .then(t.step_func(offer => {
+ return pc.setLocalDescription(offer);
+ }))
+ .then(t.step_func(() => {
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', track.id);
+ let streamStats = findStatsByTypeAndId(report, 'stream', stream.id);
+ assert_true(trackStats != null && streamStats != null,
+ 'Has stats for track and stream');
+ assert_array_equals(streamStats.trackIds, [ trackStats.id ],
+ 'streamStats.trackIds == [ trackStats.id ]');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, streamStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'addTrack(): Media stream stats references track stats');
+
+ // TODO(hbos): addStream() is legacy API not in the spec. Based on discussion
+ // whether to standardize in legacy section, consider removing this test or
+ // keeping it until addTrack() has wide support.
+ // https://github.com/w3c/webrtc-pc/issues/1705
+ // https://github.com/w3c/webrtc-pc/issues/1125
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ let track;
+ let stream;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ track = tracks[0];
+ stream = streams[0];
+ stream.addTrack(track);
+ pc.addStream(stream);
+ return pc.createOffer();
+ }))
+ .then(t.step_func(offer => {
+ return pc.setLocalDescription(offer);
+ }))
+ .then(t.step_func(() => {
+ return pc.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', track.id);
+ let streamStats = findStatsByTypeAndId(report, 'stream', stream.id);
+ assert_true(trackStats != null && streamStats != null,
+ 'Has stats for track and stream');
+ assert_array_equals(streamStats.trackIds, [ trackStats.id ],
+ 'streamStats.trackIds == [ trackStats.id ]');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, streamStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'Legacy addStream(): Media stream stats references track stats');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let sendingTrack;
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ sendingTrack = tracks[0];
+ caller.addTrack(sendingTrack);
+ return doSignalingHandshake(caller, callee);
+ }))
+ .then(t.step_func(() => {
+ return caller.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', sendingTrack.id);
+ assert_true(trackStats != null, 'Has stats for sending track');
+ let outboundStats = findStatsByTypeAndMember(report, 'outbound-rtp',
+ 'trackId', trackStats.id);
+ assert_true(outboundStats != null, 'Has stats for outbound RTP stream');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, outboundStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'O/A exchange yields outbound RTP stream stats for sending track');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let receivingTrack;
+ callee.ontrack = trackEvent => {
+ assert_true(receivingTrack == undefined, 'ontrack has not fired before');
+ receivingTrack = trackEvent.track;
+ };
+ return getUserMediaTracksAndStreams(1)
+ .then(t.step_func(([tracks, streams]) => {
+ caller.addTrack(tracks[0]);
+ return doSignalingHandshake(caller, callee);
+ }))
+ .then(t.step_func(() => {
+ return callee.getStats();
+ }))
+ .then(t.step_func(report => {
+ assert_true(receivingTrack != null, 'Has a receiving track');
+ let trackStats = findStatsByTypeAndId(report, 'track', receivingTrack.id);
+ assert_true(trackStats != null, 'Has stats for receiving track');
+ let inboundStats = findStatsByTypeAndMember(report, 'inbound-rtp',
+ 'trackId', trackStats.id);
+ assert_true(inboundStats != null, 'Has stats for outbound RTP stream');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, inboundStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'O/A exchange yields inbound RTP stream stats for receiving track');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let sendingTrack1;
+ let sendingTrack2;
+ let sender;
+ return getUserMediaTracksAndStreams(2)
+ .then(t.step_func(([tracks, streams]) => {
+ sendingTrack1 = tracks[0];
+ sendingTrack2 = tracks[1];
+ sender = caller.addTrack(sendingTrack1);
+ return sender.replaceTrack(sendingTrack2);
+ }))
+ .then(t.step_func(() => {
+ return caller.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', sendingTrack2.id);
+ assert_true(trackStats != null, 'Has stats for replaced track');
+ validateRtcStats(report, trackStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'replaceTrack() before offer: new track attachment stats present');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let sendingTrack1;
+ let sendingTrack2;
+ let sender;
+ return getUserMediaTracksAndStreams(2)
+ .then(t.step_func(([tracks, streams]) => {
+ sendingTrack1 = tracks[0];
+ sendingTrack2 = tracks[1];
+ sender = caller.addTrack(sendingTrack1);
+ return performOffer(caller, callee);
+ }))
+ .then(t.step_func(() => {
+ return sender.replaceTrack(sendingTrack2);
+ }))
+ .then(t.step_func(() => {
+ return caller.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', sendingTrack2.id);
+ assert_true(trackStats != null, 'Has stats for replaced track');
+ let outboundStats = findStatsByTypeAndMember(report, 'outbound-rtp',
+ 'trackId', trackStats.id);
+ assert_true(outboundStats != null, 'Has stats for outbound RTP stream');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, outboundStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'replaceTrack() after offer, before answer: new track attachment stats ' +
+ 'present');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let sendingTrack1;
+ let sendingTrack2;
+ let sender;
+ return getUserMediaTracksAndStreams(2)
+ .then(t.step_func(([tracks, streams]) => {
+ sendingTrack1 = tracks[0];
+ sendingTrack2 = tracks[1];
+ sender = caller.addTrack(sendingTrack1);
+ return doSignalingHandshake(caller, callee);
+ }))
+ .then(t.step_func(() => {
+ return sender.replaceTrack(sendingTrack2);
+ }))
+ .then(t.step_func(() => {
+ return caller.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', sendingTrack2.id);
+ assert_true(trackStats != null, 'Has stats for replaced track');
+ let outboundStats = findStatsByTypeAndMember(report, 'outbound-rtp',
+ 'trackId', trackStats.id);
+ assert_true(outboundStats != null, 'Has stats for outbound RTP stream');
+ validateRtcStats(report, trackStats);
+ validateRtcStats(report, outboundStats);
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'replaceTrack() after answer: new track attachment stats present');
+
+ async_test(t => {
+ const caller = new RTCPeerConnection();
+ const callee = new RTCPeerConnection();
+ let sendingTrack1;
+ let sendingTrack2;
+ let sender;
+ return getUserMediaTracksAndStreams(2)
+ .then(t.step_func(([tracks, streams]) => {
+ sendingTrack1 = tracks[0];
+ sendingTrack2 = tracks[1];
+ sender = caller.addTrack(sendingTrack1);
+ return doSignalingHandshake(caller, callee);
+ }))
+ .then(t.step_func(() => {
+ return sender.replaceTrack(sendingTrack2);
+ }))
+ .then(t.step_func(() => {
+ return caller.getStats();
+ }))
+ .then(t.step_func(report => {
+ let trackStats = findStatsByTypeAndId(report, 'track', sendingTrack1.id);
+ assert_true(trackStats != null, 'Has stats for original track');
+ assert_true(trackStats.objectDeleted);
+ let outboundStats = findStatsByTypeAndMember(report, 'outbound-rtp',
+ 'trackId', trackStats.id);
+ assert_true(outboundStats == null,
+ 'The outbound RTP stream should no longer reference the ' +
+ 'original attachment');
+ t.done();
+ }))
+ .catch(t.step_func(reason => {
+ assert_unreached(reason);
+ }));
+ }, 'replaceTrack(): original track attachment stats present after replacing');
+
+ // Helpers.
+
+ function findStatsByTypeAndId(report, type, identifier) {
+ return findStats(report, stats => {
+ return stats.type == type && stats[type + 'Identifier'] == identifier;
+ });
+ }
+
+ function findStatsByTypeAndMember(report, type, member, value) {
+ return findStats(report, stats => {
+ return stats.type == type && stats[member] == value;
+ });
+ }
+
+ function findStats(report, findFunc) {
+ for (let it = report.values(), n = it.next(); !n.done; n = it.next()) {
+ if (findFunc(n.value))
+ return n.value;
+ }
+ return null;
+ }
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize.html b/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize.html
index 7d73cc5a3b5..d7f836292eb 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-maxMessageSize.html
@@ -86,11 +86,11 @@ promise_test(t => {
assert_not_equals(pc.sctp, null);
// Test outcome depends on canSendSize value
if (canSendSize) {
- assert_equals(pc.sctp.maxMessageSize, Math.min(65535, canSendSize),
- 'Missing SDP attribute and a non-zero canSendSize should give an maxMessageSize of min(65535, canSendSize)');
+ assert_equals(pc.sctp.maxMessageSize, Math.min(65536, canSendSize),
+ 'Missing SDP attribute and a non-zero canSendSize should give an maxMessageSize of min(65536, canSendSize)');
} else {
- assert_equals(pc.sctp.maxMessageSize, 65535,
- 'Missing SDP attribute and a canSendSize of 0 should give an maxMessageSize of 65535');
+ assert_equals(pc.sctp.maxMessageSize, 65536,
+ 'Missing SDP attribute and a canSendSize of 0 should give an maxMessageSize of 65536');
}
});
}, 'Remote offer SDP missing max-message-size attribute');
@@ -172,7 +172,7 @@ promise_test(t => {
assert_equals(pc.sctp.maxMessageSize, canSendSize,
'A remote value larger than a non-zero canSendSize should limit maxMessageSize to canSendSize');
} else {
- assert_equals(pc.sctp.maxMessageSize, 65535,
+ assert_equals(pc.sctp.maxMessageSize, 65536,
'A canSendSize of zero should let the remote value set maxMessageSize');
}
});
diff --git a/tests/wpt/web-platform-tests/webxr/interfaces.https.html b/tests/wpt/web-platform-tests/webxr/interfaces.https.html
new file mode 100644
index 00000000000..e04764e5f61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/interfaces.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>WebXR Device API IDL Tests</title>
+<link rel="help" href="https://immersive-web.github.io/webxr/spec/latest/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script>
+"use strict";
+
+promise_test(async () => {
+ const idl_array = new IdlArray();
+ const dom_idl = await fetch("/interfaces/dom.idl").then(r => r.text());
+ const webxr_idl = await fetch("/interfaces/webxr.idl").then(r => r.text());
+
+ idl_array.add_untested_idls(dom_idl);
+ idl_array.add_untested_idls("interface Navigator {};");
+ idl_array.add_idls(webxr_idl);
+ idl_array.add_objects({
+ Navigator:['navigator'],
+ });
+ idl_array.test();
+}, "Test IDL implementation of WebXR API");
+</script>
diff --git a/tests/wpt/web-platform-tests/worklets/layout-worklet-credentials.https.html b/tests/wpt/web-platform-tests/worklets/layout-worklet-credentials.https.html
new file mode 100644
index 00000000000..9468d2da7d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/layout-worklet-credentials.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/worklet-test-utils.js"></script>
+ <script src="resources/credentials-tests.js"></script>
+</head>
+<body>
+<script>
+ runCredentialsTests("layout");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/layout-worklet-csp.https.html b/tests/wpt/web-platform-tests/worklets/layout-worklet-csp.https.html
new file mode 100644
index 00000000000..854df8c8e18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/layout-worklet-csp.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/worklet-test-utils.js"></script>
+ <script src="resources/csp-tests.js"></script>
+</head>
+<body>
+<script>
+ runContentSecurityPolicyTests("layout");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/layout-worklet-import.https.html b/tests/wpt/web-platform-tests/worklets/layout-worklet-import.https.html
new file mode 100644
index 00000000000..a2f57c221b7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/layout-worklet-import.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/worklet-test-utils.js"></script>
+ <script src="resources/import-tests.js"></script>
+</head>
+<body>
+<script>
+ runImportTests("layout");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/layout-worklet-referrer.https.html b/tests/wpt/web-platform-tests/worklets/layout-worklet-referrer.https.html
new file mode 100644
index 00000000000..cb383a935a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/layout-worklet-referrer.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/worklet-test-utils.js"></script>
+ <script src="resources/referrer-tests.js"></script>
+</head>
+<body>
+<script>
+ runReferrerTests("layout");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/layout-worklet-service-worker-interception.https.html b/tests/wpt/web-platform-tests/worklets/layout-worklet-service-worker-interception.https.html
new file mode 100644
index 00000000000..146dff9e53a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/layout-worklet-service-worker-interception.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/worklet-test-utils.js"></script>
+ <script src="resources/service-worker-interception-tests.js"></script>
+ <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+</head>
+<body>
+<script>
+ runServiceWorkerInterceptionTests("layout");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/resources/worklet-test-utils.js b/tests/wpt/web-platform-tests/worklets/resources/worklet-test-utils.js
index 4912dadb9d5..f7f28b41cd1 100644
--- a/tests/wpt/web-platform-tests/worklets/resources/worklet-test-utils.js
+++ b/tests/wpt/web-platform-tests/worklets/resources/worklet-test-utils.js
@@ -1,8 +1,10 @@
// Returns a reference to a worklet object corresponding to a given type.
function get_worklet(type) {
- if (type == 'paint')
- return CSS.paintWorklet;
if (type == 'animation')
return window.animationWorklet;
+ if (type == 'layout')
+ return CSS.layoutWorklet;
+ if (type == 'paint')
+ return CSS.paintWorklet;
return undefined;
}
diff --git a/tests/wpt/web-platform-tests/xhr/interfaces.html b/tests/wpt/web-platform-tests/xhr/interfaces.html
index 56ba5523e31..cc98075dd7a 100644
--- a/tests/wpt/web-platform-tests/xhr/interfaces.html
+++ b/tests/wpt/web-platform-tests/xhr/interfaces.html
@@ -14,113 +14,16 @@
callback EventHandlerNonNull = any (Event event);
typedef EventHandlerNonNull? EventHandler;
</script>
-<script type=text/plain>
-/*[Exposed=(Window,Worker)]*/
-interface XMLHttpRequestEventTarget : EventTarget {
- // event handlers
- attribute EventHandler onloadstart;
- attribute EventHandler onprogress;
- attribute EventHandler onabort;
- attribute EventHandler onerror;
- attribute EventHandler onload;
- attribute EventHandler ontimeout;
- attribute EventHandler onloadend;
-};
-
-/*[Exposed=(Window,Worker)]*/
-interface XMLHttpRequestUpload : XMLHttpRequestEventTarget {
-};
-
-enum XMLHttpRequestResponseType {
- "",
- "arraybuffer",
- "blob",
- "document",
- "json",
- "text"
-};
-
-[Constructor/*,
- Exposed=(Window,Worker)*/]
-interface XMLHttpRequest : XMLHttpRequestEventTarget {
- // event handler
- attribute EventHandler onreadystatechange;
-
- // states
- const unsigned short UNSENT = 0;
- const unsigned short OPENED = 1;
- const unsigned short HEADERS_RECEIVED = 2;
- const unsigned short LOADING = 3;
- const unsigned short DONE = 4;
- readonly attribute unsigned short readyState;
-
- // request
- void open(ByteString method, USVString url);
- void open(ByteString method, USVString url, boolean async, optional USVString? username = null, optional USVString? password = null);
- void setRequestHeader(ByteString name, ByteString value);
- attribute unsigned long timeout;
- attribute boolean withCredentials;
- readonly attribute XMLHttpRequestUpload upload;
- void send(optional (Document or BodyInit)? body = null);
- void abort();
-
- // response
- readonly attribute USVString responseURL;
- readonly attribute unsigned short status;
- readonly attribute ByteString statusText;
- ByteString? getResponseHeader(ByteString name);
- ByteString getAllResponseHeaders();
- void overrideMimeType(DOMString mime);
- attribute XMLHttpRequestResponseType responseType;
- readonly attribute any response;
- readonly attribute USVString responseText;
- [Exposed=Window] readonly attribute Document? responseXML;
-};
-
-typedef (File or USVString) FormDataEntryValue;
-
-[Constructor(optional HTMLFormElement form)/*,
- Exposed=(Window,Worker)*/]
-interface FormData {
- void append(USVString name, Blob value, optional USVString filename);
- void append(USVString name, USVString value);
- void delete(USVString name);
- FormDataEntryValue? get(USVString name);
- sequence<FormDataEntryValue> getAll(USVString name);
- boolean has(USVString name);
- void set(USVString name, Blob value, optional USVString filename);
- void set(USVString name, USVString value);
- /*iterable<USVString, FormDataEntryValue>;*/
-};
-
-[Constructor(DOMString type, optional ProgressEventInit eventInitDict)/*,
- Exposed=(Window,Worker)*/]
-interface ProgressEvent : Event {
- readonly attribute boolean lengthComputable;
- readonly attribute unsigned long long loaded;
- readonly attribute unsigned long long total;
-};
-
-dictionary ProgressEventInit : EventInit {
- boolean lengthComputable = false;
- unsigned long long loaded = 0;
- unsigned long long total = 0;
-};
-</script>
<script>
"use strict";
var form = document.createElement("form");
var idlArray = new IdlArray();
-function doTest(domIdl) {
+function doTest([domIdl, xhrIdl]) {
idlArray.add_untested_idls(domIdl);
- [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
- if (node.className == "untested") {
- idlArray.add_untested_idls(node.textContent);
- } else {
- idlArray.add_idls(node.textContent);
- }
- });
+ var untestedIdl = document.querySelector("script.untested").textContent;
+ idlArray.add_untested_idls(untestedIdl);
+ idlArray.add_idls(xhrIdl);
idlArray.add_objects({
XMLHttpRequest: ['new XMLHttpRequest()'],
XMLHttpRequestUpload: ['(new XMLHttpRequest()).upload'],
@@ -129,8 +32,13 @@ function doTest(domIdl) {
idlArray.test();
}
-promise_test(function() {
- return fetch("/interfaces/dom.idl").then(response => response.text())
- .then(doTest);
+function fetchText(url) {
+ return fetch(url).then(response => response.text());
+}
+
+promise_test(() => {
+ return Promise.all(["/interfaces/dom.idl",
+ "/interfaces/xhr.idl"].map(fetchText))
+ .then(doTest);
}, "Test driver");
</script>
diff --git a/tests/wpt/web-platform-tests/xhr/xmlhttprequest-sync-default-feature-policy.sub.html b/tests/wpt/web-platform-tests/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
index ade343716b1..1866100bf06 100644
--- a/tests/wpt/web-platform-tests/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
+++ b/tests/wpt/web-platform-tests/xhr/xmlhttprequest-sync-default-feature-policy.sub.html
@@ -11,8 +11,7 @@
run_all_fp_tests_allow_all(
'http://{{domains[www]}}:{{ports[http][0]}}',
'sync-xhr',
- 'InvalidAccessError: Failed to execute \'open\' on \'XMLHttpRequest\': ' +
- 'Synchronous requests are disabled by Feature Policy.',
+ 'NetworkError',
() => {
return new Promise((resolve, reject) => {
try {