diff options
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 Binary files differnew file mode 100644 index 00000000000..e34419263f9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-paint-api/resources/html5.png 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 Binary files differnew file mode 100644 index 00000000000..b98ca0ba0a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-typed-om/resources/1x1-green.png 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> </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> </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> </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 Binary files differnew file mode 100644 index 00000000000..c866bfedf91 --- /dev/null +++ b/tests/wpt/web-platform-tests/images/pattern.mp4 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 Binary files differdeleted file mode 100644 index f9cbd5300ad..00000000000 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/b2g_setup/certtest_app.zip +++ /dev/null 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 { |