mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Update web-platform-tests to revision 2df7f9ff620cbdaa2928464892fb1dfb880fd6c6
This commit is contained in:
parent
97e3c5f3a9
commit
7ba3376dde
74 changed files with 1985 additions and 504 deletions
|
@ -14,6 +14,9 @@
|
||||||
[Revoke blob URL after creating Request, will fetch]
|
[Revoke blob URL after creating Request, will fetch]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Revoke blob URL after calling fetch, fetch should succeed]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
||||||
[url-with-fetch.any.html]
|
[url-with-fetch.any.html]
|
||||||
[Untitled]
|
[Untitled]
|
||||||
|
@ -34,3 +37,6 @@
|
||||||
[Revoke blob URL after creating Request, will fetch]
|
[Revoke blob URL after creating Request, will fetch]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Revoke blob URL after calling fetch, fetch should succeed]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -109729,6 +109729,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-layout-button-001.html": [
|
||||||
|
[
|
||||||
|
"/css/css-contain/contain-layout-button-001.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-contain/reference/contain-layout-button-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/contain-layout-cell-001.html": [
|
"css/css-contain/contain-layout-cell-001.html": [
|
||||||
[
|
[
|
||||||
"/css/css-contain/contain-layout-cell-001.html",
|
"/css/css-contain/contain-layout-cell-001.html",
|
||||||
|
@ -109753,6 +109765,30 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-layout-flexbox-001.html": [
|
||||||
|
[
|
||||||
|
"/css/css-contain/contain-layout-flexbox-001.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-contain/reference/contain-layout-flexbox-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"css/css-contain/contain-layout-grid-001.html": [
|
||||||
|
[
|
||||||
|
"/css/css-contain/contain-layout-grid-001.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-contain/reference/contain-layout-grid-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/contain-layout-ifc-022.html": [
|
"css/css-contain/contain-layout-ifc-022.html": [
|
||||||
[
|
[
|
||||||
"/css/css-contain/contain-layout-ifc-022.html",
|
"/css/css-contain/contain-layout-ifc-022.html",
|
||||||
|
@ -110341,6 +110377,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-paint-clip-019.html": [
|
||||||
|
[
|
||||||
|
"/css/css-contain/contain-paint-clip-019.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/css-contain/reference/contain-paint-clip-019-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/contain-paint-ifc-011.html": [
|
"css/css-contain/contain-paint-ifc-011.html": [
|
||||||
[
|
[
|
||||||
"/css/css-contain/contain-paint-ifc-011.html",
|
"/css/css-contain/contain-paint-ifc-011.html",
|
||||||
|
@ -120897,6 +120945,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-grid/alignment/grid-gutters-013.html": [
|
||||||
|
[
|
||||||
|
"/css/css-grid/alignment/grid-gutters-013.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/reference/ref-filled-green-100px-square.xht",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html": [
|
"css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html": [
|
||||||
[
|
[
|
||||||
"/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html",
|
"/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html",
|
||||||
|
@ -172081,6 +172141,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html": [
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html",
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html",
|
||||||
|
"=="
|
||||||
|
]
|
||||||
|
],
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html": [
|
||||||
[
|
[
|
||||||
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html",
|
"/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html",
|
||||||
|
@ -248225,11 +248297,26 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-button-001-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-layout-cell-001-ref.html": [
|
"css/css-contain/reference/contain-layout-cell-001-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-flexbox-001-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-grid-001-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-layout-ifc-022-ref.html": [
|
"css/css-contain/reference/contain-layout-ifc-022-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -248290,6 +248377,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-paint-clip-019-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-paint-ifc-011-ref.html": [
|
"css/css-contain/reference/contain-paint-ifc-011-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -275025,6 +275117,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -314165,6 +314262,11 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"webrtc/RTCIceTransport-extension-helper.js": [
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"webrtc/RTCPeerConnection-helper.js": [
|
"webrtc/RTCPeerConnection-helper.js": [
|
||||||
[
|
[
|
||||||
{}
|
{}
|
||||||
|
@ -332830,6 +332932,12 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"css/css-flexbox/flex-minimum-height-flex-items-009.html": [
|
||||||
|
[
|
||||||
|
"/css/css-flexbox/flex-minimum-height-flex-items-009.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"css/css-flexbox/flexbox_first-letter.html": [
|
"css/css-flexbox/flexbox_first-letter.html": [
|
||||||
[
|
[
|
||||||
"/css/css-flexbox/flexbox_first-letter.html",
|
"/css/css-flexbox/flexbox_first-letter.html",
|
||||||
|
@ -335436,9 +335544,9 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"css/css-masking/inheritance.html": [
|
"css/css-masking/inheritance.sub.html": [
|
||||||
[
|
[
|
||||||
"/css/css-masking/inheritance.html",
|
"/css/css-masking/inheritance.sub.html",
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -371266,6 +371374,12 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"intersection-observer/target-in-different-window.html": [
|
||||||
|
[
|
||||||
|
"/intersection-observer/target-in-different-window.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"intersection-observer/text-target.html": [
|
"intersection-observer/text-target.html": [
|
||||||
[
|
[
|
||||||
"/intersection-observer/text-target.html",
|
"/intersection-observer/text-target.html",
|
||||||
|
@ -396946,6 +397060,12 @@
|
||||||
{
|
{
|
||||||
"timeout": "long"
|
"timeout": "long"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"/service-workers/service-worker/navigation-redirect.https.html?client",
|
||||||
|
{
|
||||||
|
"timeout": "long"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/navigation-timing.https.html": [
|
"service-workers/service-worker/navigation-timing.https.html": [
|
||||||
|
@ -397986,6 +398106,18 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"speech-api/SpeechSynthesisErrorEvent-constructor.html": [
|
||||||
|
[
|
||||||
|
"/speech-api/SpeechSynthesisErrorEvent-constructor.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"speech-api/SpeechSynthesisEvent-constructor.html": [
|
||||||
|
[
|
||||||
|
"/speech-api/SpeechSynthesisEvent-constructor.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"speech-api/SpeechSynthesisUtterance-basics.https.html": [
|
"speech-api/SpeechSynthesisUtterance-basics.https.html": [
|
||||||
[
|
[
|
||||||
"/speech-api/SpeechSynthesisUtterance-basics.https.html",
|
"/speech-api/SpeechSynthesisUtterance-basics.https.html",
|
||||||
|
@ -437900,7 +438032,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"README.md": [
|
"README.md": [
|
||||||
"684f4617f689d0611b18ce1b338bfdeb8d5886b7",
|
"6f9436bc3e4261e2f6813253e1709cbb60763ca2",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"WebCryptoAPI/META.yml": [
|
"WebCryptoAPI/META.yml": [
|
||||||
|
@ -439248,11 +439380,11 @@
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
"accname/name_test_case_659-manual.html": [
|
"accname/name_test_case_659-manual.html": [
|
||||||
"1332c30c4929430bdc7839bb543c1078fa67047a",
|
"abf5e85e16ba7bc28d157127db0607a9a6023de2",
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
"accname/name_test_case_660-manual.html": [
|
"accname/name_test_case_660-manual.html": [
|
||||||
"66b36635d940fcf5e34fdc89ecd193ad09c1a7ba",
|
"0c18218707b0320f114aeafe3e2b5b601c692620",
|
||||||
"manual"
|
"manual"
|
||||||
],
|
],
|
||||||
"accname/name_test_case_661-manual.html": [
|
"accname/name_test_case_661-manual.html": [
|
||||||
|
@ -441732,7 +441864,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"background-fetch/fetch.https.window.js": [
|
"background-fetch/fetch.https.window.js": [
|
||||||
"98ecdfa3933c40b909793100b4b9f9cccb35cb86",
|
"b8b1ff0983cdce1c799d03c7f1856548fa649b17",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"background-fetch/get-ids.https.window.js": [
|
"background-fetch/get-ids.https.window.js": [
|
||||||
|
@ -441748,7 +441880,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"background-fetch/mixed-content-and-allowed-schemes.https.window.js": [
|
"background-fetch/mixed-content-and-allowed-schemes.https.window.js": [
|
||||||
"9f24f13581819ef444a89cb7549de900f5b98ef6",
|
"05b32501228fbb765a5c782102660ebd476f0168",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"background-fetch/port-blocking.https.window.js": [
|
"background-fetch/port-blocking.https.window.js": [
|
||||||
|
@ -441772,7 +441904,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"background-fetch/service_workers/sw.js": [
|
"background-fetch/service_workers/sw.js": [
|
||||||
"43d778c08914da6c8ff75acb819676895adbc180",
|
"af4655dbad4ef6ad6b17d79bb2645aee98ce1102",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"background-fetch/update-ui.https.window.js": [
|
"background-fetch/update-ui.https.window.js": [
|
||||||
|
@ -530931,6 +531063,10 @@
|
||||||
"fadb3c41c5363742eb88bdf803eac7cdbf5e7a8f",
|
"fadb3c41c5363742eb88bdf803eac7cdbf5e7a8f",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-layout-button-001.html": [
|
||||||
|
"e8beef7c0edfa20258b9600376d3ab245ca63f32",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-contain/contain-layout-cell-001.html": [
|
"css/css-contain/contain-layout-cell-001.html": [
|
||||||
"fa1af0eee6848a34c61f47861c22d9efb56ab059",
|
"fa1af0eee6848a34c61f47861c22d9efb56ab059",
|
||||||
"reftest"
|
"reftest"
|
||||||
|
@ -530939,6 +531075,14 @@
|
||||||
"331a0e6519b0af23ba91355584f0c37dfcf6a88e",
|
"331a0e6519b0af23ba91355584f0c37dfcf6a88e",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-layout-flexbox-001.html": [
|
||||||
|
"2b206edb57f46f3baa9dcfbcc24591b852cf8697",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
|
"css/css-contain/contain-layout-grid-001.html": [
|
||||||
|
"a6bcc4dbc2adda58602281eac5c2c0b2c0a9de61",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-contain/contain-layout-ifc-022.html": [
|
"css/css-contain/contain-layout-ifc-022.html": [
|
||||||
"3e4f3dafbf213c18a09cfd2a7512dd485c13f839",
|
"3e4f3dafbf213c18a09cfd2a7512dd485c13f839",
|
||||||
"reftest"
|
"reftest"
|
||||||
|
@ -531135,6 +531279,10 @@
|
||||||
"17bcccdeff538ea869a51d703acb80e9acc4b0ca",
|
"17bcccdeff538ea869a51d703acb80e9acc4b0ca",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/contain-paint-clip-019.html": [
|
||||||
|
"bd761b8a523bd9fa05dd88f57b6b1317b5c4c40b",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-contain/contain-paint-ifc-011.html": [
|
"css/css-contain/contain-paint-ifc-011.html": [
|
||||||
"b8a03936cbcc3ddcc88dc1237fab0af56f4bd72b",
|
"b8a03936cbcc3ddcc88dc1237fab0af56f4bd72b",
|
||||||
"reftest"
|
"reftest"
|
||||||
|
@ -531272,7 +531420,7 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-contain/contain-size-button-001.html": [
|
"css/css-contain/contain-size-button-001.html": [
|
||||||
"1e4965e9daf380aec19cf43902c409ad6b457370",
|
"4b2ecd7b76e421ea5dfffce6654d722142b5823c",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-contain/contain-size-fieldset-001.html": [
|
"css/css-contain/contain-size-fieldset-001.html": [
|
||||||
|
@ -531280,11 +531428,11 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-contain/contain-size-flexbox-001.html": [
|
"css/css-contain/contain-size-flexbox-001.html": [
|
||||||
"31e82f5d24c4aa673291a2ce25c660cf10977e28",
|
"16ba62eda041abe11424f63c65d6dfd46aa82570",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-contain/contain-size-grid-001.html": [
|
"css/css-contain/contain-size-grid-001.html": [
|
||||||
"f67f0e118e00b3426986b39226310c59b14a3755",
|
"4510c1e55368aeea38a79ba66059acd4d7660ddb",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/css-contain/contain-size-grid-002.html": [
|
"css/css-contain/contain-size-grid-002.html": [
|
||||||
|
@ -531399,10 +531547,22 @@
|
||||||
"c68bee1d0aa4f9201fb6e48cc25199f373128ca8",
|
"c68bee1d0aa4f9201fb6e48cc25199f373128ca8",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-button-001-ref.html": [
|
||||||
|
"11a784b213cbc05d10cdcc199a11055fe0c0fdfa",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-layout-cell-001-ref.html": [
|
"css/css-contain/reference/contain-layout-cell-001-ref.html": [
|
||||||
"9ff7f45e39ca741b4b334c1c9b3d1d5ee6759b73",
|
"9ff7f45e39ca741b4b334c1c9b3d1d5ee6759b73",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-flexbox-001-ref.html": [
|
||||||
|
"832e4c72c2cef426f2d759e77435290fff2f0d55",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"css/css-contain/reference/contain-layout-grid-001-ref.html": [
|
||||||
|
"b5ff8e0e0dad0cd586e7b899d8a7905b26063233",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-layout-ifc-022-ref.html": [
|
"css/css-contain/reference/contain-layout-ifc-022-ref.html": [
|
||||||
"682af7d4f44b22f987c069dbbee370520612bc10",
|
"682af7d4f44b22f987c069dbbee370520612bc10",
|
||||||
"support"
|
"support"
|
||||||
|
@ -531451,6 +531611,10 @@
|
||||||
"781a6d2f2f4e8810690ab321f7ff7bf3539044f3",
|
"781a6d2f2f4e8810690ab321f7ff7bf3539044f3",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
|
"css/css-contain/reference/contain-paint-clip-019-ref.html": [
|
||||||
|
"2a529c12c48e630cc7df146fe3e685afd85a42f0",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"css/css-contain/reference/contain-paint-ifc-011-ref.html": [
|
"css/css-contain/reference/contain-paint-ifc-011-ref.html": [
|
||||||
"229c8c2d74ba3f2b5cede6824091575835807092",
|
"229c8c2d74ba3f2b5cede6824091575835807092",
|
||||||
"support"
|
"support"
|
||||||
|
@ -531520,7 +531684,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-contain/reference/contain-size-button-001-ref.html": [
|
"css/css-contain/reference/contain-size-button-001-ref.html": [
|
||||||
"1cbaaccd1a0751c5dadf913e1fc31d130ff95259",
|
"eff64aa8e2ef0c7fbce03858e90ef0d9e2a7ee6b",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-contain/reference/contain-size-fieldset-001-ref.html": [
|
"css/css-contain/reference/contain-size-fieldset-001-ref.html": [
|
||||||
|
@ -531528,11 +531692,11 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-contain/reference/contain-size-flexbox-001-ref.html": [
|
"css/css-contain/reference/contain-size-flexbox-001-ref.html": [
|
||||||
"85628b59c48f7931e7d3e5a498da60cc264dc363",
|
"70f408643007d8338f401ef947f7bb24f1eaedc9",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-contain/reference/contain-size-grid-001-ref.html": [
|
"css/css-contain/reference/contain-size-grid-001-ref.html": [
|
||||||
"d71636bd5f4a344352249b50563eb03d249484c6",
|
"cf4f8076650928dfd0cefc18665ef1e8ab52d7b6",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/css-contain/reference/contain-size-monolithic-001-ref.html": [
|
"css/css-contain/reference/contain-size-monolithic-001-ref.html": [
|
||||||
|
@ -534427,6 +534591,10 @@
|
||||||
"ead7a424b374fddb247046d2a36a37a11669baae",
|
"ead7a424b374fddb247046d2a36a37a11669baae",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-flexbox/flex-minimum-height-flex-items-009.html": [
|
||||||
|
"718386af02069fa1a3fff0ee5aaa10415ef4b23a",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"css/css-flexbox/flex-minimum-width-flex-items-001.xht": [
|
"css/css-flexbox/flex-minimum-width-flex-items-001.xht": [
|
||||||
"b8e2866edaa46af46900c287238894cd8ddef24c",
|
"b8e2866edaa46af46900c287238894cd8ddef24c",
|
||||||
"reftest"
|
"reftest"
|
||||||
|
@ -545547,6 +545715,10 @@
|
||||||
"1e56e708dfb45f1dd1e48d7779818d244eb25f3d",
|
"1e56e708dfb45f1dd1e48d7779818d244eb25f3d",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/css-grid/alignment/grid-gutters-013.html": [
|
||||||
|
"e72814725d2cb90fba6f3bd4d1e8370f37382fbb",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/css-grid/alignment/grid-row-axis-alignment-positioned-items-001.html": [
|
"css/css-grid/alignment/grid-row-axis-alignment-positioned-items-001.html": [
|
||||||
"e350f972357cfdc9559c5a86116e538d87c9ce61",
|
"e350f972357cfdc9559c5a86116e538d87c9ce61",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -548911,8 +549083,8 @@
|
||||||
"c415eaaa67a2bc9a4b621700049eb0c0b60ec0a3",
|
"c415eaaa67a2bc9a4b621700049eb0c0b60ec0a3",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-masking/inheritance.html": [
|
"css/css-masking/inheritance.sub.html": [
|
||||||
"34f75859ee88833ed39a56bb6c443cd60586e1b5",
|
"95424204d5094bb1cbcd49e32f5e38c28d86d76f",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"css/css-masking/mask-image/mask-image-url-image-hash.html": [
|
"css/css-masking/mask-image/mask-image-url-image-hash.html": [
|
||||||
|
@ -585035,6 +585207,14 @@
|
||||||
"cf54aabe9936b3963e7343d566d957633fc26c69",
|
"cf54aabe9936b3963e7343d566d957633fc26c69",
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001-ref.html": [
|
||||||
|
"5e5561cadf2ddbd6dfd2c7b4819f146f61be006b",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-dyn-resize-001.html": [
|
||||||
|
"d64c4bdf28ecb783af4f342d515dcf63134602c6",
|
||||||
|
"reftest"
|
||||||
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001-ref.html": [
|
||||||
"b5377110201d1de21a966c8a7f1a7d60dfff4126",
|
"b5377110201d1de21a966c8a7f1a7d60dfff4126",
|
||||||
"support"
|
"support"
|
||||||
|
@ -585876,7 +586056,7 @@
|
||||||
"reftest"
|
"reftest"
|
||||||
],
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/reftest.list": [
|
||||||
"df226fa8df7801a7bbfe8807e512e678d13bf0fa",
|
"5bb3b650139c3293cb7d782d47af7dbff9bc3ad6",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [
|
"css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/support/Ahem.ttf": [
|
||||||
|
@ -619084,7 +619264,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"interfaces/screen-capture.idl": [
|
"interfaces/screen-capture.idl": [
|
||||||
"668f4588ba2a24a909dc7f44b24628c56631296d",
|
"b79d09d19dced9e3b77e791e2d543fc9f44742ee",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"interfaces/screen-orientation.idl": [
|
"interfaces/screen-orientation.idl": [
|
||||||
|
@ -619116,7 +619296,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"interfaces/speech-api.idl": [
|
"interfaces/speech-api.idl": [
|
||||||
"8e998df5bc3fa41d728b5c79d592746701bc3754",
|
"0b5c866b35c28d8e10261205fb6cbaa6962e480a",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"interfaces/storage.idl": [
|
"interfaces/storage.idl": [
|
||||||
|
@ -619236,7 +619416,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"intersection-observer/bounding-box.html": [
|
"intersection-observer/bounding-box.html": [
|
||||||
"69052b11ce6c40c6a56fe2b723c70c49ddc36dd9",
|
"50f33f0443bb70e64bec2e2fcc930fa2b4118ed6",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"intersection-observer/client-rect.html": [
|
"intersection-observer/client-rect.html": [
|
||||||
|
@ -619351,6 +619531,10 @@
|
||||||
"d049c70919e129fa6c335e8601f6ce6a6cd73a9d",
|
"d049c70919e129fa6c335e8601f6ce6a6cd73a9d",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"intersection-observer/target-in-different-window.html": [
|
||||||
|
"cf8fe4e6ec9e6b33df2d61b6219a1b2d4bb74c79",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"intersection-observer/text-target.html": [
|
"intersection-observer/text-target.html": [
|
||||||
"13dc3abea2d8b0438ac76e9da974718778bcbb12",
|
"13dc3abea2d8b0438ac76e9da974718778bcbb12",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
@ -619528,7 +619712,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"lint.whitelist": [
|
"lint.whitelist": [
|
||||||
"46c2550e72884c3f060b0fc7355f44562d2803d4",
|
"9f5693fcc2b9ad790ca7d502d998a1b71701b717",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"longtask-timing/META.yml": [
|
"longtask-timing/META.yml": [
|
||||||
|
@ -644152,7 +644336,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/navigation-redirect.https.html": [
|
"service-workers/service-worker/navigation-redirect.https.html": [
|
||||||
"b6281b9e6c30540aae97c31454e4a2a5ac2c62b9",
|
"6f03fd8f2f0db54f4895d284a2ced78723d9965c",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/navigation-timing.https.html": [
|
"service-workers/service-worker/navigation-timing.https.html": [
|
||||||
|
@ -644948,7 +645132,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/resources/navigation-redirect-other-origin.html": [
|
"service-workers/service-worker/resources/navigation-redirect-other-origin.html": [
|
||||||
"0d2825f31093f8959b45712eff247a0a21c7c8cd",
|
"d82571d1a3c71e23274009d147e410b10fe8d245",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/resources/navigation-redirect-out-scope.py": [
|
"service-workers/service-worker/resources/navigation-redirect-out-scope.py": [
|
||||||
|
@ -645100,7 +645284,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/resources/redirect-worker.js": [
|
"service-workers/service-worker/resources/redirect-worker.js": [
|
||||||
"bf0a3a8d9e0486f896e635e478dcd623dda987c0",
|
"0c5bc3bd9aa5bff83df74ce5e0a8a244f21a85a7",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"service-workers/service-worker/resources/redirect.py": [
|
"service-workers/service-worker/resources/redirect.py": [
|
||||||
|
@ -646280,7 +646464,15 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
|
"speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
|
||||||
"acf0d7d575b5dc7f9b348d82b056aa90089b6639",
|
"1b86552a1cbd8dabaf8b50f928823e743e4b46cb",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
|
"speech-api/SpeechSynthesisErrorEvent-constructor.html": [
|
||||||
|
"61e179cca47b70d001e5e081e87166ec1363714a",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
|
"speech-api/SpeechSynthesisEvent-constructor.html": [
|
||||||
|
"47a37d25d9723cadcb9da2d778481fd9561c37aa",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"speech-api/SpeechSynthesisUtterance-basics.https.html": [
|
"speech-api/SpeechSynthesisUtterance-basics.https.html": [
|
||||||
|
@ -651324,7 +651516,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/manifest/sourcefile.py": [
|
"tools/manifest/sourcefile.py": [
|
||||||
"9be0d8966ece1bf56fd93e3fd606ac08c4bb1a76",
|
"1f08088eb4666158b5fbece0c2727a9f41b7d907",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/manifest/tests/__init__.py": [
|
"tools/manifest/tests/__init__.py": [
|
||||||
|
@ -651344,7 +651536,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/manifest/tests/test_sourcefile.py": [
|
"tools/manifest/tests/test_sourcefile.py": [
|
||||||
"57a175cae913a273c6ba4ebbcc13dd47571e4970",
|
"ad59055de73f5f8801c53095fe16faececf4fc97",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/manifest/update.py": [
|
"tools/manifest/update.py": [
|
||||||
|
@ -656548,7 +656740,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/base.py": [
|
"tools/wptserve/tests/functional/base.py": [
|
||||||
"741ab0bcb745753f72f2e26e37258f877caae513",
|
"e49c8287c5985aa5ebbed04ef3070bc785831733",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/docroot/document.txt": [
|
"tools/wptserve/tests/functional/docroot/document.txt": [
|
||||||
|
@ -656668,7 +656860,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/test_handlers.py": [
|
"tools/wptserve/tests/functional/test_handlers.py": [
|
||||||
"759a096b79957079429ae387186d6e7891651ecf",
|
"7ac410abfee2d0a700f9f39bc466cedffbb4780f",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/test_input_file.py": [
|
"tools/wptserve/tests/functional/test_input_file.py": [
|
||||||
|
@ -656676,11 +656868,11 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/test_pipes.py": [
|
"tools/wptserve/tests/functional/test_pipes.py": [
|
||||||
"7739af5e26e17c7b7930a612816151772f3f5cc0",
|
"83b2c621641ca17b670eb5a8c08b38f8d37cc2a7",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/test_request.py": [
|
"tools/wptserve/tests/functional/test_request.py": [
|
||||||
"983539260a5215cab779e76b256f678894f654f3",
|
"096c0535b9ae79a9782be097545a51e526a29106",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/tests/functional/test_response.py": [
|
"tools/wptserve/tests/functional/test_response.py": [
|
||||||
|
@ -656724,7 +656916,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/wptserve/pipes.py": [
|
"tools/wptserve/wptserve/pipes.py": [
|
||||||
"33a43e1f06b9835a2acf9be78b38a765cc9fdb60",
|
"ad96f591a3a8c8b7e8d13a4ad95a1aae500f66da",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/wptserve/ranges.py": [
|
"tools/wptserve/wptserve/ranges.py": [
|
||||||
|
@ -656732,11 +656924,11 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/wptserve/request.py": [
|
"tools/wptserve/wptserve/request.py": [
|
||||||
"233ff151c28e482f1087a853e385ab2f9c819276",
|
"cb575ccdba4514a456c0cbf73904bb63c12fd7ff",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/wptserve/response.py": [
|
"tools/wptserve/wptserve/response.py": [
|
||||||
"483265bf084666069c21dd91310a005d2162268b",
|
"44299cc994ef43ebe72053e1444f5af7cd7f9598",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"tools/wptserve/wptserve/router.py": [
|
"tools/wptserve/wptserve/router.py": [
|
||||||
|
@ -661408,7 +661600,7 @@
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webdriver/tests/perform_actions/key.py": [
|
"webdriver/tests/perform_actions/key.py": [
|
||||||
"2b3414c5ebfd62955860de540b4614471efbe8ad",
|
"cbfb5bcef43d52bb34faa515e7c24182e808cfa9",
|
||||||
"wdspec"
|
"wdspec"
|
||||||
],
|
],
|
||||||
"webdriver/tests/perform_actions/key_events.py": [
|
"webdriver/tests/perform_actions/key_events.py": [
|
||||||
|
@ -661416,7 +661608,7 @@
|
||||||
"wdspec"
|
"wdspec"
|
||||||
],
|
],
|
||||||
"webdriver/tests/perform_actions/key_modifiers.py": [
|
"webdriver/tests/perform_actions/key_modifiers.py": [
|
||||||
"55dc9280c6267172a96a4f3c02f2503aa0c22500",
|
"e8ea30dd3d7d0be7ceddab672554fd871457bf7a",
|
||||||
"wdspec"
|
"wdspec"
|
||||||
],
|
],
|
||||||
"webdriver/tests/perform_actions/key_shortcuts.py": [
|
"webdriver/tests/perform_actions/key_shortcuts.py": [
|
||||||
|
@ -662275,8 +662467,12 @@
|
||||||
"974ed0c76cfafb788e865c0b1c71fa19007c55b9",
|
"974ed0c76cfafb788e865c0b1c71fa19007c55b9",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"webrtc/RTCIceTransport-extension-helper.js": [
|
||||||
|
"659ec59b8df2847e7e2a3c513d3d6fd01027f16d",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
"webrtc/RTCIceTransport-extension.https.html": [
|
"webrtc/RTCIceTransport-extension.https.html": [
|
||||||
"9c6cec7e1e4994ee58f6822d77048eca8e8af569",
|
"5adee9fbe61eb9a8f7235b7faa6670eaea45cc89",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"webrtc/RTCIceTransport.html": [
|
"webrtc/RTCIceTransport.html": [
|
||||||
|
@ -662444,15 +662640,15 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"webrtc/RTCQuicStream.https.html": [
|
"webrtc/RTCQuicStream.https.html": [
|
||||||
"1e08016d75af57307d922b9876605e8152f92768",
|
"33025451b252e1bdf2491fa118e072f4b8711d12",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"webrtc/RTCQuicTransport-helper.js": [
|
"webrtc/RTCQuicTransport-helper.js": [
|
||||||
"50d9e6666a2d3bf8b3128f94b3c902579fabc0f5",
|
"3ea19d7a78e4a3788e97d0fa537d51d4b9e6b4fc",
|
||||||
"support"
|
"support"
|
||||||
],
|
],
|
||||||
"webrtc/RTCQuicTransport.https.html": [
|
"webrtc/RTCQuicTransport.https.html": [
|
||||||
"703f424a63851996b3708fe66caff63c7e0f5502",
|
"ec79bc228ad21de3a9ce3c2ee812a7d50e57571b",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"webrtc/RTCRtpCapabilities-helper.js": [
|
"webrtc/RTCRtpCapabilities-helper.js": [
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[flex-minimum-height-flex-items-009.html]
|
||||||
|
[.container 2]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[.container 1]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,16 +1,4 @@
|
||||||
[css-text-line-break-ja-cpm-normal.html]
|
[css-text-line-break-ja-cpm-normal.html]
|
||||||
[203C DOUBLE EXCLAMATION MARK may NOT appear at line start if ja and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2047 DOUBLE QUESTION MARK may NOT appear at line start if ja and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2048 QUESTION EXCLAMATION MARK may NOT appear at line start if ja and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2049 EXCLAMATION QUESTION MARK may NOT appear at line start if ja and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[30FB KATAKANA MIDDLE DOT may NOT appear at line start if ja and normal]
|
[30FB KATAKANA MIDDLE DOT may NOT appear at line start if ja and normal]
|
||||||
expected:
|
expected:
|
||||||
if os == "linux": FAIL
|
if os == "linux": FAIL
|
||||||
|
|
|
@ -3,3 +3,12 @@
|
||||||
expected:
|
expected:
|
||||||
if os == "linux": FAIL
|
if os == "linux": FAIL
|
||||||
|
|
||||||
|
[2010 HYPHEN may NOT appear at line start if ja and strict]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN may NOT appear at line start if ja and strict]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[2013 EN DASH may NOT appear at line start if ja and strict]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,4 @@
|
||||||
[css-text-line-break-zh-cpm-normal.html]
|
[css-text-line-break-zh-cpm-normal.html]
|
||||||
[203C DOUBLE EXCLAMATION MARK may NOT appear at line start if zh and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2047 DOUBLE QUESTION MARK may NOT appear at line start if zh and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2048 QUESTION EXCLAMATION MARK may NOT appear at line start if zh and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[2049 EXCLAMATION QUESTION MARK may NOT appear at line start if zh and normal]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[30FB KATAKANA MIDDLE DOT may NOT appear at line start if zh and normal]
|
[30FB KATAKANA MIDDLE DOT may NOT appear at line start if zh and normal]
|
||||||
expected:
|
expected:
|
||||||
if os == "linux": FAIL
|
if os == "linux": FAIL
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
[properties-value-inherit-002.html]
|
[properties-value-inherit-002.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[outline-width length(px) / values]
|
[outline-width length(px) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-width length(em) / values]
|
[border-left-width length(em) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -25,13 +24,13 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[opacity number[0,1\](zero-to-one) / values]
|
[opacity number[0,1\](zero-to-one) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[line-height number(integer) / values]
|
[line-height number(integer) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(px) / values]
|
[outline-offset length(px) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[font-size length(pt) / values]
|
[font-size length(pt) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -40,7 +39,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(in) / values]
|
[vertical-align length(in) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[max-height percentage(%) / values]
|
[max-height percentage(%) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -76,7 +75,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align percentage(%) / values]
|
[vertical-align percentage(%) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[background-position length(in) / events]
|
[background-position length(in) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -100,10 +99,10 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(em) / values]
|
[vertical-align length(em) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[clip rectangle(rectangle) / values]
|
[clip rectangle(rectangle) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[word-spacing length(em) / values]
|
[word-spacing length(em) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -127,7 +126,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(ex) / values]
|
[outline-offset length(ex) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[min-width length(cm) / values]
|
[min-width length(cm) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -142,16 +141,16 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(pc) / values]
|
[vertical-align length(pc) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(cm) / values]
|
[vertical-align length(cm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[max-height length(ex) / values]
|
[max-height length(ex) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(ex) / values]
|
[vertical-align length(ex) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[min-height percentage(%) / values]
|
[min-height percentage(%) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -160,7 +159,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(mm) / values]
|
[outline-offset length(mm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[font-weight font-weight(keyword) / values]
|
[font-weight font-weight(keyword) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -169,7 +168,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(pt) / values]
|
[outline-offset length(pt) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[line-height length(mm) / values]
|
[line-height length(mm) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -202,7 +201,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(pt) / values]
|
[vertical-align length(pt) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-color color(rgba) / values]
|
[border-left-color color(rgba) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -271,10 +270,10 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(in) / values]
|
[outline-offset length(in) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(pt) / values]
|
[outline-width length(pt) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-top-width length(pc) / values]
|
[border-top-width length(pc) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -292,7 +291,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(in) / values]
|
[outline-width length(in) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[word-spacing length(pt) / values]
|
[word-spacing length(pt) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -304,7 +303,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-color color(rgba) / values]
|
[outline-color color(rgba) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[background-position length(ex) / events]
|
[background-position length(ex) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -328,7 +327,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(ex) / values]
|
[outline-width length(ex) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[font-size length(pc) / values]
|
[font-size length(pc) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -340,7 +339,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(cm) / values]
|
[outline-width length(cm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[max-width percentage(%) / values]
|
[max-width percentage(%) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -355,19 +354,19 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(mm) / values]
|
[outline-width length(mm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-width length(pc) / values]
|
[border-left-width length(pc) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(pc) / values]
|
[outline-width length(pc) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[font-weight font-weight(numeric) / values]
|
[font-weight font-weight(numeric) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(px) / values]
|
[vertical-align length(px) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[letter-spacing length(px) / values]
|
[letter-spacing length(px) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -394,7 +393,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(em) / values]
|
[outline-width length(em) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-right-width length(em) / values]
|
[border-right-width length(em) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -406,10 +405,10 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(em) / values]
|
[outline-offset length(em) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(cm) / values]
|
[outline-offset length(cm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[background-position length(mm) / events]
|
[background-position length(mm) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -421,13 +420,13 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[z-index integer(integer) / values]
|
[z-index integer(integer) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-width length(pt) / values]
|
[border-left-width length(pt) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(mm) / values]
|
[vertical-align length(mm) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[border-bottom-width length(pc) / values]
|
[border-bottom-width length(pc) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -448,7 +447,7 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(pc) / values]
|
[outline-offset length(pc) / values]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
[max-height length(pc) / values]
|
[max-height length(pc) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
@ -483,126 +482,30 @@
|
||||||
[word-spacing percentage(%) / values]
|
[word-spacing percentage(%) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(pc) / events]
|
[text-indent length(pc) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[height percentage(%) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(px) / events]
|
[text-indent length(ex) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[padding-right length(em) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-offset length(mm) / events]
|
[text-indent length(px) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[vertical-align length(in) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[padding-left length(px) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(em) / events]
|
[text-indent length(mm) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[vertical-align length(cm) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(cm) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[vertical-align length(mm) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(em) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[z-index integer(integer) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[vertical-align length(ex) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(em) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[visibility visibility(keyword) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[width length(pc) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[opacity number[0,1\](zero-to-one) / events]
|
[text-indent length(cm) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[margin-bottom length(px) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / values]
|
[text-shadow shadow(shadow) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[width length(pt) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[outline-width length(cm) / events]
|
[text-indent length(in) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[clip rectangle(rectangle) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(ex) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(mm) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[width length(mm) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align percentage(%) / events]
|
[text-indent length(em) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(pt) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-color color(rgba) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(in) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(ex) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[padding-top length(mm) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[vertical-align length(pc) / events]
|
[text-indent percentage(%) / values]
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[vertical-align length(pt) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[width length(ex) / values]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[top length(ex) / values]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[outline-offset length(pt) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(px) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(in) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-width length(px) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
[outline-offset length(pc) / events]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
||||||
|
|
|
@ -47,66 +47,33 @@
|
||||||
[outline-width end]
|
[outline-width end]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[max-height end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[height end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[line-height end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[min-height end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[bottom end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[clip end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[font-weight end]
|
[font-weight end]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-color end]
|
[min-width intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-top-width end]
|
[clip intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[margin-right intermediate]
|
[border-right-width intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-left-width end]
|
[border-left-width intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-bottom-width end]
|
[border-top-width intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[letter-spacing end]
|
[max-width intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[margin-bottom end]
|
[border-spacing intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-right-width end]
|
[left intermediate]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[border-right-color end]
|
[bottom intermediate]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[border-top-color end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[color end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[border-spacing end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[visibility end]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[left end]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
type: testharness
|
type: testharness
|
||||||
|
|
||||||
[single-byte-decoder.html?document]
|
[single-byte-decoder.html?document]
|
||||||
expected: TIMEOUT
|
expected: CRASH
|
||||||
[windows-1254: iso_8859-9 (document.characterSet and document.inputEncoding)]
|
[windows-1254: iso_8859-9 (document.characterSet and document.inputEncoding)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[format-field-id-2.htm]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[EventSource: Last-Event-ID (2)]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[format-field-id.htm]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[EventSource: Last-Event-ID]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[traverse_the_history_5.html]
|
|
||||||
[Multiple history traversals, last would be aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
[location-protocol-setter-non-broken-weird.html]
|
||||||
|
[Set location.protocol to data]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Set location.protocol to ftp]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Set location.protocol to gopher]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Set location.protocol to x]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Set location.protocol to http+x]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -172,3 +172,63 @@
|
||||||
[XHTML img usemap="http://example.org/#garbage-before-hash-id"]
|
[XHTML img usemap="http://example.org/#garbage-before-hash-id"]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#percent-escape-id-%41"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#different-CASE-id"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="hash-last#"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="no-hash-id"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="no-hash-name"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#no-such-map"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="hash-last#"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="no-hash-id"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#different-CASE-name"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#no-such-map"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#percent-escape-name-%41"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#different-CASE-id"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="#different-CASE-name"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap=""]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap=""]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#percent-escape-name-%41"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[HTML (quirks) IMG usemap="#percent-escape-id-%41"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[XHTML img usemap="no-hash-name"]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
[picture: source (max-width:500px) valid image, img valid image, resize to wide]
|
[picture: source (max-width:500px) valid image, img valid image, resize to wide]
|
||||||
expected: FAIL
|
expected: TIMEOUT
|
||||||
|
|
||||||
[picture: source (max-width:500px) valid image, img broken image, resize to narrow]
|
[picture: source (max-width:500px) valid image, img broken image, resize to narrow]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
|
@ -2,6 +2,3 @@
|
||||||
[document.open() after parser is aborted]
|
[document.open() after parser is aborted]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[async document.open() after parser is aborted]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
[response.formData() with input: a&b&c]
|
[response.formData() with input: a&b&c]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[response.formData() with input: _charset_=windows-1252&test=%C2x]
|
[request.formData() with input: a&b&c]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[response.formData() with input: a=b&c=d]
|
[response.formData() with input: a=b&c=d&]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,18 +19,15 @@
|
||||||
[request.formData() with input: a&b&c]
|
[request.formData() with input: a&b&c]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[request.formData() with input: _charset_=windows-1252&test=%C2x]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[response.formData() with input: a&b&c]
|
[response.formData() with input: a&b&c]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[response.formData() with input: a=b&c=d&]
|
[response.formData() with input: a=b&c=d&]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[request.formData() with input: a=b&c=d]
|
[response.formData() with input: &&&a=b&&&&c=d&]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[response.formData() with input: _charset_=windows-1252&test=%C2x]
|
[request.formData() with input: a=b&c=d&]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,73 @@
|
||||||
[realtimeanalyser-fft-scaling.html]
|
[realtimeanalyser-fft-scaling.html]
|
||||||
expected: TIMEOUT
|
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 128-point FFT peak position is not equal to 4. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 32768-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 64-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 4096-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[< [FFT scaling tests\] 22 out of 22 assertions were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 128-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 8192-point FFT peak position is not equal to 256. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 32-point FFT peak value in dBFS is not greater than or equal to -14.43. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 16384-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 256-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 8192-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 1024-point FFT peak position is not equal to 32. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 64-point FFT peak position is not equal to 2. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 512-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 32-point FFT peak position is not equal to 1. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 16384-point FFT peak position is not equal to 512. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 1024-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 2048-point FFT peak value in dBFS is not greater than or equal to -13.56. Got -1000.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 32768-point FFT peak position is not equal to 1024. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 4096-point FFT peak position is not equal to 128. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 512-point FFT peak position is not equal to 16. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[X 256-point FFT peak position is not equal to 8. Got 0.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[# AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
[import-in-moduleworker.html]
|
[import-in-moduleworker.html]
|
||||||
|
expected: ERROR
|
||||||
[Base URL in module dedicated workers: import]
|
[Base URL in module dedicated workers: import]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[transition_calc_implicit.html]
|
||||||
|
expected: TIMEOUT
|
|
@ -432,11 +432,11 @@ upstream review.
|
||||||
|
|
||||||
Search filters to find things to review:
|
Search filters to find things to review:
|
||||||
|
|
||||||
* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22)
|
* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
|
||||||
* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?)
|
* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+-label%3Avendor-imports+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?)
|
||||||
* [Open PRs without reviewers](https://github.com/web-platform-tests/wpt/pulls?q=is%3Apr+is%3Aopen+label%3Astatus%3Aneeds-reviewers)
|
* [Open PRs without reviewers](https://github.com/web-platform-tests/wpt/pulls?q=is%3Apr+is%3Aopen+label%3Astatus%3Aneeds-reviewers)
|
||||||
* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22)
|
* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
|
||||||
* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22)
|
* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
|
||||||
|
|
||||||
Getting Involved
|
Getting Involved
|
||||||
================
|
================
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
label:after { content: "baz"; }
|
label:after { content: "baz"; }
|
||||||
</style>
|
</style>
|
||||||
<form>
|
<form>
|
||||||
<label for="test" title="bar"><input id="test" type="text" name="test" title="bar"></label>
|
<label for="test" title="bar"><input id="test" type="text" name="test" title="buz"></label>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div id="manualMode"></div>
|
<div id="manualMode"></div>
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
label:after { content: "baz"; }
|
label:after { content: "baz"; }
|
||||||
</style>
|
</style>
|
||||||
<form>
|
<form>
|
||||||
<label for="test" title="bar"><input id="test" type="password" name="test" title="bar"></label>
|
<label for="test" title="bar"><input id="test" type="password" name="test" title="buz"></label>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div id="manualMode"></div>
|
<div id="manualMode"></div>
|
||||||
|
|
|
@ -67,6 +67,21 @@ backgroundFetchTest(async (test, backgroundFetch) => {
|
||||||
|
|
||||||
}, 'IDs must be unique among active Background Fetch registrations');
|
}, 'IDs must be unique among active Background Fetch registrations');
|
||||||
|
|
||||||
|
backgroundFetchTest(async (test, backgroundFetch) => {
|
||||||
|
const registrationId = uniqueId();
|
||||||
|
const registration =
|
||||||
|
await backgroundFetch.fetch(registrationId, '');
|
||||||
|
|
||||||
|
assert_equals(registration.id, registrationId);
|
||||||
|
|
||||||
|
const {type, eventRegistration, results} = await getMessageFromServiceWorker();
|
||||||
|
|
||||||
|
assert_equals('backgroundfetchsuccess', type);
|
||||||
|
assert_equals(eventRegistration.result, 'success');
|
||||||
|
assert_equals(eventRegistration.failureReason, '');
|
||||||
|
|
||||||
|
}, 'Empty URL is OK.');
|
||||||
|
|
||||||
backgroundFetchTest(async (test, backgroundFetch) => {
|
backgroundFetchTest(async (test, backgroundFetch) => {
|
||||||
const registrationId = uniqueId();
|
const registrationId = uniqueId();
|
||||||
const registration =
|
const registration =
|
||||||
|
@ -190,4 +205,20 @@ backgroundFetchTest(async (test, backgroundFetch) => {
|
||||||
assert_equals(eventRegistration.result, 'failure');
|
assert_equals(eventRegistration.result, 'failure');
|
||||||
assert_equals(eventRegistration.failureReason, 'bad-status');
|
assert_equals(eventRegistration.failureReason, 'bad-status');
|
||||||
|
|
||||||
}, 'Using Background Fetch to fetch a non-existent resource should fail.');
|
}, 'Using Background Fetch to fetch a non-existent resource should fail.');
|
||||||
|
|
||||||
|
backgroundFetchTest(async (test, backgroundFetch) => {
|
||||||
|
const registration = await backgroundFetch.fetch(
|
||||||
|
'my-id',
|
||||||
|
['https://example.com', 'http://example.com']);
|
||||||
|
|
||||||
|
const {type, eventRegistration, results} = await getMessageFromServiceWorker();
|
||||||
|
|
||||||
|
assert_equals('backgroundfetchfail', type);
|
||||||
|
assert_equals(eventRegistration.failureReason, 'fetch-error');
|
||||||
|
|
||||||
|
assert_equals(results.length, 2);
|
||||||
|
assert_true(results[0].url.includes('https://example.com'));
|
||||||
|
assert_equals(results[1].url, '');
|
||||||
|
|
||||||
|
}, 'Fetches with mixed content should fail.');
|
||||||
|
|
|
@ -30,34 +30,6 @@ backgroundFetchTest((t, bgFetch) => {
|
||||||
return bgFetch.fetch(uniqueId(), 'http://localhost');
|
return bgFetch.fetch(uniqueId(), 'http://localhost');
|
||||||
}, 'localhost http: fetch should register ok');
|
}, 'localhost http: fetch should register ok');
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
|
||||||
return promise_rejects(t, new TypeError(),
|
|
||||||
bgFetch.fetch(uniqueId(), 'http://example.com'));
|
|
||||||
}, 'non-loopback http: fetch should reject');
|
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
|
||||||
return promise_rejects(t, new TypeError(),
|
|
||||||
bgFetch.fetch(uniqueId(), 'http://192.0.2.0'));
|
|
||||||
}, 'non-loopback IPv4 http: fetch should reject');
|
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
|
||||||
return promise_rejects(t, new TypeError(),
|
|
||||||
bgFetch.fetch(uniqueId(), 'http://[2001:db8::1]'));
|
|
||||||
}, 'non-loopback IPv6 http: fetch should reject');
|
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
|
||||||
return promise_rejects(t, new TypeError(),
|
|
||||||
bgFetch.fetch(uniqueId(), ['https://example.com',
|
|
||||||
'http://example.com']));
|
|
||||||
}, 'https: and non-loopback http: fetch should reject');
|
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
|
||||||
return promise_rejects(t, new TypeError(),
|
|
||||||
bgFetch.fetch(uniqueId(), ['http://example.com',
|
|
||||||
'https://example.com']));
|
|
||||||
}, 'non-loopback http: and https: fetch should reject');
|
|
||||||
|
|
||||||
|
|
||||||
backgroundFetchTest((t, bgFetch) => {
|
backgroundFetchTest((t, bgFetch) => {
|
||||||
return promise_rejects(t, new TypeError(),
|
return promise_rejects(t, new TypeError(),
|
||||||
bgFetch.fetch(uniqueId(), 'wss:127.0.0.1'));
|
bgFetch.fetch(uniqueId(), 'wss:127.0.0.1'));
|
||||||
|
|
|
@ -27,5 +27,3 @@ function handleBackgroundFetchUpdateEvent(event) {
|
||||||
|
|
||||||
self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchUpdateEvent);
|
self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchUpdateEvent);
|
||||||
self.addEventListener('backgroundfetchfail', handleBackgroundFetchUpdateEvent);
|
self.addEventListener('backgroundfetchfail', handleBackgroundFetchUpdateEvent);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Layout containment on button</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout">
|
||||||
|
<link rel="match" href="reference/contain-layout-button-001-ref.html">
|
||||||
|
<meta name=assert content="Layout containment does apply to buttons, thus their baseline is the same than if they don't have contents.">
|
||||||
|
<style>
|
||||||
|
button {
|
||||||
|
border: 5px solid green;
|
||||||
|
padding: 0;
|
||||||
|
contain: layout;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<button>b</button>after
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Layout containment on flexbox container</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout">
|
||||||
|
<link rel="match" href="reference/contain-layout-flexbox-001-ref.html">
|
||||||
|
<meta name=assert content="Layout containment does apply to flexbox containers, thus their baseline is the same than if they don't have contents.">
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: inline-flex;
|
||||||
|
border: 5px solid green;
|
||||||
|
contain: layout;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<div>f</div>after
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Layout containment on grid container</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-layout">
|
||||||
|
<link rel="match" href="reference/contain-layout-grid-001-ref.html">
|
||||||
|
<meta name=assert content="Layout containment does apply to grid containers, thus their baseline is the same than if they don't have contents.">
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: inline-grid;
|
||||||
|
border: 5px solid green;
|
||||||
|
contain: layout;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<div>g</div>after
|
|
@ -0,0 +1,38 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
|
<title>CSS Containment Test: 'contain: paint' and clipping prevents scrollbars</title>
|
||||||
|
|
||||||
|
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-contain-1/#containment-paint">
|
||||||
|
<link rel="match" href="reference/contain-paint-clip-019-ref.html">
|
||||||
|
|
||||||
|
<meta content="This test checks that the paint containment of an element clips contents.
|
||||||
|
It should also prevent layout overflow from being propagated to ancestors." name="assert">
|
||||||
|
<meta content="" name="flags">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#container {
|
||||||
|
contain: paint;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
#green {
|
||||||
|
background-color: green;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
#red {
|
||||||
|
background-color: red;
|
||||||
|
width: 100px;
|
||||||
|
height: 10000px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>Test passes if there there is a green square. No red and no scrollbars should be visible.</p>
|
||||||
|
|
||||||
|
<div id="container">
|
||||||
|
<div id="green"></div>
|
||||||
|
<div id="red"></div>
|
||||||
|
</div>
|
|
@ -4,15 +4,16 @@
|
||||||
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
||||||
<link rel="match" href="reference/contain-size-button-001-ref.html">
|
<link rel="match" href="reference/contain-size-button-001-ref.html">
|
||||||
<meta name=assert content="Size containment does apply to buttons, thus their size and baseline is the same than if they don't have contents.">
|
<meta name=assert content="Size containment does apply to buttons, thus their size is the same than if they don't have contents.">
|
||||||
<style>
|
<style>
|
||||||
button {
|
button {
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
contain: size;
|
contain: size;
|
||||||
color: transparent;
|
color: transparent;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<button>flex</button>after
|
before<button>flex</button>after
|
||||||
|
|
|
@ -4,15 +4,16 @@
|
||||||
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
||||||
<link rel="match" href="reference/contain-size-flexbox-001-ref.html">
|
<link rel="match" href="reference/contain-size-flexbox-001-ref.html">
|
||||||
<meta name=assert content="Size containment does apply to flexbox containers, thus their size and baseline is the same than if they don't have contents.">
|
<meta name=assert content="Size containment does apply to flexbox containers, thus their size is the same than if they don't have contents.">
|
||||||
<style>
|
<style>
|
||||||
div {
|
div {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
contain: size;
|
contain: size;
|
||||||
color: transparent;
|
color: transparent;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<div>flex</div>after
|
before<div>flex</div>after
|
||||||
|
|
|
@ -4,15 +4,16 @@
|
||||||
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
|
||||||
<link rel="match" href="reference/contain-size-grid-001-ref.html">
|
<link rel="match" href="reference/contain-size-grid-001-ref.html">
|
||||||
<meta name=assert content="Size containment does apply to grid containers, thus their size and baseline is the same than if they don't have contents.">
|
<meta name=assert content="Size containment does apply to grid containers, thus their size is the same than if they don't have contents.">
|
||||||
<style>
|
<style>
|
||||||
div {
|
div {
|
||||||
display: inline-grid;
|
display: inline-grid;
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
contain: size;
|
contain: size;
|
||||||
color: transparent;
|
color: transparent;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<div>grid</div>after
|
before<div>grid</div>after
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Reference file</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<style>
|
||||||
|
button {
|
||||||
|
border: 5px solid green;
|
||||||
|
padding: 0;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0px;
|
||||||
|
/* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<button></button>after
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Reference file</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: inline-flex;
|
||||||
|
border: 5px solid green;
|
||||||
|
/* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<div></div>after
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Containment Test: Reference file</title>
|
||||||
|
<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: inline-grid;
|
||||||
|
border: 5px solid green;
|
||||||
|
/* Layout containment creates a stacking context, the following lines simuluate the same in the reference file. */
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the bottom, and then the word "after".</p>
|
||||||
|
before<div></div>after
|
|
@ -0,0 +1,19 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
|
<title>CSS Reference Test</title>
|
||||||
|
|
||||||
|
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#green {
|
||||||
|
background-color: green;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>Test passes if there there is a green square. No red and no scrollbars should be visible.</p>
|
||||||
|
|
||||||
|
<div id="green"></div>
|
|
@ -6,8 +6,12 @@
|
||||||
button {
|
button {
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<button></button>after
|
before<button>b</button>after
|
||||||
|
|
|
@ -6,8 +6,12 @@
|
||||||
div {
|
div {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<div></div>after
|
before<div>f</div>after
|
||||||
|
|
|
@ -6,8 +6,12 @@
|
||||||
div {
|
div {
|
||||||
display: inline-grid;
|
display: inline-grid;
|
||||||
border: 5px solid green;
|
border: 5px solid green;
|
||||||
|
color: transparent;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square, and then the word "after".</p>
|
<p>This test passes if it has the same output as the reference. You see the word "before", a 10px green square at the top, and then the word "after".</p>
|
||||||
before<div></div>after
|
before<div>g</div>after
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>Tests correct handling of min-height: auto with dynamic changes</title>
|
||||||
|
<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#min-size-auto" title="4.5. Implied Minimum Size of Flex Items" />
|
||||||
|
<link rel="author" title="Google Inc." href="http://www.google.com/">
|
||||||
|
<link href="support/flexbox.css" rel="stylesheet">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="/resources/check-layout-th.js"></script>
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
height: 300px;
|
||||||
|
outline: 2px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inner
|
||||||
|
{
|
||||||
|
width: 400px;
|
||||||
|
flex: 1;
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
#container2 .flexbox > * { flex-basis: 0; }
|
||||||
|
#container2 .column > * { flex-basis: auto; }
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
function change() {
|
||||||
|
var container = document.getElementById('container');
|
||||||
|
container.offsetHeight;
|
||||||
|
container.style.height = '80px';
|
||||||
|
container = document.getElementById('container2');
|
||||||
|
container.offsetHeight;
|
||||||
|
container.style.height = '80px';
|
||||||
|
checkLayout('.container');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<body onload="change()">
|
||||||
|
<p>Green rectangle should be entirely within the black rectangle</p>
|
||||||
|
<div id="log"></div>
|
||||||
|
<div id="container" class="container">
|
||||||
|
<div class="flexbox column" style="height: 100%;">
|
||||||
|
<div class="flexbox flex-one">
|
||||||
|
<div class="flexbox column">
|
||||||
|
<div class="flexbox column flex-one">
|
||||||
|
<div class="inner" data-expected-height="80">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="container2" class="container">
|
||||||
|
<div class="flexbox column" style="height: 100%;">
|
||||||
|
<div class="flexbox flex-one">
|
||||||
|
<div class="flexbox column">
|
||||||
|
<div class="flexbox column flex-one">
|
||||||
|
<div class="inner" data-expected-height="80">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,36 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>CSS Grid Layout Test: Gutters adjacent to collapsed tracks also collapse</title>
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-grid-1/#gutters">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-shorthand">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-legacy">
|
||||||
|
<link rel="help" href="https://www.w3.org/TR/css-grid-1/#repeat-notation">
|
||||||
|
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
|
||||||
|
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
|
||||||
|
<meta name="assert" content="This test checks that gutters adjacent to collapsed tracks don't reduce the space available for aligning adjacent grid items." />
|
||||||
|
<style>
|
||||||
|
#grid {
|
||||||
|
display: grid;
|
||||||
|
margin-top: -50px;
|
||||||
|
margin-left: -50px;
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
grid-gap: 100px;
|
||||||
|
grid-template-rows: repeat(auto-fit, 200px);
|
||||||
|
grid-template-columns: repeat(auto-fit, 200px);
|
||||||
|
align-items: center;
|
||||||
|
justify-items: center;
|
||||||
|
background: linear-gradient(red, red) no-repeat 50px 50px / 100px 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#grid > div {
|
||||||
|
background-color: green;
|
||||||
|
width: 50%;
|
||||||
|
height: 50%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||||
|
<div id="grid">
|
||||||
|
<div></div>
|
||||||
|
</div>
|
|
@ -16,17 +16,17 @@
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
assert_not_inherited('clip', 'auto', 'rect(10px, 20px, 30px, 40px)');
|
assert_not_inherited('clip', 'auto', 'rect(10px, 20px, 30px, 40px)');
|
||||||
assert_not_inherited('clip-path', 'none', 'url("https://example.com/")');
|
assert_not_inherited('clip-path', 'none', 'url("http://{{host}}/")');
|
||||||
assert_inherited('clip-rule', 'nonzero', 'evenodd');
|
assert_inherited('clip-rule', 'nonzero', 'evenodd');
|
||||||
assert_not_inherited('mask-border-mode', 'alpha', 'luminance');
|
assert_not_inherited('mask-border-mode', 'alpha', 'luminance');
|
||||||
assert_not_inherited('mask-border-outset', '0', '10px 20px 30px 40px');
|
assert_not_inherited('mask-border-outset', '0', '10px 20px 30px 40px');
|
||||||
assert_not_inherited('mask-border-repeat', 'stretch', 'round space');
|
assert_not_inherited('mask-border-repeat', 'stretch', 'round space');
|
||||||
assert_not_inherited('mask-border-slice', '0', '1 2 3 4 fill');
|
assert_not_inherited('mask-border-slice', '0', '1 2 3 4 fill');
|
||||||
assert_not_inherited('mask-border-source', 'none', 'url("https://example.com/")');
|
assert_not_inherited('mask-border-source', 'none', 'url("http://{{host}}/")');
|
||||||
assert_not_inherited('mask-border-width', 'auto', '10px 20px 30px 40px');
|
assert_not_inherited('mask-border-width', 'auto', '10px 20px 30px 40px');
|
||||||
assert_not_inherited('mask-clip', 'border-box', 'no-clip');
|
assert_not_inherited('mask-clip', 'border-box', 'no-clip');
|
||||||
assert_not_inherited('mask-composite', 'add', 'exclude');
|
assert_not_inherited('mask-composite', 'add', 'exclude');
|
||||||
assert_not_inherited('mask-image', 'none', 'url("https://example.com/")');
|
assert_not_inherited('mask-image', 'none', 'url("http://{{host}}/")');
|
||||||
assert_not_inherited('mask-mode', 'match-source', 'luminance');
|
assert_not_inherited('mask-mode', 'match-source', 'luminance');
|
||||||
assert_not_inherited('mask-origin', 'border-box', 'padding-box');
|
assert_not_inherited('mask-origin', 'border-box', 'padding-box');
|
||||||
assert_not_inherited('mask-position', '0% 0%', '10px 20px');
|
assert_not_inherited('mask-position', '0% 0%', '10px 20px');
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>
|
||||||
|
CSS Reftest Reference
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
width: 100px;
|
||||||
|
display: flex;
|
||||||
|
border: 1px solid purple;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
margin: 2px;
|
||||||
|
background: lightblue;
|
||||||
|
}
|
||||||
|
.inline-box {
|
||||||
|
display: inline-block;
|
||||||
|
height: 10px;
|
||||||
|
width: 10px;
|
||||||
|
background: lightgray;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
#change-width {
|
||||||
|
/* Using hardcoded CSS as reference for testcase's tweak: */
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
#change-flex {
|
||||||
|
/* Using hardcoded CSS as reference for testcase's tweak: */
|
||||||
|
flex: 0 0 75px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="item" id="change-width">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="item" id="change-flex">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,65 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>
|
||||||
|
CSS Test: Testing how a sizing change to one flex item impacts its sibling
|
||||||
|
</title>
|
||||||
|
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||||
|
<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#layout-algorithm">
|
||||||
|
<link rel="match" href="flexbox-dyn-resize-001-ref.html">
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
width: 100px;
|
||||||
|
display: flex;
|
||||||
|
border: 1px solid purple;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
margin: 2px;
|
||||||
|
background: lightblue;
|
||||||
|
}
|
||||||
|
.inline-box {
|
||||||
|
display: inline-block;
|
||||||
|
height: 10px;
|
||||||
|
width: 10px;
|
||||||
|
background: lightgray;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
function go() {
|
||||||
|
// Make this item steal all the spare width (forcing its sibling to shrink)
|
||||||
|
// by giving it a huge 'width' and therefore huge flex-basis:
|
||||||
|
document.getElementById("change-width").style.width = "300px";
|
||||||
|
|
||||||
|
// Make this item steal all the spare width (forcing its sibling to shrink)
|
||||||
|
// by giving it a pretty big flex-basis and no shrinkability:
|
||||||
|
document.getElementById("change-flex").style.flex = "0 0 75px"
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="go()">
|
||||||
|
<div class="container">
|
||||||
|
<div class="item" id="change-width">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="item" id="change-flex">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<div class="inline-box"></div><div class="inline-box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -108,6 +108,9 @@
|
||||||
== flexbox-column-row-gap-003.html flexbox-column-row-gap-003-ref.html
|
== flexbox-column-row-gap-003.html flexbox-column-row-gap-003-ref.html
|
||||||
== flexbox-column-row-gap-004.html flexbox-column-row-gap-004-ref.html
|
== flexbox-column-row-gap-004.html flexbox-column-row-gap-004-ref.html
|
||||||
|
|
||||||
|
# Tests with dynamic changes that impact sizing:
|
||||||
|
== flexbox-dyn-resize-001.html flexbox-dyn-resize-001-ref.html
|
||||||
|
|
||||||
# Tests for "flex-basis: content"
|
# Tests for "flex-basis: content"
|
||||||
== flexbox-flex-basis-content-001a.html flexbox-flex-basis-content-001-ref.html
|
== flexbox-flex-basis-content-001a.html flexbox-flex-basis-content-001-ref.html
|
||||||
== flexbox-flex-basis-content-001b.html flexbox-flex-basis-content-001-ref.html
|
== flexbox-flex-basis-content-001b.html flexbox-flex-basis-content-001-ref.html
|
||||||
|
|
|
@ -7,12 +7,24 @@ partial interface Navigator {
|
||||||
Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
|
Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
partial dictionary MediaTrackSupportedConstraints {
|
||||||
|
boolean displaySurface = true;
|
||||||
|
boolean logicalSurface = true;
|
||||||
|
boolean cursor = true;
|
||||||
|
};
|
||||||
|
|
||||||
partial dictionary MediaTrackConstraintSet {
|
partial dictionary MediaTrackConstraintSet {
|
||||||
ConstrainDOMString displaySurface;
|
ConstrainDOMString displaySurface;
|
||||||
ConstrainBoolean logicalSurface;
|
ConstrainBoolean logicalSurface;
|
||||||
ConstrainDOMString cursor;
|
ConstrainDOMString cursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
partial dictionary MediaTrackSettings {
|
||||||
|
DOMString displaySurface;
|
||||||
|
boolean logicalSurface;
|
||||||
|
DOMString cursor;
|
||||||
|
};
|
||||||
|
|
||||||
enum DisplayCaptureSurfaceType {
|
enum DisplayCaptureSurfaceType {
|
||||||
"monitor",
|
"monitor",
|
||||||
"window",
|
"window",
|
||||||
|
|
|
@ -137,7 +137,8 @@ interface SpeechSynthesisUtterance : EventTarget {
|
||||||
attribute EventHandler onboundary;
|
attribute EventHandler onboundary;
|
||||||
};
|
};
|
||||||
|
|
||||||
[Exposed=Window]
|
[Exposed=Window,
|
||||||
|
Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)]
|
||||||
interface SpeechSynthesisEvent : Event {
|
interface SpeechSynthesisEvent : Event {
|
||||||
readonly attribute SpeechSynthesisUtterance utterance;
|
readonly attribute SpeechSynthesisUtterance utterance;
|
||||||
readonly attribute unsigned long charIndex;
|
readonly attribute unsigned long charIndex;
|
||||||
|
@ -145,6 +146,13 @@ interface SpeechSynthesisEvent : Event {
|
||||||
readonly attribute DOMString name;
|
readonly attribute DOMString name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dictionary SpeechSynthesisEventInit : EventInit {
|
||||||
|
required SpeechSynthesisUtterance utterance;
|
||||||
|
unsigned long charIndex = 0;
|
||||||
|
float elapsedTime = 0;
|
||||||
|
DOMString name = "";
|
||||||
|
};
|
||||||
|
|
||||||
enum SpeechSynthesisErrorCode {
|
enum SpeechSynthesisErrorCode {
|
||||||
"canceled",
|
"canceled",
|
||||||
"interrupted",
|
"interrupted",
|
||||||
|
@ -160,11 +168,16 @@ enum SpeechSynthesisErrorCode {
|
||||||
"not-allowed",
|
"not-allowed",
|
||||||
};
|
};
|
||||||
|
|
||||||
[Exposed=Window]
|
[Exposed=Window,
|
||||||
|
Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)]
|
||||||
interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent {
|
interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent {
|
||||||
readonly attribute SpeechSynthesisErrorCode error;
|
readonly attribute SpeechSynthesisErrorCode error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dictionary SpeechSynthesisErrorEventInit : SpeechSynthesisEventInit {
|
||||||
|
required SpeechSynthesisErrorCode error;
|
||||||
|
};
|
||||||
|
|
||||||
[Exposed=Window]
|
[Exposed=Window]
|
||||||
interface SpeechSynthesisVoice {
|
interface SpeechSynthesisVoice {
|
||||||
readonly attribute DOMString voiceURI;
|
readonly attribute DOMString voiceURI;
|
||||||
|
|
|
@ -13,7 +13,7 @@ pre, #log {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
height: 200px;
|
height: 200px;
|
||||||
width: 160px;
|
width: 160px;
|
||||||
border: 7px solid black;
|
border: 8px solid black;
|
||||||
}
|
}
|
||||||
#target {
|
#target {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
|
@ -50,12 +50,35 @@ function step0() {
|
||||||
var targetBounds = clientBounds(target);
|
var targetBounds = clientBounds(target);
|
||||||
target.style.transform = "translateY(195px)";
|
target.style.transform = "translateY(195px)";
|
||||||
runTestCycle(step1, "target.style.transform = 'translateY(195px)'");
|
runTestCycle(step1, "target.style.transform = 'translateY(195px)'");
|
||||||
checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, 8, 182, 8, 222, false));
|
checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, 8, 184, 8, 224, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
function step1() {
|
function step1() {
|
||||||
var targetBounds = clientBounds(target);
|
var targetBounds = clientBounds(target);
|
||||||
target.style.transform = "";
|
target.style.transform = "translateY(300px)";
|
||||||
checkLastEntry(entries, 1, targetBounds.concat(25, 145, 220, 222, 8, 182, 8, 222, true));
|
runTestCycle(step2, "target.style.transform = 'translateY(300px)'");
|
||||||
|
checkLastEntry(entries, 1, targetBounds.concat(26, 146, 221, 224, 8, 184, 8, 224, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function step2() {
|
||||||
|
var targetBounds = clientBounds(target);
|
||||||
|
target.style.transform = "";
|
||||||
|
target.style.zoom = "2";
|
||||||
|
runTestCycle(step3, "target.style.zoom = 2");
|
||||||
|
checkLastEntry(entries, 2, targetBounds.concat(0, 0, 0, 0, 8, 184, 8, 224, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
function step3() {
|
||||||
|
var targetBounds = clientBounds(target);
|
||||||
|
var intersectionWidth = (
|
||||||
|
176 // root width including border
|
||||||
|
-8 // root left border
|
||||||
|
-20 // target left margin * target zoom
|
||||||
|
) / 2; // convert to target's zoom factor.
|
||||||
|
var intersectionHeight = (216 - 8 - 20) / 2;
|
||||||
|
var intersectionRect = [targetBounds[0], targetBounds[0] + intersectionWidth,
|
||||||
|
targetBounds[2], targetBounds[2] + intersectionHeight];
|
||||||
|
checkLastEntry(entries, 3, targetBounds.concat(intersectionRect).concat(8, 184, 8, 224, true));
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="./resources/intersection-observer-test-utils.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var entries = [];
|
||||||
|
var popup, target;
|
||||||
|
|
||||||
|
function waitForPopupNotification(f) {
|
||||||
|
popup.requestAnimationFrame(function() {
|
||||||
|
popup.requestAnimationFrame(function() { popup.setTimeout(f); });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async_test((t) => {
|
||||||
|
var observer = new IntersectionObserver(function(changes) {
|
||||||
|
entries = entries.concat(changes);
|
||||||
|
});
|
||||||
|
popup = window.open();
|
||||||
|
t.add_cleanup(() => popup.close());
|
||||||
|
target = popup.document.createElement('div');
|
||||||
|
target.style.width = "100px";
|
||||||
|
target.style.height = "100px";
|
||||||
|
observer.observe(target);
|
||||||
|
waitForPopupNotification(t.step_func(() => {
|
||||||
|
assert_equals(entries.length, 1, "Initial notification for detached target.");
|
||||||
|
assert_equals(entries[0].isIntersecting, false, "not intersecting");
|
||||||
|
popup.document.body.appendChild(target);
|
||||||
|
waitForPopupNotification(t.step_func_done(() => {
|
||||||
|
assert_equals(entries.length, 2, "Notification after insertion into popup.");
|
||||||
|
assert_equals(entries[1].isIntersecting, true, "intersecting");
|
||||||
|
}));
|
||||||
|
}));
|
||||||
|
}, "IntersectionObserver with target in a different window.");
|
||||||
|
</script>
|
|
@ -169,6 +169,7 @@ SET TIMEOUT: html/webappapis/scripting/events/event-handler-processing-algorithm
|
||||||
SET TIMEOUT: html/webappapis/scripting/processing-model-2/*
|
SET TIMEOUT: html/webappapis/scripting/processing-model-2/*
|
||||||
SET TIMEOUT: IndexedDB/*
|
SET TIMEOUT: IndexedDB/*
|
||||||
SET TIMEOUT: infrastructure/*
|
SET TIMEOUT: infrastructure/*
|
||||||
|
SET TIMEOUT: intersection-observer/target-in-different-window.html
|
||||||
SET TIMEOUT: media-source/mediasource-util.js
|
SET TIMEOUT: media-source/mediasource-util.js
|
||||||
SET TIMEOUT: media-source/URL-createObjectURL-revoke.html
|
SET TIMEOUT: media-source/URL-createObjectURL-revoke.html
|
||||||
SET TIMEOUT: mixed-content/generic/sanity-checker.js
|
SET TIMEOUT: mixed-content/generic/sanity-checker.js
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<title>Service Worker: Navigation redirection</title>
|
<title>Service Worker: Navigation redirection</title>
|
||||||
<meta name="timeout" content="long">
|
<meta name="timeout" content="long">
|
||||||
|
<!-- empty variant tests document.location and intercepted URLs -->
|
||||||
|
<meta name="variant" content="">
|
||||||
|
<!-- client variant tests the Clients API (resultingClientId and Client.url) -->
|
||||||
|
<meta name="variant" content="?client">
|
||||||
|
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
<script src="/common/get-host-info.sub.js"></script>
|
<script src="/common/get-host-info.sub.js"></script>
|
||||||
|
@ -76,36 +81,208 @@ async function check_all_intercepted_urls(expected_urls) {
|
||||||
assert_object_equals(urls, expected_urls, 'Intercepted URLs should match.');
|
assert_object_equals(urls, expected_urls, 'Intercepted URLs should match.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Checks |clients| returned from a worker. Only the client matching
|
||||||
|
// |expected_final_client_tag| should be found. Returns true if a client was
|
||||||
|
// found. Note that the final client is not necessarily found by this worker,
|
||||||
|
// if the client is cross-origin.
|
||||||
|
//
|
||||||
|
// |clients| is an object like:
|
||||||
|
// {x: {found: true, id: id1, url: url1}, b: {found: false}}
|
||||||
|
function check_clients(clients,
|
||||||
|
expected_id,
|
||||||
|
expected_url,
|
||||||
|
expected_final_client_tag,
|
||||||
|
worker_name) {
|
||||||
|
let found = false;
|
||||||
|
Object.keys(clients).forEach(key => {
|
||||||
|
const info = clients[key];
|
||||||
|
if (info.found) {
|
||||||
|
assert_true(expected_final_client_tag,
|
||||||
|
`${worker_name} client tag exists`);
|
||||||
|
assert_equals(key, expected_final_client_tag,
|
||||||
|
`${worker_name} client tag matches`);
|
||||||
|
assert_equals(info.id, expected_id, `${worker_name} client id`);
|
||||||
|
assert_equals(info.url, expected_url, `${worker_name} client url`);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_resulting_client_ids(infos, expected_infos, actual_ids, worker) {
|
||||||
|
assert_equals(infos.length, expected_infos.length,
|
||||||
|
`request length for ${worker}`);
|
||||||
|
for (var i = 0; i < infos.length; i++) {
|
||||||
|
const tag = expected_infos[i].resultingClientIdTag;
|
||||||
|
const url = expected_infos[i].url;
|
||||||
|
const actual_id = infos[i].resultingClientId;
|
||||||
|
const expected_id = actual_ids[tag];
|
||||||
|
assert_equals(typeof(actual_id), 'string',
|
||||||
|
`resultingClientId for ${url} request to ${worker}`);
|
||||||
|
if (expected_id) {
|
||||||
|
assert_equals(requestInfos[0], expected_id,
|
||||||
|
`resultingClientId for ${url} request to ${worker}`);
|
||||||
|
} else {
|
||||||
|
actual_ids[key] = actual_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Creates an iframe and navigates to |url|, which is expected to start a chain
|
// Creates an iframe and navigates to |url|, which is expected to start a chain
|
||||||
// of redirects.
|
// of redirects.
|
||||||
// - |expected_last_url| is the expected window.location after the
|
// - |expected_last_url| is the expected window.location after the
|
||||||
// navigation.
|
// navigation.
|
||||||
|
//
|
||||||
// - |expected_request_infos| is the expected requests that the service workers
|
// - |expected_request_infos| is the expected requests that the service workers
|
||||||
// were dispatched fetch events for. The format is:
|
// were dispatched fetch events for. The format is:
|
||||||
// [
|
// [
|
||||||
// [{url: url1}, {url: url2}], // requests from workers[0],
|
// [
|
||||||
// [{url: url1}, // requests from workers[1],
|
// // Requests received by workers[0].
|
||||||
// [{url: url1}, {url: url2}] // requests from cross-origin worker
|
// {url: url1, resultingClientIdTag: 'a'},
|
||||||
|
// {url: url2, resultingClientIdTag: 'a'}
|
||||||
|
// ],
|
||||||
|
// [
|
||||||
|
// // Requests received by workers[1].
|
||||||
|
// {url: url3, resultingClientIdTag: 'a'}
|
||||||
|
// ],
|
||||||
|
// [
|
||||||
|
// // Requests received by the cross-origin worker.
|
||||||
|
// {url: url4, resultingClientIdTag: 'x'}
|
||||||
|
// {url: url5, resultingClientIdTag: 'x'}
|
||||||
|
// ]
|
||||||
// ]
|
// ]
|
||||||
|
// Here, |url| is |event.request.url| and |resultingClientIdTag| represents
|
||||||
|
// |event.resultingClientId|. Since the actual client ids are not known
|
||||||
|
// beforehand, the expectation isn't the literal expected value, but all equal
|
||||||
|
// tags must map to the same actual id.
|
||||||
|
//
|
||||||
|
// - |expected_final_client_tag| is the resultingClientIdTag that is
|
||||||
|
// expected to map to the created client's id. This is null if there
|
||||||
|
// is no such tag, which can happen when the final request was a cross-origin
|
||||||
|
// redirect to out-scope, so no worker received a fetch event whose
|
||||||
|
// resultingClientId is the id of the resulting client.
|
||||||
|
//
|
||||||
|
// In the example above:
|
||||||
|
// - workers[0] receives two requests with the same resultingClientId.
|
||||||
|
// - workers[1] receives one request also with that resultingClientId.
|
||||||
|
// - The cross-origin worker receives two requests with the same
|
||||||
|
// resultingClientId which differs from the previous one.
|
||||||
|
// - Assuming |expected_final_client_tag| is 'x', then the created
|
||||||
|
// client has the id seen by the cross-origin worker above.
|
||||||
function redirect_test(url,
|
function redirect_test(url,
|
||||||
expected_last_url,
|
expected_last_url,
|
||||||
expected_request_infos,
|
expected_request_infos,
|
||||||
|
expected_final_client_tag,
|
||||||
test_name) {
|
test_name) {
|
||||||
promise_test(async t => {
|
promise_test(async t => {
|
||||||
const frame = await with_iframe(url);
|
const frame = await with_iframe(url);
|
||||||
t.add_cleanup(() => { frame.remove(); });
|
t.add_cleanup(() => { frame.remove(); });
|
||||||
|
|
||||||
const expected_intercepted_urls = expected_request_infos.map(requests => {
|
// Switch on variant.
|
||||||
return requests.map(info => {
|
if (document.location.search == '?client') {
|
||||||
return info.url;
|
return client_variant_test(url, expected_last_url, expected_request_infos,
|
||||||
});
|
expected_final_client_tag, test_name);
|
||||||
});
|
}
|
||||||
await check_all_intercepted_urls(expected_intercepted_urls);
|
|
||||||
const last_url = await send_to_iframe(frame, 'getLocation');
|
return default_variant_test(url, expected_last_url, expected_request_infos,
|
||||||
assert_equals(last_url, expected_last_url, 'Last URL should match.');
|
frame, test_name);
|
||||||
}, test_name);
|
}, test_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The default variant tests the request interception chain and
|
||||||
|
// resulting document.location.
|
||||||
|
async function default_variant_test(url,
|
||||||
|
expected_last_url,
|
||||||
|
expected_request_infos,
|
||||||
|
frame,
|
||||||
|
test_name) {
|
||||||
|
const expected_intercepted_urls = expected_request_infos.map(
|
||||||
|
requests_for_worker => {
|
||||||
|
return requests_for_worker.map(info => {
|
||||||
|
return info.url;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
await check_all_intercepted_urls(expected_intercepted_urls);
|
||||||
|
const last_url = await send_to_iframe(frame, 'getLocation');
|
||||||
|
assert_equals(last_url, expected_last_url, 'Last URL should match.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// The "client" variant tests the Clients API using resultingClientId.
|
||||||
|
async function client_variant_test(url,
|
||||||
|
expected_last_url,
|
||||||
|
expected_request_infos,
|
||||||
|
expected_final_client_tag,
|
||||||
|
test_name) {
|
||||||
|
// Request infos is an array like:
|
||||||
|
// [
|
||||||
|
// [{url: url1, resultingClientIdTag: tag1}],
|
||||||
|
// [{url: url2, resultingClientIdTag: tag2}],
|
||||||
|
// [{url: url3: resultingClientIdTag: tag3}]
|
||||||
|
// ]
|
||||||
|
const requestInfos = await get_all_request_infos();
|
||||||
|
|
||||||
|
// We check the actual infos against the expected ones, and learn the
|
||||||
|
// actual ids as we go.
|
||||||
|
const actual_ids = {};
|
||||||
|
check_resulting_client_ids(requestInfos[0],
|
||||||
|
expected_request_infos[0],
|
||||||
|
actual_ids,
|
||||||
|
'worker0');
|
||||||
|
check_resulting_client_ids(requestInfos[1],
|
||||||
|
expected_request_infos[1],
|
||||||
|
actual_ids,
|
||||||
|
'worker1');
|
||||||
|
check_resulting_client_ids(requestInfos[2],
|
||||||
|
expected_request_infos[2],
|
||||||
|
actual_ids,
|
||||||
|
'crossOriginWorker');
|
||||||
|
|
||||||
|
// Now |actual_ids| maps tag to actual id:
|
||||||
|
// {x: id1, b: id2, c: id3}
|
||||||
|
// Ask each worker to try to resolve the actual ids to clients.
|
||||||
|
// Only |expected_final_client_tag| should resolve to a client.
|
||||||
|
const client_infos = await get_all_clients(actual_ids);
|
||||||
|
|
||||||
|
// Client infos is an object like:
|
||||||
|
// {
|
||||||
|
// worker0: {x: {found: true, id: id1, url: url1}, b: {found: false}},
|
||||||
|
// worker1: {x: {found: true, id: id1, url: url1}},
|
||||||
|
// crossOriginWorker: {x: {found: false}}, {b: {found: false}}
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Now check each client info. check_clients() verifies each info: only
|
||||||
|
// |expected_final_client_tag| should ever be found and the found client
|
||||||
|
// should have the expected url and id. A wrinkle is that not all workers
|
||||||
|
// will find the client, if they are cross-origin to the client. This
|
||||||
|
// means check_clients() trivially passes if no clients are found. So
|
||||||
|
// additionally check that at least one worker found the client (|found|),
|
||||||
|
// if that was expected (|expect_found|).
|
||||||
|
let found = false;
|
||||||
|
const expect_found = !!expected_final_client_tag;
|
||||||
|
const expected_id = actual_ids[expected_final_client_tag];
|
||||||
|
found = check_clients(client_infos.worker0,
|
||||||
|
expected_id,
|
||||||
|
expected_last_url,
|
||||||
|
expected_final_client_tag,
|
||||||
|
'worker0');
|
||||||
|
found = check_clients(client_infos.worker1,
|
||||||
|
expected_id,
|
||||||
|
expected_last_url,
|
||||||
|
expected_final_client_tag,
|
||||||
|
'worker1') || found;
|
||||||
|
found = check_clients(client_infos.crossOriginWorker,
|
||||||
|
expected_id,
|
||||||
|
expected_last_url,
|
||||||
|
expected_final_client_tag,
|
||||||
|
'crossOriginWorker') || found;
|
||||||
|
assert_equals(found, expect_found, 'client found');
|
||||||
|
|
||||||
|
if (!expect_found) {
|
||||||
|
// TODO(falken): Ask the other origin frame if it has a client of the
|
||||||
|
// expected URL.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
window.addEventListener('message', on_message, false);
|
window.addEventListener('message', on_message, false);
|
||||||
|
|
||||||
function on_message(e) {
|
function on_message(e) {
|
||||||
|
@ -129,6 +306,27 @@ function send_to_iframe(frame, message) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function get_all_clients(actual_ids) {
|
||||||
|
const client_infos = {};
|
||||||
|
client_infos['worker0'] = await get_clients(workers[0], actual_ids);
|
||||||
|
client_infos['worker1'] = await get_clients(workers[1], actual_ids);
|
||||||
|
client_infos['crossOriginWorker'] =
|
||||||
|
await send_to_iframe(other_origin_frame,
|
||||||
|
{command: 'get_clients', actual_ids});
|
||||||
|
return client_infos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_clients(worker, actual_ids) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var channel = new MessageChannel();
|
||||||
|
channel.port1.onmessage = (msg) => {
|
||||||
|
resolve(msg.data.clients);
|
||||||
|
};
|
||||||
|
worker.postMessage({command: 'getClients', actual_ids, port: channel.port2},
|
||||||
|
[channel.port2]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Returns an array of the URLs that |worker| received fetch events for:
|
// Returns an array of the URLs that |worker| received fetch events for:
|
||||||
// [url1, url2]
|
// [url1, url2]
|
||||||
async function get_intercepted_urls(worker) {
|
async function get_intercepted_urls(worker) {
|
||||||
|
@ -138,7 +336,10 @@ async function get_intercepted_urls(worker) {
|
||||||
|
|
||||||
// Returns the requests that |worker| received fetch events for. The return
|
// Returns the requests that |worker| received fetch events for. The return
|
||||||
// value is an array of format:
|
// value is an array of format:
|
||||||
// [{url: url1}, {url: url2}]
|
// [
|
||||||
|
// {url: url1, resultingClientId: id},
|
||||||
|
// {url: url2, resultingClientId: id}
|
||||||
|
// ]
|
||||||
function get_request_infos(worker) {
|
function get_request_infos(worker) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
var channel = new MessageChannel();
|
var channel = new MessageChannel();
|
||||||
|
@ -150,6 +351,29 @@ function get_request_infos(worker) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns an array of the requests the workers received fetch events for:
|
||||||
|
// [
|
||||||
|
// // Requests from workers[0].
|
||||||
|
// [
|
||||||
|
// {url: url1, resultingClientIdTag: tag1},
|
||||||
|
// {url: url2, resultingClientIdTag: tag1}
|
||||||
|
// ],
|
||||||
|
//
|
||||||
|
// // Requests from workers[1].
|
||||||
|
// [{url: url3, resultingClientIdTag: tag2}],
|
||||||
|
//
|
||||||
|
// // Requests from the cross-origin worker.
|
||||||
|
// []
|
||||||
|
// ]
|
||||||
|
async function get_all_request_infos() {
|
||||||
|
const request_infos = [];
|
||||||
|
request_infos.push(await get_request_infos(workers[0]));
|
||||||
|
request_infos.push(await get_request_infos(workers[1]));
|
||||||
|
request_infos.push(await send_to_iframe(other_origin_frame,
|
||||||
|
{command: 'get_request_infos'}));
|
||||||
|
return request_infos;
|
||||||
|
}
|
||||||
|
|
||||||
let url;
|
let url;
|
||||||
let url1;
|
let url1;
|
||||||
let url2;
|
let url2;
|
||||||
|
@ -159,7 +383,8 @@ url = SCOPE1;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
OUT_SCOPE + 'url=' + encodeURIComponent(url),
|
OUT_SCOPE + 'url=' + encodeURIComponent(url),
|
||||||
url,
|
url,
|
||||||
[[{url}], [], []],
|
[[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'Normal redirect to same-origin scope.');
|
'Normal redirect to same-origin scope.');
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,30 +392,33 @@ url = SCOPE1 + '#ref';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1) + '#ref',
|
OUT_SCOPE + 'url=' + encodeURIComponent(SCOPE1) + '#ref',
|
||||||
url,
|
url,
|
||||||
[[{url}], [], []],
|
[[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'Normal redirect to same-origin scope with a hash fragment.');
|
'Normal redirect to same-origin scope with a hash fragment.');
|
||||||
|
|
||||||
url = SCOPE1 + '#ref2';
|
url = SCOPE1 + '#ref2';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
OUT_SCOPE + 'url=' + encodeURIComponent(url) + '#ref',
|
OUT_SCOPE + 'url=' + encodeURIComponent(url) + '#ref',
|
||||||
url,
|
url,
|
||||||
[[{url}], [], []],
|
[[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'Normal redirect to same-origin scope with different hash fragments.');
|
'Normal redirect to same-origin scope with different hash fragments.');
|
||||||
|
|
||||||
url = OTHER_ORIGIN_SCOPE;
|
url = OTHER_ORIGIN_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
OUT_SCOPE + 'url=' + encodeURIComponent(url),
|
OUT_SCOPE + 'url=' + encodeURIComponent(url),
|
||||||
url,
|
url,
|
||||||
[[], [], [{url}]],
|
[[], [], [{url, resultingClientIdTag: 'x'}]],
|
||||||
|
'x',
|
||||||
'Normal redirect to other-origin scope.');
|
'Normal redirect to other-origin scope.');
|
||||||
|
|
||||||
|
|
||||||
// SW fallbacked redirect. SW doesn't handle the fetch request.
|
// SW fallbacked redirect. SW doesn't handle the fetch request.
|
||||||
url = SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE);
|
url = SCOPE1 + 'url=' + encodeURIComponent(OUT_SCOPE);
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url,
|
url,
|
||||||
OUT_SCOPE,
|
OUT_SCOPE,
|
||||||
[[{url}], [], []],
|
[[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to same-origin out-scope.');
|
'SW-fallbacked redirect to same-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1);
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1);
|
||||||
|
@ -198,7 +426,15 @@ url2 = SCOPE1;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to same-origin same-scope.');
|
'SW-fallbacked redirect to same-origin same-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref';
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1) + '#ref';
|
||||||
|
@ -206,7 +442,15 @@ url2 = SCOPE1 + '#ref';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to same-origin same-scope with a hash fragment.');
|
'SW-fallbacked redirect to same-origin same-scope with a hash fragment.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref';
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(SCOPE1 + '#ref2') + '#ref';
|
||||||
|
@ -214,7 +458,15 @@ url2 = SCOPE1 + '#ref2';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to same-origin same-scope with different hash ' +
|
'SW-fallbacked redirect to same-origin same-scope with different hash ' +
|
||||||
'fragments.');
|
'fragments.');
|
||||||
|
|
||||||
|
@ -223,7 +475,12 @@ url2 = SCOPE2;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [{url: url2}], []],
|
[
|
||||||
|
[{url: url1, resultingClientIdTag: 'x'}],
|
||||||
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to same-origin other-scope.');
|
'SW-fallbacked redirect to same-origin other-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
||||||
|
@ -231,7 +488,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to other-origin out-scope.');
|
'SW-fallbacked redirect to other-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
||||||
|
@ -239,10 +497,32 @@ url2 = OTHER_ORIGIN_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], [{url: url2}]],
|
[
|
||||||
|
[{url: url1, resultingClientIdTag: 'a'}],
|
||||||
|
[],
|
||||||
|
[{url: url2, resultingClientIdTag: 'x'}]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fallbacked redirect to other-origin in-scope.');
|
'SW-fallbacked redirect to other-origin in-scope.');
|
||||||
|
|
||||||
|
|
||||||
|
url3 = SCOPE1;
|
||||||
|
url2 = OTHER_ORIGIN_SCOPE + 'url=' + encodeURIComponent(url3);
|
||||||
|
url1 = SCOPE1 + 'url=' + encodeURIComponent(url2);
|
||||||
|
redirect_test(
|
||||||
|
url1,
|
||||||
|
url3,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'a'},
|
||||||
|
{url: url3, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[{url: url2, resultingClientIdTag: 'b'}]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
|
'SW-fallbacked redirect to other-origin and back to same-origin.');
|
||||||
|
|
||||||
// SW generated redirect.
|
// SW generated redirect.
|
||||||
// SW: event.respondWith(Response.redirect(params['url']));
|
// SW: event.respondWith(Response.redirect(params['url']));
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE);
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE);
|
||||||
|
@ -250,7 +530,8 @@ url2 = OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
null,
|
||||||
'SW-generated redirect to same-origin out-scope.');
|
'SW-generated redirect to same-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref';
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref';
|
||||||
|
@ -258,7 +539,8 @@ url2 = OUT_SCOPE + '#ref';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'SW-generated redirect to same-origin out-scope with a hash fragment.');
|
'SW-generated redirect to same-origin out-scope with a hash fragment.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref';
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE + '#ref2') + '#ref';
|
||||||
|
@ -266,7 +548,8 @@ url2 = OUT_SCOPE + '#ref2';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'SW-generated redirect to same-origin out-scope with different hash ' +
|
'SW-generated redirect to same-origin out-scope with different hash ' +
|
||||||
'fragments.');
|
'fragments.');
|
||||||
|
|
||||||
|
@ -275,7 +558,15 @@ url2 = SCOPE1;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-generated redirect to same-origin same-scope.');
|
'SW-generated redirect to same-origin same-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2);
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(SCOPE2);
|
||||||
|
@ -283,7 +574,12 @@ url2 = SCOPE2;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [{url: url2}], []],
|
[
|
||||||
|
[{url: url1, resultingClientIdTag: 'x'}],
|
||||||
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-generated redirect to same-origin other-scope.');
|
'SW-generated redirect to same-origin other-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
||||||
|
@ -291,7 +587,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
null,
|
||||||
'SW-generated redirect to other-origin out-scope.');
|
'SW-generated redirect to other-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
||||||
|
@ -300,10 +597,11 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}],
|
[{url: url1, resultingClientIdTag: 'a'}],
|
||||||
[],
|
[],
|
||||||
[{url: url2}]
|
[{url: url2, resultingClientIdTag: 'x'}]
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'SW-generated redirect to other-origin in-scope.');
|
'SW-generated redirect to other-origin in-scope.');
|
||||||
|
|
||||||
|
|
||||||
|
@ -314,7 +612,8 @@ url2 = OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'SW-fetched redirect to same-origin out-scope.');
|
'SW-fetched redirect to same-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1);
|
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1);
|
||||||
|
@ -322,7 +621,15 @@ url2 = SCOPE1;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'SW-fetched redirect to same-origin same-scope.');
|
'SW-fetched redirect to same-origin same-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2);
|
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2);
|
||||||
|
@ -331,10 +638,11 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}],
|
[{url: url1, resultingClientIdTag: 'x'}],
|
||||||
[{url: url2}],
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'SW-fetched redirect to same-origin other-scope.');
|
'SW-fetched redirect to same-origin other-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
||||||
|
@ -342,7 +650,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
null,
|
||||||
'SW-fetched redirect to other-origin out-scope.');
|
'SW-fetched redirect to other-origin out-scope.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
url1 = SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
||||||
|
@ -351,10 +660,11 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}],
|
[{url: url1, resultingClientIdTag: 'a'}],
|
||||||
[],
|
[],
|
||||||
[{url: url2}]
|
[{url: url2, resultingClientIdTag: 'x'}]
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'SW-fetched redirect to other-origin in-scope.');
|
'SW-fetched redirect to other-origin in-scope.');
|
||||||
|
|
||||||
|
|
||||||
|
@ -366,7 +676,8 @@ url2 = OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin out-scope with opaque redirect response.');
|
'Redirect to same-origin out-scope with opaque redirect response.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1);
|
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE1);
|
||||||
|
@ -374,7 +685,15 @@ url2 = SCOPE1;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}, {url: url2}], [], []],
|
[
|
||||||
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin same-scope with opaque redirect response.');
|
'Redirect to same-origin same-scope with opaque redirect response.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2);
|
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(SCOPE2);
|
||||||
|
@ -382,7 +701,12 @@ url2 = SCOPE2;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [{url: url2}], []],
|
[
|
||||||
|
[{url: url1, resultingClientIdTag: 'x'}],
|
||||||
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin other-scope with opaque redirect response.');
|
'Redirect to same-origin other-scope with opaque redirect response.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE);
|
||||||
|
@ -390,7 +714,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
null,
|
||||||
'Redirect to other-origin out-scope with opaque redirect response.');
|
'Redirect to other-origin out-scope with opaque redirect response.');
|
||||||
|
|
||||||
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
url1 = SCOPE1 + 'sw=manual&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE);
|
||||||
|
@ -398,12 +723,18 @@ url2 = OTHER_ORIGIN_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], [{url: url2}]],
|
[
|
||||||
|
[{url: url1, resultingClientIdTag: 'a'}],
|
||||||
|
[],
|
||||||
|
[{url: url2, resultingClientIdTag: 'x'}]
|
||||||
|
],
|
||||||
|
'x',
|
||||||
'Redirect to other-origin in-scope with opaque redirect response.');
|
'Redirect to other-origin in-scope with opaque redirect response.');
|
||||||
|
|
||||||
url= SCOPE1 + 'sw=manual&noLocationRedirect';
|
url= SCOPE1 + 'sw=manual&noLocationRedirect';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url, url, [[{url}], [], []],
|
url, url, [[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'No location redirect response.');
|
'No location redirect response.');
|
||||||
|
|
||||||
|
|
||||||
|
@ -414,7 +745,8 @@ url2 = OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin out-scope with opaque redirect response which ' +
|
'Redirect to same-origin out-scope with opaque redirect response which ' +
|
||||||
'is passed through Cache.');
|
'is passed through Cache.');
|
||||||
|
|
||||||
|
@ -424,10 +756,14 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}, {url: url2}],
|
[
|
||||||
|
{url: url1, resultingClientIdTag: 'x'},
|
||||||
|
{url: url2, resultingClientIdTag: 'x'}
|
||||||
|
],
|
||||||
[],
|
[],
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin same-scope with opaque redirect response which ' +
|
'Redirect to same-origin same-scope with opaque redirect response which ' +
|
||||||
'is passed through Cache.');
|
'is passed through Cache.');
|
||||||
|
|
||||||
|
@ -437,10 +773,11 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}],
|
[{url: url1, resultingClientIdTag: 'x'}],
|
||||||
[{url: url2}],
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'Redirect to same-origin other-scope with opaque redirect response which ' +
|
'Redirect to same-origin other-scope with opaque redirect response which ' +
|
||||||
'is passed through Cache.');
|
'is passed through Cache.');
|
||||||
|
|
||||||
|
@ -450,7 +787,8 @@ url2 = OTHER_ORIGIN_OUT_SCOPE;
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[[{url: url1}], [], []],
|
[[{url: url1, resultingClientIdTag: 'a'}], [], []],
|
||||||
|
null,
|
||||||
'Redirect to other-origin out-scope with opaque redirect response which ' +
|
'Redirect to other-origin out-scope with opaque redirect response which ' +
|
||||||
'is passed through Cache.');
|
'is passed through Cache.');
|
||||||
|
|
||||||
|
@ -461,10 +799,11 @@ redirect_test(
|
||||||
url1,
|
url1,
|
||||||
url2,
|
url2,
|
||||||
[
|
[
|
||||||
[{url: url1}],
|
[{url: url1, resultingClientIdTag: 'a'}],
|
||||||
[],
|
[],
|
||||||
[{url: url2}],
|
[{url: url2, resultingClientIdTag: 'x'}],
|
||||||
],
|
],
|
||||||
|
'x',
|
||||||
'Redirect to other-origin in-scope with opaque redirect response which ' +
|
'Redirect to other-origin in-scope with opaque redirect response which ' +
|
||||||
'is passed through Cache.');
|
'is passed through Cache.');
|
||||||
|
|
||||||
|
@ -472,7 +811,8 @@ url = SCOPE1 + 'sw=manualThroughCache&noLocationRedirect';
|
||||||
redirect_test(
|
redirect_test(
|
||||||
url,
|
url,
|
||||||
url,
|
url,
|
||||||
[[{url}], [], []],
|
[[{url, resultingClientIdTag: 'x'}], [], []],
|
||||||
|
'x',
|
||||||
'No location redirect response via Cache.');
|
'No location redirect response via Cache.');
|
||||||
|
|
||||||
// Clean up the test environment. This promise_test() needs to be the last one.
|
// Clean up the test environment. This promise_test() needs to be the last one.
|
||||||
|
|
|
@ -44,6 +44,20 @@ function get_request_infos(worker) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_clients(worker, actual_ids) {
|
||||||
|
return new Promise(function(resolve) {
|
||||||
|
var channel = new MessageChannel();
|
||||||
|
channel.port1.onmessage = (msg) => {
|
||||||
|
resolve(msg.data.clients);
|
||||||
|
};
|
||||||
|
worker.postMessage({
|
||||||
|
command: 'getClients',
|
||||||
|
actual_ids,
|
||||||
|
port: channel.port2
|
||||||
|
}, [channel.port2]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
window.addEventListener('message', on_message, false);
|
window.addEventListener('message', on_message, false);
|
||||||
|
|
||||||
function on_message(e) {
|
function on_message(e) {
|
||||||
|
@ -59,6 +73,11 @@ function on_message(e) {
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
send_result(e.data.id, data);
|
send_result(e.data.id, data);
|
||||||
});
|
});
|
||||||
|
} else if (command == 'get_clients') {
|
||||||
|
get_clients(worker, e.data.message.actual_ids)
|
||||||
|
.then(function(data) {
|
||||||
|
send_result(e.data.id, data);
|
||||||
|
});
|
||||||
} else if (command == 'unregister') {
|
} else if (command == 'unregister') {
|
||||||
registration.unregister()
|
registration.unregister()
|
||||||
.then(function() {
|
.then(function() {
|
||||||
|
|
|
@ -5,6 +5,13 @@ var cacheName = 'urls-' + self.registration.scope;
|
||||||
|
|
||||||
var waitUntilPromiseList = [];
|
var waitUntilPromiseList = [];
|
||||||
|
|
||||||
|
// Sends the requests seen by this worker. The output is:
|
||||||
|
// {
|
||||||
|
// requestInfos: [
|
||||||
|
// {url: url1, resultingClientId: id1},
|
||||||
|
// {url: url2, resultingClientId: id2},
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
async function getRequestInfos(event) {
|
async function getRequestInfos(event) {
|
||||||
// Wait for fetch events to finish.
|
// Wait for fetch events to finish.
|
||||||
await Promise.all(waitUntilPromiseList);
|
await Promise.all(waitUntilPromiseList);
|
||||||
|
@ -15,8 +22,11 @@ async function getRequestInfos(event) {
|
||||||
const requestList = await cache.keys();
|
const requestList = await cache.keys();
|
||||||
const requestInfos = [];
|
const requestInfos = [];
|
||||||
for (let i = 0; i < requestList.length; i++) {
|
for (let i = 0; i < requestList.length; i++) {
|
||||||
|
const response = await cache.match(requestList[i]);
|
||||||
|
const body = await response.json();
|
||||||
requestInfos[i] = {
|
requestInfos[i] = {
|
||||||
url: requestList[i].url,
|
url: requestList[i].url,
|
||||||
|
resultingClientId: body.resultingClientId
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
await caches.delete(cacheName);
|
await caches.delete(cacheName);
|
||||||
|
@ -24,13 +34,50 @@ async function getRequestInfos(event) {
|
||||||
event.data.port.postMessage({requestInfos});
|
event.data.port.postMessage({requestInfos});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sends the results of clients.get(id) from this worker. The
|
||||||
|
// input is:
|
||||||
|
// {
|
||||||
|
// actual_ids: {a: id1, b: id2, x: id3}
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// The output is:
|
||||||
|
// {
|
||||||
|
// clients: {
|
||||||
|
// a: {found: false},
|
||||||
|
// b: {found: false},
|
||||||
|
// x: {
|
||||||
|
// id: id3,
|
||||||
|
// url: url1,
|
||||||
|
// found: true
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
async function getClients(event) {
|
||||||
|
// |actual_ids| is like:
|
||||||
|
// {a: id1, b: id2, x: id3}
|
||||||
|
const actual_ids = event.data.actual_ids;
|
||||||
|
const result = {}
|
||||||
|
for (let key of Object.keys(actual_ids)) {
|
||||||
|
const id = actual_ids[key];
|
||||||
|
const client = await self.clients.get(id);
|
||||||
|
if (client === undefined)
|
||||||
|
result[key] = {found: false};
|
||||||
|
else
|
||||||
|
result[key] = {found: true, url: client.url, id: client.id};
|
||||||
|
}
|
||||||
|
event.data.port.postMessage({clients: result});
|
||||||
|
}
|
||||||
|
|
||||||
self.addEventListener('message', async function(event) {
|
self.addEventListener('message', async function(event) {
|
||||||
if (event.data.command == 'getRequestInfos') {
|
if (event.data.command == 'getRequestInfos') {
|
||||||
event.waitUntil(getRequestInfos(event));
|
event.waitUntil(getRequestInfos(event));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(falken): Add a getClientInfos command to test Clients API.
|
if (event.data.command == 'getClients') {
|
||||||
|
event.waitUntil(getClients(event));
|
||||||
|
return;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function get_query_params(url) {
|
function get_query_params(url) {
|
||||||
|
@ -49,7 +96,11 @@ function get_query_params(url) {
|
||||||
|
|
||||||
self.addEventListener('fetch', function(event) {
|
self.addEventListener('fetch', function(event) {
|
||||||
var waitUntilPromise = caches.open(cacheName).then(function(cache) {
|
var waitUntilPromise = caches.open(cacheName).then(function(cache) {
|
||||||
return cache.put(event.request, new Response());
|
const responseBody = {};
|
||||||
|
responseBody['resultingClientId'] = event.resultingClientId;
|
||||||
|
const headers = new Headers({'Content-Type': 'application/json'});
|
||||||
|
const response = new Response(JSON.stringify(responseBody), {headers});
|
||||||
|
return cache.put(event.request, response);
|
||||||
});
|
});
|
||||||
event.waitUntil(waitUntilPromise);
|
event.waitUntil(waitUntilPromise);
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
async_test(t => {
|
async_test(t => {
|
||||||
const utter = new SpeechSynthesisUtterance('1');
|
const utter = new SpeechSynthesisUtterance('1');
|
||||||
utter.onerror = t.step_func_done((e) => {
|
utter.onerror = t.step_func_done((e) => {
|
||||||
assert_equals(e.name, "not-allowed");
|
assert_equals(e.error, "not-allowed");
|
||||||
});
|
});
|
||||||
utter.onend = t.step_func_done(() => assert_unreached());
|
utter.onend = t.step_func_done(() => assert_unreached());
|
||||||
speechSynthesis.speak(utter);
|
speechSynthesis.speak(utter);
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
/*
|
||||||
|
[Exposed=Window,
|
||||||
|
Constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict)]
|
||||||
|
interface SpeechSynthesisErrorEvent : SpeechSynthesisErrorEvent {
|
||||||
|
readonly attribute SpeechSynthesisErrorCode error;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisErrorEvent();
|
||||||
|
});
|
||||||
|
}, "SpeechSynthesisErrorEvent with no arguments throws TypeError");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisErrorEvent("type");
|
||||||
|
});
|
||||||
|
}, "SpeechSynthesisErrorEvent with no eventInitDict throws TypeError");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisErrorEvent("type", {});
|
||||||
|
});
|
||||||
|
}, `SpeechSynthesisErrorEvent with empty eventInitDict throws TypeError (requires
|
||||||
|
utterance and error)`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisErrorEvent("type", {error:"not-allowed"});
|
||||||
|
});
|
||||||
|
}, `SpeechSynthesisErrorEvent with eventInitDict without utterance throws
|
||||||
|
TypeError`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisErrorEvent("type", {utterance: new SpeechSynthesisUtterance()});
|
||||||
|
});
|
||||||
|
}, `SpeechSynthesisErrorEvent with eventInitDict without error throws
|
||||||
|
TypeError`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const utterance = new SpeechSynthesisUtterance("foo");
|
||||||
|
const event = new SpeechSynthesisErrorEvent("type", {utterance: utterance, error:"not-allowed"});
|
||||||
|
assert_equals(event.utterance, utterance);
|
||||||
|
assert_equals(event.error, "not-allowed");
|
||||||
|
assert_equals(event.charIndex, 0);
|
||||||
|
assert_equals(event.elapsedTime, 0);
|
||||||
|
assert_equals(event.name, "");
|
||||||
|
}, "SpeechSynthesisErrorEvent with eventInitDict having utterance and error");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const utterance = new SpeechSynthesisUtterance("foo");
|
||||||
|
const event = new SpeechSynthesisErrorEvent("type", {
|
||||||
|
utterance: utterance,
|
||||||
|
charIndex: 5,
|
||||||
|
elapsedTime: 100,
|
||||||
|
name: "foo",
|
||||||
|
error: "synthesis-failed"
|
||||||
|
});
|
||||||
|
assert_equals(event.bubbles, false);
|
||||||
|
assert_equals(event.cancelable, false);
|
||||||
|
assert_equals(event.type, "type");
|
||||||
|
assert_equals(event.utterance, utterance);
|
||||||
|
assert_equals(event.charIndex, 5);
|
||||||
|
assert_equals(event.elapsedTime, 100);
|
||||||
|
assert_equals(event.name, "foo");
|
||||||
|
assert_equals(event.error, "synthesis-failed");
|
||||||
|
}, "SpeechSynthesisErrorEvent with custom eventInitDict");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
function createEventFunc(error) {
|
||||||
|
return () => {
|
||||||
|
new SpeechSynthesisErrorEvent("type", {
|
||||||
|
utterance: new SpeechSynthesisUtterance(),
|
||||||
|
error: error
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
assert_throws(new TypeError(), createEventFunc(""));
|
||||||
|
assert_throws(new TypeError(), createEventFunc("foo"));
|
||||||
|
assert_throws(new TypeError(), createEventFunc("bar"));
|
||||||
|
}, "SpeechSynthesisErrorEvent with wrong error enum");
|
||||||
|
</script>
|
|
@ -0,0 +1,67 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script>
|
||||||
|
/*
|
||||||
|
[Exposed=Window,
|
||||||
|
Constructor(DOMString type, SpeechSynthesisEventInit eventInitDict)]
|
||||||
|
interface SpeechSynthesisEvent : Event {
|
||||||
|
readonly attribute SpeechSynthesisUtterance utterance;
|
||||||
|
readonly attribute unsigned long charIndex;
|
||||||
|
readonly attribute float elapsedTime;
|
||||||
|
readonly attribute DOMString name;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisEvent();
|
||||||
|
});
|
||||||
|
}, "SpeechSynthesisEvent with no arguments throws TypeError");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisEvent("type");
|
||||||
|
});
|
||||||
|
}, "SpeechSynthesisEvent with no eventInitDict throws TypeError");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisEvent("type", {});
|
||||||
|
});
|
||||||
|
}, `SpeechSynthesisEvent with empty eventInitDict throws TypeError (requires
|
||||||
|
utterance)`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
assert_throws(new TypeError(), () => {
|
||||||
|
new SpeechSynthesisEvent("type", {charIndex: 10, elapsedTime: 50, name:"foo"});
|
||||||
|
});
|
||||||
|
}, `SpeechSynthesisEvent with eventInitDict not having utterance throws
|
||||||
|
TypeError`);
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const utterance = new SpeechSynthesisUtterance("foo");
|
||||||
|
const event = new SpeechSynthesisEvent("type", {utterance: utterance});
|
||||||
|
assert_equals(event.utterance, utterance);
|
||||||
|
assert_equals(event.charIndex, 0);
|
||||||
|
assert_equals(event.elapsedTime, 0);
|
||||||
|
assert_equals(event.name, "");
|
||||||
|
}, "SpeechSynthesisEvent with eventInitDict having an utterance");
|
||||||
|
|
||||||
|
test(() => {
|
||||||
|
const utterance = new SpeechSynthesisUtterance("foo");
|
||||||
|
const event = new SpeechSynthesisEvent("type", {
|
||||||
|
utterance: utterance,
|
||||||
|
charIndex: 5,
|
||||||
|
elapsedTime: 100,
|
||||||
|
name: "foo"
|
||||||
|
});
|
||||||
|
assert_equals(event.bubbles, false);
|
||||||
|
assert_equals(event.cancelable, false);
|
||||||
|
assert_equals(event.type, "type");
|
||||||
|
assert_equals(event.utterance, utterance);
|
||||||
|
assert_equals(event.charIndex, 5);
|
||||||
|
assert_equals(event.elapsedTime, 100);
|
||||||
|
assert_equals(event.name, "foo");
|
||||||
|
}, "SpeechSynthesisEvent with custom eventInitDict");
|
||||||
|
</script>
|
|
@ -267,6 +267,7 @@ class SourceFile(object):
|
||||||
self.name_prefix("MANIFEST") or
|
self.name_prefix("MANIFEST") or
|
||||||
self.filename == "META.yml" or
|
self.filename == "META.yml" or
|
||||||
self.filename.startswith(".") or
|
self.filename.startswith(".") or
|
||||||
|
self.filename.endswith(".headers") or
|
||||||
self.type_flag == "support" or
|
self.type_flag == "support" or
|
||||||
self.in_non_test_dir())
|
self.in_non_test_dir())
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ def items(s):
|
||||||
"foo/resources/test.html",
|
"foo/resources/test.html",
|
||||||
"foo/support/test.html",
|
"foo/support/test.html",
|
||||||
"foo/test-support.html",
|
"foo/test-support.html",
|
||||||
|
"foo/foo-manual.html.headers",
|
||||||
"css/common/test.html",
|
"css/common/test.html",
|
||||||
"css/CSS2/archive/test.html",
|
"css/CSS2/archive/test.html",
|
||||||
])
|
])
|
||||||
|
@ -64,6 +65,7 @@ def test_not_name_is_non_test(rel_path):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("rel_path", [
|
@pytest.mark.parametrize("rel_path", [
|
||||||
|
"foo/foo-manual.html",
|
||||||
"html/test-manual.html",
|
"html/test-manual.html",
|
||||||
"html/test-manual.xhtml",
|
"html/test-manual.xhtml",
|
||||||
"html/test-manual.https.html",
|
"html/test-manual.https.html",
|
||||||
|
|
|
@ -75,7 +75,7 @@ class TestUsingServer(unittest.TestCase):
|
||||||
req.add_data(body)
|
req.add_data(body)
|
||||||
|
|
||||||
if auth is not None:
|
if auth is not None:
|
||||||
req.add_header("Authorization", b"Basic %s" % base64.b64encode(("%s:%s" % auth).encode("utf-8")))
|
req.add_header("Authorization", "Basic %s" % base64.b64encode('%s:%s' % auth))
|
||||||
|
|
||||||
return urlopen(req)
|
return urlopen(req)
|
||||||
|
|
||||||
|
|
|
@ -88,16 +88,19 @@ class TestFileHandler(TestUsingServer):
|
||||||
self.request("/document.txt", headers={"Range":"bytes=%i-%i" % (len(expected), len(expected) + 10)})
|
self.request("/document.txt", headers={"Range":"bytes=%i-%i" % (len(expected), len(expected) + 10)})
|
||||||
self.assertEqual(cm.exception.code, 416)
|
self.assertEqual(cm.exception.code, 416)
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_config(self):
|
def test_sub_config(self):
|
||||||
resp = self.request("/sub.sub.txt")
|
resp = self.request("/sub.sub.txt")
|
||||||
expected = b"localhost localhost %i" % self.server.port
|
expected = b"localhost localhost %i" % self.server.port
|
||||||
assert resp.read().rstrip() == expected
|
assert resp.read().rstrip() == expected
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_headers(self):
|
def test_sub_headers(self):
|
||||||
resp = self.request("/sub_headers.sub.txt", headers={"X-Test": "PASS"})
|
resp = self.request("/sub_headers.sub.txt", headers={"X-Test": "PASS"})
|
||||||
expected = b"PASS"
|
expected = b"PASS"
|
||||||
assert resp.read().rstrip() == expected
|
assert resp.read().rstrip() == expected
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_params(self):
|
def test_sub_params(self):
|
||||||
resp = self.request("/sub_params.sub.txt", query="test=PASS")
|
resp = self.request("/sub_params.sub.txt", query="test=PASS")
|
||||||
expected = b"PASS"
|
expected = b"PASS"
|
||||||
|
|
|
@ -57,35 +57,40 @@ class TestSlice(TestUsingServer):
|
||||||
self.assertEqual(resp.read(), expected[:10])
|
self.assertEqual(resp.read(), expected[:10])
|
||||||
|
|
||||||
class TestSub(TestUsingServer):
|
class TestSub(TestUsingServer):
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_config(self):
|
def test_sub_config(self):
|
||||||
resp = self.request("/sub.txt", query="pipe=sub")
|
resp = self.request("/sub.txt", query="pipe=sub")
|
||||||
expected = b"localhost localhost %i" % self.server.port
|
expected = "localhost localhost %i" % self.server.port
|
||||||
self.assertEqual(resp.read().rstrip(), expected)
|
self.assertEqual(resp.read().rstrip(), expected)
|
||||||
|
|
||||||
@pytest.mark.xfail(sys.platform == "win32",
|
@pytest.mark.xfail(sys.platform == "win32",
|
||||||
reason="https://github.com/web-platform-tests/wpt/issues/12949")
|
reason="https://github.com/web-platform-tests/wpt/issues/12949")
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_file_hash(self):
|
def test_sub_file_hash(self):
|
||||||
resp = self.request("/sub_file_hash.sub.txt")
|
resp = self.request("/sub_file_hash.sub.txt")
|
||||||
expected = b"""
|
expected = """
|
||||||
md5: JmI1W8fMHfSfCarYOSxJcw==
|
md5: JmI1W8fMHfSfCarYOSxJcw==
|
||||||
sha1: nqpWqEw4IW8NjD6R375gtrQvtTo=
|
sha1: nqpWqEw4IW8NjD6R375gtrQvtTo=
|
||||||
sha224: RqQ6fMmta6n9TuA/vgTZK2EqmidqnrwBAmQLRQ==
|
sha224: RqQ6fMmta6n9TuA/vgTZK2EqmidqnrwBAmQLRQ==
|
||||||
sha256: G6Ljg1uPejQxqFmvFOcV/loqnjPTW5GSOePOfM/u0jw=
|
sha256: G6Ljg1uPejQxqFmvFOcV/loqnjPTW5GSOePOfM/u0jw=
|
||||||
sha384: lkXHChh1BXHN5nT5BYhi1x67E1CyYbPKRKoF2LTm5GivuEFpVVYtvEBHtPr74N9E
|
sha384: lkXHChh1BXHN5nT5BYhi1x67E1CyYbPKRKoF2LTm5GivuEFpVVYtvEBHtPr74N9E
|
||||||
sha512: r8eLGRTc7ZznZkFjeVLyo6/FyQdra9qmlYCwKKxm3kfQAswRS9+3HsYk3thLUhcFmmWhK4dXaICzJwGFonfXwg=="""
|
sha512: r8eLGRTc7ZznZkFjeVLyo6/FyQdra9qmlYCwKKxm3kfQAswRS9+3HsYk3thLUhcFmmWhK4dXaICz
|
||||||
|
JwGFonfXwg=="""
|
||||||
self.assertEqual(resp.read().rstrip(), expected.strip())
|
self.assertEqual(resp.read().rstrip(), expected.strip())
|
||||||
|
|
||||||
def test_sub_file_hash_unrecognized(self):
|
def test_sub_file_hash_unrecognized(self):
|
||||||
with self.assertRaises(urllib.error.HTTPError):
|
with self.assertRaises(urllib.error.HTTPError):
|
||||||
self.request("/sub_file_hash_unrecognized.sub.txt")
|
self.request("/sub_file_hash_unrecognized.sub.txt")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_headers(self):
|
def test_sub_headers(self):
|
||||||
resp = self.request("/sub_headers.txt", query="pipe=sub", headers={"X-Test": "PASS"})
|
resp = self.request("/sub_headers.txt", query="pipe=sub", headers={"X-Test": "PASS"})
|
||||||
expected = b"PASS"
|
expected = "PASS"
|
||||||
self.assertEqual(resp.read().rstrip(), expected)
|
self.assertEqual(resp.read().rstrip(), expected)
|
||||||
|
|
||||||
@pytest.mark.xfail(sys.platform == "win32",
|
@pytest.mark.xfail(sys.platform == "win32",
|
||||||
reason="https://github.com/web-platform-tests/wpt/issues/12949")
|
reason="https://github.com/web-platform-tests/wpt/issues/12949")
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_location(self):
|
def test_sub_location(self):
|
||||||
resp = self.request("/sub_location.sub.txt?query_string")
|
resp = self.request("/sub_location.sub.txt?query_string")
|
||||||
expected = """
|
expected = """
|
||||||
|
@ -96,27 +101,30 @@ pathname: /sub_location.sub.txt
|
||||||
port: {0}
|
port: {0}
|
||||||
query: ?query_string
|
query: ?query_string
|
||||||
scheme: http
|
scheme: http
|
||||||
server: http://localhost:{0}""".format(self.server.port).encode("ascii")
|
server: http://localhost:{0}""".format(self.server.port)
|
||||||
self.assertEqual(resp.read().rstrip(), expected.strip())
|
self.assertEqual(resp.read().rstrip(), expected.strip())
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_params(self):
|
def test_sub_params(self):
|
||||||
resp = self.request("/sub_params.txt", query="test=PASS&pipe=sub")
|
resp = self.request("/sub_params.txt", query="test=PASS&pipe=sub")
|
||||||
expected = b"PASS"
|
expected = "PASS"
|
||||||
self.assertEqual(resp.read().rstrip(), expected)
|
self.assertEqual(resp.read().rstrip(), expected)
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_url_base(self):
|
def test_sub_url_base(self):
|
||||||
resp = self.request("/sub_url_base.sub.txt")
|
resp = self.request("/sub_url_base.sub.txt")
|
||||||
self.assertEqual(resp.read().rstrip(), b"Before / After")
|
self.assertEqual(resp.read().rstrip(), "Before / After")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_uuid(self):
|
def test_sub_uuid(self):
|
||||||
resp = self.request("/sub_uuid.sub.txt")
|
resp = self.request("/sub_uuid.sub.txt")
|
||||||
self.assertRegexpMatches(resp.read().rstrip(), b"Before [a-f0-9-]+ After")
|
self.assertRegexpMatches(resp.read().rstrip(), r"Before [a-f0-9-]+ After")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_sub_var(self):
|
def test_sub_var(self):
|
||||||
resp = self.request("/sub_var.sub.txt")
|
resp = self.request("/sub_var.sub.txt")
|
||||||
port = self.server.port
|
port = self.server.port
|
||||||
print(port, type(port))
|
expected = "localhost %s A %s B localhost C" % (port, port)
|
||||||
expected = b"localhost %d A %d B localhost C" % (port, port)
|
|
||||||
self.assertEqual(resp.read().rstrip(), expected)
|
self.assertEqual(resp.read().rstrip(), expected)
|
||||||
|
|
||||||
class TestTrickle(TestUsingServer):
|
class TestTrickle(TestUsingServer):
|
||||||
|
@ -136,10 +144,12 @@ class TestTrickle(TestUsingServer):
|
||||||
self.assertEqual(resp.info()["Expires"], "0")
|
self.assertEqual(resp.info()["Expires"], "0")
|
||||||
|
|
||||||
class TestPipesWithVariousHandlers(TestUsingServer):
|
class TestPipesWithVariousHandlers(TestUsingServer):
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_with_python_file_handler(self):
|
def test_with_python_file_handler(self):
|
||||||
resp = self.request("/test_string.py", query="pipe=slice(null,2)")
|
resp = self.request("/test_string.py", query="pipe=slice(null,2)")
|
||||||
self.assertEqual(resp.read(), b"PA")
|
self.assertEqual(resp.read(), "PA")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_with_python_func_handler(self):
|
def test_with_python_func_handler(self):
|
||||||
@wptserve.handlers.handler
|
@wptserve.handlers.handler
|
||||||
def handler(request, response):
|
def handler(request, response):
|
||||||
|
@ -147,8 +157,9 @@ class TestPipesWithVariousHandlers(TestUsingServer):
|
||||||
route = ("GET", "/test/test_pipes_1/", handler)
|
route = ("GET", "/test/test_pipes_1/", handler)
|
||||||
self.server.router.register(*route)
|
self.server.router.register(*route)
|
||||||
resp = self.request(route[1], query="pipe=slice(null,2)")
|
resp = self.request(route[1], query="pipe=slice(null,2)")
|
||||||
self.assertEqual(resp.read(), b"PA")
|
self.assertEqual(resp.read(), "PA")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_with_python_func_handler_using_response_writer(self):
|
def test_with_python_func_handler_using_response_writer(self):
|
||||||
@wptserve.handlers.handler
|
@wptserve.handlers.handler
|
||||||
def handler(request, response):
|
def handler(request, response):
|
||||||
|
@ -157,8 +168,9 @@ class TestPipesWithVariousHandlers(TestUsingServer):
|
||||||
self.server.router.register(*route)
|
self.server.router.register(*route)
|
||||||
resp = self.request(route[1], query="pipe=slice(null,2)")
|
resp = self.request(route[1], query="pipe=slice(null,2)")
|
||||||
# slice has not been applied to the response, because response.writer was used.
|
# slice has not been applied to the response, because response.writer was used.
|
||||||
self.assertEqual(resp.read(), b"PASS")
|
self.assertEqual(resp.read(), "PASS")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_header_pipe_with_python_func_using_response_writer(self):
|
def test_header_pipe_with_python_func_using_response_writer(self):
|
||||||
@wptserve.handlers.handler
|
@wptserve.handlers.handler
|
||||||
def handler(request, response):
|
def handler(request, response):
|
||||||
|
@ -168,8 +180,9 @@ class TestPipesWithVariousHandlers(TestUsingServer):
|
||||||
resp = self.request(route[1], query="pipe=header(X-TEST,FAIL)")
|
resp = self.request(route[1], query="pipe=header(X-TEST,FAIL)")
|
||||||
# header pipe was ignored, because response.writer was used.
|
# header pipe was ignored, because response.writer was used.
|
||||||
self.assertFalse(resp.info().get("X-TEST"))
|
self.assertFalse(resp.info().get("X-TEST"))
|
||||||
self.assertEqual(resp.read(), b"CONTENT")
|
self.assertEqual(resp.read(), "CONTENT")
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_with_json_handler(self):
|
def test_with_json_handler(self):
|
||||||
@wptserve.handlers.json_handler
|
@wptserve.handlers.json_handler
|
||||||
def handler(request, response):
|
def handler(request, response):
|
||||||
|
@ -177,29 +190,32 @@ class TestPipesWithVariousHandlers(TestUsingServer):
|
||||||
route = ("GET", "/test/test_pipes_2/", handler)
|
route = ("GET", "/test/test_pipes_2/", handler)
|
||||||
self.server.router.register(*route)
|
self.server.router.register(*route)
|
||||||
resp = self.request(route[1], query="pipe=slice(null,2)")
|
resp = self.request(route[1], query="pipe=slice(null,2)")
|
||||||
self.assertEqual(resp.read(), b'"{')
|
self.assertEqual(resp.read(), '"{')
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_slice_with_as_is_handler(self):
|
def test_slice_with_as_is_handler(self):
|
||||||
resp = self.request("/test.asis", query="pipe=slice(null,2)")
|
resp = self.request("/test.asis", query="pipe=slice(null,2)")
|
||||||
self.assertEqual(202, resp.getcode())
|
self.assertEqual(202, resp.getcode())
|
||||||
self.assertEqual("Giraffe", resp.msg)
|
self.assertEqual("Giraffe", resp.msg)
|
||||||
self.assertEqual("PASS", resp.info()["X-Test"])
|
self.assertEqual("PASS", resp.info()["X-Test"])
|
||||||
# slice has not been applied to the response, because response.writer was used.
|
# slice has not been applied to the response, because response.writer was used.
|
||||||
self.assertEqual(b"Content", resp.read())
|
self.assertEqual("Content", resp.read())
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_headers_with_as_is_handler(self):
|
def test_headers_with_as_is_handler(self):
|
||||||
resp = self.request("/test.asis", query="pipe=header(X-TEST,FAIL)")
|
resp = self.request("/test.asis", query="pipe=header(X-TEST,FAIL)")
|
||||||
self.assertEqual(202, resp.getcode())
|
self.assertEqual(202, resp.getcode())
|
||||||
self.assertEqual("Giraffe", resp.msg)
|
self.assertEqual("Giraffe", resp.msg)
|
||||||
# header pipe was ignored.
|
# header pipe was ignored.
|
||||||
self.assertEqual("PASS", resp.info()["X-TEST"])
|
self.assertEqual("PASS", resp.info()["X-TEST"])
|
||||||
self.assertEqual(b"Content", resp.read())
|
self.assertEqual("Content", resp.read())
|
||||||
|
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_trickle_with_as_is_handler(self):
|
def test_trickle_with_as_is_handler(self):
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
resp = self.request("/test.asis", query="pipe=trickle(1:d2:5:d1:r2)")
|
resp = self.request("/test.asis", query="pipe=trickle(1:d2:5:d1:r2)")
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
self.assertTrue(b'Content' in resp.read())
|
self.assertTrue('Content' in resp.read())
|
||||||
self.assertGreater(6, t1-t0)
|
self.assertGreater(6, t1-t0)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
wptserve = pytest.importorskip("wptserve")
|
wptserve = pytest.importorskip("wptserve")
|
||||||
|
@ -115,6 +117,7 @@ class TestRequest(TestUsingServer):
|
||||||
|
|
||||||
|
|
||||||
class TestAuth(TestUsingServer):
|
class TestAuth(TestUsingServer):
|
||||||
|
@pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2")
|
||||||
def test_auth(self):
|
def test_auth(self):
|
||||||
@wptserve.handlers.handler
|
@wptserve.handlers.handler
|
||||||
def handler(request, response):
|
def handler(request, response):
|
||||||
|
@ -124,4 +127,4 @@ class TestAuth(TestUsingServer):
|
||||||
self.server.router.register(*route)
|
self.server.router.register(*route)
|
||||||
resp = self.request(route[1], auth=("test", "PASS"))
|
resp = self.request(route[1], auth=("test", "PASS"))
|
||||||
self.assertEqual(200, resp.getcode())
|
self.assertEqual(200, resp.getcode())
|
||||||
self.assertEqual([b"test", b"PASS"], resp.read().split(b" "))
|
self.assertEqual(["test", "PASS"], resp.read().split(" "))
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
from cgi import escape
|
from cgi import escape
|
||||||
from collections import deque
|
from collections import deque
|
||||||
import base64
|
|
||||||
import gzip as gzip_module
|
import gzip as gzip_module
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
|
@ -274,9 +273,8 @@ def slice(request, response, start, end=None):
|
||||||
(spelled "null" in a query string) to indicate the end of
|
(spelled "null" in a query string) to indicate the end of
|
||||||
the file.
|
the file.
|
||||||
"""
|
"""
|
||||||
content = resolve_content(response)[start:end]
|
content = resolve_content(response)
|
||||||
response.content = content
|
response.content = content[start:end]
|
||||||
response.headers.set("Content-Length", len(content))
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@ -394,7 +392,7 @@ class SubFunctions(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def file_hash(request, algorithm, path):
|
def file_hash(request, algorithm, path):
|
||||||
assert isinstance(algorithm, text_type)
|
algorithm = algorithm.decode("ascii")
|
||||||
if algorithm not in SubFunctions.supported_algorithms:
|
if algorithm not in SubFunctions.supported_algorithms:
|
||||||
raise ValueError("Unsupported encryption algorithm: '%s'" % algorithm)
|
raise ValueError("Unsupported encryption algorithm: '%s'" % algorithm)
|
||||||
|
|
||||||
|
@ -402,7 +400,7 @@ class SubFunctions(object):
|
||||||
absolute_path = os.path.join(request.doc_root, path)
|
absolute_path = os.path.join(request.doc_root, path)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(absolute_path, "rb") as f:
|
with open(absolute_path) as f:
|
||||||
hash_obj.update(f.read())
|
hash_obj.update(f.read())
|
||||||
except IOError:
|
except IOError:
|
||||||
# In this context, an unhandled IOError will be interpreted by the
|
# In this context, an unhandled IOError will be interpreted by the
|
||||||
|
@ -412,7 +410,7 @@ class SubFunctions(object):
|
||||||
# the path to the file to be hashed is invalid.
|
# the path to the file to be hashed is invalid.
|
||||||
raise Exception('Cannot open file for hash computation: "%s"' % absolute_path)
|
raise Exception('Cannot open file for hash computation: "%s"' % absolute_path)
|
||||||
|
|
||||||
return base64.b64encode(hash_obj.digest()).strip()
|
return hash_obj.digest().encode('base64').strip()
|
||||||
|
|
||||||
def template(request, content, escape_type="html"):
|
def template(request, content, escape_type="html"):
|
||||||
#TODO: There basically isn't any error handling here
|
#TODO: There basically isn't any error handling here
|
||||||
|
@ -427,6 +425,7 @@ def template(request, content, escape_type="html"):
|
||||||
tokens = deque(tokens)
|
tokens = deque(tokens)
|
||||||
|
|
||||||
token_type, field = tokens.popleft()
|
token_type, field = tokens.popleft()
|
||||||
|
field = field.decode("ascii")
|
||||||
|
|
||||||
if token_type == "var":
|
if token_type == "var":
|
||||||
variable = field
|
variable = field
|
||||||
|
@ -471,14 +470,14 @@ def template(request, content, escape_type="html"):
|
||||||
raise Exception("Undefined template variable %s" % field)
|
raise Exception("Undefined template variable %s" % field)
|
||||||
|
|
||||||
while tokens:
|
while tokens:
|
||||||
ttype, tfield = tokens.popleft()
|
ttype, field = tokens.popleft()
|
||||||
if ttype == "index":
|
if ttype == "index":
|
||||||
value = value[tfield]
|
value = value[field]
|
||||||
elif ttype == "arguments":
|
elif ttype == "arguments":
|
||||||
value = value(request, *tfield)
|
value = value(request, *field)
|
||||||
else:
|
else:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"unexpected token type %s (token '%r'), expected ident or arguments" % (ttype, tfield)
|
"unexpected token type %s (token '%r'), expected ident or arguments" % (ttype, field)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert isinstance(value, (int, (binary_type, text_type))), tokens
|
assert isinstance(value, (int, (binary_type, text_type))), tokens
|
||||||
|
@ -486,19 +485,12 @@ def template(request, content, escape_type="html"):
|
||||||
if variable is not None:
|
if variable is not None:
|
||||||
variables[variable] = value
|
variables[variable] = value
|
||||||
|
|
||||||
if field == "GET" and not isinstance(value, str):
|
|
||||||
value = value.decode("utf-8")
|
|
||||||
|
|
||||||
escape_func = {"html": lambda x:escape(x, quote=True),
|
escape_func = {"html": lambda x:escape(x, quote=True),
|
||||||
"none": lambda x:x}[escape_type]
|
"none": lambda x:x}[escape_type]
|
||||||
|
|
||||||
#Should possibly support escaping for other contexts e.g. script
|
#Should possibly support escaping for other contexts e.g. script
|
||||||
#TODO: read the encoding of the response
|
#TODO: read the encoding of the response
|
||||||
if isinstance(value, binary_type):
|
return escape_func(text_type(value)).encode("utf-8")
|
||||||
value = value.decode("utf-8")
|
|
||||||
elif isinstance(value, int):
|
|
||||||
value = text_type(value)
|
|
||||||
return escape_func(value).encode("utf-8")
|
|
||||||
|
|
||||||
template_regexp = re.compile(br"{{([^}]*)}}")
|
template_regexp = re.compile(br"{{([^}]*)}}")
|
||||||
new_content = template_regexp.sub(config_replacement, content)
|
new_content = template_regexp.sub(config_replacement, content)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import base64
|
import base64
|
||||||
import cgi
|
import cgi
|
||||||
from six.moves.http_cookies import BaseCookie
|
from six.moves.http_cookies import BaseCookie
|
||||||
from six import BytesIO, binary_type, text_type
|
from six import BytesIO
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from six.moves.urllib.parse import parse_qsl, urlsplit
|
from six.moves.urllib.parse import parse_qsl, urlsplit
|
||||||
|
@ -318,8 +318,8 @@ class Request(object):
|
||||||
def cookies(self):
|
def cookies(self):
|
||||||
if self._cookies is None:
|
if self._cookies is None:
|
||||||
parser = BaseCookie()
|
parser = BaseCookie()
|
||||||
cookie_headers = self.headers.get("cookie", u"")
|
cookie_headers = self.headers.get("cookie", "")
|
||||||
parser.load(cookie_headers.encode("utf-8"))
|
parser.load(cookie_headers)
|
||||||
cookies = Cookies()
|
cookies = Cookies()
|
||||||
for key, value in parser.iteritems():
|
for key, value in parser.iteritems():
|
||||||
cookies[key] = CookieValue(value)
|
cookies[key] = CookieValue(value)
|
||||||
|
@ -355,16 +355,6 @@ class H2Request(Request):
|
||||||
super(H2Request, self).__init__(request_handler)
|
super(H2Request, self).__init__(request_handler)
|
||||||
|
|
||||||
|
|
||||||
def maybedecode(s):
|
|
||||||
if isinstance(s, text_type):
|
|
||||||
return s
|
|
||||||
|
|
||||||
if isinstance(s, binary_type):
|
|
||||||
return s.decode("ascii")
|
|
||||||
|
|
||||||
raise TypeError("Unexpected value in RequestHeaders: %r" % s)
|
|
||||||
|
|
||||||
|
|
||||||
class RequestHeaders(dict):
|
class RequestHeaders(dict):
|
||||||
"""Dictionary-like API for accessing request headers."""
|
"""Dictionary-like API for accessing request headers."""
|
||||||
def __init__(self, items):
|
def __init__(self, items):
|
||||||
|
@ -379,17 +369,15 @@ class RequestHeaders(dict):
|
||||||
for value in values:
|
for value in values:
|
||||||
# getallmatchingheaders returns raw header lines, so
|
# getallmatchingheaders returns raw header lines, so
|
||||||
# split to get name, value
|
# split to get name, value
|
||||||
multiples.append(maybedecode(value).split(':', 1)[1].strip())
|
multiples.append(value.split(':', 1)[1].strip())
|
||||||
headers = multiples
|
dict.__setitem__(self, key, multiples)
|
||||||
else:
|
else:
|
||||||
headers = [maybedecode(items[header])]
|
dict.__setitem__(self, key, [items[header]])
|
||||||
dict.__setitem__(self, maybedecode(key), headers)
|
|
||||||
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
"""Get all headers of a certain (case-insensitive) name. If there is
|
"""Get all headers of a certain (case-insensitive) name. If there is
|
||||||
more than one, the values are returned comma separated"""
|
more than one, the values are returned comma separated"""
|
||||||
key = maybedecode(key)
|
|
||||||
values = dict.__getitem__(self, key.lower())
|
values = dict.__getitem__(self, key.lower())
|
||||||
if len(values) == 1:
|
if len(values) == 1:
|
||||||
return values[0]
|
return values[0]
|
||||||
|
@ -415,7 +403,6 @@ class RequestHeaders(dict):
|
||||||
def get_list(self, key, default=missing):
|
def get_list(self, key, default=missing):
|
||||||
"""Get all the header values for a particular field name as
|
"""Get all the header values for a particular field name as
|
||||||
a list"""
|
a list"""
|
||||||
key = maybedecode(key)
|
|
||||||
try:
|
try:
|
||||||
return dict.__getitem__(self, key.lower())
|
return dict.__getitem__(self, key.lower())
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
@ -425,7 +412,6 @@ class RequestHeaders(dict):
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
key = maybedecode(key)
|
|
||||||
return dict.__contains__(self, key.lower())
|
return dict.__contains__(self, key.lower())
|
||||||
|
|
||||||
def iteritems(self):
|
def iteritems(self):
|
||||||
|
@ -613,7 +599,6 @@ class Authentication(object):
|
||||||
|
|
||||||
if "authorization" in headers:
|
if "authorization" in headers:
|
||||||
header = headers.get("authorization")
|
header = headers.get("authorization")
|
||||||
assert isinstance(header, text_type)
|
|
||||||
auth_type, data = header.split(" ", 1)
|
auth_type, data = header.split(" ", 1)
|
||||||
if auth_type in auth_schemes:
|
if auth_type in auth_schemes:
|
||||||
self.username, self.password = auth_schemes[auth_type](data)
|
self.username, self.password = auth_schemes[auth_type](data)
|
||||||
|
@ -621,6 +606,5 @@ class Authentication(object):
|
||||||
raise HTTPException(400, "Unsupported authentication scheme %s" % auth_type)
|
raise HTTPException(400, "Unsupported authentication scheme %s" % auth_type)
|
||||||
|
|
||||||
def decode_basic(self, data):
|
def decode_basic(self, data):
|
||||||
assert isinstance(data, text_type)
|
decoded_data = base64.decodestring(data)
|
||||||
decoded_data = base64.decodestring(data.encode("utf-8"))
|
return decoded_data.split(":", 1)
|
||||||
return decoded_data.decode("utf-8").split(":", 1)
|
|
||||||
|
|
|
@ -183,10 +183,8 @@ class Response(object):
|
||||||
True, the entire content of the file will be returned as a string facilitating
|
True, the entire content of the file will be returned as a string facilitating
|
||||||
non-streaming operations like template substitution.
|
non-streaming operations like template substitution.
|
||||||
"""
|
"""
|
||||||
if isinstance(self.content, binary_type):
|
if isinstance(self.content, (binary_type, text_type)):
|
||||||
yield self.content
|
yield self.content
|
||||||
elif isinstance(self.content, text_type):
|
|
||||||
yield self.content.encode("utf-8")
|
|
||||||
elif hasattr(self.content, "read"):
|
elif hasattr(self.content, "read"):
|
||||||
if read_file:
|
if read_file:
|
||||||
yield self.content.read()
|
yield self.content.read()
|
||||||
|
|
|
@ -16,6 +16,14 @@ def test_no_browsing_context(session, closed_window, key_chain):
|
||||||
key_chain.key_up("a").perform()
|
key_chain.key_up("a").perform()
|
||||||
|
|
||||||
|
|
||||||
|
def test_element_not_focused(session, test_actions_page, key_chain):
|
||||||
|
key_reporter = session.find.css("#keys", all=False)
|
||||||
|
|
||||||
|
key_chain.key_down("a").key_up("a").perform()
|
||||||
|
|
||||||
|
assert get_keys(key_reporter) == ""
|
||||||
|
|
||||||
|
|
||||||
def test_backspace_erases_keys(session, key_reporter, key_chain):
|
def test_backspace_erases_keys(session, key_reporter, key_chain):
|
||||||
key_chain \
|
key_chain \
|
||||||
.send_keys("efcd") \
|
.send_keys("efcd") \
|
||||||
|
|
|
@ -3,6 +3,19 @@ import pytest
|
||||||
from tests.perform_actions.support.keys import Keys
|
from tests.perform_actions.support.keys import Keys
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("modifier", [Keys.SHIFT, Keys.R_SHIFT])
|
||||||
|
def test_shift_modifier_and_non_printable_keys(session, key_reporter, key_chain, modifier):
|
||||||
|
key_chain \
|
||||||
|
.send_keys("foo") \
|
||||||
|
.key_down(modifier) \
|
||||||
|
.key_down(Keys.BACKSPACE) \
|
||||||
|
.key_up(modifier) \
|
||||||
|
.key_up(Keys.BACKSPACE) \
|
||||||
|
.perform()
|
||||||
|
|
||||||
|
assert key_reporter.property("value") == "fo"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("modifier", [Keys.SHIFT, Keys.R_SHIFT])
|
@pytest.mark.parametrize("modifier", [Keys.SHIFT, Keys.R_SHIFT])
|
||||||
def test_shift_modifier_generates_capital_letters(session, key_reporter, key_chain, modifier):
|
def test_shift_modifier_generates_capital_letters(session, key_reporter, key_chain, modifier):
|
||||||
key_chain \
|
key_chain \
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Construct an RTCIceTransport instance. The instance will automatically be
|
||||||
|
// cleaned up when the test finishes.
|
||||||
|
function makeIceTransport(t) {
|
||||||
|
const iceTransport = new RTCIceTransport();
|
||||||
|
t.add_cleanup(() => iceTransport.stop());
|
||||||
|
return iceTransport;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct two RTCIceTransport instances, configure them to exchange
|
||||||
|
// candidates, then gather() them.
|
||||||
|
// Returns a 2-list: [ RTCIceTransport, RTCIceTransport ]
|
||||||
|
function makeAndGatherTwoIceTransports(t) {
|
||||||
|
const localTransport = makeIceTransport(t);
|
||||||
|
const remoteTransport = makeIceTransport(t);
|
||||||
|
localTransport.onicecandidate = e => {
|
||||||
|
if (e.candidate) {
|
||||||
|
remoteTransport.addRemoteCandidate(e.candidate);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
remoteTransport.onicecandidate = e => {
|
||||||
|
if (e.candidate) {
|
||||||
|
localTransport.addRemoteCandidate(e.candidate);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
localTransport.gather({});
|
||||||
|
remoteTransport.gather({});
|
||||||
|
return [ localTransport, remoteTransport ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct two RTCIceTransport instances, configure them to exchange
|
||||||
|
// candidates and parameters, then gather() and start() them.
|
||||||
|
// Returns a 2-list:
|
||||||
|
// [ controlling RTCIceTransport,
|
||||||
|
// controlled RTCIceTransport ]
|
||||||
|
function makeGatherAndStartTwoIceTransports(t) {
|
||||||
|
const [ localTransport, remoteTransport ] = makeAndGatherTwoIceTransports(t);
|
||||||
|
localTransport.start(remoteTransport.getLocalParameters(), 'controlling');
|
||||||
|
remoteTransport.start(localTransport.getLocalParameters(), 'controlled');
|
||||||
|
return [ localTransport, remoteTransport ];
|
||||||
|
}
|
|
@ -3,12 +3,18 @@
|
||||||
<title>RTCIceTransport-extensions.https.html</title>
|
<title>RTCIceTransport-extensions.https.html</title>
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="RTCIceTransport-extension-helper.js"></script>
|
||||||
<script>
|
<script>
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
// These tests are based on the following extension specification:
|
// These tests are based on the following extension specification:
|
||||||
// https://w3c.github.io/webrtc-ice/
|
// https://w3c.github.io/webrtc-ice/
|
||||||
|
|
||||||
|
// The following helper functions are called from
|
||||||
|
// RTCIceTransport-extension-helper.js:
|
||||||
|
// makeIceTransport
|
||||||
|
// makeGatherAndStartTwoIceTransports
|
||||||
|
|
||||||
function makeIceTransport(t) {
|
function makeIceTransport(t) {
|
||||||
const iceTransport = new RTCIceTransport();
|
const iceTransport = new RTCIceTransport();
|
||||||
t.add_cleanup(() => iceTransport.stop());
|
t.add_cleanup(() => iceTransport.stop());
|
||||||
|
@ -240,22 +246,8 @@ test(t => {
|
||||||
'later called with different remote parameters');
|
'later called with different remote parameters');
|
||||||
|
|
||||||
promise_test(async t => {
|
promise_test(async t => {
|
||||||
const localTransport = makeIceTransport(t);
|
const [ localTransport, remoteTransport ] =
|
||||||
const remoteTransport = makeIceTransport(t);
|
makeGatherAndStartTwoIceTransports(t);
|
||||||
localTransport.onicecandidate = e => {
|
|
||||||
if (e.candidate) {
|
|
||||||
remoteTransport.addRemoteCandidate(e.candidate);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
remoteTransport.onicecandidate = e => {
|
|
||||||
if (e.candidate) {
|
|
||||||
localTransport.addRemoteCandidate(e.candidate);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
localTransport.gather({});
|
|
||||||
remoteTransport.gather({});
|
|
||||||
localTransport.start(remoteTransport.getLocalParameters(), 'controlling');
|
|
||||||
remoteTransport.start(localTransport.getLocalParameters(), 'controlled');
|
|
||||||
const localWatcher = new EventWatcher(t, localTransport, 'statechange');
|
const localWatcher = new EventWatcher(t, localTransport, 'statechange');
|
||||||
const remoteWatcher = new EventWatcher(t, remoteTransport, 'statechange');
|
const remoteWatcher = new EventWatcher(t, remoteTransport, 'statechange');
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<title>RTCQuicStream.https.html</title>
|
<title>RTCQuicStream.https.html</title>
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="RTCIceTransport-extension-helper.js"></script>
|
||||||
<script src="RTCQuicTransport-helper.js"></script>
|
<script src="RTCQuicTransport-helper.js"></script>
|
||||||
<script>
|
<script>
|
||||||
'use strict';
|
'use strict';
|
||||||
|
@ -11,10 +12,10 @@
|
||||||
// https://w3c.github.io/webrtc-quic/
|
// https://w3c.github.io/webrtc-quic/
|
||||||
|
|
||||||
// The following helper functions are called from RTCQuicTransport-helper.js:
|
// The following helper functions are called from RTCQuicTransport-helper.js:
|
||||||
// makeQuicTransport
|
// makeStandaloneQuicTransport
|
||||||
|
|
||||||
test(t => {
|
promise_test(async t => {
|
||||||
const quicTransport = makeQuicTransport(t, []);
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
const quicStream = quicTransport.createStream();
|
const quicStream = quicTransport.createStream();
|
||||||
assert_equals(quicStream.transport, quicTransport,
|
assert_equals(quicStream.transport, quicTransport,
|
||||||
'Expect transport to be set to the creating RTCQuicTransport.');
|
'Expect transport to be set to the creating RTCQuicTransport.');
|
||||||
|
@ -25,14 +26,14 @@ test(t => {
|
||||||
'Expect write buffered amount to be 0.');
|
'Expect write buffered amount to be 0.');
|
||||||
}, 'createStream() returns an RTCQuicStream with initial properties set.');
|
}, 'createStream() returns an RTCQuicStream with initial properties set.');
|
||||||
|
|
||||||
test(t => {
|
promise_test(async t => {
|
||||||
const quicTransport = makeQuicTransport(t, []);
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
quicTransport.stop();
|
quicTransport.stop();
|
||||||
assert_throws('InvalidStateError', () => quicTransport.createStream());
|
assert_throws('InvalidStateError', () => quicTransport.createStream());
|
||||||
}, 'createStream() throws if the transport is closed.');
|
}, 'createStream() throws if the transport is closed.');
|
||||||
|
|
||||||
test(t => {
|
promise_test(async t => {
|
||||||
const quicTransport = makeQuicTransport(t, []);
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
const firstQuicStream = quicTransport.createStream();
|
const firstQuicStream = quicTransport.createStream();
|
||||||
const secondQuicStream = quicTransport.createStream();
|
const secondQuicStream = quicTransport.createStream();
|
||||||
quicTransport.stop();
|
quicTransport.stop();
|
||||||
|
|
|
@ -1,10 +1,82 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function makeQuicTransport(t, certificates) {
|
// This file depends on RTCIceTransport-extension-helper.js which should be
|
||||||
const iceTransport = new RTCIceTransport();
|
// loaded from the main HTML file.
|
||||||
t.add_cleanup(() => iceTransport.stop());
|
// The following helper functions are called from
|
||||||
|
// RTCIceTransport-extension-helper.js:
|
||||||
|
// makeIceTransport
|
||||||
|
// makeGatherAndStartTwoIceTransports
|
||||||
|
|
||||||
|
// Return a promise to generate an RTCCertificate with the given keygen
|
||||||
|
// algorithm or a default one if none provided.
|
||||||
|
function generateCertificate(keygenAlgorithm) {
|
||||||
|
return RTCPeerConnection.generateCertificate({
|
||||||
|
name: 'ECDSA',
|
||||||
|
namedCurve: 'P-256',
|
||||||
|
...keygenAlgorithm,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct an RTCQuicTransport instance with the given RTCIceTransport
|
||||||
|
// instance and the given certificates. The RTCQuicTransport instance will be
|
||||||
|
// automatically cleaned up when the test finishes.
|
||||||
|
function makeQuicTransport(t, iceTransport, certificates) {
|
||||||
const quicTransport = new RTCQuicTransport(iceTransport, certificates);
|
const quicTransport = new RTCQuicTransport(iceTransport, certificates);
|
||||||
t.add_cleanup(() => quicTransport.stop());
|
t.add_cleanup(() => quicTransport.stop());
|
||||||
return quicTransport;
|
return quicTransport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Construct an RTCQuicTransport instance with a new RTCIceTransport instance
|
||||||
|
// and a single, newly-generated certificate. The RTCQuicTransport and
|
||||||
|
// RTCIceTransport instances will be automatically cleaned up when the test
|
||||||
|
// finishes.
|
||||||
|
async function makeStandaloneQuicTransport(t) {
|
||||||
|
const certificate = await generateCertificate();
|
||||||
|
return makeQuicTransport(t, makeIceTransport(t), [ certificate ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct two RTCQuicTransport instances and each call start() with the other
|
||||||
|
// transport's local parameters.
|
||||||
|
// Returns a 2-list:
|
||||||
|
// [ server RTCQuicTransport,
|
||||||
|
// client RTCQuicTransport ]
|
||||||
|
async function makeAndStartTwoQuicTransports(t) {
|
||||||
|
const [ localCertificate, remoteCertificate ] =
|
||||||
|
await Promise.all([ generateCertificate(), generateCertificate() ]);
|
||||||
|
const [ localIceTransport, remoteIceTransport ] =
|
||||||
|
makeGatherAndStartTwoIceTransports(t);
|
||||||
|
const localQuicTransport =
|
||||||
|
makeQuicTransport(t, localIceTransport, [ localCertificate ]);
|
||||||
|
const remoteQuicTransport =
|
||||||
|
makeQuicTransport(t, remoteIceTransport, [ remoteCertificate ]);
|
||||||
|
localQuicTransport.start(remoteQuicTransport.getLocalParameters());
|
||||||
|
remoteQuicTransport.start(localQuicTransport.getLocalParameters());
|
||||||
|
return [ localQuicTransport, remoteQuicTransport ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct two RTCQuicTransport instances and wait for them to connect.
|
||||||
|
// Returns a 2-list:
|
||||||
|
// [ server RTCQuicTransport,
|
||||||
|
// client RTCQuicTransport ]
|
||||||
|
async function makeTwoConnectedQuicTransports(t) {
|
||||||
|
// Returns a promise that resolves when the transport fires a 'statechange'
|
||||||
|
// event to 'connected'.
|
||||||
|
function waitForConnected(transport) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const eventHandler = t.step_func(() => {
|
||||||
|
assert_equals(transport.state, 'connected');
|
||||||
|
transport.removeEventListener('statechange', eventHandler, false);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
transport.addEventListener('statechange', eventHandler, false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const [ localQuicTransport, remoteQuicTransport ] =
|
||||||
|
await makeAndStartTwoQuicTransports(t);
|
||||||
|
await Promise.all([
|
||||||
|
waitForConnected(localQuicTransport),
|
||||||
|
waitForConnected(remoteQuicTransport),
|
||||||
|
]);
|
||||||
|
return [ localQuicTransport, remoteQuicTransport ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<title>RTCQuicTransport.https.html</title>
|
<title>RTCQuicTransport.https.html</title>
|
||||||
<script src="/resources/testharness.js"></script>
|
<script src="/resources/testharness.js"></script>
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="RTCIceTransport-extension-helper.js"></script>
|
||||||
<script src="RTCQuicTransport-helper.js"></script>
|
<script src="RTCQuicTransport-helper.js"></script>
|
||||||
<script>
|
<script>
|
||||||
'use strict';
|
'use strict';
|
||||||
|
@ -10,36 +11,31 @@
|
||||||
// These tests are based on the following specification:
|
// These tests are based on the following specification:
|
||||||
// https://w3c.github.io/webrtc-quic/
|
// https://w3c.github.io/webrtc-quic/
|
||||||
|
|
||||||
|
// The following helper functions are called from
|
||||||
|
// RTCIceTransport-extension-helper.js:
|
||||||
|
// makeIceTransport
|
||||||
|
// makeAndGatherTwoIceTransports
|
||||||
|
|
||||||
// The following helper functions are called from RTCQuicTransport-helper.js:
|
// The following helper functions are called from RTCQuicTransport-helper.js:
|
||||||
// makeQuicTransport
|
// makeQuicTransport
|
||||||
|
// makeStandaloneQuicTransport
|
||||||
|
// makeAndStartTwoQuicTransports
|
||||||
|
// makeTwoConnectedQuicTransports
|
||||||
|
|
||||||
function generateCertificate(keygenAlgorithm) {
|
promise_test(async t => {
|
||||||
return RTCPeerConnection.generateCertificate({
|
const certificate = await generateCertificate();
|
||||||
name: 'ECDSA',
|
const iceTransport = makeIceTransport(t);
|
||||||
namedCurve: 'P-256',
|
const quicTransport = makeQuicTransport(t, iceTransport, [ certificate ]);
|
||||||
...keygenAlgorithm,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
test(t => {
|
|
||||||
// Don't use the makeQuicTransport helper so that the transport property can
|
|
||||||
// be verified.
|
|
||||||
const iceTransport = new RTCIceTransport();
|
|
||||||
const quicTransport = new RTCQuicTransport(iceTransport, []);
|
|
||||||
t.add_cleanup(() => {
|
|
||||||
quicTransport.stop();
|
|
||||||
iceTransport.stop();
|
|
||||||
});
|
|
||||||
assert_equals(quicTransport.transport, iceTransport,
|
assert_equals(quicTransport.transport, iceTransport,
|
||||||
'Expect transport to be the same as the one passed in the constructor.');
|
'Expect transport to be the same as the one passed in the constructor.');
|
||||||
assert_equals(quicTransport.state, 'new', `Expect state to be 'new'.`);
|
assert_equals(quicTransport.state, 'new', `Expect state to be 'new'.`);
|
||||||
assert_object_equals(quicTransport.getLocalParameters(),
|
assert_object_equals(quicTransport.getLocalParameters(),
|
||||||
{ role: 'auto', fingerprints: [] },
|
{ role: 'auto', fingerprints: certificate.getFingerprints() },
|
||||||
'Expect local parameters to be initialized.');
|
'Expect local parameters to be initialized.');
|
||||||
assert_equals(quicTransport.getRemoteParameters(), null,
|
assert_equals(quicTransport.getRemoteParameters(), null,
|
||||||
'Expect no remote parameters.');
|
'Expect no remote parameters.');
|
||||||
assert_array_equals(quicTransport.getCertificates(), [],
|
assert_array_equals(quicTransport.getCertificates(), [ certificate ],
|
||||||
'Expect not certificates.');
|
'Expect one certificate.');
|
||||||
assert_array_equals(quicTransport.getRemoteCertificates(), [],
|
assert_array_equals(quicTransport.getRemoteCertificates(), [],
|
||||||
'Expect no remote certificates.');
|
'Expect no remote certificates.');
|
||||||
}, 'RTCQuicTransport initial properties are set.');
|
}, 'RTCQuicTransport initial properties are set.');
|
||||||
|
@ -48,7 +44,8 @@ promise_test(async t => {
|
||||||
const [ firstCertificate, secondCertificate ] =
|
const [ firstCertificate, secondCertificate ] =
|
||||||
await Promise.all([ generateCertificate(), generateCertificate() ]);
|
await Promise.all([ generateCertificate(), generateCertificate() ]);
|
||||||
const quicTransport =
|
const quicTransport =
|
||||||
makeQuicTransport(t, [ firstCertificate, secondCertificate ]);
|
makeQuicTransport(t, makeIceTransport(t),
|
||||||
|
[ firstCertificate, secondCertificate ]);
|
||||||
assert_array_equals(quicTransport.getCertificates(),
|
assert_array_equals(quicTransport.getCertificates(),
|
||||||
[ firstCertificate, secondCertificate ]);
|
[ firstCertificate, secondCertificate ]);
|
||||||
}, 'getCertificates() returns the certificates passed in the constructor.');
|
}, 'getCertificates() returns the certificates passed in the constructor.');
|
||||||
|
@ -57,11 +54,13 @@ promise_test(async t => {
|
||||||
const [ firstCertificate, secondCertificate ] =
|
const [ firstCertificate, secondCertificate ] =
|
||||||
await Promise.all([ generateCertificate(), generateCertificate() ]);
|
await Promise.all([ generateCertificate(), generateCertificate() ]);
|
||||||
const quicTransport =
|
const quicTransport =
|
||||||
makeQuicTransport(t, [ firstCertificate, secondCertificate ]);
|
makeQuicTransport(t, makeIceTransport(t),
|
||||||
|
[ firstCertificate, secondCertificate ]);
|
||||||
assert_object_equals(quicTransport.getLocalParameters(), {
|
assert_object_equals(quicTransport.getLocalParameters(), {
|
||||||
role: 'auto',
|
role: 'auto',
|
||||||
fingerprints: [ firstCertificate.getFingerprints()[0],
|
fingerprints:
|
||||||
secondCertificate.getFingerprints()[0] ],
|
[ firstCertificate.getFingerprints()[0],
|
||||||
|
secondCertificate.getFingerprints()[0] ],
|
||||||
});
|
});
|
||||||
assert_array_equals(quicTransport.getCertificates(),
|
assert_array_equals(quicTransport.getCertificates(),
|
||||||
[ firstCertificate, secondCertificate ]);
|
[ firstCertificate, secondCertificate ]);
|
||||||
|
@ -71,21 +70,119 @@ promise_test(async t => {
|
||||||
promise_test(async t => {
|
promise_test(async t => {
|
||||||
const expiredCertificate = await generateCertificate({ expires: 0 });
|
const expiredCertificate = await generateCertificate({ expires: 0 });
|
||||||
assert_throws(new TypeError(),
|
assert_throws(new TypeError(),
|
||||||
() => makeQuicTransport(t, [ expiredCertificate ]));
|
() => makeQuicTransport(t, makeIceTransport(t), [ expiredCertificate ]));
|
||||||
}, 'RTCQuicTransport constructor throws if passed an expired certificate.');
|
}, 'RTCQuicTransport constructor throws if passed an expired certificate.');
|
||||||
|
|
||||||
test(t => {
|
promise_test(async t => {
|
||||||
const iceTransport = new RTCIceTransport();
|
const certificate = await generateCertificate();
|
||||||
|
const iceTransport = makeIceTransport(t);
|
||||||
iceTransport.stop();
|
iceTransport.stop();
|
||||||
assert_throws('InvalidStateError',
|
assert_throws('InvalidStateError',
|
||||||
() => new RTCQuicTransport(iceTransport, []));
|
() => makeQuicTransport(t, iceTransport, [ certificate ]));
|
||||||
}, 'RTCQuicTransport constructor throws if passed a closed RTCIceTransport.');
|
}, 'RTCQuicTransport constructor throws if passed a closed RTCIceTransport.');
|
||||||
|
|
||||||
test(t => {
|
promise_test(async t => {
|
||||||
const quicTransport = makeQuicTransport(t, []);
|
const certificate = await generateCertificate();
|
||||||
|
const iceTransport = makeIceTransport(t);
|
||||||
|
const firstQuicTransport =
|
||||||
|
makeQuicTransport(t, iceTransport, [ certificate ]);
|
||||||
|
assert_throws('InvalidStateError',
|
||||||
|
() => makeQuicTransport(t, iceTransport, [ certificate ]));
|
||||||
|
}, 'RTCQuicTransport constructor throws if passed an RTCIceTransport that ' +
|
||||||
|
'already has an active RTCQuicTransport.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
quicTransport.stop();
|
quicTransport.stop();
|
||||||
assert_equals(quicTransport.state, 'closed');
|
assert_equals(quicTransport.state, 'closed');
|
||||||
}, `stop() changes state to 'closed'.`);
|
}, `stop() changes state to 'closed'.`);
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
|
quicTransport.transport.stop();
|
||||||
|
assert_equals(quicTransport.state, 'closed');
|
||||||
|
}, `RTCIceTransport.stop() changes RTCQuicTransport.state to 'closed'.`);
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
|
quicTransport.start(quicTransport.getLocalParameters());
|
||||||
|
assert_equals(quicTransport.state, 'new');
|
||||||
|
}, 'start() with a non-started RTCIceTransport does not change state.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const certificate = await generateCertificate();
|
||||||
|
const [ localIceTransport, remoteIceTransport ] =
|
||||||
|
makeAndGatherTwoIceTransports(t);
|
||||||
|
const quicTransport =
|
||||||
|
makeQuicTransport(t, localIceTransport, [ certificate ]);
|
||||||
|
quicTransport.start(quicTransport.getLocalParameters());
|
||||||
|
const iceTransportWatcher =
|
||||||
|
new EventWatcher(t, remoteIceTransport, 'icecandidate');
|
||||||
|
await iceTransportWatcher.wait_for('icecandidate');
|
||||||
|
localIceTransport.start(remoteIceTransport.getLocalParameters(),
|
||||||
|
'controlling');
|
||||||
|
assert_equals(quicTransport.state, 'connecting');
|
||||||
|
}, 'start() with a non-started RTCIceTransport later changes state to ' +
|
||||||
|
`'connecting' once the RTCIceTransport.start() is called.`);
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const certificate = await generateCertificate();
|
||||||
|
const [ localIceTransport, remoteIceTransport ] =
|
||||||
|
makeAndGatherTwoIceTransports(t);
|
||||||
|
const quicTransport =
|
||||||
|
makeQuicTransport(t, localIceTransport, [ certificate ]);
|
||||||
|
const iceTransportWatcher =
|
||||||
|
new EventWatcher(t, remoteIceTransport, 'icecandidate');
|
||||||
|
await iceTransportWatcher.wait_for('icecandidate');
|
||||||
|
localIceTransport.start(remoteIceTransport.getLocalParameters());
|
||||||
|
quicTransport.start(quicTransport.getLocalParameters());
|
||||||
|
assert_equals(quicTransport.state, 'connecting');
|
||||||
|
}, `start() with a started RTCIceTransport changes state to 'connecting'.`);
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
|
quicTransport.stop();
|
||||||
|
assert_throws('InvalidStateError',
|
||||||
|
() => quicTransport.start(quicTransport.getLocalParameters()));
|
||||||
|
}, 'start() throws if called after stop().');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
|
quicTransport.transport.stop();
|
||||||
|
assert_throws('InvalidStateError',
|
||||||
|
() => quicTransport.start(quicTransport.getLocalParameters()));
|
||||||
|
}, 'start() throws if called after the RTCIceTransport has stopped.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||||
|
quicTransport.start(quicTransport.getLocalParameters());
|
||||||
|
assert_throws('InvalidStateError',
|
||||||
|
() => quicTransport.start(quicTransport.getLocalParameters()));
|
||||||
|
}, 'start() throws if called twice.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const [ localQuicTransport, remoteQuicTransport ] =
|
||||||
|
await makeAndStartTwoQuicTransports(t);
|
||||||
|
const localWatcher = new EventWatcher(t, localQuicTransport, 'statechange');
|
||||||
|
const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'statechange');
|
||||||
|
await Promise.all([
|
||||||
|
localWatcher.wait_for('statechange').then(() => {
|
||||||
|
assert_equals(localQuicTransport.state, 'connected');
|
||||||
|
}),
|
||||||
|
remoteWatcher.wait_for('statechange').then(() => {
|
||||||
|
assert_equals(remoteQuicTransport.state, 'connected');
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
}, 'Two RTCQuicTransports connect to each other.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const [ localQuicTransport, remoteQuicTransport ] =
|
||||||
|
await makeTwoConnectedQuicTransports(t);
|
||||||
|
localQuicTransport.stop();
|
||||||
|
const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'statechange');
|
||||||
|
await remoteWatcher.wait_for('statechange');
|
||||||
|
assert_equals(remoteQuicTransport.state, 'closed');
|
||||||
|
}, `stop() fires a statechange event to 'closed' on the remote transport`);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -14,3 +14,6 @@
|
||||||
[WebGL test #44: could not create image (SVG)]
|
[WebGL test #44: could not create image (SVG)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[WebGL test #588: could not create image (SVG)]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue