Auto merge of #26605 - servo-wpt-sync:wpt_update_21-05-2020, r=servo-wpt-sync

Sync WPT with upstream (21-05-2020)

Automated downstream sync of changes from upstream as of 21-05-2020.
[no-wpt-sync]
r? @servo-wpt-sync
This commit is contained in:
bors-servo 2020-05-21 07:14:40 -04:00 committed by GitHub
commit 87bf24139c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
150 changed files with 5753 additions and 3515 deletions

View file

@ -1,4 +0,0 @@
[hit-test-floats-002.html]
[Hit test float]
expected: FAIL

View file

@ -2,3 +2,6 @@
[Hit test intersecting scaled box]
expected: FAIL
[Hit test within unscaled box]
expected: FAIL

View file

@ -1,982 +1,58 @@
[properties-value-inherit-001.html]
[top length(pt) / events]
expected: FAIL
[border-right-width length(mm) / events]
expected: FAIL
[background-position length(pt) / values]
expected: FAIL
[width length(pt) / events]
expected: FAIL
[background-position length(pt) / events]
expected: FAIL
[border-bottom-width length(pc) / events]
expected: FAIL
[height length(ex) / events]
expected: FAIL
[padding-bottom length(mm) / events]
expected: FAIL
[border-top-width length(px) / events]
expected: FAIL
[border-top-width length(pt) / events]
expected: FAIL
[padding-top length(em) / events]
expected: FAIL
[outline-width length(pc) / events]
expected: FAIL
[max-width length(in) / events]
expected: FAIL
[margin-top length(cm) / events]
expected: FAIL
[margin-right length(pt) / events]
expected: FAIL
[right length(ex) / events]
expected: FAIL
[vertical-align length(px) / events]
expected: FAIL
[max-height length(em) / events]
expected: FAIL
[width length(ex) / events]
expected: FAIL
[border-bottom-color color(rgba) / events]
expected: FAIL
[width percentage(%) / events]
expected: FAIL
[background-position length(px) / values]
expected: FAIL
[margin-top length(ex) / events]
expected: FAIL
[border-top-width length(in) / events]
expected: FAIL
[right length(em) / events]
expected: FAIL
[top length(ex) / events]
expected: FAIL
[padding-left length(px) / events]
expected: FAIL
[margin-top length(em) / events]
expected: FAIL
[left length(em) / events]
expected: FAIL
[margin-left length(px) / events]
expected: FAIL
[background-position length(cm) / events]
expected: FAIL
[max-height percentage(%) / events]
expected: FAIL
[bottom length(ex) / events]
expected: FAIL
[padding-left length(mm) / events]
expected: FAIL
[right length(mm) / events]
expected: FAIL
[margin-top length(pc) / events]
expected: FAIL
[background-position length(mm) / values]
expected: FAIL
[border-left-width length(pt) / events]
expected: FAIL
[outline-offset length(mm) / events]
expected: FAIL
[vertical-align length(in) / events]
expected: FAIL
[border-bottom-width length(pt) / events]
expected: FAIL
[border-bottom-width length(in) / events]
expected: FAIL
[margin-bottom length(pc) / events]
expected: FAIL
[border-left-width length(mm) / events]
expected: FAIL
[height length(em) / events]
expected: FAIL
[background-position length(in) / events]
expected: FAIL
[height length(cm) / events]
expected: FAIL
[padding-top length(in) / events]
expected: FAIL
[max-width length(ex) / events]
expected: FAIL
[padding-top length(px) / events]
expected: FAIL
[border-top-width length(pc) / events]
expected: FAIL
[top length(cm) / events]
expected: FAIL
[left length(ex) / events]
expected: FAIL
[min-width length(ex) / events]
expected: FAIL
[left length(pc) / events]
expected: FAIL
[vertical-align length(em) / events]
expected: FAIL
[left length(in) / events]
expected: FAIL
[left length(px) / events]
expected: FAIL
[border-bottom-width length(mm) / events]
expected: FAIL
[min-width length(cm) / events]
expected: FAIL
[vertical-align length(cm) / events]
expected: FAIL
[padding-bottom length(px) / events]
expected: FAIL
[max-width percentage(%) / events]
expected: FAIL
[outline-offset length(cm) / events]
expected: FAIL
[top length(in) / events]
expected: FAIL
[border-left-color color(rgba) / events]
expected: FAIL
[margin-left length(mm) / events]
expected: FAIL
[margin-top length(pt) / events]
expected: FAIL
[min-height length(cm) / events]
expected: FAIL
[max-height length(cm) / events]
expected: FAIL
[width length(mm) / events]
expected: FAIL
[width length(pc) / events]
expected: FAIL
[background-position length(em) / events]
expected: FAIL
[vertical-align length(mm) / events]
expected: FAIL
[height length(px) / events]
expected: FAIL
[right percentage(%) / events]
expected: FAIL
[border-top-color color(rgba) / events]
expected: FAIL
[outline-offset length(em) / events]
expected: FAIL
[z-index integer(integer) / events]
expected: FAIL
[padding-right length(px) / events]
expected: FAIL
[vertical-align length(ex) / events]
expected: FAIL
[outline-width length(em) / events]
expected: FAIL
[width length(cm) / events]
expected: FAIL
[margin-right length(ex) / events]
expected: FAIL
[border-right-width length(cm) / events]
expected: FAIL
[margin-right length(em) / events]
expected: FAIL
[border-left-width length(ex) / events]
expected: FAIL
[min-width length(mm) / events]
expected: FAIL
[margin-right length(pc) / events]
expected: FAIL
[margin-left length(pt) / events]
expected: FAIL
[border-right-width length(pc) / events]
expected: FAIL
[height length(in) / events]
expected: FAIL
[border-left-width length(in) / events]
expected: FAIL
[min-height length(ex) / events]
expected: FAIL
[bottom length(em) / events]
expected: FAIL
[border-right-color color(rgba) / events]
expected: FAIL
[right length(in) / events]
expected: FAIL
[padding-top length(pt) / events]
expected: FAIL
[min-width length(em) / events]
expected: FAIL
[border-right-width length(pt) / events]
expected: FAIL
[opacity number[0,1\](zero-to-one) / events]
expected: FAIL
[padding-bottom length(cm) / events]
expected: FAIL
[margin-right length(in) / events]
expected: FAIL
[margin-top length(px) / events]
expected: FAIL
[padding-top length(ex) / events]
expected: FAIL
[margin-left length(ex) / events]
expected: FAIL
[top length(px) / events]
expected: FAIL
[bottom length(cm) / events]
expected: FAIL
[border-bottom-width length(px) / events]
expected: FAIL
[margin-bottom length(ex) / events]
expected: FAIL
[max-width length(mm) / events]
expected: FAIL
[height percentage(%) / events]
expected: FAIL
[border-right-width length(px) / events]
expected: FAIL
[border-top-width length(mm) / events]
expected: FAIL
[border-left-width length(em) / events]
expected: FAIL
[max-width length(pc) / events]
expected: FAIL
[visibility visibility(keyword) / values]
expected: FAIL
[padding-bottom length(em) / events]
expected: FAIL
[min-width length(pt) / events]
expected: FAIL
[outline-width length(cm) / events]
expected: FAIL
[border-right-width length(in) / events]
expected: FAIL
[bottom length(in) / events]
expected: FAIL
[padding-right length(mm) / events]
expected: FAIL
[border-left-width length(px) / events]
expected: FAIL
[left length(cm) / events]
expected: FAIL
[background-position length(ex) / values]
expected: FAIL
[margin-right length(px) / events]
expected: FAIL
[clip rectangle(rectangle) / events]
expected: FAIL
[margin-left length(cm) / events]
expected: FAIL
[background-color color(rgba) / events]
expected: FAIL
[min-width length(in) / events]
expected: FAIL
[padding-right length(cm) / events]
expected: FAIL
[width length(em) / events]
expected: FAIL
[background-position length(cm) / values]
expected: FAIL
[margin-left length(em) / events]
expected: FAIL
[margin-right length(cm) / events]
expected: FAIL
[border-bottom-width length(cm) / events]
expected: FAIL
[bottom length(pc) / events]
expected: FAIL
[top percentage(%) / events]
expected: FAIL
[padding-left length(pt) / events]
expected: FAIL
[min-width percentage(%) / events]
expected: FAIL
[right length(px) / events]
expected: FAIL
[padding-right length(in) / events]
expected: FAIL
[left length(mm) / events]
expected: FAIL
[bottom length(px) / events]
expected: FAIL
[padding-left length(pc) / events]
expected: FAIL
[outline-width length(ex) / events]
expected: FAIL
[padding-left length(cm) / events]
expected: FAIL
[left length(pt) / events]
expected: FAIL
[outline-width length(mm) / events]
expected: FAIL
[padding-left length(ex) / events]
expected: FAIL
[margin-bottom length(cm) / events]
expected: FAIL
[max-width length(pt) / events]
expected: FAIL
[border-right-width length(em) / events]
expected: FAIL
[margin-left length(in) / events]
expected: FAIL
[top length(em) / events]
expected: FAIL
[padding-right length(pt) / events]
expected: FAIL
[padding-top length(pc) / events]
expected: FAIL
[border-top-width length(ex) / events]
expected: FAIL
[min-height length(pt) / events]
expected: FAIL
[width length(in) / events]
expected: FAIL
[min-width length(pc) / events]
expected: FAIL
[margin-bottom length(mm) / events]
expected: FAIL
[height length(pc) / events]
expected: FAIL
[background-position length(ex) / events]
expected: FAIL
[max-width length(px) / events]
expected: FAIL
[bottom length(pt) / events]
expected: FAIL
[padding-right length(ex) / events]
expected: FAIL
[border-top-width length(em) / events]
expected: FAIL
[max-height length(pt) / events]
expected: FAIL
[vertical-align percentage(%) / events]
expected: FAIL
[margin-left length(pc) / events]
expected: FAIL
[min-height percentage(%) / events]
expected: FAIL
[padding-bottom length(ex) / events]
expected: FAIL
[padding-left length(em) / events]
expected: FAIL
[bottom percentage(%) / events]
expected: FAIL
[min-height length(pc) / events]
expected: FAIL
[border-left-width length(pc) / events]
expected: FAIL
[margin-bottom length(in) / events]
expected: FAIL
[outline-width length(pt) / events]
expected: FAIL
[margin-bottom length(em) / events]
expected: FAIL
[top length(mm) / events]
expected: FAIL
[outline-color color(rgba) / events]
expected: FAIL
[background-position length(pc) / events]
expected: FAIL
[bottom length(mm) / events]
expected: FAIL
[padding-top length(mm) / events]
expected: FAIL
[border-right-width length(ex) / events]
expected: FAIL
[border-top-width length(cm) / events]
expected: FAIL
[outline-width length(in) / events]
expected: FAIL
[right length(pt) / events]
expected: FAIL
[width length(px) / events]
expected: FAIL
[height length(pt) / events]
expected: FAIL
[background-position length(in) / values]
expected: FAIL
[padding-left length(in) / events]
expected: FAIL
[min-height length(em) / events]
expected: FAIL
[left percentage(%) / events]
expected: FAIL
[padding-bottom length(pc) / events]
expected: FAIL
[max-height length(ex) / events]
expected: FAIL
[border-left-width length(cm) / events]
expected: FAIL
[outline-offset length(ex) / events]
expected: FAIL
[max-height length(pc) / events]
expected: FAIL
[padding-right length(pc) / events]
expected: FAIL
[top length(pc) / events]
expected: FAIL
[vertical-align length(pc) / events]
expected: FAIL
[min-height length(px) / events]
expected: FAIL
[margin-right length(mm) / events]
expected: FAIL
[max-height length(mm) / events]
expected: FAIL
[background-position length(pc) / values]
expected: FAIL
[right length(pc) / events]
expected: FAIL
[background-position percentage(%) / values]
expected: FAIL
[vertical-align length(pt) / events]
expected: FAIL
[padding-top length(cm) / events]
expected: FAIL
[right length(cm) / events]
expected: FAIL
[outline-offset length(pt) / events]
expected: FAIL
[background-position length(mm) / events]
expected: FAIL
[min-height length(in) / events]
expected: FAIL
[max-width length(cm) / events]
expected: FAIL
[border-bottom-width length(ex) / events]
expected: FAIL
[max-height length(px) / events]
expected: FAIL
[min-width length(px) / events]
expected: FAIL
[outline-offset length(px) / events]
expected: FAIL
[margin-top length(in) / events]
expected: FAIL
[background-position length(em) / values]
expected: FAIL
[outline-offset length(in) / events]
expected: FAIL
[margin-bottom length(pt) / events]
expected: FAIL
[max-width length(em) / events]
expected: FAIL
[padding-bottom length(pt) / events]
expected: FAIL
[min-height length(mm) / events]
expected: FAIL
[padding-bottom length(in) / events]
expected: FAIL
[margin-bottom length(px) / events]
expected: FAIL
[max-height length(in) / events]
expected: FAIL
[outline-width length(px) / events]
expected: FAIL
[background-position percentage(%) / events]
expected: FAIL
[padding-right length(em) / events]
expected: FAIL
[height length(mm) / events]
expected: FAIL
[margin-top length(mm) / events]
expected: FAIL
[background-position length(px) / events]
expected: FAIL
[outline-offset length(pc) / events]
expected: FAIL
[border-bottom-width length(em) / events]
expected: FAIL
[outline-width length(px) / values]
expected: FAIL
[letter-spacing length(em) / events]
expected: FAIL
[letter-spacing length(ex) / events]
expected: FAIL
[text-indent length(pc) / values]
expected: FAIL
[outline-offset length(px) / values]
expected: FAIL
[letter-spacing length(mm) / events]
expected: FAIL
[line-height length(in) / events]
expected: FAIL
[vertical-align length(in) / values]
expected: FAIL
[font-size percentage(%) / events]
expected: FAIL
[text-indent percentage(%) / events]
expected: FAIL
[text-shadow shadow(shadow) / events]
expected: FAIL
[letter-spacing length(cm) / events]
expected: FAIL
[vertical-align percentage(%) / values]
expected: FAIL
[letter-spacing length(px) / events]
expected: FAIL
[text-indent length(ex) / values]
expected: FAIL
[text-indent length(mm) / events]
expected: FAIL
[font-size length(px) / events]
expected: FAIL
[vertical-align length(em) / values]
expected: FAIL
[text-indent length(px) / values]
expected: FAIL
[clip rectangle(rectangle) / values]
expected: FAIL
[text-indent length(ex) / events]
expected: FAIL
[line-height length(em) / events]
expected: FAIL
[font-size length(pt) / events]
expected: FAIL
[font-size length(in) / events]
expected: FAIL
[text-indent length(in) / events]
expected: FAIL
[outline-offset length(ex) / values]
expected: FAIL
[letter-spacing length(in) / events]
expected: FAIL
[vertical-align length(pc) / values]
expected: FAIL
[vertical-align length(cm) / values]
expected: FAIL
[letter-spacing length(pc) / events]
expected: FAIL
[visibility visibility(keyword) / events]
expected: FAIL
[vertical-align length(ex) / values]
expected: FAIL
[text-indent length(pc) / events]
expected: FAIL
[text-indent length(em) / events]
expected: FAIL
[font-size length(pc) / events]
expected: FAIL
[outline-offset length(mm) / values]
expected: FAIL
[line-height length(pc) / events]
expected: FAIL
[outline-offset length(pt) / values]
expected: FAIL
[text-indent length(px) / events]
expected: FAIL
[text-indent length(cm) / events]
expected: FAIL
[vertical-align length(pt) / values]
expected: FAIL
[font-weight font-weight(keyword) / events]
expected: FAIL
[font-weight font-weight(numeric) / events]
expected: FAIL
[line-height length(mm) / events]
expected: FAIL
[line-height length(cm) / events]
expected: FAIL
[word-spacing length(pt) / events]
expected: FAIL
[line-height length(pt) / events]
expected: FAIL
[word-spacing length(ex) / events]
expected: FAIL
[color color(rgba) / events]
expected: FAIL
[text-indent length(mm) / values]
expected: FAIL
[word-spacing percentage(%) / events]
expected: FAIL
[line-height percentage(%) / events]
expected: FAIL
[text-indent length(pt) / events]
expected: FAIL
[line-height length(ex) / events]
expected: FAIL
[outline-offset length(in) / values]
expected: FAIL
[outline-width length(pt) / values]
expected: FAIL
[line-height number(integer) / events]
expected: FAIL
[word-spacing length(cm) / events]
expected: FAIL
[font-size length(mm) / events]
expected: FAIL
[word-spacing length(mm) / events]
expected: FAIL
[font-size length(cm) / events]
expected: FAIL
[outline-width length(in) / values]
expected: FAIL
[text-indent length(cm) / values]
expected: FAIL
[outline-color color(rgba) / values]
expected: FAIL
[text-indent length(pt) / values]
expected: FAIL
[word-spacing length(em) / events]
expected: FAIL
[line-height number(decimal) / events]
expected: FAIL
[letter-spacing length(pt) / events]
expected: FAIL
[text-shadow shadow(shadow) / values]
expected: FAIL
[outline-width length(ex) / values]
expected: FAIL
[word-spacing length(in) / events]
expected: FAIL
[outline-width length(cm) / values]
expected: FAIL
[word-spacing length(px) / events]
expected: FAIL
[outline-width length(mm) / values]
expected: FAIL
[outline-width length(pc) / values]
expected: FAIL
[vertical-align length(px) / values]
expected: FAIL
[text-indent length(in) / values]
expected: FAIL
[text-indent length(em) / values]
expected: FAIL
[line-height length(px) / events]
expected: FAIL
[word-spacing length(pc) / events]
expected: FAIL
[outline-width length(em) / values]
expected: FAIL
[font-size length(em) / events]
expected: FAIL
[outline-offset length(em) / values]
expected: FAIL
[font-size length(ex) / events]
expected: FAIL
[outline-offset length(cm) / values]
expected: FAIL
[vertical-align length(mm) / values]
expected: FAIL
[text-indent percentage(%) / values]
expected: FAIL
[outline-offset length(pc) / values]
expected: FAIL

View file

@ -1,106 +1,7 @@
[properties-value-inherit-003.html]
[line-height length-em(em) / events]
expected: FAIL
[padding-left length-em(em) / events]
expected: FAIL
[min-width length-em(em) / events]
expected: FAIL
[right length-em(em) / events]
expected: FAIL
[max-width length-em(em) / events]
expected: FAIL
[text-indent length-em(em) / events]
expected: FAIL
[margin-left length-em(em) / events]
expected: FAIL
[word-spacing length-em(em) / events]
expected: FAIL
[letter-spacing length-em(em) / events]
expected: FAIL
[width length-em(em) / events]
expected: FAIL
[padding-top length-em(em) / events]
expected: FAIL
[margin-right length-em(em) / events]
expected: FAIL
[vertical-align length-em(em) / values]
expected: FAIL
[max-height length-em(em) / events]
expected: FAIL
[padding-bottom length-em(em) / events]
expected: FAIL
[border-top-width length-em(em) / events]
expected: FAIL
[height length-em(em) / events]
expected: FAIL
[border-bottom-width length-em(em) / events]
expected: FAIL
[background-position length-em(em) / events]
expected: FAIL
[border-left-width length-em(em) / events]
expected: FAIL
[margin-bottom length-em(em) / events]
expected: FAIL
[min-height length-em(em) / events]
expected: FAIL
[outline-width length-em(em) / values]
expected: FAIL
[outline-offset length-em(em) / events]
expected: FAIL
[padding-right length-em(em) / events]
expected: FAIL
[background-position length-em(em) / values]
expected: FAIL
[top length-em(em) / events]
expected: FAIL
[outline-width length-em(em) / events]
expected: FAIL
[bottom length-em(em) / events]
expected: FAIL
[text-indent length-em(em) / values]
expected: FAIL
[outline-offset length-em(em) / values]
expected: FAIL
[vertical-align length-em(em) / events]
expected: FAIL
[left length-em(em) / events]
expected: FAIL
[margin-top length-em(em) / events]
expected: FAIL
[border-right-width length-em(em) / events]
expected: FAIL

View file

@ -1,4 +0,0 @@
[elementFromPoint-001.html]
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

View file

@ -1,4 +0,0 @@
[elementsFromPoint-invalid-cases.html]
[The root element is the last element returned for otherwise empty queries within the viewport]
expected: FAIL

View file

@ -312,18 +312,21 @@
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
expected: NOTRUN
[<iframe>: combined response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
[<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL

View file

@ -53,3 +53,6 @@
[combined text/javascript ]
expected: FAIL
[separate text/javascript x/x]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_2.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -0,0 +1,47 @@
[blob-data.https.html]
expected: ERROR
[blob worker: self.crossOriginIsolated]
expected: FAIL
[data frame: self.crossOriginIsolated]
expected: FAIL
[blob frame: self.isSecureContext]
expected: FAIL
[data worker: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[blob worker: self.isSecureContext]
expected: FAIL
[blob frame: self.crossOriginIsolated]
expected: FAIL
[blob worker: postMessaging to a dedicated HTTP sub-worker allows them to see each others' modifications]
expected: FAIL
[data worker: self.crossOriginIsolated]
expected: FAIL
[data worker: self.origin]
expected: FAIL
[data frame: self.isSecureContext]
expected: FAIL
[blob frame: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[data frame: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[data worker: self.isSecureContext]
expected: FAIL
[blob worker: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[blob frame: postMessaging to a dedicated HTTP sub-worker allows them to see each others' modifications]
expected: FAIL

View file

@ -1,5 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL

View file

@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-1.html]
expected: CRASH
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN

View file

@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-3.html]
expected: CRASH
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN

View file

@ -1,5 +1,5 @@
[ignore-opens-during-unload.window.html]
expected: TIMEOUT
expected: CRASH
[document.open should bail out when ignore-opens-during-unload is greater than 0 during visibilitychange event (open(parent) while unloading parent and child)]
expected: TIMEOUT

View file

@ -1,5 +0,0 @@
[018.html]
expected: TIMEOUT
[origin of the script that invoked the method, javascript:]
expected: TIMEOUT

View file

@ -113,6 +113,13 @@
{}
]
],
"negative-item-margins-002-crash.html": [
"97b450df9a014bb309adec4c68b1bf5aca3314a5",
[
null,
{}
]
],
"negative-item-margins-crash.html": [
"d5f9365b5ec1be0e62435651a70d1baeb6d8083a",
[
@ -13334,14 +13341,14 @@
]
],
"focus-visible-003-manual.html": [
"eeb2904d7d33ebab283c37925db90f6fab7c1328",
"ccc916a952854cc357ba7a5af73f4e1b476ef97d",
[
null,
{}
]
],
"focus-visible-004-manual.html": [
"dba057cc9c8641a96c65b0bb90cccbdd3d596dc3",
"4d7878e751ecd5487eecd9f40477fa4a7ff03484",
[
null,
{}
@ -123179,6 +123186,45 @@
{}
]
],
"tall-float-pushed-to-next-fragmentainer-000.html": [
"a5f02184687fd21337c935d0ecc7ae07d6ae3bda",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"tall-float-pushed-to-next-fragmentainer-001.html": [
"d172f935744ee3d44fdeb0c2f5f758321af4172a",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"tall-float-pushed-to-next-fragmentainer-002.html": [
"1ba22353c0754a1e52224adae491971a7f86645c",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square-only.html",
"=="
]
],
{}
]
],
"widows-orphans-001.html": [
"8da27f0b6594fc7ddd90bdb160be8f80a9479038",
[
@ -229339,6 +229385,60 @@
]
]
},
"manual": {
"unclosed-canvas-1.htm": [
"5e0c914755b672ae3427f2e433120176494bebf0",
[
null,
[
[
"/html/canvas/element/manual/unclosed-canvas-1-expected.htm",
"=="
]
],
{}
]
],
"unclosed-canvas-2.htm": [
"fb329e73d6f3a37410cad745e37bb2539f683edf",
[
null,
[
[
"/html/canvas/element/manual/unclosed-canvas-2-expected.htm",
"=="
]
],
{}
]
],
"unclosed-canvas-3.htm": [
"8ffaa0f9eb5b0025029fc45c7585c601bff3f60f",
[
null,
[
[
"/html/canvas/element/manual/unclosed-canvas-3-expected.htm",
"=="
]
],
{}
]
],
"unclosed-canvas-4.htm": [
"aa5fd144381dbbdbc71afc7350e9aa6187a728ef",
[
null,
[
[
"/html/canvas/element/manual/unclosed-canvas-4-expected.htm",
"=="
]
],
{}
]
]
},
"shadows": {
"canvas_shadows_002.htm": [
"908fffea13bfac5a5cd40413797928848cd34dcf",
@ -239529,6 +239629,40 @@
}
}
},
"webgpu": {
"webgpu": {
"web-platform": {
"reftests": {
"canvas_clear.html": [
"86a3da939dbe94efbeec04e5d366a40736ca4560",
[
null,
[
[
"/webgpu/webgpu/web-platform/reftests/ref/canvas_clear-ref.html",
"=="
]
],
{}
]
],
"canvas_complex_bgra8unorm.html": [
"1310543648e4fd640b0deb227000731af7b88b00",
[
null,
[
[
"/webgpu/webgpu/web-platform/reftests/ref/canvas_complex-ref.html",
"=="
]
],
{}
]
]
}
}
}
},
"webvtt": {
"rendering": {
"cues-with-video": {
@ -242781,7 +242915,7 @@
},
"support": {
".azure-pipelines.yml": [
"8c8a15d4ef438d21786fb62e5c7ca99475e80c45",
"8c39de66f4890b8507aaba8325a7fb7da176bc17",
[]
],
".codecov.yml": [
@ -316445,7 +316579,7 @@
[]
],
"safari.md": [
"0ff8fe5d95e8aed678e3f1d0e357f6518011537b",
"eed52254718922b000abd30273a50d56ce84d35a",
[]
],
"webkitgtk_minibrowser.md": [
@ -323097,6 +323231,24 @@
[]
]
},
"manual": {
"unclosed-canvas-1-expected.htm": [
"3272f32fb88030747608ce4b794a5bdbeeda5634",
[]
],
"unclosed-canvas-2-expected.htm": [
"fd48cd0db18f9eb46d435aa499bdeaa40504cd9f",
[]
],
"unclosed-canvas-3-expected.htm": [
"efd239b4fb33304da0a47473111d5e9ebf7fb54f",
[]
],
"unclosed-canvas-4-expected.htm": [
"492449261e722ebaa78196db579656d9b0ec5a34",
[]
]
},
"path-objects": {
"2d.path.fill.overlap.png": [
"e2a35d48d4c4363294aec671a38cbd4b39c9a53c",
@ -333563,10 +333715,6 @@
"b5481216729526387722a6c733ea529f5d1f831a",
[]
],
"screen-wake-lock.idl": [
"1eb30a06024713e5aab435610a8fc62841db8a50",
[]
],
"scroll-animations.idl": [
"00d0bae68126aa67d6714694422a098100eb7e71",
[]
@ -333643,6 +333791,10 @@
"ef8fd6342a59c3584536e6ec491ad20c2208c51d",
[]
],
"wake-lock.idl": [
"1eb30a06024713e5aab435610a8fc62841db8a50",
[]
],
"wasm-js-api.idl": [
"cc943610145dec2346e7ec9d6891cf32859f9d59",
[]
@ -340944,11 +341096,11 @@
[]
],
"fetch-request-resources-iframe.https.html": [
"fca57220235838939d04a10b5266c89eb3f9c17c",
"b9783071e12515b7e9cb683ce33970a31304ce2d",
[]
],
"fetch-request-resources-worker.js": [
"d85f7143c3333933fcedb2ddc24ba6aaed019d9a",
"5c9e86d66846605a96a9fd61889e71b7ad4b7d00",
[]
],
"fetch-request-xhr-iframe.https.html": [
@ -343408,13 +343560,17 @@
[]
],
"install_safari.yml": [
"5cbad0d00b9b7d268c5fa969172b8910ac73a3dd",
"d0660d152bbdfc89f308bfc048cd2221e9ea7524",
[]
],
"pip_install.yml": [
"18d1879e971613532fac5673d9a804acc1bc8673",
[]
],
"publish_logs.yml": [
"a49397a91ad7ca424864c5326b5fe7b4a3685a41",
[]
],
"safari-technology-preview.rb": [
"eae03474a49ff7bece32daf482390025c3ce9e2a",
[]
@ -343895,11 +344051,11 @@
[]
],
"manifest.py": [
"19d1bbed0334b938d765fda6738f409a9793b306",
"345eeb6d2b0beeb3ce3c1390949cb9e2d19a435a",
[]
],
"sourcefile.py": [
"c374ba050434e89b5c915d21da42550d16ed3b7d",
"b324bf22dd382515220d3a78d9f2710430030aee",
[]
],
"testpaths.py": [
@ -343997,7 +344153,7 @@
[]
],
"quic_transport_server.py": [
"10d81743693b431acba1eaa082e03f73124e050a",
"9a04ad17f195c6e5d233e84a9b23904cccfeccd6",
[]
],
"requirements.txt": [
@ -352157,7 +352313,7 @@
],
"common": {
"constants.js": [
"9d3dd1a32defa22fd3a0cd0e17504cb4727b9622",
"69496b1b23bf8a37bce0c4da0f121dd1810d334d",
[]
],
"framework": {
@ -352169,8 +352325,12 @@
"dc5a9caf850b967ea0779fee6b7c725376c0bbbb",
[]
],
"file_loader.js": [
"1b77a4e85953b7f0d85345b2f4f8d4f38ce7ed29",
[]
],
"fixture.js": [
"55f8ec48b22acdd553c093eaba8a568b0d8f1f56",
"ef23f06596bd7cc244484102008db8ca9485c2c8",
[]
],
"generate_minimal_query_list.js": [
@ -352178,6 +352338,10 @@
[]
],
"gpu": {
"device_pool.js": [
"848e5802817b43e26c8e25ecfec48c0ea9fe8816",
[]
],
"implementation.js": [
"670872b5d6e32ebf3815935fdd9fec605056a30c",
[]
@ -352199,14 +352363,66 @@
"3f624a86e325daaadd1990e1aa11804ea2ab16d2",
[]
],
"logging": {
"log_message.js": [
"11f352f892e76eb0140f0fe36249f41e103e1e05",
[]
],
"logger.js": [
"8d66c554c5ad8b48df127d914883fc8f4578bc38",
[]
],
"result.js": [
"813e781ba28ce0471d17d439c0fc20ed400f68ac",
[]
],
"test_case_recorder.js": [
"d16af0f2b861421cb77050648440ae4e4fbd3d39",
[]
]
},
"params.js": [
"f8e46b62dbaf0039903a0496d333de5c84315820",
[]
],
"params_utils.js": [
"cde89843f9e67d7f7e01914823fc807df2f40a66",
"params_builder.js": [
"10dd239df93c6ce1a9ae8559586c6c304b3243e2",
[]
],
"params_utils.js": [
"161feb5d4306ea30ae56c7ba6f76ac81f90a25ba",
[]
],
"query": {
"compare.js": [
"2cbe6cc80c9f35d1c70dc08fa1a4eea7b577d2bf",
[]
],
"encode_selectively.js": [
"d67f10422334a14747285c5dfc1672d0553fa05f",
[]
],
"parseQuery.js": [
"758227cc520f486f4a0662d0935eaa86a1aa937b",
[]
],
"query.js": [
"b80b6904f17e1b9e4341f1e926fc27de5ce86362",
[]
],
"separators.js": [
"4782fe457b877850899ce45c7fe7eab0d8f5970c",
[]
],
"stringify_params.js": [
"b5503ffb54ead8677dfb5189aecd9e46fcf30cad",
[]
],
"validQueryPart.js": [
"f51ebade76a3442e80fdffd789af12aa56e8db40",
[]
]
},
"test_filter": {
"filter_by_group.js": [
"b43749f9c5d700d1085b6402a086e38dcc4f2e24",
@ -352230,11 +352446,15 @@
]
},
"test_group.js": [
"8837b1e924a412e8fb706d2f0601b72a7a79a28a",
"ef34b5fd51ccd1196240310f1fac7ed0e0b95407",
[]
],
"test_suite_listing.js": [
"99c900217c1463e09faefd01e0db96498db7ca92",
[]
],
"tree.js": [
"8f96c98074942127cd7b781778e5a17eb36f1d0d",
"2f4329c164d843c8ff18f5115f439106065853d3",
[]
],
"url_query.js": [
@ -352246,8 +352466,12 @@
"cb900605bcfe77bae785c207419787e317bf1d73",
[]
],
"collect_garbage.js": [
"83b797a0cc48e3f7de5a7b51cdcbf82b531fe025",
[]
],
"stack.js": [
"3d0ec636d853d7b150cf921a931ce2e59963dcbc",
"99653f888066181e5fbac7a7a4331f6cb4fe3ecb",
[]
],
"timeout.js": [
@ -352255,12 +352479,12 @@
[]
],
"util.js": [
"ca64026916c1a7319674daf254c5eeb7df5c7699",
"b64379982a60f7b4551b7611feb7fdcf288d560e",
[]
]
},
"version.js": [
"159b3cf420e59692ad87875ce7d760b5a8c956f8",
"f1fe61edc7f491e64eb8a768fb03b0f36c76a2e0",
[]
]
},
@ -352271,16 +352495,16 @@
[]
],
"test_worker-worker.js": [
"dd078c313a6287e500c902ee301c310b0c81e81f",
"be3f4952f0542e5be2c45e4882416576cb685a07",
[]
],
"test_worker.js": [
"a67030056f5b8d5ed7665f9e06f9735d0e26b287",
"7e8b9a47c077261e8dcacb21487989edbd146e2c",
[]
]
},
"wpt.js": [
"fd02f09471bc656a900714dd586101d6acb28c46",
"0648a0dc7ee923ee37b676b77d97105776f378b9",
[]
]
}
@ -352290,19 +352514,19 @@
"operation": {
"buffers": {
"create_mapped.spec.js": [
"7b2bc39aa3defbd14c1ad2dfa938ca4df6ee495d",
"1c3b1254d503727d9efd189ec6b9eba5bac3a79b",
[]
],
"map.spec.js": [
"1c73d62a95ff82ed211a8dc6bf9b74b4c2a41fae",
"842421dd5ce0321554b39aaae31ce42cd0b944ba",
[]
],
"map_detach.spec.js": [
"14d5be5a6311cd4eba637d679c7275be811aafb6",
"8ae0be0b197ac1ae1a6bac48dacd00ecc8ec2a9e",
[]
],
"map_oom.spec.js": [
"ee642a5c3b34177b815bbac26228567e25f62e37",
"a04347ffd4f7af75514c11326c6ef704849ca46d",
[]
],
"mapping_test.js": [
@ -352312,115 +352536,173 @@
},
"command_buffer": {
"basic.spec.js": [
"bc4020bfeb53afcaa19ccf5f155e358886ffbc29",
"547a08683f7318d5aceb2e26096166c1c994c579",
[]
],
"copies.spec.js": [
"c330415d8511b9a548706b6019e1a6614804d432",
"cc2ea6deae161d2025119beda183dfb767b63795",
[]
],
"render": {
"basic.spec.js": [
"88710e8aa09287dfd612acf26976406c2576cba5",
"815eb5b70b0092c096fe385ad94729f62ef44761",
[]
]
}
},
"fences.spec.js": [
"386530e08523bdfc9da2a4827d8a04760cab6678",
"f9f079b6241fa99a6895250329b18fb88d895ac3",
[]
]
],
"resource_init": {
"copied_texture_clear.spec.js": [
"22a71bf725ced2b9e3b53569ff25798aa9761968",
[]
],
"texture_zero_init_test.js": [
"5dc3c227232b0fc3140b30be26ccb38071622fcd",
[]
]
}
},
"validation": {
"createBindGroup.spec.js": [
"97683cf75a92d574147a000e29a69b70e7fb97a1",
"1eb8f959f333b7680ce81c1e449a02bde25cf188",
[]
],
"createBindGroupLayout.spec.js": [
"b03e01591133aa7fd641b805a598cca328d16157",
"3961ba3a81a5e0b4c95db861fae12ace1aa97ec9",
[]
],
"createPipelineLayout.spec.js": [
"f1582c4478a2074cbb37b99c32f8e4c5242116d0",
"262581e8714ce7c5a1f165cfac7749b240b52df8",
[]
],
"createTexture.spec.js": [
"ab4c6f866b4df74315c69f3cb8bfd483540e54ea",
"2ef8d19523311d64519af8ecff18d27ac9695749",
[]
],
"createView.spec.js": [
"d23af58387440bf7b5d6953a240110a179e8379d",
"524d921adaa7002187faa306eaf9d78aa5b98aef",
[]
],
"error_scope.spec.js": [
"fd69c4e13c0382d95eb2fc5dd535b48b5543c022",
"3edbec2dc417fc4cb95ab67baefc1d0f1a798154",
[]
],
"fences.spec.js": [
"7747b5e9dc8592dde77167c2696da0582e1573f0",
"2ab0691e3ce6cadb532a94a43d568b8a111a8430",
[]
],
"queue_submit.spec.js": [
"dbe0bb4d31ed68eec197d7a556e6f9e097b5eeb5",
"24e386b9d22c2bbea0fca8e8b5c94c770e8ed7d5",
[]
],
"render_pass_descriptor.spec.js": [
"7c887a1c0fd112b7d5648edc2698e0376e5f2ae5",
"3c1b111fea4a79aab8cd8defbc61152e7e5302ea",
[]
],
"setBindGroup.spec.js": [
"baf590746c33c04c9fedd75b11de7873d4eeec91",
"95786a8f78d3a6fe230d6a08c3cfb83c93a97666",
[]
],
"setBlendColor.spec.js": [
"b8905453ac952131698a5b67d9b3a1f6270c9e83",
"469641df04341795efdad946ea65eb517a51265c",
[]
],
"setScissorRect.spec.js": [
"e12c90d7cdae1c2271b9b97df8a85816c6e5e5a7",
"8381865a6938c4a32d81744fb1bbaaf41ae309fb",
[]
],
"setStencilReference.spec.js": [
"cbd48aeaad532724977752e524dd106c38cd14df",
"f205239d86142ea08880f226f9d9ae052a385aa1",
[]
],
"setViewport.spec.js": [
"9a3009f38ac020893f78cc5f7ad33defaa93101d",
"f1168c11086fd4fa7114c36b9895bab49b66a410",
[]
],
"validation_test.js": [
"92d8a0699c4f2c7f1002537c97dd30bf93137b9d",
"17eb97bcc63daafbda34a661bafd0da688d7bb8b",
[]
]
}
},
"capability_info.js": [
"0e336b979f8290152b0ec0e9c7993768106a2fed",
"b2d9353b04d7c9f4616b22c9a235ddaf41827131",
[]
],
"examples.spec.js": [
"add23f7250ee70a1f80b7ee1ca2c292e7ae3c0d6",
"28b9ae47f2c25183ba68b1bcb7303a033541213b",
[]
],
"gpu_test.js": [
"0202f34fcf7429a3eb671f786c45efbacae36871",
"d2528c8d84b5eaa1fcb218fbb9452c4f9f0ae0a9",
[]
],
"listing.js": [
"5b9ef1afb0184599c0b6f33468356f21677315d5",
"ea23ab2832834983efe327c5adffc8cf1ac0cefe",
[]
],
"util": {
"conversion.js": [
"73c04fe56badcff5aee3bf665465b24c81d4f3bf",
[]
],
"math.js": [
"19720d631c55590bfbfc223e9c6409eded4d6232",
[]
],
"texture": {
"layout.js": [
"db9d5dbb4352b9c29581ff5d1b7bbadb1d8753e6",
[]
],
"subresource.js": [
"04a8e7221a8ad8a9f76369d4e3f2ffa4fe21a056",
[]
],
"texelData.js": [
"2ea7275e710a5e47a59480ca2a56c1026172e6bf",
[]
]
}
},
"web-platform": {
"canvas": {
"context_creation.spec.js": [
"fd8593b642ed84440706ca4b1b29dc4f2e1660d5",
"427b15fced447160db36ca3d6f829211f5080206",
[]
]
},
"copyImageBitmapToTexture.spec.js": [
"5e84113b95ad6940517a9c3dc3339ae233b52a10",
"de978550acccc3c1b876eb99fdfabd1ed8c1c56a",
[]
]
],
"reftests": {
"canvas_clear.js": [
"52ffaedad84c7552fd13cbac89cd800c09a012c0",
[]
],
"canvas_complex.js": [
"1e63a0ab20233e9db7e9c628493af178edd386c9",
[]
],
"gpu_ref_test.js": [
"f45f232557cdd05406317b3a521d06e3e1bbd960",
[]
],
"ref": {
"canvas_clear-ref.html": [
"2e0781186273ac49d6c70b5e5a9c68103aa5f173",
[]
],
"canvas_complex-ref.html": [
"3d5b3b3376d23cfdcda57f0c53fc3192e8a77bb6",
[]
]
}
}
}
}
},
@ -352960,7 +353242,7 @@
[]
],
"client-indication.quic.py": [
"da0701cc04b17b461344879a62631d65326c167b",
"56238c7514c065f9933bf3b1f10eff24503ad73e",
[]
]
}
@ -374345,6 +374627,13 @@
{}
]
],
"blocked-iframe-are-cross-origin.html": [
"9fedc4e930e923fbb58c684fb55acbecb951e0bd",
[
null,
{}
]
],
"idlharness.window.js": [
"2845f82c955139e5a5640195af49ece555fe3faa",
[
@ -376042,7 +376331,7 @@
]
],
"reporting-api-sends-reports-on-violation.https.sub.html": [
"23337ae8d077e33fcec38fec6baa59778a39e0f8",
"ba4df62bf6f1c658d6dfed48fe1f6f62201b942f",
[
null,
{}
@ -382700,6 +382989,20 @@
{}
]
],
"viewport-user-scalable-no-clamp-to-max.tentative.html": [
"c2c341245b528bc375bd8aa2d14e273fda492207",
[
null,
{}
]
],
"viewport-user-scalable-no-clamp-to-min.tentative.html": [
"89d7bb2f8ceb4d3da08ca7c98a7b37d311bbce3f",
[
null,
{}
]
],
"viewport-user-scalable-no-wide-content.tentative.html": [
"6cf0bfa236a0cb5806c5deeeb7d45c07afb9f16f",
[
@ -391440,6 +391743,13 @@
{}
]
],
"position-change-heuristic-in-nested-scroll-box.html": [
"58c88001d53683c3f3a146c13141436b56514c96",
[
null,
{}
]
],
"position-change-heuristic.html": [
"b36b211f586782a7616c222fce04aa98817f35c4",
[
@ -404573,14 +404883,14 @@
]
},
"is-nested.html": [
"7c3973ae058edfcead691242479777aab1f5d35a",
"0658f9030d1303e46184741b5e4114c4ce7b40a4",
[
null,
{}
]
],
"is-specificity.html": [
"bf3dbc6bb9fc105d87a63ddbef65ade931f223f0",
"541b0406d347e5ade0474024ba208ba222dc2d29",
[
null,
{}
@ -426942,6 +427252,15 @@
]
],
"rendering": {
"fullscreen-css-invalidation.html": [
"e855d0c19352ccfec41a54fc20300c2b9323e39b",
[
null,
{
"testdriver": true
}
]
],
"fullscreen-css-transition.html": [
"b494dc04e6d900ce3fcb6ece31dd987095f4cfdb",
[
@ -448880,7 +449199,7 @@
],
"shared-array-buffers": {
"blob-data.https.html": [
"8fe2ee46cb35e41029b545cef4865c3e852995af",
"dbc73e98f578111757e5b82a8d6f5197249871a9",
[
null,
{}
@ -487468,7 +487787,7 @@
]
],
"path-absolute-endpoint.https.sub.html": [
"ec06a368e97bdbad1e1df00a9aff55e807d9dd4d",
"144fcb024e39178e318e5b820efc5958b2a200b1",
[
null,
{}
@ -488383,7 +488702,7 @@
},
"screen-wake-lock": {
"idlharness.https.window.js": [
"370696e90b3579e9b0960942c1cc9269850f3f6b",
"275454248f5792b89883d67944ba5f46158c58a1",
[
"screen-wake-lock/idlharness.https.window.html",
{
@ -490506,7 +490825,7 @@
]
],
"fetch-request-resources.https.html": [
"e0ddac74dbf8bd308a8942d925e1f9139c5f5685",
"fe227d9ce2f4943ec8a2aa936882f7b46daca28f",
[
null,
{}
@ -502262,7 +502581,7 @@
]
],
"trusted-types-reporting.tentative.html": [
"5003fc7fad5fab912e678c6fe0ec60e7935d0613",
"5cefedb7b8ad5d9be8c3611df3aa3aee8ced29df",
[
null,
{
@ -502271,7 +502590,7 @@
]
],
"trusted-types-svg-script.tentative.html": [
"903490e2f3d7f43f017bd843f912b99acba47c8e",
"946f825fa3eecd05247e1a2b16396ee4d3f7af11",
[
null,
{}
@ -502330,8 +502649,8 @@
}
]
],
"mouse-dblclick-event.html": [
"31a600b3cb715e408cd4aa8920fb54fd77064e57",
"dblclick_event_mouse.html": [
"50324f6dfdf7785db66d9af031f779d0189e0e57",
[
null,
{
@ -505319,15 +505638,22 @@
}
]
],
"request-video-frame-callback-dom.html": [
"0277d7297883c4cd4f472b08c4399806280fe8eb",
[
null,
{}
]
],
"request-video-frame-callback-parallel.html": [
"3407786c052b1844568c2f8512aecb3e2c7e3063",
"14c5de1adf55ba0016ab9985776c568e49f5956d",
[
null,
{}
]
],
"request-video-frame-callback-repeating.html": [
"bfdedb4bec00fe99f01ab6225e8b85a47617b3dd",
"e637a0872cb0d0c151e0a80a6a569449fd222a1b",
[
null,
{}
@ -505341,7 +505667,7 @@
]
],
"request-video-frame-callback.html": [
"6660fadeaf47460fb274e2801ff2b2528147e010",
"afc6b834d44b3e1e400c09f1c74dbfbb159fea3d",
[
null,
{}
@ -511813,105 +512139,109 @@
},
"webgpu": {
"cts.html": [
"62340be400ed172b3997a68680e7f6c9e36dfeca",
"a06ad795899a57e544da016360a70c0050511eca",
[
"webgpu/cts.html?q=webgpu:api/operation/buffers/create_mapped",
"webgpu/cts.html?q=webgpu:api,operation,buffers,create_mapped:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/buffers/map",
"webgpu/cts.html?q=webgpu:api,operation,buffers,map:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/buffers/map_detach",
"webgpu/cts.html?q=webgpu:api,operation,buffers,map_detach:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/buffers/map_oom",
"webgpu/cts.html?q=webgpu:api,operation,buffers,map_oom:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/command_buffer/basic",
"webgpu/cts.html?q=webgpu:api,operation,command_buffer,basic:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/command_buffer/copies",
"webgpu/cts.html?q=webgpu:api,operation,command_buffer,copies:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/command_buffer/render/basic",
"webgpu/cts.html?q=webgpu:api,operation,command_buffer,render,basic:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/operation/fences",
"webgpu/cts.html?q=webgpu:api,operation,fences:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/createBindGroup",
"webgpu/cts.html?q=webgpu:api,operation,resource_init,copied_texture_clear:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/createBindGroupLayout",
"webgpu/cts.html?q=webgpu:api,validation,createBindGroup:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/createPipelineLayout",
"webgpu/cts.html?q=webgpu:api,validation,createBindGroupLayout:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/createTexture",
"webgpu/cts.html?q=webgpu:api,validation,createPipelineLayout:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/createView",
"webgpu/cts.html?q=webgpu:api,validation,createTexture:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/error_scope",
"webgpu/cts.html?q=webgpu:api,validation,createView:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/fences",
"webgpu/cts.html?q=webgpu:api,validation,error_scope:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/queue_submit",
"webgpu/cts.html?q=webgpu:api,validation,fences:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/render_pass_descriptor",
"webgpu/cts.html?q=webgpu:api,validation,queue_submit:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/setBindGroup",
"webgpu/cts.html?q=webgpu:api,validation,render_pass_descriptor:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/setBlendColor",
"webgpu/cts.html?q=webgpu:api,validation,setBindGroup:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/setScissorRect",
"webgpu/cts.html?q=webgpu:api,validation,setBlendColor:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/setStencilReference",
"webgpu/cts.html?q=webgpu:api,validation,setScissorRect:*",
{}
],
[
"webgpu/cts.html?q=webgpu:api/validation/setViewport",
"webgpu/cts.html?q=webgpu:api,validation,setStencilReference:*",
{}
],
[
"webgpu/cts.html?q=webgpu:examples",
"webgpu/cts.html?q=webgpu:api,validation,setViewport:*",
{}
],
[
"webgpu/cts.html?q=webgpu:web-platform/canvas/context_creation",
"webgpu/cts.html?q=webgpu:examples:*",
{}
],
[
"webgpu/cts.html?q=webgpu:web-platform/copyImageBitmapToTexture",
"webgpu/cts.html?q=webgpu:web-platform,canvas,context_creation:*",
{}
],
[
"webgpu/cts.html?q=webgpu:web-platform,copyImageBitmapToTexture:*",
{}
]
]

View file

@ -1,4 +0,0 @@
[hit-test-floats-002.html]
[Hit test float]
expected: FAIL

View file

@ -2,3 +2,6 @@
[Hit test intersecting scaled box]
expected: FAIL
[Hit test within unscaled box]
expected: FAIL

View file

@ -56,663 +56,3 @@
[background-position length(px) / events]
expected: FAIL
[top length(pt) / events]
expected: FAIL
[border-right-width length(mm) / events]
expected: FAIL
[width length(pt) / events]
expected: FAIL
[border-bottom-width length(pc) / events]
expected: FAIL
[height length(ex) / events]
expected: FAIL
[padding-bottom length(mm) / events]
expected: FAIL
[border-top-width length(px) / events]
expected: FAIL
[border-top-width length(pt) / events]
expected: FAIL
[padding-top length(em) / events]
expected: FAIL
[outline-width length(pc) / events]
expected: FAIL
[max-width length(in) / events]
expected: FAIL
[margin-top length(cm) / events]
expected: FAIL
[margin-right length(pt) / events]
expected: FAIL
[right length(ex) / events]
expected: FAIL
[vertical-align length(px) / events]
expected: FAIL
[max-height length(em) / events]
expected: FAIL
[width length(ex) / events]
expected: FAIL
[border-bottom-color color(rgba) / events]
expected: FAIL
[width percentage(%) / events]
expected: FAIL
[margin-top length(ex) / events]
expected: FAIL
[border-top-width length(in) / events]
expected: FAIL
[right length(em) / events]
expected: FAIL
[top length(ex) / events]
expected: FAIL
[padding-left length(px) / events]
expected: FAIL
[margin-top length(em) / events]
expected: FAIL
[left length(em) / events]
expected: FAIL
[margin-left length(px) / events]
expected: FAIL
[max-height percentage(%) / events]
expected: FAIL
[bottom length(ex) / events]
expected: FAIL
[padding-left length(mm) / events]
expected: FAIL
[right length(mm) / events]
expected: FAIL
[margin-top length(pc) / events]
expected: FAIL
[border-left-width length(pt) / events]
expected: FAIL
[outline-offset length(mm) / events]
expected: FAIL
[vertical-align length(in) / events]
expected: FAIL
[border-bottom-width length(pt) / events]
expected: FAIL
[border-bottom-width length(in) / events]
expected: FAIL
[margin-bottom length(pc) / events]
expected: FAIL
[border-left-width length(mm) / events]
expected: FAIL
[height length(em) / events]
expected: FAIL
[height length(cm) / events]
expected: FAIL
[padding-top length(in) / events]
expected: FAIL
[max-width length(ex) / events]
expected: FAIL
[padding-top length(px) / events]
expected: FAIL
[border-top-width length(pc) / events]
expected: FAIL
[top length(cm) / events]
expected: FAIL
[left length(ex) / events]
expected: FAIL
[min-width length(ex) / events]
expected: FAIL
[left length(pc) / events]
expected: FAIL
[vertical-align length(em) / events]
expected: FAIL
[left length(in) / events]
expected: FAIL
[left length(px) / events]
expected: FAIL
[border-bottom-width length(mm) / events]
expected: FAIL
[min-width length(cm) / events]
expected: FAIL
[vertical-align length(cm) / events]
expected: FAIL
[padding-bottom length(px) / events]
expected: FAIL
[max-width percentage(%) / events]
expected: FAIL
[outline-offset length(cm) / events]
expected: FAIL
[top length(in) / events]
expected: FAIL
[border-left-color color(rgba) / events]
expected: FAIL
[margin-left length(mm) / events]
expected: FAIL
[margin-top length(pt) / events]
expected: FAIL
[min-height length(cm) / events]
expected: FAIL
[max-height length(cm) / events]
expected: FAIL
[width length(mm) / events]
expected: FAIL
[width length(pc) / events]
expected: FAIL
[vertical-align length(mm) / events]
expected: FAIL
[height length(px) / events]
expected: FAIL
[right percentage(%) / events]
expected: FAIL
[border-top-color color(rgba) / events]
expected: FAIL
[outline-offset length(em) / events]
expected: FAIL
[padding-right length(px) / events]
expected: FAIL
[vertical-align length(ex) / events]
expected: FAIL
[outline-width length(em) / events]
expected: FAIL
[width length(cm) / events]
expected: FAIL
[margin-right length(ex) / events]
expected: FAIL
[border-right-width length(cm) / events]
expected: FAIL
[margin-right length(em) / events]
expected: FAIL
[border-left-width length(ex) / events]
expected: FAIL
[min-width length(mm) / events]
expected: FAIL
[margin-right length(pc) / events]
expected: FAIL
[margin-left length(pt) / events]
expected: FAIL
[border-right-width length(pc) / events]
expected: FAIL
[height length(in) / events]
expected: FAIL
[border-left-width length(in) / events]
expected: FAIL
[min-height length(ex) / events]
expected: FAIL
[bottom length(em) / events]
expected: FAIL
[border-right-color color(rgba) / events]
expected: FAIL
[right length(in) / events]
expected: FAIL
[padding-top length(pt) / events]
expected: FAIL
[min-width length(em) / events]
expected: FAIL
[border-right-width length(pt) / events]
expected: FAIL
[opacity number[0,1\](zero-to-one) / events]
expected: FAIL
[padding-bottom length(cm) / events]
expected: FAIL
[margin-right length(in) / events]
expected: FAIL
[margin-top length(px) / events]
expected: FAIL
[padding-top length(ex) / events]
expected: FAIL
[margin-left length(ex) / events]
expected: FAIL
[top length(px) / events]
expected: FAIL
[bottom length(cm) / events]
expected: FAIL
[border-bottom-width length(px) / events]
expected: FAIL
[margin-bottom length(ex) / events]
expected: FAIL
[max-width length(mm) / events]
expected: FAIL
[height percentage(%) / events]
expected: FAIL
[border-right-width length(px) / events]
expected: FAIL
[border-top-width length(mm) / events]
expected: FAIL
[border-left-width length(em) / events]
expected: FAIL
[max-width length(pc) / events]
expected: FAIL
[padding-bottom length(em) / events]
expected: FAIL
[min-width length(pt) / events]
expected: FAIL
[outline-width length(cm) / events]
expected: FAIL
[border-right-width length(in) / events]
expected: FAIL
[bottom length(in) / events]
expected: FAIL
[padding-right length(mm) / events]
expected: FAIL
[border-left-width length(px) / events]
expected: FAIL
[left length(cm) / events]
expected: FAIL
[margin-right length(px) / events]
expected: FAIL
[clip rectangle(rectangle) / events]
expected: FAIL
[margin-left length(cm) / events]
expected: FAIL
[background-color color(rgba) / events]
expected: FAIL
[min-width length(in) / events]
expected: FAIL
[padding-right length(cm) / events]
expected: FAIL
[width length(em) / events]
expected: FAIL
[margin-left length(em) / events]
expected: FAIL
[margin-right length(cm) / events]
expected: FAIL
[border-bottom-width length(cm) / events]
expected: FAIL
[bottom length(pc) / events]
expected: FAIL
[top percentage(%) / events]
expected: FAIL
[padding-left length(pt) / events]
expected: FAIL
[min-width percentage(%) / events]
expected: FAIL
[right length(px) / events]
expected: FAIL
[padding-right length(in) / events]
expected: FAIL
[left length(mm) / events]
expected: FAIL
[bottom length(px) / events]
expected: FAIL
[padding-left length(pc) / events]
expected: FAIL
[outline-width length(ex) / events]
expected: FAIL
[padding-left length(cm) / events]
expected: FAIL
[left length(pt) / events]
expected: FAIL
[outline-width length(mm) / events]
expected: FAIL
[padding-left length(ex) / events]
expected: FAIL
[margin-bottom length(cm) / events]
expected: FAIL
[max-width length(pt) / events]
expected: FAIL
[border-right-width length(em) / events]
expected: FAIL
[margin-left length(in) / events]
expected: FAIL
[top length(em) / events]
expected: FAIL
[padding-right length(pt) / events]
expected: FAIL
[padding-top length(pc) / events]
expected: FAIL
[border-top-width length(ex) / events]
expected: FAIL
[min-height length(pt) / events]
expected: FAIL
[width length(in) / events]
expected: FAIL
[min-width length(pc) / events]
expected: FAIL
[margin-bottom length(mm) / events]
expected: FAIL
[height length(pc) / events]
expected: FAIL
[max-width length(px) / events]
expected: FAIL
[bottom length(pt) / events]
expected: FAIL
[padding-right length(ex) / events]
expected: FAIL
[border-top-width length(em) / events]
expected: FAIL
[max-height length(pt) / events]
expected: FAIL
[vertical-align percentage(%) / events]
expected: FAIL
[margin-left length(pc) / events]
expected: FAIL
[min-height percentage(%) / events]
expected: FAIL
[padding-bottom length(ex) / events]
expected: FAIL
[padding-left length(em) / events]
expected: FAIL
[bottom percentage(%) / events]
expected: FAIL
[min-height length(pc) / events]
expected: FAIL
[border-left-width length(pc) / events]
expected: FAIL
[margin-bottom length(in) / events]
expected: FAIL
[outline-width length(pt) / events]
expected: FAIL
[margin-bottom length(em) / events]
expected: FAIL
[top length(mm) / events]
expected: FAIL
[outline-color color(rgba) / events]
expected: FAIL
[bottom length(mm) / events]
expected: FAIL
[padding-top length(mm) / events]
expected: FAIL
[border-right-width length(ex) / events]
expected: FAIL
[border-top-width length(cm) / events]
expected: FAIL
[outline-width length(in) / events]
expected: FAIL
[right length(pt) / events]
expected: FAIL
[width length(px) / events]
expected: FAIL
[height length(pt) / events]
expected: FAIL
[padding-left length(in) / events]
expected: FAIL
[min-height length(em) / events]
expected: FAIL
[left percentage(%) / events]
expected: FAIL
[padding-bottom length(pc) / events]
expected: FAIL
[max-height length(ex) / events]
expected: FAIL
[border-left-width length(cm) / events]
expected: FAIL
[outline-offset length(ex) / events]
expected: FAIL
[max-height length(pc) / events]
expected: FAIL
[padding-right length(pc) / events]
expected: FAIL
[top length(pc) / events]
expected: FAIL
[vertical-align length(pc) / events]
expected: FAIL
[min-height length(px) / events]
expected: FAIL
[margin-right length(mm) / events]
expected: FAIL
[max-height length(mm) / events]
expected: FAIL
[right length(pc) / events]
expected: FAIL
[vertical-align length(pt) / events]
expected: FAIL
[padding-top length(cm) / events]
expected: FAIL
[right length(cm) / events]
expected: FAIL
[outline-offset length(pt) / events]
expected: FAIL
[min-height length(in) / events]
expected: FAIL
[max-width length(cm) / events]
expected: FAIL
[border-bottom-width length(ex) / events]
expected: FAIL
[max-height length(px) / events]
expected: FAIL
[min-width length(px) / events]
expected: FAIL
[outline-offset length(px) / events]
expected: FAIL
[margin-top length(in) / events]
expected: FAIL
[outline-offset length(in) / events]
expected: FAIL
[margin-bottom length(pt) / events]
expected: FAIL
[max-width length(em) / events]
expected: FAIL
[padding-bottom length(pt) / events]
expected: FAIL
[min-height length(mm) / events]
expected: FAIL
[padding-bottom length(in) / events]
expected: FAIL
[margin-bottom length(px) / events]
expected: FAIL
[max-height length(in) / events]
expected: FAIL
[outline-width length(px) / events]
expected: FAIL
[padding-right length(em) / events]
expected: FAIL
[height length(mm) / events]
expected: FAIL
[margin-top length(mm) / events]
expected: FAIL
[outline-offset length(pc) / events]
expected: FAIL
[border-bottom-width length(em) / events]
expected: FAIL
[z-index integer(integer) / events]
expected: FAIL

View file

@ -5,90 +5,3 @@
[background-position length-em(em) / values]
expected: FAIL
[line-height length-em(em) / events]
expected: FAIL
[padding-left length-em(em) / events]
expected: FAIL
[min-width length-em(em) / events]
expected: FAIL
[right length-em(em) / events]
expected: FAIL
[max-width length-em(em) / events]
expected: FAIL
[text-indent length-em(em) / events]
expected: FAIL
[margin-left length-em(em) / events]
expected: FAIL
[word-spacing length-em(em) / events]
expected: FAIL
[letter-spacing length-em(em) / events]
expected: FAIL
[width length-em(em) / events]
expected: FAIL
[padding-top length-em(em) / events]
expected: FAIL
[margin-right length-em(em) / events]
expected: FAIL
[max-height length-em(em) / events]
expected: FAIL
[padding-bottom length-em(em) / events]
expected: FAIL
[border-top-width length-em(em) / events]
expected: FAIL
[height length-em(em) / events]
expected: FAIL
[border-bottom-width length-em(em) / events]
expected: FAIL
[border-left-width length-em(em) / events]
expected: FAIL
[margin-bottom length-em(em) / events]
expected: FAIL
[min-height length-em(em) / events]
expected: FAIL
[outline-offset length-em(em) / events]
expected: FAIL
[padding-right length-em(em) / events]
expected: FAIL
[top length-em(em) / events]
expected: FAIL
[outline-width length-em(em) / events]
expected: FAIL
[bottom length-em(em) / events]
expected: FAIL
[vertical-align length-em(em) / events]
expected: FAIL
[left length-em(em) / events]
expected: FAIL
[margin-top length-em(em) / events]
expected: FAIL
[border-right-width length-em(em) / events]
expected: FAIL

View file

@ -1,4 +0,0 @@
[elementFromPoint-001.html]
[CSSOM View - 5 - extensions to the Document interface]
expected: FAIL

View file

@ -1,4 +0,0 @@
[elementsFromPoint-invalid-cases.html]
[The root element is the last element returned for otherwise empty queries within the viewport]
expected: FAIL

View file

@ -312,18 +312,21 @@
[fetch(): separate response Content-Type: text/plain ]
expected: NOTRUN
[<iframe>: combined response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
[<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL

View file

@ -53,3 +53,6 @@
[combined text/javascript ]
expected: FAIL
[separate text/javascript x/x]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -0,0 +1,4 @@
[traverse_the_history_2.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -24,3 +24,24 @@
[blob frame: postMessaging to a dedicated HTTP sub-worker allows them to see each others' modifications]
expected: FAIL
[data frame: self.crossOriginIsolated]
expected: FAIL
[data worker: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[data worker: self.crossOriginIsolated]
expected: FAIL
[data worker: self.origin]
expected: FAIL
[data frame: self.isSecureContext]
expected: FAIL
[data frame: postMessaging to a dedicated blob sub-worker allows them to see each others' modifications]
expected: TIMEOUT
[data worker: self.isSecureContext]
expected: FAIL

View file

@ -1,6 +1,5 @@
[iframe_sandbox_popups_escaping-3.html]
type: testharness
expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL

View file

@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
expected: CRASH
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN

View file

@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-3.html]
type: testharness
expected: CRASH
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN

View file

@ -1,5 +1,5 @@
[ignore-opens-during-unload.window.html]
expected: TIMEOUT
expected: CRASH
[ignore-opens-during-unload]
expected: FAIL

View file

@ -1,5 +0,0 @@
[018.html]
expected: TIMEOUT
[origin of the script that invoked the method, javascript:]
expected: TIMEOUT

View file

@ -25,6 +25,11 @@ trigger:
- triggers/safari_stable
- triggers/safari_preview
# Set safaridriver_diagnose to true to enable safaridriver diagnostics. The
# logs won't appear in `./wpt run` output but will be uploaded as an artifact.
variables:
safaridriver_diagnose: false
jobs:
# The affected tests jobs are unconditional for speed, as most PRs have one or
# more affected tests: https://github.com/web-platform-tests/wpt/issues/13936.
@ -108,11 +113,7 @@ jobs:
displayName: 'Run tests (Firefox Nightly)'
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-mach - --log-mach-level info --channel preview safari infrastructure/
displayName: 'Run tests (Safari Technology Preview)'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
inputs:
artifactName: 'infrastructure'
condition: always()
- template: tools/ci/azure/publish_logs.yml
- job: tools_unittest_mac
displayName: 'tools/ unittests: macOS'
@ -616,6 +617,7 @@ jobs:
displayName: 'Publish results'
inputs:
artifactName: 'safari-results'
- template: tools/ci/azure/publish_logs.yml
- template: tools/ci/azure/fyi_hook.yml
parameters:
dependsOn: results_safari
@ -651,6 +653,7 @@ jobs:
displayName: 'Publish results'
inputs:
artifactName: 'safari-preview-results'
- template: tools/ci/azure/publish_logs.yml
- template: tools/ci/azure/fyi_hook.yml
parameters:
dependsOn: results_safari_preview

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<head>
<title>Embedded Enforcement: blocked iframe are cross-origin.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/testharness-helper.sub.js"></script>
</head>
<body>
<script>
let SecurityError = 18;
let tests = [
{name: "Same-origin" , origin: getOrigin()},
{name: "Cross-origin", origin: getCrossOrigin()},
];
for(test of tests) {
promise_test(async () => {
let iframe = document.createElement("iframe");
let loaded = new Promise(r => iframe.onload = r);
iframe.csp = "script-src 'none'";
iframe.src = test.origin + "common/blank.html";
document.body.appendChild(iframe);
await loaded;
assert_throws_dom(SecurityError, () => iframe.contentWindow.document);
}, `${test.name} document blocked by embedded enforcement must appear cross-origin`);
}
</script>
</body>
</html>

View file

@ -27,14 +27,14 @@
assert_equals(reports[0].type, "csp-violation");
assert_equals(reports[0].url, document_url);
assert_equals(reports[0].body.documentURL, document_url);
assert_equals(reports[0].body.referrer, null);
assert_equals(reports[0].body.referrer, "");
assert_equals(reports[0].body.blockedURL,
base_url + "support/fail.png");
assert_equals(reports[0].body.effectiveDirective, "img-src");
assert_equals(reports[0].body.originalPolicy,
"script-src 'self' 'unsafe-inline'; img-src 'none'; report-to csp-group");
assert_equals(reports[0].body.sourceFile, document_url);
assert_equals(reports[0].body.sample, null);
assert_equals(reports[0].body.sample, "");
assert_equals(reports[0].body.disposition, "enforce");
assert_equals(reports[0].body.statusCode, 0);
assert_equals(reports[0].body.lineNumber, 53);

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<meta name="assert" content="A float that doesn't fit in the current fragmentainer will be pushed to next fragmentainer, while subsequent content may still fit in the former fragmentainer, without being affected by the float">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="columns:3; column-fill:auto; height:100px;">
<div style="width:100px; background:red;">
<div style="width:200px;">
<div style="width:100px; height:50px; background:green;"></div>
<div style="float:left; width:50px; line-height:60px;"><br></div>
<div style="clear:right; width:100px; height:50px; display:flow-root; background:green;"></div>
</div>
</div>
</div>

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<meta name="assert" content="A float that doesn't fit in the current fragmentainer will be pushed to next fragmentainer, while subsequent content may still fit in the former fragmentainer, without being affected by the float">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="columns:3; column-fill:auto; column-gap:0; width:150px; height:100px;">
<div style="background:red;">
<div style="width:50px; height:50px; background:green;"></div>
<div style="float:left; width:50px; line-height:70px; background:green;"><br></div>
<div style="float:left; width:50px; line-height:30px; background:green;"><br></div>
<div style="width:50px; height:50px; display:flow-root; background:green;"></div>
</div>
</div>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<meta name="assert" content="A float that doesn't fit in the current fragmentainer will be pushed to next fragmentainer, while subsequent content may still fit in the former fragmentainer, but it still needs to apply clearance as needed.">
<p>Test passes if there is a filled green square.</p>
<div style="columns:3; column-fill:auto; column-gap:0; width:150px; height:120px;">
<div style="height:100px; background:green;"></div>
<div style="float:right; width:10px; line-height:100px; background:green;"><br></div>
<div style="float:left; width:40px; line-height:60px; background:green;"><br></div>
<div style="clear:left; height:40px;background:green;"></div>
</div>

View file

@ -0,0 +1,29 @@
<!doctype html>
<meta charset=utf-8>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=device-width, maximum-scale=1.0">
<link rel="help" href="https://drafts.csswg.org/css-device-adapt/">
<link rel="help" href="https://webcompat.com/issues/52856">
<style>
body {
margin: 0;
}
#content {
width: 100px;
height: 100px;
background: green;
}
</style>
<div id="content">Content</div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
'use strict';
test(() => {
assert_equals(window.visualViewport.scale, 1.0,
'visual viewport scale should be 1.0');
}, 'Page with meta viewport "width=device-width, user-scalable=no, ' +
'initial-scale=device-width, maximum-scale=1.0" ' +
'should scale to 1.0.');
</script>

View file

@ -0,0 +1,29 @@
<!doctype html>
<meta charset=utf-8>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=0.25, minimum-scale=1.0">
<link rel="help" href="https://drafts.csswg.org/css-device-adapt/">
<link rel="help" href="https://webcompat.com/issues/52856">
<style>
body {
margin: 0;
}
#content {
width: 100px;
height: 100px;
background: green;
}
</style>
<div id="content">Content</div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
'use strict';
test(() => {
assert_equals(window.visualViewport.scale, 1.0,
'visual viewport scale should be 1.0');
}, 'Page with meta viewport "width=device-width, user-scalable=no, ' +
'initial-scale=0.25, minimum-scale=1.0" ' +
'should scale to 1.0.');
</script>

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<title>Negative item margins</title>
<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org" />
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths" />
<p>Test passes if it doesn't crash.</p>
<div style="display: flex; flex-flow: column;">
<div style="margin: -10px;"></div>
</div>

View file

@ -0,0 +1,85 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/#suppression-triggers">
<style>
#space {
height: 4000px;
overflow: hidden;
}
#header {
background-color: #F5B335;
height: 50px;
width: 100%;
}
#content {
background-color: #D3D3D3;
height: 400px;
}
.scroller {
overflow: scroll;
position: relative;
width: 600px;
height: 600px;
}
body {
overflow: hidden;
}
</style>
<div id="maybeScroller">
<div id="space">
<div id="header"></div>
<div id="before"></div>
<div id="content"></div>
</div>
</div>
<script>
// Tests that scroll anchoring is suppressed when an element in the scroller
// changes its in-flow state.
var scroller;
function runCase(oldPos, newPos, expectSuppression, skipInverse) {
var header = document.querySelector("#header");
var before = document.querySelector("#before");
header.style.position = oldPos;
before.style.height = "0";
scroller.scrollTop = 200;
header.style.position = newPos;
before.style.height = "25px";
var expectedTop = expectSuppression ? 200 : 225;
assert_equals(scroller.scrollTop, expectedTop);
if (!skipInverse)
runCase(newPos, oldPos, expectSuppression, true);
}
test(() => {
scroller = document.scrollingElement;
document.querySelector("#maybeScroller").className = "";
runCase("static", "fixed", true);
runCase("static", "absolute", true);
runCase("static", "relative", false);
runCase("fixed", "absolute", false);
runCase("fixed", "relative", true);
runCase("absolute", "relative", true);
}, "Position changes in document scroller.");
test(() => {
scroller = document.querySelector("#maybeScroller");
scroller.className = "scroller";
runCase("static", "fixed", true);
runCase("static", "absolute", true);
runCase("static", "relative", false);
runCase("fixed", "absolute", false);
runCase("fixed", "relative", true);
runCase("absolute", "relative", true);
}, "Position changes in scrollable <div>.");
</script>

View file

@ -57,9 +57,6 @@
<div>
<label><input data-tested="false" id="el-10" type="radio"></input> Focus me.</label>
</div>
<div>
<label><input data-tested="false" id="el-11" type="color"></input> Focus me.</label>
</div>
<div>
<!-- Focusing file input triggers a modal, so only test manually -->
<input id="el-12" type="file" value="Focus me."></input>
@ -67,6 +64,10 @@
<div>
<label><input data-tested="false" id="el-13" type="range"></input> Focus me.</label>
</div>
<div>
<!-- Ensure the color input is last, as it has a pop-up which obscures other elements -->
<label><input data-tested="false" id="el-11" type="color"></input> Focus me.</label>
</div>
<script>
async_test(function(t) {
document.querySelectorAll("[data-tested]").forEach((el) => {

View file

@ -57,9 +57,6 @@
<div>
<label><input data-tested="false" id="el-10" type="radio"></input> Focus me.</label>
</div>
<div>
<label><input data-tested="false" id="el-11" type="color"></input> Focus me.</label>
</div>
<div>
<!-- Focusing file input triggers a modal, so only test manually -->
<input id="el-12" type="file" value="Focus me."></input>
@ -67,6 +64,12 @@
<div>
<label><input data-tested="false" id="el-13" type="range"></input> Focus me.</label>
</div>
<div>
<!-- Ensure the color input is last, as it has a pop-up which obscures other elements,
causing the `mouseClickInTarget` method to fail and the test to hang waiting for
a click event.-->
<label><input data-tested="false" id="el-11" type="color"></input> Focus me.</label>
</div>
<script>
async_test(function(t) {
document.querySelectorAll("[data-tested]").forEach((el) => {

View file

@ -14,7 +14,7 @@
font-size: 10px;
width: 10px;
}
.a+:is(.b+.f, .b+:is(*, .c>.e, .g, *))+.d {
.e:is(.b+.f, .e:is(*, .c>.e, .g, *))+.d {
color: red;
font-size: 20px;
}
@ -25,7 +25,7 @@
.a+.c>.e {
color: black;
}
.a+:is(.b+.f, :is(.c>.e, .g)) {
.e:is(.b+.f, :is(.c>.e, .g)) {
color: red;
}
.c>.e {
@ -69,4 +69,4 @@
</script>
</body>
</html>
</html>

View file

@ -13,7 +13,7 @@
height: 10px;
width: 10px;
}
:is(.a, .b.c + .d, .e) + :is(* + .p, .q.r + .s, * + .t) + #target {
:is(.a, .b.c + .d, .q) + :is(* + .p, .q.r + .s, * + .t) + #target {
height: 20px;
width: 20px;
}

View file

@ -42,3 +42,6 @@ argument:
The logs will be in `~/Library/Logs/com.apple.WebDriver/`.
See `man safaridriver` for more information.
To enable safaridriver diagnostics in Azure Pipelines, set
`safaridriver_diagnose` to `true` in `.azure-pipelines.yml`.

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<title>Invalidate :fullscreen based style</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style>
#pass {
color: red;
}
:root:fullscreen #pass {
color: green;
}
</style>
<div id="pass">Should be green</div>
<script>
async_test(t => {
document.onfullscreenchange = t.step_func_done(() => {
assert_equals(document.fullscreenElement, document.documentElement);
assert_equals(getComputedStyle(pass).color, "rgb(0, 128, 0)", "Green when :root is fullscreened.");
});
document.documentElement.addEventListener('click', t.step_func(() => {
document.documentElement.requestFullscreen();
}), {once: true});
assert_equals(getComputedStyle(pass).color, "rgb(255, 0, 0)", "Initially red.");
test_driver.click(document.documentElement);
});
</script>

View file

@ -0,0 +1,10 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element.
The canvas is never closed, and the rest of the body ends up inside it.</p>
</body>
</html>

View file

@ -0,0 +1,14 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
<link rel="match" href="unclosed-canvas-1-expected.htm">
<meta name="assert" content="Test what if canvas tag is unclosed in tag p" />
<script type="text/javascript"></script>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element.
The canvas is never closed, and the rest of the body ends up inside it. </p>
<canvas>This text should NOT be visible if JavaScript is enabled.
</body>
</html>

View file

@ -0,0 +1,14 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
</head>
<body>
<div><canvas></canvas></div>
<p>This text should be visible, even though it's preceded by an unclosed canvas tag,
because of the &lt;/div&gt; that closes an element opened before the canvas.
There's nothing special about div; we get the same results with other types of
elements.
</p>
</body>
</html>

View file

@ -0,0 +1,15 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
<link rel="match" href="unclosed-canvas-2-expected.htm">
<meta name="assert" content="Test what if canvas tag is unclosed in tag div" />
<script type="text/javascript"></script>
</head>
<body>
<div><canvas></div>
<p>This text should be visible, even though it's preceded by an unclosed canvas tag,
because of the &lt;/div&gt; that closes an element opened before the canvas.
There's nothing special about div; we get the same results with other types of elements.</p>
</body>
</html>

View file

@ -0,0 +1,13 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element
and the &lt;/div&gt; that's also inside the canvas element does not close an open
element. The canvas is never closed, and the rest of the body ends up inside it.
There's nothing special about div; we get the same results with other types of
elements.</p>
</body>
</html>

View file

@ -0,0 +1,16 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
<link rel="match" href="unclosed-canvas-3-expected.htm">
<meta name="assert" content="Test what if canvas tag is unclosed in unclosed div" />
<script type="text/javascript"></script>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element
and the &lt;/div&gt; that's also inside the canvas element does not close an open element.
The canvas is never closed, and the rest of the body ends up inside it.
There's nothing special about div; we get the same results with other types of elements.</p>
<canvas></div>This text should NOT be visible if JavaScript is enabled.
</body>
</html>

View file

@ -0,0 +1,14 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element
and the &lt;/div&gt; that's also inside the canvas element does not close an open
element. The canvas is never closed, and the rest of the body ends up inside it.
There's nothing special about div; we get the same results with other types of
elements. The fact that the canvas tag uses XML self-closing syntax has no effect.
</p>
</body>
</html>

View file

@ -0,0 +1,17 @@
<!doctype HTML>
<html>
<head>
<title>unclosed canvas tag in body</title>
<link rel="match" href="unclosed-canvas-4-expected.htm">
<meta name="assert" content="Test what if canvas tag is unclosed in body" />
<script type="text/javascript"></script>
</head>
<body>
<p>There should be no text below this, because the text is inside a canvas element
and the &lt;/div&gt; that's also inside the canvas element does not close an open element.
The canvas is never closed, and the rest of the body ends up inside it.
There's nothing special about div; we get the same results with other types of elements.
The fact that the canvas tag uses XML self-closing syntax has no effect.</p>
<canvas/></div>This text should NOT be visible if JavaScript is enabled.
</body>
</html>

View file

@ -29,9 +29,10 @@ self.postMessage({ origin: self.origin, view });
\`], { type: "text/javascript" })));
return new Promise((resolve, reject) => {
// Initially the sub-worker gives us an object containing an origin and a view on a shared
/* Initially the sub-worker gives us an object containing an origin and a view on a shared
// buffer. We then modify the shared buffer through the buffer and tell the sub-worker to
// "continue". The sub-worker verifies the modification and relays whether it succeeded.
*/
worker.onmessage = t.step_func(({ data }) => {
if ("succeeded" in data) {
assert_true(data.succeeded);
@ -101,7 +102,7 @@ fetch_tests_from_window(frame.contentWindow);
const dataWorkerScript = `
importScripts("${url.origin}/resources/testharness.js?pipe=header(Cross-Origin-Resource-Policy,cross-origin)");
// Cannot use httpWorkerIncrementerTest() here as the HTTP URL is not same origin.
/* Cannot use httpWorkerIncrementerTest() here as the HTTP URL is not same origin. */
${blobWorkerIncrementerTest("data worker")}
@ -116,7 +117,7 @@ const dataFrameScript = `
<!doctype html>
<script src=${url.origin}/resources/testharness.js?pipe=header(Cross-Origin-Resource-Policy,cross-origin)><\/script>
<script>
// Cannot use httpWorkerIncrementerTest() here as the HTTP URL is not same origin.
/* Cannot use httpWorkerIncrementerTest() here as the HTTP URL is not same origin. */
${blobWorkerIncrementerTest("data frame")}

View file

@ -28,14 +28,14 @@
assert_equals(reports[0].type, "csp-violation");
assert_equals(reports[0].url, location.href);
assert_equals(reports[0].body.documentURL, location.href);
assert_equals(reports[0].body.referrer, null);
assert_equals(reports[0].body.referrer, "");
assert_equals(reports[0].body.blockedURL,
`${base_url}/reporting/resources/fail.png`);
assert_equals(reports[0].body.effectiveDirective, "img-src");
assert_equals(reports[0].body.originalPolicy,
"script-src 'self' 'unsafe-inline'; img-src 'none'; report-to csp-group");
assert_equals(reports[0].body.sourceFile, location.href);
assert_equals(reports[0].body.sample, null);
assert_equals(reports[0].body.sample, "");
assert_equals(reports[0].body.disposition, "enforce");
assert_equals(reports[0].body.statusCode, 0);
assert_equals(reports[0].body.lineNumber, 66);

View file

@ -8,7 +8,7 @@
'use strict';
idl_test(
['screen-wake-lock'],
['wake-lock'],
['dom', 'html'],
async idl_array => {
idl_array.add_objects({ Navigator: ['navigator'] });

View file

@ -5,12 +5,12 @@
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
var url_count = 0;
var expected_results = {};
let url_count = 0;
const expected_results = {};
function add_promise_to_test(url)
{
var expected = expected_results[url];
const expected = expected_results[url];
return new Promise((resolve) => {
expected.resolve = resolve;
});
@ -18,7 +18,7 @@ function add_promise_to_test(url)
function image_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
mode: expected_mode,
@ -26,8 +26,7 @@ function image_test(frame, url, cross_origin, expected_mode,
redirect: 'follow',
integrity: '',
destination: 'image',
message: 'Image load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
message: `Image load (url:${actual_url} cross_origin:${cross_origin})`
};
frame.contentWindow.load_image(actual_url, cross_origin);
return add_promise_to_test(actual_url);
@ -35,7 +34,7 @@ function image_test(frame, url, cross_origin, expected_mode,
function script_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
mode: expected_mode,
@ -43,8 +42,7 @@ function script_test(frame, url, cross_origin, expected_mode,
redirect: 'follow',
integrity: '',
destination: 'script',
message: 'Script load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
message: `Script load (url:${actual_url} cross_origin:${cross_origin})`
};
frame.contentWindow.load_script(actual_url, cross_origin);
return add_promise_to_test(actual_url);
@ -52,7 +50,7 @@ function script_test(frame, url, cross_origin, expected_mode,
function css_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
mode: expected_mode,
@ -60,15 +58,14 @@ function css_test(frame, url, cross_origin, expected_mode,
redirect: 'follow',
integrity: '',
destination: 'style',
message: 'CSS load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
message: `CSS load (url:${actual_url} cross_origin:${cross_origin})`
};
frame.contentWindow.load_css(actual_url, cross_origin);
return add_promise_to_test(actual_url);
}
function font_face_test(frame, url, expected_mode, expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
url: actual_url,
mode: expected_mode,
@ -76,14 +73,14 @@ function font_face_test(frame, url, expected_mode, expected_credentials) {
redirect: 'follow',
integrity: '',
destination: 'font',
message: 'FontFace load (url:' + actual_url + ')'
message: `FontFace load (url: ${actual_url})`
};
frame.contentWindow.load_font(actual_url);
return add_promise_to_test(actual_url);
}
function script_integrity_test(frame, url, integrity, expected_integrity) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
url: actual_url,
mode: 'no-cors',
@ -91,14 +88,14 @@ function script_integrity_test(frame, url, integrity, expected_integrity) {
redirect: 'follow',
integrity: expected_integrity,
destination: 'script',
message: 'Script load (url:' + actual_url + ')'
message: `Script load (url:${actual_url})`
};
frame.contentWindow.load_script_with_integrity(actual_url, integrity);
return add_promise_to_test(actual_url);
}
function css_integrity_test(frame, url, integrity, expected_integrity) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
url: actual_url,
mode: 'no-cors',
@ -106,7 +103,7 @@ function css_integrity_test(frame, url, integrity, expected_integrity) {
redirect: 'follow',
integrity: expected_integrity,
destination: 'style',
message: 'CSS load (url:' + actual_url + ')'
message: `CSS load (url:${actual_url})`
};
frame.contentWindow.load_css_with_integrity(actual_url, integrity);
return add_promise_to_test(actual_url);
@ -114,33 +111,31 @@ function css_integrity_test(frame, url, integrity, expected_integrity) {
function fetch_test(frame, url, mode, credentials,
expected_mode, expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
mode: expected_mode,
credentials: expected_credentials,
redirect: 'follow',
integrity: '',
destination: 'empty',
message: 'fetch (url:' + actual_url + ' mode:' + mode + ' credentials:' +
credentials + ')'
message: `fetch (url:${actual_url} mode:${mode} ` +
`credentials:${credentials})`
};
frame.contentWindow.fetch(
new Request(actual_url, {mode: mode, credentials: credentials})).then(() => {
}, () => { });
new Request(actual_url, {mode: mode, credentials: credentials}));
return add_promise_to_test(actual_url);
}
function audio_test(frame, url, cross_origin,
expected_mode, expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
mode: expected_mode,
credentials: expected_credentials,
redirect: 'follow',
integrity: '',
destination: 'audio',
message: 'Audio load (url:' + actual_url + ' cross_origin:' +
cross_origin + ')'
message: `Audio load (url:${actual_url} cross_origin:${cross_origin})`
};
frame.contentWindow.load_audio(actual_url, cross_origin);
return add_promise_to_test(actual_url);
@ -149,163 +144,159 @@ function audio_test(frame, url, cross_origin,
function video_test(frame, url, cross_origin,
expected_mode, expected_credentials) {
var actual_url = url + (++url_count);
const actual_url = url + (++url_count);
expected_results[actual_url] = {
mode: expected_mode,
credentials: expected_credentials,
redirect: 'follow',
integrity: '',
destination: 'video',
message: 'Video load (url:' + actual_url + ' cross_origin:' +
cross_origin + ')'
message: `Video load (url:${actual_url} cross_origin:${cross_origin})`
};
frame.contentWindow.load_video(actual_url, cross_origin);
return add_promise_to_test(actual_url);
}
promise_test(function(t) {
var SCOPE = 'resources/fetch-request-resources-iframe.https.html';
var SCRIPT = 'resources/fetch-request-resources-worker.js';
var host_info = get_host_info();
var LOCAL_URL =
promise_test(async t => {
const SCOPE = 'resources/fetch-request-resources-iframe.https.html';
const SCRIPT = 'resources/fetch-request-resources-worker.js';
const host_info = get_host_info();
const LOCAL_URL =
host_info['HTTPS_ORIGIN'] + base_path() + 'resources/dummy?test';
var REMOTE_URL =
const REMOTE_URL =
host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/dummy?test';
var worker;
var frame;
return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
.then(function(registration) {
worker = registration.installing;
return wait_for_state(t, worker, 'activated');
})
.then(function() {
return new Promise(function(resolve, reject) {
var channel = new MessageChannel();
channel.port1.onmessage = t.step_func(function(msg) {
if (msg.data.ready) {
resolve();
return;
}
var result = msg.data;
var expected = expected_results[result.url];
if (!expected) {
return;
}
test(() => {
assert_equals(
result.mode, expected.mode,
'mode of ' + expected.message + ' must be ' +
expected.mode + '.');
assert_equals(
result.credentials, expected.credentials,
'credentials of ' + expected.message + ' must be ' +
expected.credentials + '.');
assert_equals(
result.redirect, expected.redirect,
'redirect mode of ' + expected.message + ' must be ' +
expected.redirect + '.');
assert_equals(
result.integrity, expected.integrity,
'integrity of ' + expected.message + ' must be ' +
expected.integrity + '.');
assert_equals(
result.destination, expected.destination,
'destination of ' + expected.message + ' must be ' +
expected.destination + '.');
}, expected.message);
expected.resolve();
delete expected_results[result.url];
});
worker.postMessage(
{port: channel.port2}, [channel.port2]);
});
})
.then(function() { return with_iframe(SCOPE); })
.then(async function(f) {
frame = f;
await image_test(f, LOCAL_URL, '', 'no-cors', 'include');
await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
const registration =
await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
t.add_cleanup(() => registration.unregister());
const worker = registration.installing;
await wait_for_state(t, worker, 'activated');
await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await new Promise((resolve, reject) => {
const channel = new MessageChannel();
channel.port1.onmessage = t.step_func(msg => {
if (msg.data.ready) {
resolve();
return;
}
const result = msg.data;
const expected = expected_results[result.url];
if (!expected) {
return;
}
test(() => {
assert_equals(
result.mode, expected.mode,
`mode of must be ${expected.mode}.`);
assert_equals(
result.credentials, expected.credentials,
`credentials of ${expected.message} must be ` +
`${expected.credentials}.`);
assert_equals(
result.redirect, expected.redirect,
`redirect mode of ${expected.message} must be ` +
`${expected.redirect}.`);
assert_equals(
result.integrity, expected.integrity,
`integrity of ${expected.message} must be ` +
`${expected.integrity}.`);
assert_equals(
result.destination, expected.destination,
`destination of ${expected.message} must be ` +
`${expected.destination}.`);
}, expected.message);
expected.resolve();
delete expected_results[result.url];
});
worker.postMessage({port: channel.port2}, [channel.port2]);
});
await script_test(f, LOCAL_URL, '', 'no-cors', 'include');
await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await script_test(f, REMOTE_URL, '', 'no-cors', 'include');
await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
const f = await with_iframe(SCOPE);
t.add_cleanup(() => f.remove());
await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await image_test(f, LOCAL_URL, '', 'no-cors', 'include');
await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
await font_face_test(f, LOCAL_URL, 'cors', 'same-origin');
await font_face_test(f, REMOTE_URL, 'cors', 'same-origin');
await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await script_integrity_test(f, LOCAL_URL, ' ', ' ');
await script_integrity_test(f, LOCAL_URL,
'This is not a valid integrity because it has no dashes',
'This is not a valid integrity because it has no dashes');
await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
await script_test(f, LOCAL_URL, '', 'no-cors', 'include');
await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await script_test(f, REMOTE_URL, '', 'no-cors', 'include');
await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await css_integrity_test(f, LOCAL_URL, ' ', ' ');
await css_integrity_test(f, LOCAL_URL,
'This is not a valid integrity because it has no dashes',
'This is not a valid integrity because it has no dashes');
await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit');
await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin',
'same-origin', 'same-origin');
await fetch_test(f, LOCAL_URL, 'same-origin', 'include',
'same-origin', 'include');
await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit');
await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin',
'no-cors', 'same-origin');
await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include');
await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit');
await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin');
await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include');
await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit');
await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin',
'no-cors', 'same-origin');
await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include');
await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit');
await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin');
await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include');
await font_face_test(f, LOCAL_URL, 'cors', 'same-origin');
await font_face_test(f, REMOTE_URL, 'cors', 'same-origin');
await audio_test(f, LOCAL_URL, '', 'no-cors', 'include');
await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await audio_test(f, REMOTE_URL, '', 'no-cors', 'include');
await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await script_integrity_test(f, LOCAL_URL, ' ', ' ');
await script_integrity_test(
f, LOCAL_URL,
'This is not a valid integrity because it has no dashes',
'This is not a valid integrity because it has no dashes');
await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ',
'sha256-foo sha384-abc ');
await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc',
'sha256-foo sha256-abc');
await video_test(f, LOCAL_URL, '', 'no-cors', 'include');
await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await video_test(f, REMOTE_URL, '', 'no-cors', 'include');
await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await css_integrity_test(f, LOCAL_URL, ' ', ' ');
await css_integrity_test(
f, LOCAL_URL,
'This is not a valid integrity because it has no dashes',
'This is not a valid integrity because it has no dashes');
await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ',
'sha256-foo sha384-abc ');
await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc',
'sha256-foo sha256-abc');
frame.remove();
service_worker_unregister(t, SCOPE);
}).catch(unreached_rejection(t));
}, 'Verify FetchEvent for resources.');
await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit');
await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin',
'same-origin', 'same-origin');
await fetch_test(f, LOCAL_URL, 'same-origin', 'include',
'same-origin', 'include');
await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit');
await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin',
'no-cors', 'same-origin');
await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include');
await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit');
await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin');
await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include');
await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit');
await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin', 'no-cors', 'same-origin');
await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include');
await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit');
await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin');
await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include');
await audio_test(f, LOCAL_URL, '', 'no-cors', 'include');
await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await audio_test(f, REMOTE_URL, '', 'no-cors', 'include');
await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
await video_test(f, LOCAL_URL, '', 'no-cors', 'include');
await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
await video_test(f, REMOTE_URL, '', 'no-cors', 'include');
await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
}, 'Verify FetchEvent for resources.');
</script>

View file

@ -3,7 +3,7 @@
<script>
function load_image(url, cross_origin) {
var img = document.createElement('img');
const img = document.createElement('img');
if (cross_origin != '') {
img.crossOrigin = cross_origin;
}
@ -11,7 +11,7 @@ function load_image(url, cross_origin) {
}
function load_script(url, cross_origin) {
var script = document.createElement('script');
const script = document.createElement('script');
script.src = url;
if (cross_origin != '') {
script.crossOrigin = cross_origin;
@ -20,7 +20,7 @@ function load_script(url, cross_origin) {
}
function load_css(url, cross_origin) {
var link = document.createElement('link');
const link = document.createElement('link');
link.rel = 'stylesheet'
link.href = url;
link.type = 'text/css';
@ -31,31 +31,31 @@ function load_css(url, cross_origin) {
}
function load_font(url) {
var fontFace = new FontFace('test', 'url(' + url + ')');
const fontFace = new FontFace('test', 'url(' + url + ')');
fontFace.load();
}
function load_css_image(url, type) {
var div = document.createElement('div');
const div = document.createElement('div');
document.body.appendChild(div);
div.style[type] = 'url(' + url + ')';
}
function load_css_image_set(url, type) {
var div = document.createElement('div');
const div = document.createElement('div');
document.body.appendChild(div);
div.style[type] = '-webkit-image-set(url(' + url + ') 1x)';
}
function load_script_with_integrity(url, integrity) {
var script = document.createElement('script');
const script = document.createElement('script');
script.src = url;
script.integrity = integrity;
document.body.appendChild(script);
}
function load_css_with_integrity(url, integrity) {
var link = document.createElement('link');
const link = document.createElement('link');
link.rel = 'stylesheet'
link.href = url;
link.type = 'text/css';
@ -64,7 +64,7 @@ function load_css_with_integrity(url, integrity) {
}
function load_audio(url, cross_origin) {
var audio = document.createElement('audio');
const audio = document.createElement('audio');
if (cross_origin != '') {
audio.crossOrigin = cross_origin;
}
@ -73,7 +73,7 @@ function load_audio(url, cross_origin) {
}
function load_video(url, cross_origin) {
var video = document.createElement('video');
const video = document.createElement('video');
if (cross_origin != '') {
video.crossOrigin = cross_origin;
}

View file

@ -1,26 +1,26 @@
var requests = [];
var port = undefined;
const requests = [];
let port = undefined;
self.onmessage = function(e) {
var message = e.data;
self.onmessage = e => {
const message = e.data;
if ('port' in message) {
port = message.port;
port.postMessage({ready: true});
}
};
self.addEventListener('fetch', function(event) {
var url = event.request.url;
if (url.indexOf('dummy?test') == -1) {
return;
}
port.postMessage({
url: url,
mode: event.request.mode,
redirect: event.request.redirect,
credentials: event.request.credentials,
integrity: event.request.integrity,
destination: event.request.destination
});
event.respondWith(Promise.reject());
self.addEventListener('fetch', e => {
const url = e.request.url;
if (!url.includes('dummy?test')) {
return;
}
port.postMessage({
url: url,
mode: e.request.mode,
redirect: e.request.redirect,
credentials: e.request.credentials,
integrity: e.request.integrity,
destination: e.request.destination
});
e.respondWith(Promise.reject());
});

View file

@ -3,6 +3,9 @@ parameters:
# Should match https://web-platform-tests.org/running-tests/safari.html
steps:
- script: defaults write com.apple.WebDriver DiagnosticsEnabled 1
displayName: 'Enable safaridriver diagnostics'
condition: eq(variables['safaridriver_diagnose'], true)
- ${{ if eq(parameters.channel, 'preview') }}:
- script: |
HOMEBREW_NO_AUTO_UPDATE=1 brew cask install tools/ci/azure/safari-technology-preview.rb

View file

@ -0,0 +1,7 @@
steps:
- task: PublishBuildArtifacts@1
displayName: 'Publish safaridriver logs'
inputs:
pathtoPublish: /Users/runner/Library/Logs/com.apple.WebDriver/
artifactName: safaridriver-logs
condition: eq(variables['safaridriver_diagnose'], true)

View file

@ -7,6 +7,7 @@ from multiprocessing import Pool, cpu_count
from six import (
PY3,
binary_type,
ensure_text,
iteritems,
itervalues,
string_types,
@ -175,12 +176,14 @@ class Manifest(object):
to_update = []
for source_file, update in tree:
for source_file_or_path, update in tree:
if not update:
assert isinstance(source_file, (binary_type, text_type))
deleted.remove(tuple(source_file.split(os.path.sep)))
assert isinstance(source_file_or_path, (binary_type, text_type))
path = ensure_text(source_file_or_path)
deleted.remove(tuple(path.split(os.path.sep)))
else:
assert not isinstance(source_file, bytes)
assert not isinstance(source_file_or_path, (binary_type, text_type))
source_file = source_file_or_path
rel_path_parts = source_file.rel_path_parts
assert isinstance(rel_path_parts, tuple)

View file

@ -2,7 +2,7 @@ import hashlib
import re
import os
from collections import deque
from six import binary_type, iteritems, text_type
from six import binary_type, ensure_text, iteritems, text_type
from six.moves.urllib.parse import urljoin
from fnmatch import fnmatch
@ -190,24 +190,21 @@ class SourceFile(object):
("css", "CSS2", "archive"),
("css", "common")} # type: Set[Tuple[bytes, ...]]
def __init__(self, tests_root, rel_path, url_base, hash=None, contents=None):
def __init__(self, tests_root, rel_path_str, url_base, hash=None, contents=None):
# type: (AnyStr, AnyStr, Text, Optional[Text], Optional[bytes]) -> None
"""Object representing a file in a source tree.
:param tests_root: Path to the root of the source tree
:param rel_path: File path relative to tests_root
:param rel_path_str: File path relative to tests_root
:param url_base: Base URL used when converting file paths to urls
:param contents: Byte array of the contents of the file or ``None``.
"""
rel_path = ensure_text(rel_path_str)
assert not os.path.isabs(rel_path), rel_path
if os.name == "nt":
# do slash normalization on Windows
if isinstance(rel_path, binary_type):
rel_path = rel_path.replace(b"/", b"\\")
else:
rel_path = rel_path.replace(u"/", u"\\")
rel_path = rel_path.replace(u"/", u"\\")
dir_path, filename = os.path.split(rel_path)
name, ext = os.path.splitext(filename)
@ -218,13 +215,13 @@ class SourceFile(object):
meta_flags = name.split(".")[1:]
self.tests_root = tests_root # type: Union[bytes, Text]
self.rel_path = rel_path # type: Union[bytes, Text]
self.dir_path = dir_path # type: Union[bytes, Text]
self.filename = filename # type: Union[bytes, Text]
self.name = name # type: Union[bytes, Text]
self.ext = ext # type: Union[bytes, Text]
self.type_flag = type_flag # type: Optional[Union[bytes, Text]]
self.tests_root = ensure_text(tests_root) # type: Text
self.rel_path = rel_path # type: Text
self.dir_path = dir_path # type: Text
self.filename = filename # type: Text
self.name = name # type: Text
self.ext = ext # type: Text
self.type_flag = type_flag # type: Optional[Text]
self.meta_flags = meta_flags # type: Union[List[bytes], List[Text]]
self.url_base = url_base
self.contents = contents
@ -282,7 +279,7 @@ class SourceFile(object):
@cached_property
def path(self):
# type: () -> Union[bytes, Text]
# type: () -> Text
return os.path.join(self.tests_root, self.rel_path)
@cached_property

View file

@ -56,9 +56,11 @@ class QuicTransportProtocol(QuicConnectionProtocol):
isinstance(event, StreamDataReceived) and
event.stream_id == 2):
# client indication process
prefix = 'Client indication error: '
self.client_indication_data += event.data
if len(self.client_indication_data) > 65535:
raise Exception('too large data for client indication')
if event.end_stream:
prefix = 'Client inditation error: '
self.process_client_indication()
if self.is_closing_or_closed():
return

View file

@ -190,34 +190,32 @@
// TODO(lyf): https://crbug.com/1066791 Following tests which related to svg
// script element cause a flaky timeout in `linux-blink-rel`, following tests
// should be added back after the bug fix.
//
// TODO(lyf): https://crbug.com/1064598
// promise_test(t => {
// let p = Promise.resolve()
// .then(promise_violation("require-trusted-types-for 'script'"))
// .then(expect_blocked_uri("trusted-types-sink"))
// .then(expect_sample("SVGScriptElement href"));
// expect_throws(_ => { document.getElementById("svgscript").href.baseVal = "" });
// return p;
// }, "Trusted Type violation report: sample for SVGScriptElement href assignment");
//
// promise_test(t => {
// let p = Promise.resolve()
// .then(promise_violation("require-trusted-types-for 'script'"))
// .then(expect_blocked_uri("trusted-types-sink"))
// .then(expect_sample("Element setAttribute"));
// expect_throws(_ => { document.getElementById("svgscript").setAttribute('href', "test"); });
// return p;
// }, "Trusted Type violation report: sample for SVGScriptElement href assignment by setAttribute");
//
// promise_test(t => {
// let p = Promise.resolve()
// .then(promise_violation("require-trusted-types-for 'script'"))
// .then(expect_blocked_uri("trusted-types-sink"))
// .then(expect_sample("SVGScriptElement text"));
// expect_throws(_ => { document.getElementById("svgscript").insertBefore(document.createTextNode("Hello"), null) });
// return p;
// }, "Trusted Type violation report: sample for SVGScriptElement text assignment");
promise_test(t => {
let p = Promise.resolve()
.then(promise_violation("require-trusted-types-for 'script'"))
.then(expect_blocked_uri("trusted-types-sink"))
.then(expect_sample("SVGAnimatedString baseVal"));
expect_throws(_ => { document.getElementById("svgscript").href.baseVal = "" });
return p;
}, "Trusted Type violation report: sample for SVGScriptElement href assignment");
promise_test(t => {
let p = Promise.resolve()
.then(promise_violation("require-trusted-types-for 'script'"))
.then(expect_blocked_uri("trusted-types-sink"))
.then(expect_sample("Element setAttribute"));
expect_throws(_ => { document.getElementById("svgscript").setAttribute('href', "test"); });
return p;
}, "Trusted Type violation report: sample for SVGScriptElement href assignment by setAttribute");
promise_test(t => {
let p = Promise.resolve()
.then(promise_violation("require-trusted-types-for 'script'"))
.then(expect_blocked_uri("trusted-types-sink"))
.then(expect_sample("SVGScriptElement text"));
expect_throws(_ => { document.getElementById("svgscript").insertBefore(document.createTextNode("Hello"), null) });
return p;
}, "Trusted Type violation report: sample for SVGScriptElement text assignment");
promise_test(t => {
let p = Promise.resolve()

View file

@ -53,13 +53,11 @@
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.href.baseVal = "about:blank";
assert_throws_js(TypeError, _ => {
elem.href.baseVal = "about:blank";
});
document.getElementById("svg").appendChild(elem);
// TODO(1066791): This should be rejected and throw an SPV event, but
// doesn't until the issue is fixed.
// return promise_spv();
return Promise.resolve();
return promise_spv();
}, "Assign string to SVGScriptElement.href.baseVal.");
promise_test(t => {

View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>dblclick event for the mouse pointer type</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style>
#target
{
background-color: green;
width: 200px;
height: 200px;
}
</style>
</head>
<body>
<p>Double-click on the green box with the left mouse button.</p>
<div id="target"></div>
<script>
promise_test(async (t) => {
const target = document.getElementById("target");
const event_watcher = new EventWatcher(t, target, ["click", "dblclick"]);
const actions_promise = new test_driver.Actions()
.pointerMove(0, 0, {origin: target})
.pointerDown()
.pointerUp()
.pointerDown()
.pointerUp()
.send();
// Make sure the test finishes after all the input actions are completed.
t.add_cleanup(() => actions_promise);
const event = await event_watcher.wait_for(["click", "click", "dblclick"]);
assert_equals(event.type, "dblclick");
assert_equals(event.target, target);
assert_equals(event.detail, 2);
});
</script>
</body>
</html>

View file

@ -1,55 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Double Click</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style type="text/css">
.textarea
{
background: red;
width: 100px;
height: 100px;
color: white;
text-align: center;
font-family: monospace;
}
</style>
<script type="text/javascript">
// Send two continuous clicks.
function run() {
var testDoubleClick = async_test('Tests that the double click event is correctly generated by sending pointerDown, pointerUp, pointerDown and pointerUp for the mouse type.');
var elem = document.getElementById("click_area");
var actions_promise;
elem.addEventListener('dblclick', function(e) {
testDoubleClick.step(function () {
assert_equals(e.target.id, "click_area");
assert_equals(e.detail, 2);
});
// Make sure the test finishes after all the input actions are completed.
actions_promise.then( () => {
testDoubleClick.done();
});
});
actions_promise = new test_driver.Actions()
.pointerMove(0, 0, {origin: elem})
.pointerDown()
.pointerUp()
.pointerDown()
.pointerUp()
.send();
}
</script>
</head>
<body onload="run()">
<h1>Double Click</h1>
<p>Double-click on the text area and check if the "dblclick" event is received.</p>
<div id="click_area" class="textarea"></div>
</body>
</html>

View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html>
<title>Test the video.requestVideoFrameCallback() API for non visible video elements.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
<body>
</body>
<script>
var testVideo = {
url: getVideoURI('/media/movie_5'),
height: 240,
width: 320,
}
async_test(function(t) {
let video = document.createElement('video');
video.requestVideoFrameCallback(t.step_func_done());
video.src = testVideo.url;
video.play();
}, 'Test a video outside of the DOM can still use video.rVFC.');
function rvfcStyleTest(applyStyle, description) {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
applyStyle(video);
video.requestVideoFrameCallback(
t.step_func( _ => {
// Make sure we can receive more than one callback.
video.requestVideoFrameCallback(t.step_func_done());
})
);
video.src = testVideo.url;
video.play();
}, description);
}
rvfcStyleTest((video) => { video.style.display = "none"},
'Test video.rVFC works with "display:none".');
rvfcStyleTest((video) => { video.style.visibility = "hidden"},
'Test video.rVFC works with "visibility:hidden".');
</script>
</html>

View file

@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<title>Test having multiple video.rVFC callbacks in flight for a single element.</title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
@ -8,6 +9,7 @@
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let firstTime;
let firstMetadata;
@ -29,6 +31,7 @@ async_test(function(t) {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let secondCallbackId;

View file

@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<title>Test repeatedly chaining video.rVFC() callbacks.</title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
@ -8,6 +9,7 @@
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let firstTime;
video.requestVideoFrameCallback(t.step_func((time) => {
@ -35,6 +37,7 @@ async_test(function(t) {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let maxNumberOfCalls = 10;
let currentCallNumber = 0;

View file

@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<title>Test the basics of the video.requestVideoFrameCallback() API.</title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
@ -13,6 +14,7 @@ var testVideo = {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let id = video.requestVideoFrameCallback(
t.step_func_done((time, metadata) => {
@ -31,6 +33,7 @@ async_test(function(t) {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
video.requestVideoFrameCallback(
t.step_func(video_now => {
@ -50,6 +53,7 @@ async_test(function(t) {
async_test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
let id = video.requestVideoFrameCallback(
t.step_func(_ => {
@ -74,6 +78,7 @@ async_test(function(t) {
test(function(t) {
let video = document.createElement('video');
document.body.appendChild(video);
// requestVideoFrameCallback() expects 1 function as a parameter.
assert_throws_js(TypeError, _ => { video.requestVideoFrameCallback() } );

View file

@ -3,6 +3,7 @@
**/
// https://github.com/gpuweb/gpuweb/blob/0a48816412b5d08a5fb8b89005e019165a1a2c63/spec/index.bs
// tslint:disable:variable-name
// String enums
export let ExtensionName;
@ -180,7 +181,7 @@ export let TextureFormat;
TextureFormat["BGRA8Unorm"] = "bgra8unorm";
TextureFormat["BGRA8UnormSRGB"] = "bgra8unorm-srgb";
TextureFormat["RGB10A2Unorm"] = "rgb10a2unorm";
TextureFormat["RGB11B10Float"] = "rg11b10float";
TextureFormat["RG11B10Float"] = "rg11b10float";
TextureFormat["RG32Uint"] = "rg32uint";
TextureFormat["RG32Sint"] = "rg32sint";
TextureFormat["RG32Float"] = "rg32float";

View file

@ -0,0 +1,36 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { parseQuery } from './query/parseQuery.js';
import { loadTreeForQuery } from './tree.js'; // A listing file, e.g. either of:
// - `src/webgpu/listing.ts` (which is dynamically computed, has a Promise<TestSuiteListing>)
// - `out/webgpu/listing.js` (which is pre-baked, has a TestSuiteListing)
// Base class for DefaultTestFileLoader and FakeTestFileLoader.
export class TestFileLoader {
importSpecFile(suite, path) {
return this.import(`${suite}/${path.join('/')}.spec.js`);
}
async loadTree(query, subqueriesToExpand = []) {
return loadTreeForQuery(this, parseQuery(query), subqueriesToExpand.map(q => parseQuery(q)));
}
async loadTests(query) {
const tree = await this.loadTree(query);
return tree.iterateLeaves();
}
}
export class DefaultTestFileLoader extends TestFileLoader {
async listing(suite) {
return (await import(`../../${suite}/listing.js`)).listing;
}
import(path) {
return import(`../../${path}`);
}
}
//# sourceMappingURL=file_loader.js.map

View file

@ -45,7 +45,7 @@ export class Fixture {
}
fail(msg) {
this.rec.fail(new Error(msg));
this.rec.expectationFailed(new Error(msg));
}
async immediateAsyncExpectation(fn) {
@ -63,18 +63,18 @@ export class Fixture {
expectErrorValue(expectedName, ex, niceStack) {
if (!(ex instanceof Error)) {
niceStack.message = 'THREW non-error value, of type ' + typeof ex + niceStack.message;
this.rec.fail(niceStack);
niceStack.message = `THREW non-error value, of type ${typeof ex}: ${ex}`;
this.rec.expectationFailed(niceStack);
return;
}
const actualName = ex.name;
if (actualName !== expectedName) {
niceStack.message = `THREW ${actualName}, instead of ${expectedName}` + niceStack.message;
this.rec.fail(niceStack);
niceStack.message = `THREW ${actualName}, instead of ${expectedName}: ${ex}`;
this.rec.expectationFailed(niceStack);
} else {
niceStack.message = 'OK: threw ' + actualName + niceStack.message;
niceStack.message = `OK: threw ${actualName}${ex.message}`;
this.rec.debug(niceStack);
}
}
@ -85,8 +85,8 @@ export class Fixture {
try {
await p;
niceStack.message = 'DID NOT THROW' + m;
this.rec.fail(niceStack);
niceStack.message = 'DID NOT REJECT' + m;
this.rec.expectationFailed(niceStack);
} catch (ex) {
niceStack.message = m;
this.expectErrorValue(expectedName, ex, niceStack);
@ -99,7 +99,7 @@ export class Fixture {
try {
fn();
this.rec.fail(new Error('DID NOT THROW' + m));
this.rec.expectationFailed(new Error('DID NOT THROW' + m));
} catch (ex) {
this.expectErrorValue(expectedName, ex, new Error(m));
}
@ -110,7 +110,7 @@ export class Fixture {
const m = msg ? ': ' + msg : '';
this.rec.debug(new Error('expect OK' + m));
} else {
this.rec.fail(new Error(msg));
this.rec.expectationFailed(new Error(msg));
}
return cond;

View file

@ -0,0 +1,132 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { assert, raceWithRejectOnTimeout, unreachable, assertReject } from '../util/util.js';
import { getGPU } from './implementation.js';
class TestFailedButDeviceReusable extends Error {}
export class TestOOMedShouldAttemptGC extends Error {}
const kPopErrorScopeTimeoutMS = 5000;
export class DevicePool {
constructor() {
_defineProperty(this, "failed", false);
_defineProperty(this, "holder", undefined);
}
// undefined if "uninitialized" (not yet initialized, or lost)
async acquire() {
assert(!this.failed, 'WebGPU device previously failed to initialize; not retrying');
if (this.holder === undefined) {
try {
this.holder = await DevicePool.makeHolder();
} catch (ex) {
this.failed = true;
throw ex;
}
}
assert(!this.holder.acquired, 'Device was in use on DevicePool.acquire');
this.holder.acquired = true;
this.beginErrorScopes();
return this.holder.device;
} // When a test is done using a device, it's released back into the pool.
// This waits for error scopes, checks their results, and checks for various error conditions.
async release(device) {
const holder = this.holder;
assert(holder !== undefined, 'trying to release a device while pool is uninitialized');
assert(holder.acquired, 'trying to release a device while already released');
assert(device === holder.device, 'Released device was the wrong device');
try {
// Time out if popErrorScope never completes. This could happen due to a browser bug - e.g.,
// as of this writing, on Chrome GPU process crash, popErrorScope just hangs.
await raceWithRejectOnTimeout(this.endErrorScopes(), kPopErrorScopeTimeoutMS, 'finalization popErrorScope timed out'); // (Hopefully if the device was lost, it has been reported by the time endErrorScopes()
// has finished (or timed out). If not, it could cause a finite number of extra test
// failures following this one (but should recover eventually).)
const lostReason = holder.lostReason;
if (lostReason !== undefined) {
// Fail the current test.
unreachable(`Device was lost: ${lostReason}`);
}
} catch (ex) {
// Any error that isn't explicitly TestFailedButDeviceReusable forces a new device to be
// created for the next test.
if (!(ex instanceof TestFailedButDeviceReusable)) {
this.holder = undefined;
}
throw ex;
} finally {
// TODO: device.destroy()
// Mark the holder as free. (This only has an effect if the pool still has the holder.)
// This could be done at the top but is done here to guard against async-races during release.
holder.acquired = false;
}
} // Gets a device and creates a DeviceHolder.
// If the device is lost, DeviceHolder.lostReason gets set.
static async makeHolder() {
const gpu = getGPU();
const adapter = await gpu.requestAdapter();
const holder = {
acquired: false,
device: await adapter.requestDevice(),
lostReason: undefined
};
holder.device.lost.then(ev => {
holder.lostReason = ev.message;
});
return holder;
} // Create error scopes that wrap the entire test.
beginErrorScopes() {
assert(this.holder !== undefined);
this.holder.device.pushErrorScope('out-of-memory');
this.holder.device.pushErrorScope('validation');
} // End the whole-test error scopes. Check that there are no extra error scopes, and that no
// otherwise-uncaptured errors occurred during the test.
async endErrorScopes() {
assert(this.holder !== undefined);
let gpuValidationError;
let gpuOutOfMemoryError;
try {
// May reject if the device was lost.
gpuValidationError = await this.holder.device.popErrorScope();
gpuOutOfMemoryError = await this.holder.device.popErrorScope();
} catch (ex) {
assert(this.holder.lostReason !== undefined, "popErrorScope failed, but device.lost hasn't fired (yet)");
throw ex;
}
await assertReject(this.holder.device.popErrorScope(), 'There was an extra error scope on the stack after a test');
if (gpuValidationError !== null) {
assert(gpuValidationError instanceof GPUValidationError); // Allow the device to be reused.
throw new TestFailedButDeviceReusable(`Unexpected validation error occurred: ${gpuValidationError.message}`);
}
if (gpuOutOfMemoryError !== null) {
assert(gpuOutOfMemoryError instanceof GPUOutOfMemoryError); // Don't allow the device to be reused; unexpected OOM could break the device.
throw new TestOOMedShouldAttemptGC('Unexpected out-of-memory error occurred');
}
}
}
//# sourceMappingURL=device_pool.js.map

View file

@ -0,0 +1,50 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { extractImportantStackTrace } from '../util/stack.js';
export class LogMessageWithStack extends Error {
constructor(name, ex) {
super(ex.message);
_defineProperty(this, "stackHidden", false);
_defineProperty(this, "timesSeen", 1);
this.name = name;
this.stack = ex.stack;
}
/** Set a flag so the stack is not printed in toJSON(). */
setStackHidden() {
this.stackHidden = true;
}
/** Increment the "seen x times" counter. */
incrementTimesSeen() {
this.timesSeen++;
}
toJSON() {
let m = this.name + ': ';
if (!this.stackHidden && this.stack) {
// this.message is already included in this.stack
m += extractImportantStackTrace(this);
} else {
m += this.message;
}
if (this.timesSeen > 1) {
m += `\n(seen ${this.timesSeen} times with identical stack)`;
}
return m;
}
}
//# sourceMappingURL=log_message.js.map

View file

@ -0,0 +1,35 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { version } from '../version.js';
import { TestCaseRecorder } from './test_case_recorder.js';
export class Logger {
constructor(debug) {
_defineProperty(this, "debug", void 0);
_defineProperty(this, "results", new Map());
this.debug = debug;
}
record(name) {
const result = {
status: 'running',
timems: -1
};
this.results.set(name, result);
return [new TestCaseRecorder(result, this.debug), result];
}
asJSON(space) {
return JSON.stringify({
version,
results: Array.from(this.results)
}, undefined, space);
}
}
//# sourceMappingURL=logger.js.map

View file

@ -0,0 +1,4 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
//# sourceMappingURL=result.js.map

View file

@ -0,0 +1,137 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { SkipTestCase } from '../fixture.js';
import { now, assert } from '../util/util.js';
import { LogMessageWithStack } from './log_message.js';
var LogSeverity;
(function (LogSeverity) {
LogSeverity[LogSeverity["Pass"] = 0] = "Pass";
LogSeverity[LogSeverity["Skip"] = 1] = "Skip";
LogSeverity[LogSeverity["Warn"] = 2] = "Warn";
LogSeverity[LogSeverity["ExpectFailed"] = 3] = "ExpectFailed";
LogSeverity[LogSeverity["ValidationFailed"] = 4] = "ValidationFailed";
LogSeverity[LogSeverity["ThrewException"] = 5] = "ThrewException";
})(LogSeverity || (LogSeverity = {}));
const kMaxLogStacks = 2;
/** Holds onto a LiveTestCaseResult owned by the Logger, and writes the results into it. */
export class TestCaseRecorder {
/** Used to dedup log messages which have identical stacks. */
constructor(result, debugging) {
_defineProperty(this, "result", void 0);
_defineProperty(this, "maxLogSeverity", LogSeverity.Pass);
_defineProperty(this, "startTime", -1);
_defineProperty(this, "logs", []);
_defineProperty(this, "logLinesAtCurrentSeverity", 0);
_defineProperty(this, "debugging", false);
_defineProperty(this, "messagesForPreviouslySeenStacks", new Map());
this.result = result;
this.debugging = debugging;
}
start() {
assert(this.startTime < 0, 'TestCaseRecorder cannot be reused');
this.startTime = now();
}
finish() {
assert(this.startTime >= 0, 'finish() before start()');
const timeMilliseconds = now() - this.startTime; // Round to next microsecond to avoid storing useless .xxxx00000000000002 in results.
this.result.timems = Math.ceil(timeMilliseconds * 1000) / 1000; // Convert numeric enum back to string (but expose 'exception' as 'fail')
this.result.status = this.maxLogSeverity === LogSeverity.Pass ? 'pass' : this.maxLogSeverity === LogSeverity.Skip ? 'skip' : this.maxLogSeverity === LogSeverity.Warn ? 'warn' : 'fail'; // Everything else is an error
this.result.logs = this.logs;
}
injectResult(injectedResult) {
Object.assign(this.result, injectedResult);
}
debug(ex) {
if (!this.debugging) {
return;
}
const logMessage = new LogMessageWithStack('DEBUG', ex);
logMessage.setStackHidden();
this.logImpl(LogSeverity.Pass, logMessage);
}
skipped(ex) {
this.logImpl(LogSeverity.Skip, new LogMessageWithStack('SKIP', ex));
}
warn(ex) {
this.logImpl(LogSeverity.Warn, new LogMessageWithStack('WARN', ex));
}
expectationFailed(ex) {
this.logImpl(LogSeverity.ExpectFailed, new LogMessageWithStack('EXPECTATION FAILED', ex));
}
validationFailed(ex) {
this.logImpl(LogSeverity.ValidationFailed, new LogMessageWithStack('VALIDATION FAILED', ex));
}
threw(ex) {
if (ex instanceof SkipTestCase) {
this.skipped(ex);
return;
}
this.logImpl(LogSeverity.ThrewException, new LogMessageWithStack('EXCEPTION', ex));
}
logImpl(level, logMessage) {
// Deduplicate errors with the exact same stack
if (logMessage.stack) {
const seen = this.messagesForPreviouslySeenStacks.get(logMessage.stack);
if (seen) {
seen.incrementTimesSeen();
return;
}
this.messagesForPreviouslySeenStacks.set(logMessage.stack, logMessage);
} // Mark printStack=false for all logs except 2 at the highest severity
if (level > this.maxLogSeverity) {
this.logLinesAtCurrentSeverity = 0;
this.maxLogSeverity = level;
if (!this.debugging) {
// Go back and turn off printStack for everything of a lower log level
for (const log of this.logs) {
log.setStackHidden();
}
}
}
if (level < this.maxLogSeverity || this.logLinesAtCurrentSeverity >= kMaxLogStacks) {
if (!this.debugging) {
logMessage.setStackHidden();
}
}
this.logs.push(logMessage);
this.logLinesAtCurrentSeverity++;
}
}
//# sourceMappingURL=test_case_recorder.js.map

View file

@ -0,0 +1,111 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
let _Symbol$iterator;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { publicParamsEquals } from './params_utils.js';
import { assert } from './util/util.js'; // https://stackoverflow.com/a/56375136
export function poptions(name, values) {
const iter = makeReusableIterable(function* () {
for (const value of values) {
yield {
[name]: value
};
}
});
return iter;
}
export function pbool(name) {
return poptions(name, [false, true]);
}
export function params() {
return new ParamsBuilder();
}
_Symbol$iterator = Symbol.iterator;
export class ParamsBuilder {
constructor() {
_defineProperty(this, "paramSpecs", [{}]);
}
[_Symbol$iterator]() {
const iter = this.paramSpecs[Symbol.iterator]();
return iter;
}
combine(newParams) {
const paramSpecs = this.paramSpecs;
this.paramSpecs = makeReusableIterable(function* () {
for (const a of paramSpecs) {
for (const b of newParams) {
yield mergeParams(a, b);
}
}
});
return this;
}
expand(expander) {
const paramSpecs = this.paramSpecs;
this.paramSpecs = makeReusableIterable(function* () {
for (const a of paramSpecs) {
for (const b of expander(a)) {
yield mergeParams(a, b);
}
}
});
return this;
}
filter(pred) {
const paramSpecs = this.paramSpecs;
this.paramSpecs = makeReusableIterable(function* () {
for (const p of paramSpecs) {
if (pred(p)) {
yield p;
}
}
});
return this;
}
unless(pred) {
return this.filter(x => !pred(x));
}
exclude(exclude) {
const excludeArray = Array.from(exclude);
const paramSpecs = this.paramSpecs;
this.paramSpecs = makeReusableIterable(function* () {
for (const p of paramSpecs) {
if (excludeArray.every(e => !publicParamsEquals(p, e))) {
yield p;
}
}
});
return this;
}
} // If you create an Iterable by calling a generator function (e.g. in IIFE), it is exhausted after
// one use. This just wraps a generator function in an object so it be iterated multiple times.
function makeReusableIterable(generatorFn) {
return {
[Symbol.iterator]: generatorFn
};
}
// (keyof A & keyof B) is not empty, so they overlapped
function mergeParams(a, b) {
for (const key of Object.keys(a)) {
assert(!(key in b), 'Duplicate key: ' + key);
}
return { ...a,
...b
};
}
//# sourceMappingURL=params_builder.js.map

View file

@ -2,71 +2,25 @@
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { objectEquals } from './util/util.js';
import { comparePublicParamsPaths, Ordering } from './query/compare.js';
import { kWildcard, kParamSeparator, kParamKVSeparator } from './query/separators.js'; // Consider adding more types here if needed
export function paramKeyIsPublic(key) {
return !key.startsWith('_');
}
export function extractPublicParams(params) {
const publicParams = {};
for (const k of Object.keys(params)) {
if (!k.startsWith('_')) {
if (paramKeyIsPublic(k)) {
publicParams[k] = params[k];
}
}
return publicParams;
}
export function stringifyPublicParams(p) {
if (p === null || paramsEquals(p, {})) {
return '';
}
return JSON.stringify(extractPublicParams(p));
}
export function paramsEquals(x, y) {
if (x === y) {
return true;
}
if (x === null) {
x = {};
}
if (y === null) {
y = {};
}
for (const xk of Object.keys(x)) {
if (x[xk] !== undefined && !y.hasOwnProperty(xk)) {
return false;
}
if (!objectEquals(x[xk], y[xk])) {
return false;
}
}
for (const yk of Object.keys(y)) {
if (y[yk] !== undefined && !x.hasOwnProperty(yk)) {
return false;
}
}
return true;
}
export function paramsSupersets(sup, sub) {
if (sub === null) {
return true;
}
if (sup === null) {
sup = {};
}
for (const k of Object.keys(sub)) {
if (!sup.hasOwnProperty(k) || sup[k] !== sub[k]) {
return false;
}
}
return true;
export const badParamValueChars = new RegExp('[' + kParamKVSeparator + kParamSeparator + kWildcard + ']');
export function publicParamsEquals(x, y) {
return comparePublicParamsPaths(x, y) === Ordering.Equal;
}
//# sourceMappingURL=params_utils.js.map

View file

@ -0,0 +1,96 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { paramKeyIsPublic } from '../params_utils.js';
import { assert, objectEquals } from '../util/util.js';
export let Ordering; // Compares two queries for their ordering (which is used to build the tree).
// See src/unittests/query_compare.spec.ts for examples.
(function (Ordering) {
Ordering[Ordering["Unordered"] = 0] = "Unordered";
Ordering[Ordering["StrictSuperset"] = 1] = "StrictSuperset";
Ordering[Ordering["Equal"] = 2] = "Equal";
Ordering[Ordering["StrictSubset"] = 3] = "StrictSubset";
})(Ordering || (Ordering = {}));
export function compareQueries(a, b) {
if (a.suite !== b.suite) {
return Ordering.Unordered;
}
const filePathOrdering = comparePaths(a.filePathParts, b.filePathParts);
if (filePathOrdering !== Ordering.Equal || a.isMultiFile || b.isMultiFile) {
return compareOneLevel(filePathOrdering, a.isMultiFile, b.isMultiFile);
}
assert('testPathParts' in a && 'testPathParts' in b);
const testPathOrdering = comparePaths(a.testPathParts, b.testPathParts);
if (testPathOrdering !== Ordering.Equal || a.isMultiTest || b.isMultiTest) {
return compareOneLevel(testPathOrdering, a.isMultiTest, b.isMultiTest);
}
assert('params' in a && 'params' in b);
const paramsPathOrdering = comparePublicParamsPaths(a.params, b.params);
if (paramsPathOrdering !== Ordering.Equal || a.isMultiCase || b.isMultiCase) {
return compareOneLevel(paramsPathOrdering, a.isMultiCase, b.isMultiCase);
}
return Ordering.Equal;
} // Compares a single level of a query.
// "IsBig" means the query is big relative to the level, e.g. for test-level:
// anything >= suite:a,* is big
// anything <= suite:a:* is small
function compareOneLevel(ordering, aIsBig, bIsBig) {
assert(ordering !== Ordering.Equal || aIsBig || bIsBig);
if (ordering === Ordering.Unordered) return Ordering.Unordered;
if (aIsBig && bIsBig) return ordering;
if (!aIsBig && !bIsBig) return Ordering.Unordered; // Equal case is already handled
// Exactly one of (a, b) is big.
if (aIsBig && ordering !== Ordering.StrictSubset) return Ordering.StrictSuperset;
if (bIsBig && ordering !== Ordering.StrictSuperset) return Ordering.StrictSubset;
return Ordering.Unordered;
}
function comparePaths(a, b) {
const shorter = Math.min(a.length, b.length);
for (let i = 0; i < shorter; ++i) {
if (a[i] !== b[i]) {
return Ordering.Unordered;
}
}
if (a.length === b.length) {
return Ordering.Equal;
} else if (a.length < b.length) {
return Ordering.StrictSuperset;
} else {
return Ordering.StrictSubset;
}
}
export function comparePublicParamsPaths(a, b) {
const aKeys = Object.keys(a).filter(k => paramKeyIsPublic(k));
const commonKeys = new Set(aKeys.filter(k => k in b));
for (const k of commonKeys) {
if (!objectEquals(a[k], b[k])) {
return Ordering.Unordered;
}
}
const bKeys = Object.keys(b).filter(k => paramKeyIsPublic(k));
const aRemainingKeys = aKeys.length - commonKeys.size;
const bRemainingKeys = bKeys.length - commonKeys.size;
if (aRemainingKeys === 0 && bRemainingKeys === 0) return Ordering.Equal;
if (aRemainingKeys === 0) return Ordering.StrictSuperset;
if (bRemainingKeys === 0) return Ordering.StrictSubset;
return Ordering.Unordered;
}
//# sourceMappingURL=compare.js.map

View file

@ -0,0 +1,28 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
// Encodes a stringified TestQuery so that it can be placed in a `?q=` parameter in a URL.
// encodeURIComponent encodes in accordance with `application/x-www-form-urlencoded`, but URLs don't
// actually have to be as strict as HTML form encoding (we interpret this purely from JavaScript).
// So we encode the component, then selectively convert some %-encoded escape codes back to their
// original form for readability/copyability.
export function encodeURIComponentSelectively(s) {
let ret = encodeURIComponent(s);
ret = ret.replace(/%22/g, '"'); // for JSON strings
ret = ret.replace(/%2C/g, ','); // for path separator, and JSON arrays
ret = ret.replace(/%3A/g, ':'); // for big separator
ret = ret.replace(/%3B/g, ';'); // for param separator
ret = ret.replace(/%3D/g, '='); // for params (k=v)
ret = ret.replace(/%5B/g, '['); // for JSON arrays
ret = ret.replace(/%5D/g, ']'); // for JSON arrays
return ret;
}
//# sourceMappingURL=encode_selectively.js.map

View file

@ -0,0 +1,122 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { badParamValueChars, paramKeyIsPublic } from '../params_utils.js';
import { assert } from '../util/util.js';
import { TestQueryMultiFile, TestQueryMultiTest, TestQueryMultiCase, TestQuerySingleCase } from './query.js';
import { kBigSeparator, kWildcard, kPathSeparator, kParamSeparator } from './separators.js';
import { validQueryPart } from './validQueryPart.js';
export function parseQuery(s) {
try {
return parseQueryImpl(s);
} catch (ex) {
ex.message += '\n on: ' + s;
throw ex;
}
}
function parseQueryImpl(s) {
// Undo encodeURIComponentSelectively
s = decodeURIComponent(s); // bigParts are: suite, group, test, params (note kBigSeparator could appear in params)
const [suite, fileString, testString, paramsString] = s.split(kBigSeparator, 4);
assert(fileString !== undefined, `filter string must have at least one ${kBigSeparator}`);
const {
parts: file,
wildcard: filePathHasWildcard
} = parseBigPart(fileString, kPathSeparator);
if (testString === undefined) {
// Query is file-level
assert(filePathHasWildcard, `File-level query without wildcard ${kWildcard}. Did you want a file-level query \
(append ${kPathSeparator}${kWildcard}) or test-level query (append ${kBigSeparator}${kWildcard})?`);
return new TestQueryMultiFile(suite, file);
}
assert(!filePathHasWildcard, `Wildcard ${kWildcard} must be at the end of the query string`);
const {
parts: test,
wildcard: testPathHasWildcard
} = parseBigPart(testString, kPathSeparator);
if (paramsString === undefined) {
// Query is test-level
assert(testPathHasWildcard, `Test-level query without wildcard ${kWildcard}; did you want a test-level query \
(append ${kPathSeparator}${kWildcard}) or case-level query (append ${kBigSeparator}${kWildcard})?`);
assert(file.length > 0, 'File part of test-level query was empty (::)');
return new TestQueryMultiTest(suite, file, test);
} // Query is case-level
assert(!testPathHasWildcard, `Wildcard ${kWildcard} must be at the end of the query string`);
const {
parts: paramsParts,
wildcard: paramsHasWildcard
} = parseBigPart(paramsString, kParamSeparator);
assert(test.length > 0, 'Test part of case-level query was empty (::)');
const params = {};
for (const paramPart of paramsParts) {
const [k, v] = parseSingleParam(paramPart);
assert(validQueryPart.test(k), 'param key names must match ' + validQueryPart);
params[k] = v;
}
if (paramsHasWildcard) {
return new TestQueryMultiCase(suite, file, test, params);
} else {
return new TestQuerySingleCase(suite, file, test, params);
}
} // webgpu:a,b,* or webgpu:a,b,c:*
const kExampleQueries = `\
webgpu${kBigSeparator}a${kPathSeparator}b${kPathSeparator}${kWildcard} or \
webgpu${kBigSeparator}a${kPathSeparator}b${kPathSeparator}c${kBigSeparator}${kWildcard}`;
function parseBigPart(s, separator) {
if (s === '') {
return {
parts: [],
wildcard: false
};
}
const parts = s.split(separator);
let endsWithWildcard = false;
for (const [i, part] of parts.entries()) {
if (i === parts.length - 1) {
endsWithWildcard = part === kWildcard;
}
assert(part.indexOf(kWildcard) === -1 || endsWithWildcard, `Wildcard ${kWildcard} must be complete last part of a path (e.g. ${kExampleQueries})`);
}
if (endsWithWildcard) {
// Remove the last element of the array (which is just the wildcard).
parts.length = parts.length - 1;
}
return {
parts,
wildcard: endsWithWildcard
};
}
function parseSingleParam(paramSubstring) {
assert(paramSubstring !== '', 'Param in a query must not be blank (is there a trailing comma?)');
const i = paramSubstring.indexOf('=');
assert(i !== -1, 'Param in a query must be of form key=value');
const k = paramSubstring.substring(0, i);
assert(paramKeyIsPublic(k), 'Param in a query must not be private (start with _)');
const v = paramSubstring.substring(i + 1);
return [k, parseSingleParamValue(v)];
}
function parseSingleParamValue(s) {
assert(!badParamValueChars.test(s), `param value must not match ${badParamValueChars} - was ${s}`);
return s === 'undefined' ? undefined : JSON.parse(s);
}
//# sourceMappingURL=parseQuery.js.map

View file

@ -0,0 +1,89 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { assert } from '../util/util.js';
import { encodeURIComponentSelectively } from './encode_selectively.js';
import { kBigSeparator, kPathSeparator, kWildcard, kParamSeparator } from './separators.js';
import { stringifyPublicParams } from './stringify_params.js';
export class TestQueryMultiFile {
constructor(suite, file) {
_defineProperty(this, "isMultiFile", true);
_defineProperty(this, "suite", void 0);
_defineProperty(this, "filePathParts", void 0);
this.suite = suite;
this.filePathParts = [...file];
}
toString() {
return encodeURIComponentSelectively(this.toStringHelper().join(kBigSeparator));
}
toHTML() {
return this.toStringHelper().join(kBigSeparator + '<wbr>');
}
toStringHelper() {
return [this.suite, [...this.filePathParts, kWildcard].join(kPathSeparator)];
}
}
export class TestQueryMultiTest extends TestQueryMultiFile {
constructor(suite, file, test) {
super(suite, file);
_defineProperty(this, "isMultiFile", false);
_defineProperty(this, "isMultiTest", true);
_defineProperty(this, "testPathParts", void 0);
assert(file.length > 0, 'multi-test (or finer) query must have file-path');
this.testPathParts = [...test];
}
toStringHelper() {
return [this.suite, this.filePathParts.join(kPathSeparator), [...this.testPathParts, kWildcard].join(kPathSeparator)];
}
}
export class TestQueryMultiCase extends TestQueryMultiTest {
constructor(suite, file, test, params) {
super(suite, file, test);
_defineProperty(this, "isMultiTest", false);
_defineProperty(this, "isMultiCase", true);
_defineProperty(this, "params", void 0);
assert(test.length > 0, 'multi-case (or finer) query must have test-path');
this.params = { ...params
};
}
toStringHelper() {
const paramsParts = stringifyPublicParams(this.params);
return [this.suite, this.filePathParts.join(kPathSeparator), this.testPathParts.join(kPathSeparator), [...paramsParts, kWildcard].join(kParamSeparator)];
}
}
export class TestQuerySingleCase extends TestQueryMultiCase {
constructor(...args) {
super(...args);
_defineProperty(this, "isMultiCase", false);
}
toStringHelper() {
const paramsParts = stringifyPublicParams(this.params);
return [this.suite, this.filePathParts.join(kPathSeparator), this.testPathParts.join(kPathSeparator), paramsParts.join(kParamSeparator)];
}
}
//# sourceMappingURL=query.js.map

View file

@ -0,0 +1,14 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
export const kBigSeparator = ':'; // Separator between big parts: suite:file:test:case
export const kPathSeparator = ','; // Separator between path,to,file or path,to,test
export const kParamSeparator = ';'; // Separator between k=v;k=v
export const kParamKVSeparator = '='; // Separator between key and value in k=v
export const kWildcard = '*'; // Final wildcard, if query is not single-case
//# sourceMappingURL=separators.js.map

View file

@ -0,0 +1,20 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { badParamValueChars, paramKeyIsPublic } from '../params_utils.js';
import { assert } from '../util/util.js';
import { kParamKVSeparator } from './separators.js';
export function stringifyPublicParams(p) {
return Object.keys(p).filter(k => paramKeyIsPublic(k)).map(k => stringifySingleParam(k, p[k]));
}
export function stringifySingleParam(k, v) {
return `${k}${kParamKVSeparator}${stringifySingleParamValue(v)}`;
}
function stringifySingleParamValue(v) {
const s = v === undefined ? 'undefined' : JSON.stringify(v);
assert(!badParamValueChars.test(s), `JSON.stringified param value must not match ${badParamValueChars} - was ${s}`);
return s;
}
//# sourceMappingURL=stringify_params.js.map

View file

@ -0,0 +1,7 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
// Applies to group parts, test parts, params keys.
export const validQueryPart = /^[a-zA-Z0-9_]+$/;
//# sourceMappingURL=validQueryPart.js.map

View file

@ -4,12 +4,20 @@
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import { allowedTestNameCharacters } from './allowed_characters.js';
import { extractPublicParams, paramsEquals } from './params_utils.js';
import { checkPublicParamType } from './url_query.js';
import { extractPublicParams, publicParamsEquals } from './params_utils.js';
import { kPathSeparator } from './query/separators.js';
import { stringifyPublicParams } from './query/stringify_params.js';
import { validQueryPart } from './query/validQueryPart.js';
import { assert } from './util/util.js';
const validNames = new RegExp('^[' + allowedTestNameCharacters + ']+$');
export class TestGroup {
export function makeTestGroup(fixture) {
return new TestGroup(fixture);
} // Interface for running tests
export function makeTestGroupForUnitTesting(fixture) {
return new TestGroup(fixture);
}
class TestGroup {
constructor(fixture) {
_defineProperty(this, "fixture", void 0);
@ -20,14 +28,13 @@ export class TestGroup {
this.fixture = fixture;
}
*iterate(log) {
*iterate() {
for (const test of this.tests) {
yield* test.iterate(log);
yield* test.iterate();
}
}
checkName(name) {
assert(validNames.test(name), `Invalid test name ${name}; must match [${validNames}]+`);
assert( // Shouldn't happen due to the rule above. Just makes sure that treated
// unencoded strings as encoded strings is OK.
name === decodeURIComponent(name), `Not decodeURIComponent-idempotent: ${name} !== ${decodeURIComponent(name)}`);
@ -36,86 +43,98 @@ export class TestGroup {
} // TODO: This could take a fixture, too, to override the one for the group.
test(name, fn) {
// Replace spaces with underscores for readability.
assert(name.indexOf('_') === -1, 'Invalid test name ${name}: contains underscore (use space)');
name = name.replace(/ /g, '_');
test(name) {
this.checkName(name);
const test = new Test(name, this.fixture, fn);
const parts = name.split(kPathSeparator);
for (const p of parts) {
assert(validQueryPart.test(p), `Invalid test name part ${p}; must match ${validQueryPart}`);
}
const test = new TestBuilder(parts, this.fixture);
this.tests.push(test);
return test;
}
} // This test is created when it's inserted, but may be parameterized afterward (.params()).
checkCaseNamesAndDuplicates() {
for (const test of this.tests) {
test.checkCaseNamesAndDuplicates();
}
}
class Test {
constructor(name, fixture, fn) {
_defineProperty(this, "name", void 0);
}
class TestBuilder {
constructor(testPath, fixture) {
_defineProperty(this, "testPath", void 0);
_defineProperty(this, "fixture", void 0);
_defineProperty(this, "fn", void 0);
_defineProperty(this, "testFn", void 0);
_defineProperty(this, "cases", null);
_defineProperty(this, "cases", undefined);
this.name = name;
this.testPath = testPath;
this.fixture = fixture;
this.fn = fn;
}
params(specs) {
assert(this.cases === null, 'test case is already parameterized');
const cases = Array.from(specs);
const seen = []; // This is n^2.
fn(fn) {
this.testFn = fn;
}
for (const spec of cases) {
const publicParams = extractPublicParams(spec); // Check type of public params: can only be (currently):
// number, string, boolean, undefined, number[]
checkCaseNamesAndDuplicates() {
if (this.cases === undefined) {
return;
} // This is n^2.
for (const v of Object.values(publicParams)) {
checkPublicParamType(v);
}
assert(!seen.some(x => paramsEquals(x, publicParams)), 'Duplicate test case params');
seen.push(publicParams);
const seen = [];
for (const testcase of this.cases) {
// stringifyPublicParams also checks for invalid params values
const testcaseString = stringifyPublicParams(testcase);
assert(!seen.some(x => publicParamsEquals(x, testcase)), `Duplicate public test case params: ${testcaseString}`);
seen.push(testcase);
}
this.cases = cases;
}
*iterate(rec) {
for (const params of this.cases || [null]) {
yield new RunCaseSpecific(rec, this.name, params, this.fixture, this.fn);
params(casesIterable) {
assert(this.cases === undefined, 'test case is already parameterized');
this.cases = Array.from(casesIterable);
return this;
}
*iterate() {
assert(this.testFn !== undefined, 'internal error');
for (const params of this.cases || [{}]) {
yield new RunCaseSpecific(this.testPath, params, this.fixture, this.testFn);
}
}
}
class RunCaseSpecific {
constructor(recorder, test, params, fixture, fn) {
constructor(testPath, params, fixture, fn) {
_defineProperty(this, "id", void 0);
_defineProperty(this, "params", void 0);
_defineProperty(this, "recorder", void 0);
_defineProperty(this, "fixture", void 0);
_defineProperty(this, "fn", void 0);
this.id = {
test,
params: params ? extractPublicParams(params) : null
test: testPath,
params: extractPublicParams(params)
};
this.params = params;
this.recorder = recorder;
this.fixture = fixture;
this.fn = fn;
}
async run(debug) {
const [rec, res] = this.recorder.record(this.id.test, this.id.params);
rec.start(debug);
async run(rec) {
rec.start();
try {
const inst = new this.fixture(rec, this.params || {});
@ -130,17 +149,12 @@ class RunCaseSpecific {
} catch (ex) {
// There was an exception from constructor, init, test, or finalize.
// An error from init or test may have been a SkipTestCase.
// An error from finalize may have been an eventualAsyncExpectation failure.
// An error from finalize may have been an eventualAsyncExpectation failure
// or unexpected validation/OOM error from the GPUDevice.
rec.threw(ex);
}
rec.finish();
return res;
}
injectResult(result) {
const [, res] = this.recorder.record(this.id.test, this.id.params);
Object.assign(res, result);
}
}

View file

@ -0,0 +1,4 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
//# sourceMappingURL=test_suite_listing.js.map

View file

@ -2,91 +2,301 @@
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { stringifyPublicParams } from './params_utils.js';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// e.g. iteratePath('a/b/c/d', ':') yields ['a/', 'a/b/', 'a/b/c/', 'a/b/c/d:']
function* iteratePath(path, terminator) {
const parts = path.split('/');
import { compareQueries, Ordering } from './query/compare.js';
import { TestQueryMultiCase, TestQuerySingleCase, TestQueryMultiFile, TestQueryMultiTest } from './query/query.js';
import { stringifySingleParam } from './query/stringify_params.js';
import { assert } from './util/util.js'; // `loadTreeForQuery()` loads a TestTree for a given queryToLoad.
// The resulting tree is a linked-list all the way from `suite:*` to queryToLoad,
// and under queryToLoad is a tree containing every case matched by queryToLoad.
//
// `subqueriesToExpand` influences the `collapsible` flag on nodes in the resulting tree.
// A node is considered "collapsible" if none of the subqueriesToExpand is a StrictSubset
// of that node.
//
// In WebKit/Blink-style web_tests, an expectation file marks individual cts.html "variants" as
// "Failure", "Crash", etc.
// By passing in the list of expectations as the subqueriesToExpand, we can programmatically
// subdivide the cts.html "variants" list to be able to implement arbitrarily-fine suppressions
// (instead of having to suppress entire test files, which would lose a lot of coverage).
//
// `iterateCollapsedQueries()` produces the list of queries for the variants list.
//
// Though somewhat complicated, this system has important benefits:
// - Avoids having to suppress entire test files, which would cause large test coverage loss.
// - Minimizes the number of page loads needed for fine-grained suppressions.
// (In the naive case, we could do one page load per test case - but the test suite would
// take impossibly long to run.)
// - Enables developers to put any number of tests in one file as appropriate, without worrying
// about expectation granularity.
if (parts.length > 1) {
let partial = parts[0] + '/';
yield partial;
export class TestTree {
constructor(root) {
_defineProperty(this, "root", void 0);
for (let i = 1; i < parts.length - 1; ++i) {
partial += parts[i] + '/';
yield partial;
} // Path ends in '/' (so is a README).
this.root = root;
}
iterateCollapsedQueries() {
return TestTree.iterateSubtreeCollapsedQueries(this.root);
}
if (parts[parts.length - 1] === '') {
return;
iterateLeaves() {
return TestTree.iterateSubtreeLeaves(this.root);
}
toString() {
return TestTree.subtreeToString('(root)', this.root, '');
}
static *iterateSubtreeCollapsedQueries(subtree) {
for (const [, child] of subtree.children) {
if ('children' in child && !child.collapsible) {
yield* TestTree.iterateSubtreeCollapsedQueries(child);
} else {
yield child.query;
}
}
}
yield path + terminator;
}
export function treeFromFilterResults(log, listing) {
function getOrInsert(n, k) {
const children = n.children;
if (children.has(k)) {
return children.get(k);
static *iterateSubtreeLeaves(subtree) {
for (const [, child] of subtree.children) {
if ('children' in child) {
yield* TestTree.iterateSubtreeLeaves(child);
} else {
yield child;
}
}
const v = {
children: new Map()
};
children.set(k, v);
return v;
}
const tree = {
children: new Map()
};
static subtreeToString(name, tree, indent) {
const collapsible = 'run' in tree ? '>' : tree.collapsible ? '+' : '-';
let s = indent + `${collapsible} ${JSON.stringify(name)} => ` + `${tree.query} ${JSON.stringify(tree.query)}`;
for (const f of listing) {
const files = getOrInsert(tree, f.id.suite + ':');
if (f.id.path === '') {
// This is a suite README.
files.description = f.spec.description.trim();
continue;
}
let tests = files;
for (const path of iteratePath(f.id.path, ':')) {
tests = getOrInsert(tests, f.id.suite + ':' + path);
}
if (f.spec.description) {
// This is a directory README or spec file.
tests.description = f.spec.description.trim();
}
if (!('g' in f.spec)) {
// This is a directory README.
continue;
}
const [tRec] = log.record(f.id);
const fId = f.id.suite + ':' + f.id.path;
for (const t of f.spec.g.iterate(tRec)) {
let cases = tests;
for (const path of iteratePath(t.id.test, '~')) {
cases = getOrInsert(cases, fId + ':' + path);
if ('children' in tree) {
if (tree.description !== undefined) {
s += indent + `\n | ${JSON.stringify(tree.description)}`;
}
const p = stringifyPublicParams(t.id.params);
cases.children.set(fId + ':' + t.id.test + '=' + p, {
runCase: t
});
for (const [name, child] of tree.children) {
s += '\n' + TestTree.subtreeToString(name, child, indent + ' ');
}
}
return s;
}
} // TODO: Consider having subqueriesToExpand actually impact the depth-order of params in the tree.
export async function loadTreeForQuery(loader, queryToLoad, subqueriesToExpand) {
const suite = queryToLoad.suite;
const specs = await loader.listing(suite);
const subqueriesToExpandEntries = Array.from(subqueriesToExpand.entries());
const seenSubqueriesToExpand = new Array(subqueriesToExpand.length);
seenSubqueriesToExpand.fill(false);
const isCollapsible = subquery => subqueriesToExpandEntries.every(([i, toExpand]) => {
const ordering = compareQueries(toExpand, subquery); // If toExpand == subquery, no expansion is needed (but it's still "seen").
if (ordering === Ordering.Equal) seenSubqueriesToExpand[i] = true;
return ordering !== Ordering.StrictSubset;
}); // L0 = suite-level, e.g. suite:*
// L1 = file-level, e.g. suite:a,b:*
// L2 = test-level, e.g. suite:a,b:c,d:*
// L3 = case-level, e.g. suite:a,b:c,d:
let foundCase = false; // L0 is suite:*
const subtreeL0 = makeTreeForSuite(suite);
isCollapsible(subtreeL0.query); // mark seenSubqueriesToExpand
for (const entry of specs) {
if (entry.file.length === 0 && 'readme' in entry) {
// Suite-level readme.
assert(subtreeL0.description === undefined);
subtreeL0.description = entry.readme.trim();
continue;
}
{
const queryL1 = new TestQueryMultiFile(suite, entry.file);
const orderingL1 = compareQueries(queryL1, queryToLoad);
if (orderingL1 === Ordering.Unordered) {
// File path is not matched by this query.
continue;
}
}
if ('readme' in entry) {
// Entry is a README that is an ancestor or descendant of the query.
// (It's included for display in the standalone runner.)
// readmeSubtree is suite:a,b,*
// (This is always going to dedup with a file path, if there are any test spec files under
// the directory that has the README).
const readmeSubtree = addSubtreeForDirPath(subtreeL0, entry.file);
assert(readmeSubtree.description === undefined);
readmeSubtree.description = entry.readme.trim();
continue;
} // Entry is a spec file.
const spec = await loader.importSpecFile(queryToLoad.suite, entry.file);
const description = spec.description.trim(); // subtreeL1 is suite:a,b:*
const subtreeL1 = addSubtreeForFilePath(subtreeL0, entry.file, description, isCollapsible); // TODO: If tree generation gets too slow, avoid actually iterating the cases in a file
// if there's no need to (based on the subqueriesToExpand).
for (const t of spec.g.iterate()) {
{
const queryL3 = new TestQuerySingleCase(suite, entry.file, t.id.test, t.id.params);
const orderingL3 = compareQueries(queryL3, queryToLoad);
if (orderingL3 === Ordering.Unordered || orderingL3 === Ordering.StrictSuperset) {
// Case is not matched by this query.
continue;
}
} // subtreeL2 is suite:a,b:c,d:*
const subtreeL2 = addSubtreeForTestPath(subtreeL1, t.id.test, isCollapsible); // Leaf for case is suite:a,b:c,d:x=1;y=2
addLeafForCase(subtreeL2, t, isCollapsible);
foundCase = true;
}
}
const tree = new TestTree(subtreeL0);
for (const [i, sq] of subqueriesToExpandEntries) {
const seen = seenSubqueriesToExpand[i];
assert(seen, `subqueriesToExpand entry did not match anything \
(can happen due to overlap with another subquery): ${sq.toString()}`);
}
assert(foundCase, 'Query does not match any cases'); // TODO: Contains lots of single-child subtrees. Consider cleaning those up (as postprocess?).
return tree;
}
function makeTreeForSuite(suite) {
return {
query: new TestQueryMultiFile(suite, []),
children: new Map(),
collapsible: false
};
}
function addSubtreeForDirPath(tree, file) {
const subqueryFile = []; // To start, tree is suite:*
// This loop goes from that -> suite:a,* -> suite:a,b,*
for (const part of file) {
subqueryFile.push(part);
tree = getOrInsertSubtree(part, tree, () => {
const query = new TestQueryMultiFile(tree.query.suite, subqueryFile);
return {
query,
collapsible: false
};
});
}
return tree;
}
function addSubtreeForFilePath(tree, file, description, checkCollapsible) {
// To start, tree is suite:*
// This goes from that -> suite:a,* -> suite:a,b,*
tree = addSubtreeForDirPath(tree, file); // This goes from that -> suite:a,b:*
const subtree = getOrInsertSubtree('', tree, () => {
const query = new TestQueryMultiTest(tree.query.suite, tree.query.filePathParts, []);
return {
query,
description,
collapsible: checkCollapsible(query)
};
});
return subtree;
}
function addSubtreeForTestPath(tree, test, isCollapsible) {
const subqueryTest = []; // To start, tree is suite:a,b:*
// This loop goes from that -> suite:a,b:c,* -> suite:a,b:c,d,*
for (const part of test) {
subqueryTest.push(part);
tree = getOrInsertSubtree(part, tree, () => {
const query = new TestQueryMultiTest(tree.query.suite, tree.query.filePathParts, subqueryTest);
return {
query,
collapsible: isCollapsible(query)
};
});
} // This goes from that -> suite:a,b:c,d:*
return getOrInsertSubtree('', tree, () => {
const query = new TestQueryMultiCase(tree.query.suite, tree.query.filePathParts, subqueryTest, {});
return {
query,
collapsible: isCollapsible(query)
};
});
}
function addLeafForCase(tree, t, checkCollapsible) {
const query = tree.query;
let name = '';
const subqueryParams = {}; // To start, tree is suite:a,b:c,d:*
// This loop goes from that -> suite:a,b:c,d:x=1;* -> suite:a,b:c,d:x=1;y=2;*
for (const [k, v] of Object.entries(t.id.params)) {
name = stringifySingleParam(k, v);
subqueryParams[k] = v;
tree = getOrInsertSubtree(name, tree, () => {
const subquery = new TestQueryMultiCase(query.suite, query.filePathParts, query.testPathParts, subqueryParams);
return {
query: subquery,
collapsible: checkCollapsible(subquery)
};
});
} // This goes from that -> suite:a,b:c,d:x=1;y=2
const subquery = new TestQuerySingleCase(query.suite, query.filePathParts, query.testPathParts, subqueryParams);
checkCollapsible(subquery); // mark seenSubqueriesToExpand
insertLeaf(tree, subquery, t);
}
function getOrInsertSubtree(key, parent, createSubtree) {
let v;
const child = parent.children.get(key);
if (child !== undefined) {
assert('children' in child); // Make sure cached subtree is not actually a leaf
v = child;
} else {
v = { ...createSubtree(),
children: new Map()
};
parent.children.set(key, v);
}
return v;
}
function insertLeaf(parent, query, t) {
const key = '';
const leaf = {
query,
run: rec => t.run(rec)
};
assert(!parent.children.has(key));
parent.children.set(key, leaf);
}
//# sourceMappingURL=tree.js.map

View file

@ -0,0 +1,51 @@
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
import { resolveOnTimeout } from './util.js';
export async function attemptGarbageCollection() {
const w = self;
if (w.GCController) {
w.GCController.collect();
return;
}
if (w.opera && w.opera.collect) {
w.opera.collect();
return;
}
try {
w.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils).garbageCollect();
return;
} catch (e) {}
if (w.gc) {
w.gc();
return;
}
if (w.CollectGarbage) {
w.CollectGarbage();
return;
}
let i;
function gcRec(n) {
if (n < 1) return;
let temp = {
i: 'ab' + i + i / 100000
};
temp = temp + 'foo';
gcRec(n - 1);
}
for (i = 0; i < 1000; i++) {
gcRec(10);
}
return resolveOnTimeout(35); // Let the event loop run a few frames in case it helps.
}
//# sourceMappingURL=collect_garbage.js.map

View file

@ -2,40 +2,24 @@
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/
// Takes a stack trace, and extracts only the first continuous range of lines
// containing '/(webgpu|unittests)/', which should provide only the useful part
// of the stack to the caller (for logging).
export function getStackTrace(e) {
// Returns the stack trace of an Error, but without the extra boilerplate at the bottom
// (e.g. RunCaseSpecific, processTicksAndRejections, etc.), for logging.
export function extractImportantStackTrace(e) {
if (!e.stack) {
return '';
}
const parts = e.stack.split('\n');
const stack = [];
const moreStack = [];
let found = false;
const commonRegex = /[\/\\](webgpu|unittests)[\/\\]/;
const lines = e.stack.split('\n');
for (let i = 0; i < parts.length; ++i) {
const part = parts[i].trim();
const isSuites = commonRegex.test(part); // approximate
for (let i = lines.length - 1; i >= 0; --i) {
const line = lines[i];
if (found && !isSuites) {
moreStack.push(part);
}
if (isSuites) {
if (moreStack.length) {
stack.push(...moreStack);
moreStack.length = 0;
}
stack.push(part);
found = true;
if (line.indexOf('.spec.') !== -1) {
return lines.slice(0, i + 1).join('\n');
}
}
return stack.join('\n');
return e.stack;
} // *** Examples ***
//
// Node fail()

View file

@ -5,7 +5,14 @@
import { timeout } from './timeout.js';
export function assert(condition, msg) {
if (!condition) {
throw new Error(msg);
throw new Error(msg && (typeof msg === 'string' ? msg : msg()));
}
}
export async function assertReject(p, msg) {
try {
await p;
unreachable(msg);
} catch (ex) {// Assertion OK
}
}
export function unreachable(msg) {
@ -16,10 +23,18 @@ const perf = typeof performance !== 'undefined' ? performance : require('perf_ho
export function now() {
return perf.now();
}
export function rejectOnTimeout(ms, msg) {
return new Promise((resolve, reject) => {
export function resolveOnTimeout(ms) {
return new Promise(resolve => {
timeout(() => {
reject(new Error(msg));
resolve();
}, ms);
});
}
export class PromiseTimeoutError extends Error {}
export function rejectOnTimeout(ms, msg) {
return new Promise((_resolve, reject) => {
timeout(() => {
reject(new PromiseTimeoutError(msg));
}, ms);
});
}

Some files were not shown because too many files have changed in this diff Show more