diff options
author | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2020-04-25 08:18:23 +0000 |
---|---|---|
committer | WPT Sync Bot <josh+wptsync@joshmatthews.net> | 2020-04-25 11:14:57 +0000 |
commit | 55139554bae383d85dfe2f96a09d91af2e01da77 (patch) | |
tree | c10628dce8f4f330373c081c3bf1602cde88d422 | |
parent | 537e575d3da0fff914f99e4c25026d119e8b6f90 (diff) | |
download | servo-55139554bae383d85dfe2f96a09d91af2e01da77.tar.gz servo-55139554bae383d85dfe2f96a09d91af2e01da77.zip |
Update web-platform-tests to revision 78eae724c61bb01d858a01a324363e997ac66851
366 files changed, 10282 insertions, 1999 deletions
diff --git a/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini b/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini new file mode 100644 index 00000000000..3ba71c8de11 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini @@ -0,0 +1,2 @@ +[drawImage-from-blob.tentative.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini index 3605e8f3fc9..76b44d9e9cf 100644 --- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -4,7 +4,7 @@ expected: TIMEOUT [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini new file mode 100644 index 00000000000..ff201e24186 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-interface.any.js.ini @@ -0,0 +1,33 @@ +[class-string-interface.any.html] + [Object.prototype.toString applied to the prototype] + expected: FAIL + + [Object.prototype.toString applied to a null-prototype instance] + expected: FAIL + + [Object.prototype.toString applied after modifying the prototype's @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists on the prototype with the appropriate descriptor] + expected: FAIL + + +[class-string-interface.any.worker.html] + [Object.prototype.toString applied to the prototype] + expected: FAIL + + [Object.prototype.toString applied to a null-prototype instance] + expected: FAIL + + [Object.prototype.toString applied after modifying the prototype's @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists on the prototype with the appropriate descriptor] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini new file mode 100644 index 00000000000..0d1aec4f066 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini @@ -0,0 +1,33 @@ +[class-string-iterator-prototype-object.any.html] + [Object.prototype.toString] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after nulling the prototype] + expected: FAIL + + +[class-string-iterator-prototype-object.any.worker.html] + [Object.prototype.toString] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after nulling the prototype] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini new file mode 100644 index 00000000000..353805a5a06 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini @@ -0,0 +1,13 @@ +[class-string-named-properties-object.window.html] + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini new file mode 100644 index 00000000000..f64b45fea6b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-002.html] + [Hit test float] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini new file mode 100644 index 00000000000..f29da48a2a0 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-003.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-003.html] + [Miss float below something else] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini new file mode 100644 index 00000000000..d0b3bc98be7 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-iframe-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-iframe-root.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini new file mode 100644 index 00000000000..c69b7cbb3b0 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-root.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini new file mode 100644 index 00000000000..25f76c60b9b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-margin-transformed-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-transformed-root.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-011.html.ini index 536029e626b..20e1b790822 100644 --- a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-011.html.ini @@ -1,2 +1,2 @@ -[fill-box.html] +[gap-011.html] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini new file mode 100644 index 00000000000..9f3e416efc5 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-012.html.ini @@ -0,0 +1,2 @@ +[gap-012.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini new file mode 100644 index 00000000000..856975d6f05 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-013.html.ini @@ -0,0 +1,2 @@ +[gap-013.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini new file mode 100644 index 00000000000..f5e7fbecd47 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-014.html.ini @@ -0,0 +1,2 @@ +[gap-014.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini new file mode 100644 index 00000000000..660a042cb7f --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-015.html.ini @@ -0,0 +1,2 @@ +[gap-015.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini new file mode 100644 index 00000000000..d1071378ed9 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/gap-016.html.ini @@ -0,0 +1,2 @@ +[gap-016.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini new file mode 100644 index 00000000000..1569c50b18c --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/backface-visibility-hidden-animated.html.ini @@ -0,0 +1,2 @@ +[backface-visibility-hidden-animated.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini new file mode 100644 index 00000000000..8e9e7b13e49 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-001.html.ini @@ -0,0 +1,2 @@ +[fill-box-001.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini new file mode 100644 index 00000000000..3f1877d85ad --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-box/fill-box-002.html.ini @@ -0,0 +1,2 @@ +[fill-box-002.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini new file mode 100644 index 00000000000..d48f67c6c1f --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-percent-010.html.ini @@ -0,0 +1,2 @@ +[transform-percent-010.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini new file mode 100644 index 00000000000..338baf702a2 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-002.html.ini @@ -0,0 +1,547 @@ +[properties-value-inherit-002.html] + [outline-width length(px) / values] + expected: FAIL + + [border-left-width length(em) / values] + expected: FAIL + + [background-position length(pt) / values] + expected: FAIL + + [background-position length(pt) / events] + expected: FAIL + + [border-bottom-width length(px) / values] + expected: FAIL + + [border-top-width length(em) / values] + expected: FAIL + + [line-height number(decimal) / values] + expected: FAIL + + [word-spacing length(mm) / values] + expected: FAIL + + [text-indent length(pc) / values] + expected: FAIL + + [opacity number[0,1\](zero-to-one) / values] + expected: FAIL + + [line-height number(integer) / values] + expected: FAIL + + [outline-offset length(px) / values] + expected: FAIL + + [font-size length(pt) / values] + expected: FAIL + + [max-height length(px) / values] + expected: FAIL + + [vertical-align length(in) / values] + expected: FAIL + + [right length(pc) / values] + expected: FAIL + + [top length(pt) / values] + expected: FAIL + + [max-height percentage(%) / values] + expected: FAIL + + [background-position length(px) / values] + expected: FAIL + + [min-width length(px) / values] + expected: FAIL + + [border-top-color color(rgba) / values] + expected: FAIL + + [background-position length(cm) / events] + expected: FAIL + + [border-right-color color(rgba) / values] + expected: FAIL + + [top length(pc) / values] + expected: FAIL + + [font-size length(ex) / values] + expected: FAIL + + [min-height length(pc) / values] + expected: FAIL + + [background-position length(mm) / values] + expected: FAIL + + [line-height length(px) / values] + expected: FAIL + + [word-spacing length(px) / values] + expected: FAIL + + [vertical-align percentage(%) / values] + expected: FAIL + + [background-position length(in) / events] + expected: FAIL + + [border-right-width length(pc) / values] + expected: FAIL + + [line-height length(ex) / values] + expected: FAIL + + [color color(rgba) / values] + expected: FAIL + + [font-size length(in) / values] + expected: FAIL + + [text-indent length(ex) / values] + expected: FAIL + + [font-size length(em) / values] + expected: FAIL + + [border-left-width length(mm) / values] + expected: FAIL + + [vertical-align length(em) / values] + expected: FAIL + + [text-indent length(px) / values] + expected: FAIL + + [clip rectangle(rectangle) / values] + expected: FAIL + + [word-spacing length(em) / values] + expected: FAIL + + [border-right-width length(ex) / values] + expected: FAIL + + [border-top-width length(cm) / values] + expected: FAIL + + [right length(px) / values] + expected: FAIL + + [max-width length(em) / values] + expected: FAIL + + [background-position length(em) / events] + expected: FAIL + + [font-size length(cm) / values] + expected: FAIL + + [border-right-width length(cm) / values] + expected: FAIL + + [top length(px) / values] + expected: FAIL + + [outline-offset length(ex) / values] + expected: FAIL + + [min-width length(cm) / values] + expected: FAIL + + [min-height length(px) / values] + expected: FAIL + + [min-width length(mm) / values] + expected: FAIL + + [border-bottom-width length(in) / values] + expected: FAIL + + [vertical-align length(pc) / values] + expected: FAIL + + [vertical-align length(cm) / values] + expected: FAIL + + [max-height length(ex) / values] + expected: FAIL + + [vertical-align length(ex) / values] + expected: FAIL + + [min-height percentage(%) / values] + expected: FAIL + + [top percentage(%) / values] + expected: FAIL + + [max-height length(pt) / values] + expected: FAIL + + [outline-offset length(mm) / values] + expected: FAIL + + [font-weight font-weight(keyword) / values] + expected: FAIL + + [max-height length(mm) / values] + expected: FAIL + + [outline-offset length(pt) / values] + expected: FAIL + + [line-height length(mm) / values] + expected: FAIL + + [line-height length(cm) / values] + expected: FAIL + + [border-top-width length(mm) / values] + expected: FAIL + + [letter-spacing length(in) / values] + expected: FAIL + + [border-bottom-color color(rgba) / values] + expected: FAIL + + [min-width percentage(%) / values] + expected: FAIL + + [min-height length(cm) / values] + expected: FAIL + + [letter-spacing length(mm) / values] + expected: FAIL + + [font-size percentage(%) / values] + expected: FAIL + + [letter-spacing length(cm) / values] + expected: FAIL + + [vertical-align length(pt) / values] + expected: FAIL + + [border-left-color color(rgba) / values] + expected: FAIL + + [letter-spacing length(pc) / values] + expected: FAIL + + [letter-spacing length(pt) / values] + expected: FAIL + + [word-spacing length(ex) / values] + expected: FAIL + + [line-height length(pt) / values] + expected: FAIL + + [top length(em) / values] + expected: FAIL + + [border-top-width length(px) / values] + expected: FAIL + + [min-width length(pt) / values] + expected: FAIL + + [border-bottom-width length(mm) / values] + expected: FAIL + + [border-bottom-width length(cm) / values] + expected: FAIL + + [min-width length(em) / values] + expected: FAIL + + [min-height length(em) / values] + expected: FAIL + + [max-width length(mm) / values] + expected: FAIL + + [min-height length(ex) / values] + expected: FAIL + + [background-position length(ex) / values] + expected: FAIL + + [max-width length(px) / values] + expected: FAIL + + [text-indent length(mm) / values] + expected: FAIL + + [font-size length(mm) / values] + expected: FAIL + + [min-width length(pc) / values] + expected: FAIL + + [letter-spacing length(em) / values] + expected: FAIL + + [background-position length(cm) / values] + expected: FAIL + + [top length(in) / values] + expected: FAIL + + [line-height length(em) / values] + expected: FAIL + + [border-bottom-width length(pt) / values] + expected: FAIL + + [word-spacing length(pc) / values] + expected: FAIL + + [outline-offset length(in) / values] + expected: FAIL + + [word-spacing length(in) / values] + expected: FAIL + + [outline-width length(pt) / values] + expected: FAIL + + [border-top-width length(pc) / values] + expected: FAIL + + [border-left-width length(px) / values] + expected: FAIL + + [font-size length(px) / values] + expected: FAIL + + [border-left-width length(cm) / values] + expected: FAIL + + [border-right-width length(px) / values] + expected: FAIL + + [outline-width length(in) / values] + expected: FAIL + + [word-spacing length(pt) / values] + expected: FAIL + + [text-indent length(cm) / values] + expected: FAIL + + [border-right-width length(mm) / values] + expected: FAIL + + [max-width length(in) / values] + expected: FAIL + + [outline-color color(rgba) / values] + expected: FAIL + + [background-position length(ex) / events] + expected: FAIL + + [text-indent length(pt) / values] + expected: FAIL + + [border-right-width length(pt) / values] + expected: FAIL + + [border-left-width length(in) / values] + expected: FAIL + + [text-shadow shadow(shadow) / values] + expected: FAIL + + [background-position length(pc) / events] + expected: FAIL + + [max-height length(in) / values] + expected: FAIL + + [line-height length(in) / values] + expected: FAIL + + [border-bottom-width length(em) / values] + expected: FAIL + + [outline-width length(ex) / values] + expected: FAIL + + [font-size length(pc) / values] + expected: FAIL + + [background-position length(in) / values] + expected: FAIL + + [min-width length(in) / values] + expected: FAIL + + [top length(cm) / values] + expected: FAIL + + [outline-width length(cm) / values] + expected: FAIL + + [max-width percentage(%) / values] + expected: FAIL + + [max-width length(ex) / values] + expected: FAIL + + [top length(mm) / values] + expected: FAIL + + [letter-spacing length(ex) / values] + expected: FAIL + + [border-left-width length(ex) / values] + expected: FAIL + + [outline-width length(mm) / values] + expected: FAIL + + [border-left-width length(pc) / values] + expected: FAIL + + [outline-width length(pc) / values] + expected: FAIL + + [word-spacing percentage(%) / values] + expected: FAIL + + [font-weight font-weight(numeric) / values] + expected: FAIL + + [vertical-align length(px) / values] + expected: FAIL + + [letter-spacing length(px) / values] + expected: FAIL + + [max-width length(pt) / values] + expected: FAIL + + [line-height percentage(%) / values] + expected: FAIL + + [text-indent length(in) / values] + expected: FAIL + + [text-indent length(em) / values] + expected: FAIL + + [border-top-width length(pt) / values] + expected: FAIL + + [min-height length(mm) / values] + expected: FAIL + + [background-position length(pc) / values] + expected: FAIL + + [background-position percentage(%) / values] + expected: FAIL + + [max-height length(cm) / values] + expected: FAIL + + [top length(ex) / values] + expected: FAIL + + [outline-width length(em) / values] + expected: FAIL + + [border-right-width length(em) / values] + expected: FAIL + + [max-height length(em) / values] + expected: FAIL + + [max-width length(cm) / values] + expected: FAIL + + [outline-offset length(em) / values] + expected: FAIL + + [outline-offset length(cm) / values] + expected: FAIL + + [background-position length(mm) / events] + expected: FAIL + + [border-top-width length(ex) / values] + expected: FAIL + + [border-right-width length(in) / values] + expected: FAIL + + [z-index integer(integer) / values] + expected: FAIL + + [border-left-width length(pt) / values] + expected: FAIL + + [vertical-align length(mm) / values] + expected: FAIL + + [border-bottom-width length(pc) / values] + expected: FAIL + + [text-indent percentage(%) / values] + expected: FAIL + + [line-height length(pc) / values] + expected: FAIL + + [right length(pt) / values] + expected: FAIL + + [background-position length(em) / values] + expected: FAIL + + [border-top-width length(in) / values] + expected: FAIL + + [border-bottom-width length(ex) / values] + expected: FAIL + + [min-height length(in) / values] + expected: FAIL + + [outline-offset length(pc) / values] + expected: FAIL + + [max-height length(pc) / values] + expected: FAIL + + [background-color color(rgba) / values] + expected: FAIL + + [min-height length(pt) / values] + expected: FAIL + + [word-spacing length(cm) / values] + expected: FAIL + + [background-position percentage(%) / events] + expected: FAIL + + [max-width length(pc) / values] + expected: FAIL + + [background-position length(px) / events] + expected: FAIL + + [min-width length(ex) / values] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index 628b1fab770..c884dc82eab 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -2,3 +2,6 @@ [listeners are called when <iframe> is resized] expected: FAIL + [listeners are called correct number of times] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini index 834b2440fbd..75d0a21d9dd 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini @@ -318,9 +318,18 @@ [<iframe>: separate response Content-Type: text/html;" text/plain] expected: FAIL - [<iframe>: combined response Content-Type: text/html */*;charset=gbk] + [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html] expected: FAIL - [<iframe>: combined response Content-Type: text/html;x=" text/plain] + [<iframe>: separate response Content-Type: text/html */*;charset=gbk] + expected: FAIL + + [<iframe>: separate response Content-Type: text/plain */*] + expected: FAIL + + [<iframe>: combined response Content-Type: text/html;" \\" text/plain] + expected: FAIL + + [<iframe>: separate response Content-Type: text/plain */*;charset=gbk] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini index ac4cbcba706..279734168dc 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/script.window.js.ini @@ -53,9 +53,9 @@ [combined text/javascript ] expected: FAIL - [separate text/javascript;charset=windows-1252 error text/javascript] + [separate text/javascript x/x] expected: FAIL - [separate text/javascript x/x] + [separate text/javascript;charset=windows-1252 text/javascript] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini index 87c807a49ff..a63e414f43a 100644 --- a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,3 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL + [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini index dc2e45516de..75d75b4cda2 100644 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini @@ -1,4 +1,4 @@ -[traverse_the_history_5.html] +[traverse_the_history_2.html] [Multiple history traversals, last would be aborted] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini index dc2e45516de..51f8272a6de 100644 --- a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini @@ -1,4 +1,4 @@ -[traverse_the_history_5.html] +[traverse_the_history_3.html] [Multiple history traversals, last would be aborted] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini new file mode 100644 index 00000000000..8621ae89f18 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini @@ -0,0 +1,3503 @@ +[idlharness.https.html?exclude=(Document|Window|HTML.*)] + [DataTransferItem interface: operation getAsFile()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute filter] + expected: FAIL + + [SVGElement interface: attribute ondrop] + expected: FAIL + + [SVGElement interface: attribute onreset] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX] + expected: FAIL + + [CanvasRenderingContext2D interface: operation getLineDash()] + expected: FAIL + + [SVGElement interface: attribute ondragend] + expected: FAIL + + [ApplicationCache interface: attribute onprogress] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation fill(optional CanvasFillRule)] + expected: FAIL + + [BarProp interface: existence and properties of interface prototype object] + expected: FAIL + + [SharedWorker interface: existence and properties of interface object] + expected: FAIL + + [SVGElement interface: attribute onmouseleave] + expected: FAIL + + [DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ApplicationCache interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [DataTransferItemList interface: operation add(File)] + expected: FAIL + + [SVGElement interface: attribute onloadstart] + expected: FAIL + + [External interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ApplicationCache must be primary interface of window.applicationCache] + expected: FAIL + + [SVGElement interface: attribute onended] + expected: FAIL + + [ElementInternals interface object length] + expected: FAIL + + [ElementInternals interface: operation reportValidity()] + expected: FAIL + + [SVGSVGElement interface: attribute onbeforeprint] + expected: FAIL + + [CanvasRenderingContext2D interface: operation scrollPathIntoView()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute shadowColor] + expected: FAIL + + [SVGElement interface: attribute onwebkitanimationend] + expected: FAIL + + [DragEvent interface: attribute dataTransfer] + expected: FAIL + + [DataTransfer interface: operation clearData(optional DOMString)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvas interface: operation convertToBlob(optional ImageEncodeOptions)] + expected: FAIL + + [ElementInternals interface: operation setValidity(ValidityStateFlags, optional DOMString, optional HTMLElement)] + expected: FAIL + + [DOMStringList interface: calling item(unsigned long) on location.ancestorOrigins with too few arguments must throw TypeError] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type] + expected: FAIL + + [DataTransferItemList interface: operation clear()] + expected: FAIL + + [SVGElement interface: attribute ondragstart] + expected: FAIL + + [SVGSVGElement interface: attribute onpageshow] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [SVGElement interface: attribute onauxclick] + expected: FAIL + + [SVGElement interface: attribute ontoggle] + expected: FAIL + + [SVGElement interface: attribute onload] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY] + expected: FAIL + + [SVGSVGElement interface: attribute onunload] + expected: FAIL + + [SVGElement interface: attribute onplay] + expected: FAIL + + [DataTransferItem interface object length] + expected: FAIL + + [SVGElement interface: attribute onselect] + expected: FAIL + + [DataTransfer interface: existence and properties of interface object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation setLineDash(sequence<unrestricted double>)] + expected: FAIL + + [ApplicationCache interface: constant UNCACHED on interface object] + expected: FAIL + + [DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [SVGSVGElement interface: attribute onpagehide] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type] + expected: FAIL + + [SVGElement interface: attribute oninvalid] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type] + expected: FAIL + + [SVGSVGElement interface: attribute onstorage] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute strokeStyle] + expected: FAIL + + [ElementInternals interface: attribute labels] + expected: FAIL + + [SVGElement interface: attribute oncopy] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation commit()] + expected: FAIL + + [CanvasRenderingContext2D interface: operation setLineDash(sequence<unrestricted double>)] + expected: FAIL + + [DataTransferItemList interface object name] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset] + expected: FAIL + + [SVGSVGElement interface: attribute onunhandledrejection] + expected: FAIL + + [SVGElement interface: attribute ondragenter] + expected: FAIL + + [SVGElement interface: attribute oncut] + expected: FAIL + + [OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, optional any)] + expected: FAIL + + [SVGElement interface: attribute oninput] + expected: FAIL + + [SVGElement interface: attribute onsubmit] + expected: FAIL + + [DataTransferItemList interface: attribute length] + expected: FAIL + + [DataTransfer interface: operation getData(DOMString)] + expected: FAIL + + [Path2D interface: operation closePath()] + expected: FAIL + + [Path2D interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [History interface: attribute scrollRestoration] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute direction] + expected: FAIL + + [SVGElement interface: attribute onwebkitanimationstart] + expected: FAIL + + [Navigator interface: operation registerProtocolHandler(DOMString, USVString)] + expected: FAIL + + [SVGElement interface: attribute onclose] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type] + expected: FAIL + + [External interface: existence and properties of interface prototype object] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type] + expected: FAIL + + [ApplicationCache interface: attribute status] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [External interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ImageBitmapRenderingContext interface: existence and properties of interface prototype object] + expected: FAIL + + [SVGElement interface: attribute onchange] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute lineWidth] + expected: FAIL + + [BarProp interface: attribute visible] + expected: FAIL + + [ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute canvas] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onsuspend] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)] + expected: FAIL + + [SharedWorker interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)] + expected: FAIL + + [SVGElement interface: attribute oncuechange] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onloadeddata] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation closePath()] + expected: FAIL + + [SVGSVGElement interface: attribute ononline] + expected: FAIL + + [SVGElement interface: attribute onemptied] + expected: FAIL + + [SVGElement interface: attribute onkeyup] + expected: FAIL + + [SVGElement interface: attribute ondblclick] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [Stringification of window.external] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type] + expected: FAIL + + [ElementInternals interface: existence and properties of interface object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash(sequence<unrestricted double>)" with the proper type] + expected: FAIL + + [SVGElement interface: attribute oncanplaythrough] + expected: FAIL + + [SVGElement interface: attribute oncontextmenu] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute lineDashOffset] + expected: FAIL + + [BarProp interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [History interface: window.history must inherit property "scrollRestoration" with the proper type] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type] + expected: FAIL + + [ApplicationCache interface: constant UPDATEREADY on interface prototype object] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "onLine" with the proper type] + expected: FAIL + + [CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)] + expected: FAIL + + [BarProp interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [SharedWorker interface: attribute port] + expected: FAIL + + [ApplicationCache interface: constant OBSOLETE on interface prototype object] + expected: FAIL + + [SVGElement interface: attribute onclick] + expected: FAIL + + [DragEvent interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)] + expected: FAIL + + [DataTransfer interface: existence and properties of interface prototype object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute fillStyle] + expected: FAIL + + [Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError] + expected: FAIL + + [ElementInternals interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [SVGElement interface: attribute ondurationchange] + expected: FAIL + + [OffscreenCanvas interface: existence and properties of interface prototype object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)] + expected: FAIL + + [External interface: window.external must inherit property "AddSearchProvider()" with the proper type] + expected: FAIL + + [ApplicationCache interface object length] + expected: FAIL + + [SVGElement interface: attribute onsecuritypolicyviolation] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation resetTransform()] + expected: FAIL + + [OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [DataTransferItem interface: existence and properties of interface prototype object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality] + expected: FAIL + + [SVGElement interface: attribute onprogress] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, optional CanvasFillRule)] + expected: FAIL + + [ApplicationCache interface: existence and properties of interface prototype object] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute imageSmoothingQuality] + expected: FAIL + + [DOMStringList interface: calling contains(DOMString) on location.ancestorOrigins with too few arguments must throw TypeError] + expected: FAIL + + [CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [Navigator interface: attribute hardwareConcurrency] + expected: FAIL + + [ApplicationCache interface: constant CHECKING on interface object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute lineJoin] + expected: FAIL + + [WebSocket interface: attribute extensions] + expected: FAIL + + [SVGElement interface: attribute oncanplay] + expected: FAIL + + [Stringification of window.applicationCache] + expected: FAIL + + [Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [ElementInternals interface: attribute validationMessage] + expected: FAIL + + [DataTransfer interface: attribute dropEffect] + expected: FAIL + + [SharedWorker interface: attribute onerror] + expected: FAIL + + [OffscreenCanvas interface: attribute height] + expected: FAIL + + [Stringification of location.ancestorOrigins] + expected: FAIL + + [External interface: operation IsSearchProviderInstalled()] + expected: FAIL + + [SVGElement interface: attribute onwheel] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type] + expected: FAIL + + [DataTransferItemList interface object length] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: existence and properties of interface object] + expected: FAIL + + [ApplicationCache interface: attribute oncached] + expected: FAIL + + [DataTransferItemList interface: operation remove(unsigned long)] + expected: FAIL + + [BarProp interface object length] + expected: FAIL + + [SVGElement interface: attribute onstalled] + expected: FAIL + + [SVGSVGElement interface: attribute onbeforeunload] + expected: FAIL + + [ImageBitmapRenderingContext interface object name] + expected: FAIL + + [Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)] + expected: FAIL + + [External interface: operation AddSearchProvider()] + expected: FAIL + + [BarProp interface object name] + expected: FAIL + + [ApplicationCache interface: constant IDLE on interface prototype object] + expected: FAIL + + [DOMStringList must be primary interface of location.ancestorOrigins] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)] + expected: FAIL + + [DataTransfer interface: operation setDragImage(Element, long, long)] + expected: FAIL + + [SVGElement interface: attribute onpaste] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute font] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "oscpu" with the proper type] + expected: FAIL + + [Location interface: window.location must have own property "ancestorOrigins"] + expected: FAIL + + [CanvasPattern interface: operation setTransform(optional DOMMatrix2DInit)] + expected: FAIL + + [SVGElement interface: attribute onscroll] + expected: FAIL + + [DOMStringList interface: location.ancestorOrigins must inherit property "length" with the proper type] + expected: FAIL + + [ApplicationCache interface: constant UNCACHED on interface prototype object] + expected: FAIL + + [Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute textBaseline] + expected: FAIL + + [SVGElement interface: attribute dataset] + expected: FAIL + + [DataTransferItemList interface: operation add(DOMString, DOMString)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onwebkittransitionend] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type] + expected: FAIL + + [SVGSVGElement interface: attribute onoffline] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type] + expected: FAIL + + [Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [SVGElement interface: attribute autofocus] + expected: FAIL + + [External interface object length] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute filter] + expected: FAIL + + [SVGElement interface: attribute ontimeupdate] + expected: FAIL + + [SVGElement interface: attribute onmouseover] + expected: FAIL + + [Path2D interface: operation addPath(Path2D, optional DOMMatrix2DInit)] + expected: FAIL + + [BarProp interface: existence and properties of interface object] + expected: FAIL + + [ApplicationCache interface: operation abort()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation clip(optional CanvasFillRule)] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type] + expected: FAIL + + [SVGElement interface: attribute ondragover] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "languages" with the proper type] + expected: FAIL + + [DragEvent interface object name] + expected: FAIL + + [ApplicationCache interface: operation swapCache()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute globalAlpha] + expected: FAIL + + [ImageBitmapRenderingContext interface: existence and properties of interface object] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type] + expected: FAIL + + [CanvasRenderingContext2D interface: operation getContextAttributes()] + expected: FAIL + + [Navigator interface: attribute oscpu] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)] + expected: FAIL + + [CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [DataTransfer interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation] + expected: FAIL + + [CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)] + expected: FAIL + + [SharedWorker interface: existence and properties of interface prototype object] + expected: FAIL + + [ApplicationCache interface: attribute onnoupdate] + expected: FAIL + + [Path2D interface: existence and properties of interface object] + expected: FAIL + + [External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation beginPath()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, optional CanvasFillRule)] + expected: FAIL + + [SVGElement interface: attribute tabIndex] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [SVGElement interface: attribute ondrag] + expected: FAIL + + [SVGElement interface: attribute onerror] + expected: FAIL + + [SVGElement interface: attribute onplaying] + expected: FAIL + + [DataTransfer interface: attribute items] + expected: FAIL + + [External must be primary interface of window.external] + expected: FAIL + + [Path2D interface object name] + expected: FAIL + + [ApplicationCache interface: constant OBSOLETE on interface object] + expected: FAIL + + [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique] + expected: FAIL + + [ApplicationCache interface: attribute onchecking] + expected: FAIL + + [DataTransferItemList interface: existence and properties of interface prototype object] + expected: FAIL + + [DataTransferItem interface: attribute kind] + expected: FAIL + + [External interface object name] + expected: FAIL + + [SVGElement interface: attribute onwebkitanimationiteration] + expected: FAIL + + [Path2D interface object length] + expected: FAIL + + [Path2D interface: existence and properties of interface prototype object] + expected: FAIL + + [DragEvent interface: existence and properties of interface prototype object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute lineCap] + expected: FAIL + + [OffscreenCanvas interface: attribute width] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute shadowBlur] + expected: FAIL + + [ApplicationCache interface: constant DOWNLOADING on interface object] + expected: FAIL + + [DataTransferItem interface: attribute type] + expected: FAIL + + [Navigator interface: attribute languages] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute direction] + expected: FAIL + + [SVGSVGElement interface: attribute onpopstate] + expected: FAIL + + [DOMStringList interface: location.ancestorOrigins must inherit property "contains(DOMString)" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [DOMStringList interface: location.ancestorOrigins must inherit property "item(unsigned long)" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface object name] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [Path2D interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation getTransform()] + expected: FAIL + + [SVGElement interface: attribute onmouseenter] + expected: FAIL + + [Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)] + expected: FAIL + + [SharedWorker interface object length] + expected: FAIL + + [Path2D interface: operation lineTo(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)] + expected: FAIL + + [CustomElementRegistry interface: operation whenDefined(DOMString)] + expected: FAIL + + [DragEvent interface: existence and properties of interface object] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type] + expected: FAIL + + [ElementInternals interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)] + expected: FAIL + + [ElementInternals interface: attribute willValidate] + expected: FAIL + + [OffscreenCanvas interface object length] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type] + expected: FAIL + + [ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [DataTransferItem interface: operation getAsString(FunctionStringCallback?)] + expected: FAIL + + [SVGElement interface: attribute nonce] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)] + expected: FAIL + + [ImageBitmap interface: operation close()] + expected: FAIL + + [DataTransfer interface: attribute files] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString)" with the proper type] + expected: FAIL + + [ElementInternals interface: existence and properties of interface prototype object] + expected: FAIL + + [OffscreenCanvas interface object name] + expected: FAIL + + [SVGElement interface: attribute onresize] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, optional boolean)] + expected: FAIL + + [SVGElement interface: attribute onmousemove] + expected: FAIL + + [SVGSVGElement interface: attribute onafterprint] + expected: FAIL + + [External interface: existence and properties of interface object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute textAlign] + expected: FAIL + + [ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onvolumechange] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type] + expected: FAIL + + [CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [DataTransfer interface: attribute effectAllowed] + expected: FAIL + + [SharedWorker interface object name] + expected: FAIL + + [ImageBitmapRenderingContext interface: attribute canvas] + expected: FAIL + + [Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onslotchange] + expected: FAIL + + [ImageBitmapRenderingContext interface object length] + expected: FAIL + + [DataTransfer interface object name] + expected: FAIL + + [OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [SVGElement interface: attribute ondragexit] + expected: FAIL + + [SVGElement interface: attribute onmousedown] + expected: FAIL + + [SVGElement interface: attribute onpause] + expected: FAIL + + [SVGElement interface: attribute onformdata] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type] + expected: FAIL + + [ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap?)] + expected: FAIL + + [DragEvent interface object length] + expected: FAIL + + [ApplicationCache interface: constant UPDATEREADY on interface object] + expected: FAIL + + [SVGElement interface: attribute onmouseout] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type] + expected: FAIL + + [Navigator interface: attribute onLine] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface object length] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation getLineDash()] + expected: FAIL + + [SVGSVGElement interface: attribute onmessage] + expected: FAIL + + [ElementInternals interface object name] + expected: FAIL + + [SVGElement interface: attribute onmouseup] + expected: FAIL + + [SVGElement interface: attribute onblur] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, optional CanvasFillRule)] + expected: FAIL + + [ElementInternals interface: attribute validity] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute textAlign] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation restore()] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type] + expected: FAIL + + [DataTransferItem interface: existence and properties of interface object] + expected: FAIL + + [ElementInternals interface: operation checkValidity()] + expected: FAIL + + [Location interface: stringifier] + expected: FAIL + + [SVGElement interface: attribute onkeypress] + expected: FAIL + + [DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [SVGElement interface: attribute oncancel] + expected: FAIL + + [CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)] + expected: FAIL + + [ApplicationCache interface: attribute onupdateready] + expected: FAIL + + [SVGElement interface: operation focus(optional FocusOptions)] + expected: FAIL + + [ApplicationCache interface object name] + expected: FAIL + + [DataTransferItemList interface: existence and properties of interface object] + expected: FAIL + + [ApplicationCache interface: attribute onerror] + expected: FAIL + + [ApplicationCache interface: constant DOWNLOADING on interface prototype object] + expected: FAIL + + [SVGSVGElement interface: attribute onmessageerror] + expected: FAIL + + [TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type] + expected: FAIL + + [WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type] + expected: FAIL + + [SVGSVGElement interface: attribute onhashchange] + expected: FAIL + + [CanvasRenderingContext2D interface: calling setLineDash(sequence<unrestricted double>) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [PromiseRejectionEvent interface: attribute promise] + expected: FAIL + + [SharedWorker interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ApplicationCache interface: existence and properties of interface object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [ApplicationCache interface: constant CHECKING on interface prototype object] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation stroke()] + expected: FAIL + + [ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [OffscreenCanvas interface: existence and properties of interface object] + expected: FAIL + + [TextTrack interface: attribute inBandMetadataTrackDispatchType] + expected: FAIL + + [DataTransferItem interface object name] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object] + expected: FAIL + + [ApplicationCache interface: attribute ondownloading] + expected: FAIL + + [Navigator interface: calling registerProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError] + expected: FAIL + + [CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [SVGElement interface: operation blur()] + expected: FAIL + + [DataTransfer interface: operation setData(DOMString, DOMString)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute miterLimit] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, optional CanvasFillRule)] + expected: FAIL + + [SVGElement interface: attribute onseeked] + expected: FAIL + + [SVGSVGElement interface: attribute onlanguagechange] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [SVGElement interface: attribute onabort] + expected: FAIL + + [DataTransferItem interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [SVGSVGElement interface: attribute onrejectionhandled] + expected: FAIL + + [ElementInternals interface: attribute form] + expected: FAIL + + [SVGElement interface: attribute onratechange] + expected: FAIL + + [Path2D interface: operation moveTo(unrestricted double, unrestricted double)] + expected: FAIL + + [DragEvent interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [CanvasRenderingContext2D interface: operation setTransform(optional DOMMatrix2DInit)] + expected: FAIL + + [ApplicationCache interface: operation update()] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: attribute font] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double)] + expected: FAIL + + [SVGElement interface: attribute onwaiting] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type] + expected: FAIL + + [SVGElement interface: attribute ondragleave] + expected: FAIL + + [DataTransfer interface object length] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type] + expected: FAIL + + [CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, optional unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] + expected: FAIL + + [SVGElement interface: attribute onfocus] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation setTransform(optional DOMMatrix2DInit)] + expected: FAIL + + [ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type] + expected: FAIL + + [OffscreenCanvas interface: operation transferToImageBitmap()] + expected: FAIL + + [SVGElement interface: attribute onseeking] + expected: FAIL + + [DataTransfer interface: attribute types] + expected: FAIL + + [SVGElement interface: attribute onloadedmetadata] + expected: FAIL + + [SVGElement interface: attribute onkeydown] + expected: FAIL + + [CanvasRenderingContext2D interface: attribute textBaseline] + expected: FAIL + + [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type] + expected: FAIL + + [ApplicationCache interface: constant IDLE on interface object] + expected: FAIL + + [DataTransfer interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [OffscreenCanvasRenderingContext2D interface: operation save()] + expected: FAIL + + [ApplicationCache interface: attribute onobsolete] + expected: FAIL + + [ElementInternals interface: operation setFormValue((File or USVString or FormData)?, optional (File or USVString or FormData)?)] + expected: FAIL + + +[idlharness.https.html?include=(Document|Window)] + [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "external" with the proper type] + expected: FAIL + + [Window interface: attribute onwebkitanimationstart] + expected: FAIL + + [Window interface: window must inherit property "statusbar" with the proper type] + expected: FAIL + + [Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions) on window with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: new Document() must inherit property "onwebkittransitionend" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandEnabled(DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: operation createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions)] + expected: FAIL + + [Document interface: new Document() must inherit property "onwebkitanimationstart" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "onsecuritypolicyviolation" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandIndeterm(DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onwebkitanimationend" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "dir" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "onwebkitanimationiteration" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type] + expected: FAIL + + [Window interface: attribute onsecuritypolicyviolation] + expected: FAIL + + [Window interface: window must inherit property "applicationCache" with the proper type] + expected: FAIL + + [Document interface: attribute onauxclick] + expected: FAIL + + [Window interface: window must inherit property "menubar" with the proper type] + expected: FAIL + + [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false] + expected: FAIL + + [Document interface: new Document() must inherit property "onwebkitanimationiteration" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandSupported(DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: attribute designMode] + expected: FAIL + + [Document interface: attribute dir] + expected: FAIL + + [Document interface: new Document() must inherit property "designMode" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions)" with the proper type] + expected: FAIL + + [Window interface: attribute locationbar] + expected: FAIL + + [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: attribute onwebkitanimationiteration] + expected: FAIL + + [Document interface: operation queryCommandEnabled(DOMString)] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type] + expected: FAIL + + [Window interface: operation print()] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "vlinkColor" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type] + expected: FAIL + + [Document interface: attribute all] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type] + expected: FAIL + + [Window interface: existence and properties of interface prototype object] + expected: FAIL + + [Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: operation focus()] + expected: FAIL + + [Window interface: attribute scrollbars] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onslotchange" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "alinkColor" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "dir" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "onslotchange" with the proper type] + expected: FAIL + + [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique] + expected: FAIL + + [Window interface: attribute applicationCache] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onwebkitanimationstart" with the proper type] + expected: FAIL + + [Document interface: attribute onslotchange] + expected: FAIL + + [Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onwebkitanimationiteration" with the proper type] + expected: FAIL + + [Document interface: operation queryCommandSupported(DOMString)] + expected: FAIL + + [Document interface: attribute onwebkittransitionend] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "all" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type] + expected: FAIL + + [Document interface: attribute linkColor] + expected: FAIL + + [Window interface: attribute onwebkitanimationiteration] + expected: FAIL + + [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions)" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "scrollbars" with the proper type] + expected: FAIL + + [Window interface: attribute personalbar] + expected: FAIL + + [Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "designMode" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onwebkitanimationiteration" with the proper type] + expected: FAIL + + [Window interface: attribute toolbar] + expected: FAIL + + [Window interface: attribute statusbar] + expected: FAIL + + [Window interface: window must inherit property "onwebkittransitionend" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "linkColor" with the proper type] + expected: FAIL + + [Document interface: attribute alinkColor] + expected: FAIL + + [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type] + expected: FAIL + + [Window interface: attribute onwebkittransitionend] + expected: FAIL + + [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: new Document() must inherit property "onslotchange" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "designMode" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "queryCommandValue(DOMString)" with the proper type] + expected: FAIL + + [Document interface: operation queryCommandValue(DOMString)] + expected: FAIL + + [Window interface: window must inherit property "personalbar" with the proper type] + expected: FAIL + + [Document interface: attribute onwebkitanimationend] + expected: FAIL + + [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError] + expected: FAIL + + [Document interface: new Document() must inherit property "dir" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "blur()" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type] + expected: FAIL + + [Document interface: operation execCommand(DOMString, optional boolean, optional DOMString)] + expected: FAIL + + [Document interface: attribute onsecuritypolicyviolation] + expected: FAIL + + [Window interface: attribute menubar] + expected: FAIL + + [Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: operation queryCommandState(DOMString)] + expected: FAIL + + [Document interface: attribute vlinkColor] + expected: FAIL + + [Window interface: window must inherit property "onauxclick" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: operation blur()] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "alinkColor" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type] + expected: FAIL + + [Window interface: attribute onslotchange] + expected: FAIL + + [Document interface: new Document() must inherit property "all" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "all" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "print()" with the proper type] + expected: FAIL + + [Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, optional ImageBitmapOptions)] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "focus()" with the proper type] + expected: FAIL + + [Window interface: calling createImageBitmap(ImageBitmapSource, optional ImageBitmapOptions) on window with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "onauxclick" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onwebkitanimationstart" with the proper type] + expected: FAIL + + [Document interface: attribute onwebkitanimationstart] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandValue(DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: attribute external] + expected: FAIL + + [Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: attribute onauxclick] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, optional boolean, optional DOMString)" with the proper type] + expected: FAIL + + [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onsecuritypolicyviolation" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "queryCommandSupported(DOMString)" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "onwebkitanimationend" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "toolbar" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "linkColor" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "onwebkitanimationend" with the proper type] + expected: FAIL + + [Document interface: operation queryCommandIndeterm(DOMString)] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onwebkittransitionend" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError] + expected: FAIL + + [Window interface: attribute onwebkitanimationend] + expected: FAIL + + [Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "queryCommandState(DOMString)" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onwebkittransitionend" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "vlinkColor" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "locationbar" with the proper type] + expected: FAIL + + [Window interface: window must inherit property "onwebkitanimationstart" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "queryCommandIndeterm(DOMString)" with the proper type] + expected: FAIL + + [Document interface: calling queryCommandState(DOMString) on documentWithHandlers with too few arguments must throw TypeError] + expected: FAIL + + +[idlharness.https.html?include=HTML.*] + [HTMLFormElement interface: calling requestSubmit(optional HTMLElement?) on document.createElement("form") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "getSVGDocument()" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: calling assignedNodes(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: existence and properties of interface prototype object] + expected: FAIL + + [HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: attribute ping] + expected: FAIL + + [HTMLIFrameElement interface: attribute marginHeight] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLElement interface: operation attachInternals()] + expected: FAIL + + [HTMLVideoElement interface: attribute playsInline] + expected: FAIL + + [HTMLCanvasElement interface: operation toBlob(BlobCallback, optional DOMString, optional any)] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type] + expected: FAIL + + [HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: attribute seekable] + expected: FAIL + + [HTMLTableSectionElement interface: attribute align] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute codeBase] + expected: FAIL + + [HTMLSlotElement interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [HTMLFrameElement interface: attribute src] + expected: FAIL + + [HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(optional AssignedNodesOptions)" with the proper type] + expected: FAIL + + [HTMLTableRowElement interface: attribute ch] + expected: FAIL + + [HTMLMarqueeElement interface: attribute loop] + expected: FAIL + + [HTMLAllCollection interface: operation namedItem(DOMString)] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLFrameSetElement interface: attribute cols] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute accessKey] + expected: FAIL + + [HTMLFormElement interface: attribute rel] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type] + expected: FAIL + + [HTMLHRElement interface: attribute size] + expected: FAIL + + [HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute sizes] + expected: FAIL + + [HTMLParamElement interface: attribute value] + expected: FAIL + + [HTMLTableColElement interface: attribute width] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface object length] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLAllCollection interface object length] + expected: FAIL + + [HTMLTableRowElement interface: attribute chOff] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: attribute length] + expected: FAIL + + [HTMLLegendElement interface: attribute align] + expected: FAIL + + [HTMLMarqueeElement interface: attribute hspace] + expected: FAIL + + [HTMLMarqueeElement interface: attribute vspace] + expected: FAIL + + [HTMLTableCellElement interface: attribute vAlign] + expected: FAIL + + [HTMLQuoteElement interface: attribute cite] + expected: FAIL + + [HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type] + expected: FAIL + + [HTMLMapElement interface: attribute name] + expected: FAIL + + [HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: attribute ch] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: attribute value] + expected: FAIL + + [HTMLFrameElement interface: attribute marginWidth] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type] + expected: FAIL + + [Stringification of document.createElement("marquee")] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: existence and properties of interface prototype object] + expected: FAIL + + [HTMLAreaElement interface: attribute protocol] + expected: FAIL + + [HTMLTableRowElement interface: attribute vAlign] + expected: FAIL + + [HTMLAnchorElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLFieldSetElement interface: attribute type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLOListElement interface: attribute type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: operation getSVGDocument()] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: attribute longDesc] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute decoding] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: attribute vAlign] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLStyleElement interface: attribute media] + expected: FAIL + + [HTMLEmbedElement interface: operation getSVGDocument()] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "autocapitalize" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute onsecuritypolicyviolation] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLSelectElement interface: attribute selectedOptions] + expected: FAIL + + [HTMLBodyElement interface: attribute aLink] + expected: FAIL + + [HTMLFrameElement interface: attribute noResize] + expected: FAIL + + [HTMLTableCellElement interface: attribute noWrap] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: stringifier] + expected: FAIL + + [HTMLSlotElement interface: existence and properties of interface object] + expected: FAIL + + [HTMLTableColElement interface: attribute align] + expected: FAIL + + [HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type] + expected: FAIL + + [HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute name] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type] + expected: FAIL + + [HTMLHeadingElement interface: attribute align] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: operation play()] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type] + expected: FAIL + + [HTMLAllCollection interface object name] + expected: FAIL + + [HTMLTableElement interface: attribute border] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "decoding" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute onwebkitanimationiteration] + expected: FAIL + + [HTMLElement interface: attribute onslotchange] + expected: FAIL + + [HTMLVideoElement interface: attribute width] + expected: FAIL + + [HTMLIFrameElement interface: attribute marginWidth] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute align] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: attribute low] + expected: FAIL + + [HTMLEmbedElement interface: attribute height] + expected: FAIL + + [HTMLElement interface: attribute autofocus] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLDirectoryElement interface: attribute compact] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLAudioElement interface: named constructor without 'new'] + expected: FAIL + + [HTMLSlotElement interface: calling assignedElements(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: attribute name] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute contentDocument] + expected: FAIL + + [HTMLMarqueeElement interface: attribute onstart] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type] + expected: FAIL + + [HTMLProgressElement interface: attribute position] + expected: FAIL + + [HTMLAreaElement interface: attribute shape] + expected: FAIL + + [HTMLObjectElement interface: attribute vspace] + expected: FAIL + + [HTMLSlotElement must be primary interface of document.createElement("slot")] + expected: FAIL + + [HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: attribute type] + expected: FAIL + + [HTMLElement interface: attribute onwebkitanimationend] + expected: FAIL + + [HTMLInputElement interface: attribute height] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: attribute align] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: attribute axis] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: attribute files] + expected: FAIL + + [Stringification of document.all] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type] + expected: FAIL + + [HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute frame] + expected: FAIL + + [HTMLParamElement interface: attribute valueType] + expected: FAIL + + [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute summary] + expected: FAIL + + [HTMLDialogElement interface: operation show()] + expected: FAIL + + [HTMLUListElement interface: attribute type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute longDesc] + expected: FAIL + + [HTMLTableCellElement interface: attribute abbr] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute scrollDelay] + expected: FAIL + + [HTMLCanvasElement interface: calling toBlob(BlobCallback, optional DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: document.all must inherit property "item(optional DOMString)" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: attribute ch] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" with the proper type] + expected: FAIL + + [HTMLBodyElement interface: attribute vLink] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type] + expected: FAIL + + [HTMLFormElement interface: operation requestSubmit(optional HTMLElement?)] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLImageElement interface: operation decode()] + expected: FAIL + + [HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: attribute contentWindow] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute lowsrc] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type] + expected: FAIL + + [HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute align] + expected: FAIL + + [HTMLElement interface: attribute enterKeyHint] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: attribute optimum] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLFormElement interface: attribute relList] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type] + expected: FAIL + + [HTMLParagraphElement interface: attribute align] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute ping] + expected: FAIL + + [HTMLInputElement interface: attribute width] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: attribute hreflang] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute cellSpacing] + expected: FAIL + + [HTMLMarqueeElement must be primary interface of document.createElement("marquee")] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: attribute marginHeight] + expected: FAIL + + [HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLScriptElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute tabIndex] + expected: FAIL + + [HTMLElement interface: attribute onwebkitanimationstart] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "loading" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: operation stop()] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: attribute frameBorder] + expected: FAIL + + [HTMLAreaElement interface: attribute rel] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "decode()" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute bgColor] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute data] + expected: FAIL + + [HTMLCanvasElement interface: operation transferControlToOffscreen()] + expected: FAIL + + [HTMLMarqueeElement interface object name] + expected: FAIL + + [HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLUListElement interface: attribute compact] + expected: FAIL + + [HTMLOListElement interface: attribute compact] + expected: FAIL + + [HTMLMeterElement interface: attribute high] + expected: FAIL + + [HTMLProgressElement interface: attribute max] + expected: FAIL + + [HTMLBRElement interface: attribute clear] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type] + expected: FAIL + + [HTMLHtmlElement interface: attribute version] + expected: FAIL + + [HTMLAreaElement interface: attribute download] + expected: FAIL + + [HTMLMeterElement interface: attribute max] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute height] + expected: FAIL + + [HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute trueSpeed] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute loading] + expected: FAIL + + [HTMLBodyElement interface: attribute link] + expected: FAIL + + [HTMLAnchorElement interface: attribute download] + expected: FAIL + + [HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute rules] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute origin] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type] + expected: FAIL + + [HTMLTableSectionElement interface: attribute chOff] + expected: FAIL + + [HTMLAreaElement interface: attribute hash] + expected: FAIL + + [HTMLMarqueeElement interface: existence and properties of interface prototype object] + expected: FAIL + + [HTMLAllCollection interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLSlotElement interface object name] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: document.all must inherit property "length" with the proper type] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type] + expected: FAIL + + [HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute inputMode] + expected: FAIL + + [HTMLMarqueeElement interface: attribute behavior] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationend" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute height] + expected: FAIL + + [HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type] + expected: FAIL + + [HTMLLIElement interface: attribute type] + expected: FAIL + + [HTMLTableCellElement interface: attribute scope] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute href] + expected: FAIL + + [HTMLTableSectionElement interface: attribute ch] + expected: FAIL + + [HTMLTableCellElement interface: attribute chOff] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLOListElement interface: attribute reversed] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type] + expected: FAIL + + [HTMLTableRowElement interface: attribute align] + expected: FAIL + + [HTMLTableCellElement interface: attribute headers] + expected: FAIL + + [HTMLModElement interface: attribute cite] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type] + expected: FAIL + + [HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: attribute align] + expected: FAIL + + [HTMLVideoElement interface: attribute height] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: calling item(optional DOMString) on document.all with too few arguments must throw TypeError] + expected: FAIL + + [HTMLAllCollection interface: operation item(optional DOMString)] + expected: FAIL + + [HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute password] + expected: FAIL + + [HTMLMapElement interface: attribute areas] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: attribute as] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLOptionElement interface: named constructor without 'new'] + expected: FAIL + + [SVGAElement includes HTMLHyperlinkElementUtils: member names are unique] + expected: FAIL + + [HTMLAreaElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLPreElement interface: attribute width] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute declare] + expected: FAIL + + [HTMLMetaElement interface: attribute scheme] + expected: FAIL + + [HTMLLinkElement interface: attribute imageSizes] + expected: FAIL + + [HTMLTableCaptionElement interface: attribute align] + expected: FAIL + + [HTMLAreaElement interface: attribute alt] + expected: FAIL + + [HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type] + expected: FAIL + + [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute contentWindow] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type] + expected: FAIL + + [HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLParamElement interface: attribute name] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute accessKeyLabel] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLDialogElement interface: operation showModal()] + expected: FAIL + + [HTMLTableCellElement interface: attribute height] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute referrerPolicy] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLFormElement interface: document.createElement("form") must inherit property "requestSubmit(optional HTMLElement?)" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLAnchorElement interface: attribute charset] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute coords] + expected: FAIL + + [HTMLInputElement interface: attribute useMap] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute spellcheck] + expected: FAIL + + [HTMLObjectElement interface: attribute archive] + expected: FAIL + + [HTMLMetaElement interface: attribute httpEquiv] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute noHref] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type] + expected: FAIL + + [HTMLTableSectionElement interface: attribute vAlign] + expected: FAIL + + [HTMLMarqueeElement interface: attribute onfinish] + expected: FAIL + + [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, optional DOMString, optional any)" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute onauxclick] + expected: FAIL + + [HTMLObjectElement interface: attribute useMap] + expected: FAIL + + [HTMLElement interface: attribute draggable] + expected: FAIL + + [HTMLMarqueeElement interface: attribute direction] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute border] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLTextAreaElement interface: attribute autocomplete] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute port] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: attribute name] + expected: FAIL + + [Stringification of document.createElement("slot")] + expected: FAIL + + [HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute hostname] + expected: FAIL + + [HTMLTableColElement interface: attribute span] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute codeType] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: attribute src] + expected: FAIL + + [HTMLAllCollection interface: existence and properties of interface object] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute width] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: operation getSVGDocument()] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute allowPaymentRequest] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: operation assignedElements(optional AssignedNodesOptions)] + expected: FAIL + + [HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute host] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute code] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type] + expected: FAIL + + [HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLOListElement interface: attribute start] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: attribute sizes] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLBaseElement interface: attribute target] + expected: FAIL + + [HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type] + expected: FAIL + + [HTMLOutputElement interface: attribute htmlFor] + expected: FAIL + + [HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute standby] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type] + expected: FAIL + + [HTMLParamElement interface: attribute type] + expected: FAIL + + [HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type] + expected: FAIL + + [HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: operation start()] + expected: FAIL + + [HTMLEmbedElement interface: attribute type] + expected: FAIL + + [HTMLFrameElement interface: attribute name] + expected: FAIL + + [HTMLAreaElement interface: attribute search] + expected: FAIL + + [HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "decode()" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type] + expected: FAIL + + [HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "loading" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: operation getStartDate()] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute onwebkittransitionend] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: attribute width] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type] + expected: FAIL + + [HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type] + expected: FAIL + + [HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute align] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute width] + expected: FAIL + + [HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "decoding" with the proper type] + expected: FAIL + + [HTMLAllCollection interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [HTMLImageElement interface: named constructor without 'new'] + expected: FAIL + + [HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type] + expected: FAIL + + [HTMLSlotElement interface object length] + expected: FAIL + + [HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type] + expected: FAIL + + [HTMLSelectElement interface: attribute autocomplete] + expected: FAIL + + [HTMLInputElement interface: attribute align] + expected: FAIL + + [HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute username] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLElement interface: attribute nonce] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: attribute autocomplete] + expected: FAIL + + [HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: attribute hspace] + expected: FAIL + + [HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(optional AssignedNodesOptions)" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type] + expected: FAIL + + [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLTableElement interface: attribute cellPadding] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" with the proper type] + expected: FAIL + + [HTMLStyleElement interface: attribute type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: attribute min] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type] + expected: FAIL + + [HTMLFrameElement interface: attribute contentDocument] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: existence and properties of interface object] + expected: FAIL + + [HTMLElement interface: attribute autocapitalize] + expected: FAIL + + [HTMLFrameSetElement interface: attribute rows] + expected: FAIL + + [HTMLLinkElement interface: attribute imageSrcset] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type] + expected: FAIL + + [HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type] + expected: FAIL + + [HTMLTableColElement interface: attribute chOff] + expected: FAIL + + [HTMLFrameElement interface: attribute scrolling] + expected: FAIL + + [HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute onbounce] + expected: FAIL + + [HTMLModElement interface: attribute dateTime] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: attribute scrollAmount] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute scrolling] + expected: FAIL + + [HTMLDListElement interface: attribute compact] + expected: FAIL + + [HTMLHRElement interface: attribute noShade] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type] + expected: FAIL + + [HTMLIFrameElement interface: attribute allow] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type] + expected: FAIL + + [HTMLProgressElement interface: attribute value] + expected: FAIL + + [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type] + expected: FAIL + + [HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type] + expected: FAIL + + [HTMLAreaElement interface: attribute pathname] + expected: FAIL + + [HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type] + expected: FAIL + + [HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type] + expected: FAIL + + [HTMLOptGroupElement interface: attribute label] + expected: FAIL + + [HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type] + expected: FAIL + + [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type] + expected: FAIL + + [HTMLSlotElement interface: operation assignedNodes(optional AssignedNodesOptions)] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini index af14e19a466..d81ae5a4949 100644 --- a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini +++ b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini @@ -7,14 +7,11 @@ expected: NOTRUN [Element with tabindex should support autofocus] - expected: TIMEOUT + expected: FAIL [Area element should support autofocus] expected: NOTRUN [Host element with delegatesFocus should support autofocus] - expected: NOTRUN - - [Non-HTMLElement should not support autofocus] - expected: NOTRUN + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index d913fcbb129..3080be9afc0 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,5 +1,5 @@ [iframe_sandbox_popups_nonescaping-1.html] - expected: TIMEOUT + expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index 0407f0cc2b7..9eb581fcf1f 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,5 +1,5 @@ [iframe_sandbox_popups_nonescaping-2.html] - expected: TIMEOUT + expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini index a1effd5f801..5ddb9bfeff6 100644 --- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini +++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini @@ -1,9 +1,10 @@ [promise-job-entry.html] + expected: TIMEOUT [Fulfillment handler on fulfilled promise] expected: FAIL [Rejection handler on pending-then-rejected promise] - expected: FAIL + expected: TIMEOUT [Sanity check: this all works as expected with no promises involved] expected: FAIL @@ -15,5 +16,5 @@ expected: FAIL [Fulfillment handler on pending-then-fulfilled promise] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini b/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini new file mode 100644 index 00000000000..4af6bc07bbf --- /dev/null +++ b/tests/wpt/metadata-layout-2020/wasm/jsapi/proto-from-ctor-realm.html.ini @@ -0,0 +1,226 @@ +[proto-from-ctor-realm.html] + [WebAssembly.Table: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Global: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Global: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Module: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Instance: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Memory: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Memory: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Module: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Instance: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Global: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Instance: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Table: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Table: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Table: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `true` prototype] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini index 77e81d04bc6..939fce46e68 100644 --- a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini +++ b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini @@ -98,3 +98,6 @@ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 39026.\n\t[39026\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] expected: FAIL + [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 40530 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 29020.\n\t[29020\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini new file mode 100644 index 00000000000..ba041c725fd --- /dev/null +++ b/tests/wpt/metadata-layout-2020/webxr/hit-test/idlharness.https.html.ini @@ -0,0 +1,73 @@ +[idlharness.https.html] + [XRTransientInputHitTestSource interface object length] + expected: FAIL + + [XRFrame interface: operation getHitTestResultsForTransientInput(XRTransientInputHitTestSource)] + expected: FAIL + + [XRRay interface: new XRRay() must inherit property "matrix" with the proper type] + expected: FAIL + + [XRSession interface: operation requestHitTestSource(XRHitTestOptionsInit)] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object] + expected: FAIL + + [XRTransientInputHitTestSource interface object name] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface object] + expected: FAIL + + [XRTransientInputHitTestResult interface object name] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [XRSession interface: calling requestHitTestSource(XRHitTestOptionsInit) on xrSession with too few arguments must throw TypeError] + expected: FAIL + + [XRTransientInputHitTestResult interface: attribute results] + expected: FAIL + + [XRSession interface: calling requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit) on xrSession with too few arguments must throw TypeError] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [XRTransientInputHitTestResult interface: attribute inputSource] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface object] + expected: FAIL + + [XRSession interface: xrSession must inherit property "requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)" with the proper type] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [idl_test setup] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object] + expected: FAIL + + [XRSession interface: xrSession must inherit property "requestHitTestSource(XRHitTestOptionsInit)" with the proper type] + expected: FAIL + + [XRTransientInputHitTestSource interface: operation cancel()] + expected: FAIL + + [XRSession interface: operation requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)] + expected: FAIL + + [XRTransientInputHitTestResult interface object length] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini index fd188fe15cb..9450b890385 100644 --- a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini @@ -278,3 +278,27 @@ [XRSession interface: operation end()] expected: FAIL + [XRLayer interface: existence and properties of interface prototype object] + expected: FAIL + + [XRLayer interface: existence and properties of interface object] + expected: FAIL + + [XRLayer interface object name] + expected: FAIL + + [XRLayer interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [XRWebGLLayer interface: existence and properties of interface object] + expected: FAIL + + [XRWebGLLayer interface: existence and properties of interface prototype object] + expected: FAIL + + [XRLayer interface object length] + expected: FAIL + + [XRLayer interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini deleted file mode 100644 index fe8654e447c..00000000000 --- a/tests/wpt/metadata-layout-2020/workers/WorkerGlobalScope-close.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[WorkerGlobalScope-close.html] - [Test sending a message after closing.] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini new file mode 100644 index 00000000000..80f9a4f15b8 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini @@ -0,0 +1,2 @@ +[Worker-constructor.html] + expected: ERROR diff --git a/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini b/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini index ea90f546c38..a97490ae566 100644 --- a/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini +++ b/tests/wpt/metadata-layout-2020/xhr/send-redirect-to-cors.htm.ini @@ -26,3 +26,9 @@ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (308 FOO with string and explicit Content-Type multipart/form-data)] expected: FAIL + [XMLHttpRequest: send() - Redirect to CORS-enabled resource (302 POST with string and explicit Content-Type)] + expected: FAIL + + [XMLHttpRequest: send() - Redirect to CORS-enabled resource (301 POST with string and explicit Content-Type)] + expected: FAIL + diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini new file mode 100644 index 00000000000..3ba71c8de11 --- /dev/null +++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html.ini @@ -0,0 +1,2 @@ +[drawImage-from-blob.tentative.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index faa00f45ecf..d4f62ed7113 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: TIMEOUT diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index adb68e3e2e5..9056496675b 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -23821,6 +23821,19 @@ {} ] ], + "drawImage-from-blob.tentative.html": [ + "633f7e4f7e3e8b5e36129f54fe7a0fb46642144a", + [ + null, + [ + [ + "/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html", + "==" + ] + ], + {} + ] + ], "drawImage-from-element-orientation-none.tentative.html": [ "e18beb9e3cd78cd6bc575f06e5904cc8d21ee63e", [ @@ -118357,6 +118370,45 @@ {} ] ], + "background-margin-iframe-root.html": [ + "08464fc9eb408f892a9a9922c3d923c380e82d26", + [ + null, + [ + [ + "/css/css-backgrounds/background-margin-iframe-root-ref.html", + "==" + ] + ], + {} + ] + ], + "background-margin-root.html": [ + "cbba6c012d0efd79fd18430d32d93554b11932d0", + [ + null, + [ + [ + "/css/css-backgrounds/background-margin-root-ref.html", + "==" + ] + ], + {} + ] + ], + "background-margin-transformed-root.html": [ + "87129f38184deb949cbdfb07e42ca5f35237f410", + [ + null, + [ + [ + "/css/css-backgrounds/background-margin-transformed-root-ref.html", + "==" + ] + ], + {} + ] + ], "background-origin-002.html": [ "e86311f799f442c9fe634763408dfe4623977891", [ @@ -136859,6 +136911,84 @@ {} ] ], + "gap-011.html": [ + "d1d579e30b8779634d94d4bfc5cfdcfd6200e9f6", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "gap-012.html": [ + "19b39b9a783d0aef9db8a0bef2c04c489a62bf21", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "gap-013.html": [ + "30e4c43e7193525ab6c7ea88b472d6b05b8204da", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "gap-014.html": [ + "c600478c73cd6436ddfd6e025612f1b74d401699", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "gap-015.html": [ + "e54598e2000f727b0b5bf6091bc002b635779d4e", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "gap-016.html": [ + "a54417725678f99e77773805dc8a70b86eb77c9e", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "image-items-flake-001.html": [ "90319f1ad83d26d414d8ddcd4a9ab59042a4bd62", [ @@ -178162,6 +178292,19 @@ {} ] ], + "backface-visibility-hidden-animated.html": [ + "6cdefad6620eef19e3bb61f2b590cbc4597e76c9", + [ + null, + [ + [ + "/css/css-transforms/backface-visibility-hidden-animated-ref.html", + "==" + ] + ], + {} + ] + ], "composited-under-rotateY-180deg-clip-perspective.html": [ "c694adf71d16cdfe365756ae05ec1818c61c9a32", [ @@ -182432,8 +182575,8 @@ ] ], "transform-box": { - "fill-box-mutation-001.html": [ - "1f0dfd01bb9ab6acf183721f23f8590293e9e32f", + "fill-box-001.html": [ + "7e9b133aead426b36702e5377c3cd1347e36ff5f", [ null, [ @@ -182445,8 +182588,8 @@ {} ] ], - "fill-box-mutation-002.html": [ - "676d5cdd03b25ce2c5d25df03237819196fa1a66", + "fill-box-002.html": [ + "9044048e387ec7e0a35c053ea1c425d964d4f6c2", [ null, [ @@ -182458,8 +182601,21 @@ {} ] ], - "fill-box.html": [ - "7e9b133aead426b36702e5377c3cd1347e36ff5f", + "fill-box-mutation-001.html": [ + "1f0dfd01bb9ab6acf183721f23f8590293e9e32f", + [ + null, + [ + [ + "/css/css-transforms/transform-box/reference/greensquare200x200.html", + "==" + ] + ], + {} + ] + ], + "fill-box-mutation-002.html": [ + "676d5cdd03b25ce2c5d25df03237819196fa1a66", [ null, [ @@ -184924,6 +185080,19 @@ {} ] ], + "transform-percent-010.html": [ + "92ebe78c1d504ed19e941f4522f5b6f42d2c3107", + [ + null, + [ + [ + "/css/css-transforms/transform-box/reference/greensquare200x200.html", + "==" + ] + ], + {} + ] + ], "transform-propagate-inherit-boolean-001.html": [ "1e27e76862f6e25e15544e1c2d7e1785aa7ce719", [ @@ -235635,6 +235804,19 @@ {} ] ], + "url-reference-local-textpath.svg": [ + "c90cfb317f474e5d0d8a53d2b869637fe64fba5b", + [ + null, + [ + [ + "/svg/linking/reftests/reference/green-100x100.svg", + "==" + ] + ], + {} + ] + ], "use-descendant-combinator-001.html": [ "5619e0ba6902656eacab0e69da808eb352247aa2", [ @@ -240812,7 +240994,7 @@ [] ], ".taskcluster.yml": [ - "556b9914d5b53f72010dd59831c710623a64ed57", + "7f794e8c2b0a4f042df6c5e9669db8f5b6a035fc", [] ], ".well-known": { @@ -241157,6 +241339,10 @@ "e945762eac716c5278eca8a0d1a6815a372f97b7", [] ], + "drawImage-from-blob-ref.html": [ + "72bd98fa2528eb9c420311287491a27d3301934c", + [] + ], "drawImage-from-element-orientation-none-ref.html": [ "b1e0c0849235cc13010f67ee26c58114c08c960a", [] @@ -244521,7 +244707,7 @@ [] ], "README.md": [ - "e7997c9fa26d86cb614bb5ad0dc5fdaa11d21f41", + "abe277712bc41d1d5f70a08d09e2e09945a156ab", [] ], "generate.py": [ @@ -244533,12 +244719,16 @@ [] ], "resources": { - "bluetooth-helpers.js": [ - "2d863b16037b3c1bcd5a222409cd7398d1fe078b", + "bluetooth-fake-devices.js": [ + "3bbcc6b322e435a4d8d5b70d59b43d29ccc3bf71", [] ], "bluetooth-scanning-helpers.js": [ - "9b173e6367ce2173336299e4ea005668ca53a03f", + "f474c9c3066f247f8f28558284e4de5d6326ff79", + [] + ], + "bluetooth-test.js": [ + "d2c6bcbdb73061d704eb5bc9ddf1b135e68ed9e8", [] ], "health-thermometer-iframe.html": [ @@ -244548,7 +244738,7 @@ }, "script-tests": { "base_test_js.template": [ - "c0fa4aed552db72575b8344c7e495680eac84916", + "e677f00f087d2d4bb4071543a2cee9a7da0ae851", [] ], "characteristic": { @@ -244752,8 +244942,16 @@ [] ], "resources": { + "accept-ch-and-redir-to-do-not-expect.py": [ + "eaca03fe76d474264226061ce639eb421dd28c94", + [] + ], + "accept-ch-and-redir-to-expect.py": [ + "835ef396b8bae0294088bc0231422c8c0f446a45", + [] + ], "accept-ch-test.js": [ - "46b499a5e4180f0ec1548f37ed2230af3eb7c5a8", + "5275057c3e5b4b8b4eeee81942b8bdfefa79233e", [] ], "accept-ch.html": [ @@ -244776,6 +244974,10 @@ "147206b26aeb8fe3f4813e4b1f68d7a59b658c46", [] ], + "do-not-expect-received.py": [ + "6b0e61af9dbaef571a1373c4d1020105bf38459e", + [] + ], "echo-client-hints-received.py": [ "be712293be3c749d98d328dd2fec7334da4ad9b2", [] @@ -244784,6 +244986,10 @@ "cda1f81978d9a8dbc7dd12286d8885f16007b9e0", [] ], + "expect-received.py": [ + "5aab578ae3482dc32da85658bac0d7fcb4b0bc87", + [] + ], "feature-policy-with-cross-origin-subresource.html": [ "88d1ac826fe773b8c20a0e1fb00520c0192d7037", [] @@ -284745,6 +284951,18 @@ "f52cd963ad25238bafc2081b7024aa5375614f5a", [] ], + "background-margin-iframe-root-ref.html": [ + "e7f00b00e8c1229592f8dde05b5252d91e0ebff2", + [] + ], + "background-margin-root-ref.html": [ + "2e5ec36ec086386addbb802bfb295cf76cb2c583", + [] + ], + "background-margin-transformed-root-ref.html": [ + "2e5ec36ec086386addbb802bfb295cf76cb2c583", + [] + ], "background-origin": { "list.txt": [ "a6fdedde542b154bbd33a090981da966ce5e6197", @@ -287764,7 +287982,7 @@ [] ], "gap-001-lr-ref.html": [ - "d772748564f855ae26a97c10fd495170758f0a63", + "25c0c5cb357793ff8b9361684868a3a48505ea19", [] ], "gap-001-ltr-ref.html": [ @@ -287772,15 +287990,15 @@ [] ], "gap-001-rl-ref.html": [ - "66d104a86d1c637da6e535e172580b591bef6720", + "5aac91817f3fb458d8b11d814818dedb98bbe49f", [] ], "gap-001-rtl-ref.html": [ - "7556857e052e715070257629c93158943d8fb254", + "bb0cf3c0eb07ad1889c3a706f5853801ce92bcea", [] ], "gap-002-lr-ref.html": [ - "f9c0c55eaafc9053a5491e1b25a559d20aaf5f17", + "8d761c6dfbcf00e0111a09f0787a09a12c4f819f", [] ], "gap-002-ltr-ref.html": [ @@ -287788,7 +288006,7 @@ [] ], "gap-002-rl-ref.html": [ - "c9148e2976a5d5969d8d0352be4236241a30c5cd", + "9310e9ae4884706b4712e1497b26e5a7b0f3cea7", [] ], "gap-002-rtl-ref.html": [ @@ -303819,6 +304037,10 @@ "a6d5672c9dfe95c990c538f5596094eb2a9615bc", [] ], + "backface-visibility-hidden-animated-ref.html": [ + "3441050a59dd521aa2ad061ea514c8a4e90dc244", + [] + ], "composited-under-rotateY-180deg-clip-perspective-ref.html": [ "ebd2d860cec74ba0d535637934aca8dadf90571d", [] @@ -317382,7 +317604,7 @@ [] ], "event-timing-test-utils.js": [ - "cc824d9cba6e795865aeb7efb5b9f173d1fb670b", + "bceaa5053d55efb8d86d5d70acb5b872bfbaf45a", [] ], "slow-image.py": [ @@ -330725,7 +330947,7 @@ [] ], "cssom.idl": [ - "f102510db4792b726ef853d140565486e21d0e87", + "b7d9c33d596c3882e14ffa2fa1dee99e087ecedf", [] ], "dom.idl": [ @@ -330805,7 +331027,7 @@ [] ], "html.idl": [ - "a8b9b423301d1d7aadd5d88ec472dcd5c888b9ec", + "c9018f1b63decf799cef7274c3f402d56b47fbef", [] ], "image-capture.idl": [ @@ -330957,7 +331179,7 @@ [] ], "pointerevents.idl": [ - "728fff98d919cc8134f2dd6148cefcc439ff4e39", + "8a42b5a8446b843c01f6a76c824bdf022b36b646", [] ], "pointerlock.idl": [ @@ -331145,7 +331367,7 @@ [] ], "webrtc-stats.idl": [ - "e3c2da8d2abc7ba27ea9ce673ebc3fa0d673c505", + "24b76ad0fe64505d637d441ca182321f0c7479a2", [] ], "webrtc-svc.idl": [ @@ -331173,7 +331395,7 @@ [] ], "webxr.idl": [ - "5f5320c205598b2c8cec340326686f6589d14984", + "2d83277526ddc70f14226a25d9b4523d6a19b90b", [] ], "worklets.idl": [ @@ -331312,7 +331534,7 @@ [] ], "util.js": [ - "515914e11fadc9c1f5e0b44994c52a9374eca1c6", + "2ef971ddb79166bbf8c6593c4d57ca3a5feca83b", [] ] } @@ -331358,7 +331580,7 @@ ] }, "lint.whitelist": [ - "42102299396167fb05a9dbba5d48b0c1ae55ff8b", + "726b64c56acfa5800899c9366caa21f3b26fc8c2", [] ], "loading": { @@ -336235,7 +336457,7 @@ ] }, "idlharness.js": [ - "d01da49c2d58959178bac9594d974eb729c0efa7", + "a5e2ca0b25ab698fad527074e72166797c218d5e", [] ], "idlharness.js.headers": [ @@ -336777,7 +336999,7 @@ ] }, "testcommon.js": [ - "2a89d8e022f2ee5f90c33c5097f199c92f3906e8", + "733b5f9f643ee47e14d7706f35c79a60eb007491", [] ] }, @@ -337853,6 +338075,10 @@ "f30e5ed274dd560b4c5a33ddab364221ef644a13", [] ], + "cookie.py": [ + "60688d943823ad57d7d31e40f0c6aca404aaae45", + [] + ], "empty-preload-response-body-scope.html": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] @@ -337869,6 +338095,10 @@ "86f0c0916ec99f0cc519f05da0d4702afb5ef1f4", [] ], + "navigation-preload-worker.js": [ + "6e1ab232907fe3c1e976057bf0ebb1cc79b0648b", + [] + ], "redirect-redirected.html": [ "f9bfce5e895379fc6944185eab35a2007a7dbc75", [] @@ -340918,7 +341148,7 @@ [] ], "run_tc.py": [ - "e8dfa6163e55054e5a18743cb89d94925f92f405", + "a5a8ca7db29ab484fe397475f9b5cfc412d6517f", [] ], "taskcluster-run.py": [ @@ -340948,7 +341178,7 @@ ], "tasks": { "test.yml": [ - "562239c31e3a5a0592160a3186279316e0b306dc", + "d2d76df13a753643e0e32d4237ad19b9823e1742", [] ] }, @@ -341010,11 +341240,11 @@ [] ], "Dockerfile": [ - "0a842de1ab857d1f655b9365df61f3fa978e31be", + "f3927fd0d71ccf292d9699d597a479945a8e5114", [] ], "README.md": [ - "8b0737359ea5fa64f4a8c1c7536705951166bc18", + "9342aded298bdd0e5daac12289c78163d1d5bec5", [] ], "__init__.py": [ @@ -341082,11 +341312,11 @@ [] ], "lint.py": [ - "2cfd41e967ec70f0e750dbf4fd9e617314d2fabf", + "1762049d1982069c58cf76fd30e2187a8f1e9070", [] ], "rules.py": [ - "b36681d092af15c6484bf2525443cbafe27b1592", + "6fbdc1c360dddc498a30a797eed029abee133a69", [] ], "tests": { @@ -347082,12 +347312,12 @@ [] ], "chromium.py": [ - "62ed53865d7825da8fd81608cf7e1302cf0650bc", + "086560b6a873cdc9fefd3b8b8b7a53b0173b3870", [] ], "tests": { "test_chromium.py": [ - "cb6f1ad370f2faafaa8311b82e9126ce9afd327d", + "2a5d3e79280cb5563747becdda4afe188d3b60e0", [] ] }, @@ -347333,7 +347563,7 @@ [] ], "wpttest.py": [ - "1e27f90d91a5cd907a1de1701fbb571c517ef16b", + "8f828ff43abf72c9e3332e7e1eb0bf09f5caaf88", [] ] }, @@ -348317,6 +348547,10 @@ "afd41936d3e0459b77f4e7fd4cda6b1754b9d4da", [] ], + "error-interfaces-no-symbol-tostringtag.js": [ + "572db0c01b620dd317f2079df6d0ea7cff6333fe", + [] + ], "instanceTestFactory.js": [ "c81672f208b1505430dd1ee909afaf12d9b2db20", [] @@ -353304,7 +353538,7 @@ [] ], "WorkerNavigator.js": [ - "eec2f6884a10562a0d21ab076b90e099dbb8891a", + "88e994959b3ae0202ffe77fd7e43204620085998", [] ], "WorkerSendingPerformanceNow.js": [ @@ -371103,6 +371337,35 @@ ] ], "ecmascript-binding": { + "class-string-interface.any.js": [ + "ee792d5368389b4f855474bd8077b8d7afd93b19", + [ + "WebIDL/ecmascript-binding/class-string-interface.any.html", + {} + ], + [ + "WebIDL/ecmascript-binding/class-string-interface.any.worker.html", + {} + ] + ], + "class-string-iterator-prototype-object.any.js": [ + "2185ae0bb7bac6aec4d69c9cbf364eb4754427bd", + [ + "WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.html", + {} + ], + [ + "WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.worker.html", + {} + ] + ], + "class-string-named-properties-object.window.js": [ + "ad466188baed439ab46dd60a157789c0c95db980", + [ + "WebIDL/ecmascript-binding/class-string-named-properties-object.window.html", + {} + ] + ], "constructors.html": [ "61993a6200ed56f3664ef72c74839b2d1feaa3b1", [ @@ -371248,7 +371511,7 @@ ] ], "interface-prototype-object.html": [ - "03ada7aa0d4d43811652fc679a00a41b9653013d", + "d2d43eda9a94688ffd707a3ed8f89c28e74324c4", [ null, {} @@ -371262,7 +371525,7 @@ ] ], "iterator-prototype-object.html": [ - "466973dc08f0e309ef847283d7fd4fb46a528d0b", + "7859c1e46ac46463f070bf2b48a38f54d2e8a8cd", [ null, {} @@ -372431,7 +372694,7 @@ "bluetooth": { "adapter": { "adapter-absent-getAvailability.https.window.js": [ - "a9f540ecd34331271e27b99f74e155f40b41f6ec", + "55f4a675da158ac8cd116ea4346c39ff11195f21", [ "bluetooth/adapter/adapter-absent-getAvailability.https.window.html", { @@ -372446,14 +372709,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "adapter-added-getAvailability.https.window.js": [ - "30c47201f072206e548cc5ea3417c91383fffcc7", + "f8e25b2ac2fc48b865ce7f9e3702a7688f89dbc3", [ "bluetooth/adapter/adapter-added-getAvailability.https.window.html", { @@ -372468,14 +372735,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "adapter-powered-off-getAvailability.https.window.js": [ - "b760d4bc2728212a025b7d8fd1a34c002e62840b", + "1ffcd3bb096cebd80c34d5c57cadc8c00a128d2a", [ "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.html", { @@ -372490,14 +372761,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "adapter-powered-on-getAvailability.https.window.js": [ - "f98a88eea9e1d2e0adb21d616802931af09c2481", + "84c7982d2146b8660d098e21c1c30496a189549a", [ "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.html", { @@ -372512,14 +372787,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "adapter-powered-on-off-on-getAvailability.https.window.js": [ - "ac664a8981267007ada522bfd610209995dbfe16", + "c4ba9b5f3a9b13eaba51a3d29cfa62405816753e", [ "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.html", { @@ -372534,14 +372813,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "adapter-removed-getAvailability.https.window.js": [ - "00425aa56f25fb208503c46cb12a2f422ee141f5", + "ca0b51f47dc6807b79a861d85ea5a7f2549e691a", [ "bluetooth/adapter/adapter-removed-getAvailability.https.window.html", { @@ -372556,14 +372839,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "cross-origin-iframe-getAvailability.sub.https.window.js": [ - "ce633c63f981921cbb9ea2ab5f2f71a839cb8acb", + "54abfbb5cefcb364be4c01f34e40a62ca49156d7", [ "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.html", { @@ -372578,7 +372865,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372587,7 +372878,7 @@ }, "characteristic": { "characteristicProperties.https.window.js": [ - "5239accab97942ea1ff8e1cccd3bc383977e915d", + "f7a57a9c4b8922249976d4f980c3e07555b05969", [ "bluetooth/characteristic/characteristicProperties.https.window.html", { @@ -372602,7 +372893,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372610,7 +372905,7 @@ ], "getDescriptor": { "gen-characteristic-is-removed.https.window.js": [ - "eb91e972c4e537f6eea30c844358ef4a30d911eb", + "7789f4b7c4693a89c8f9a41e5d3c613ff43ba12a", [ "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.html", { @@ -372625,14 +372920,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-descriptor-get-same-object.https.window.js": [ - "4cff64bbdad180314b76784ea4f0720ba6df83fd", + "01d4e8f30f82d7f87af7ee6ae5168e36d87bafcf", [ "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.html", { @@ -372647,14 +372946,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed.https.window.js": [ - "f5d1761994abc3800dbc6e62ee4357fbceeb26f5", + "16b34dc09124ea7be5777fbd5040eb96b84171c7", [ "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.html", { @@ -372669,7 +372972,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372678,7 +372985,7 @@ }, "getDescriptors": { "gen-characteristic-is-removed-with-uuid.https.window.js": [ - "7405a8ee6e3a5fc4a78061b30f98608b2946f545", + "b924f052d37dc4ba1a91d41fa7605862543d2dc8", [ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.html", { @@ -372693,14 +373000,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-characteristic-is-removed.https.window.js": [ - "470f7043be314bf6e7c0678806c948cb0591e2ed", + "ae8127c87b3c41f5dae6f3793e6ebdf5b5e05fcd", [ "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.html", { @@ -372715,14 +373026,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-descriptor-get-same-object.https.window.js": [ - "1dc58aea155206df60f567bbba3560887d6f24a0", + "11dd8bee80a77d132cc15c4662d81270fe1e513c", [ "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.html", { @@ -372737,14 +373052,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed-with-uuid.https.window.js": [ - "5ee7e0d24943bc939ee2a2b9bbf7940d212d1218", + "13e2e3751a8843ca5054f48192aa92abf2a153c4", [ "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.html", { @@ -372759,14 +373078,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed.https.window.js": [ - "24a2087e938fed32a63c9b0fed8ca20b437be6b4", + "99056cf209a78f34732a64299b6feb871864a66b", [ "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.html", { @@ -372781,7 +373104,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372790,7 +373117,7 @@ }, "notifications": { "characteristic-is-removed.https.window.js": [ - "2ab165d9044520d62f4d4fb334b4f148c865ecab", + "9641ad71e970aeb8b4b53b6b7f1415cc28e889e6", [ "bluetooth/characteristic/notifications/characteristic-is-removed.https.window.html", { @@ -372805,14 +373132,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "service-is-removed.https.window.js": [ - "d2456934d83dc75720dff84429932a157094cf56", + "a5851fc473323741f9f2a3a6f793287e4b2cd1ab", [ "bluetooth/characteristic/notifications/service-is-removed.https.window.html", { @@ -372827,7 +373158,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372836,7 +373171,7 @@ }, "readValue": { "add-multiple-event-listeners.https.window.js": [ - "13709ea941ed5ca54f6b2e38d4017afa3c9995c2", + "0eeafd0b79ba30fe7325c48727c13c3cf4fc3fab", [ "bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.html", { @@ -372851,14 +373186,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "characteristic-is-removed.https.window.js": [ - "269f2cb4a1f010a972a156090763ebb152fcb5c2", + "e97b94f73664bb2e1639715827c8ba870021f4e6", [ "bluetooth/characteristic/readValue/characteristic-is-removed.https.window.html", { @@ -372873,14 +373212,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "event-is-fired.https.window.js": [ - "03b8f2b4cee8ec0c77630d15dbb7df711921f6c4", + "52b70e7a080e870c27bf86d9ba591292f0b273bb", [ "bluetooth/characteristic/readValue/event-is-fired.https.window.html", { @@ -372895,14 +373238,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-characteristic-is-removed.https.window.js": [ - "26efe8b306b4a99e7ac4a34f153c1b909f029cf7", + "e2599a16faec6c9cdcfa3b27a206f6488e1909d1", [ "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.html", { @@ -372917,14 +373264,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "read-succeeds.https.window.js": [ - "82be128f31242ccc55a761c09a992a1132064faa", + "e5ddfb81696c009743622929d3c490a6469e4c4b", [ "bluetooth/characteristic/readValue/read-succeeds.https.window.html", { @@ -372939,14 +373290,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "read-updates-value.https.window.js": [ - "34da455ddff4a91ee16f969b096f7821fb2d00bc", + "bb98aeb18f2dcd068735d8d492dc604ead3970e4", [ "bluetooth/characteristic/readValue/read-updates-value.https.window.html", { @@ -372961,14 +373316,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "service-is-removed.https.window.js": [ - "20dd4ba1c05e5850f16234d693c32dab0350bd4e", + "1f699ca25eebcd35e0dc76be4be735d7dfd801b6", [ "bluetooth/characteristic/readValue/service-is-removed.https.window.html", { @@ -372983,7 +373342,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -372991,7 +373354,7 @@ ] }, "service-same-from-2-characteristics.https.window.js": [ - "b34b3b9216abec77727dcda84a83e07f3eedb210", + "dafd755fd1d49b48bcd0a2623a07a5f6855a8164", [ "bluetooth/characteristic/service-same-from-2-characteristics.https.window.html", { @@ -373006,14 +373369,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "service-same-object.https.window.js": [ - "b58902ae51957b91ee63eb4f53acd1c0e353f7ef", + "01b3a25e35e4a8c2e8a1626e12de90e625dda0a8", [ "bluetooth/characteristic/service-same-object.https.window.html", { @@ -373028,7 +373395,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373036,7 +373407,7 @@ ], "startNotifications": { "gen-characteristic-is-removed.https.window.js": [ - "af27f933d8f10207caf1574befa6d9f64767fc45", + "62d0d15d10b57992bdf2f60c5582cdb06e8f1673", [ "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.html", { @@ -373051,7 +373422,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373060,7 +373435,7 @@ }, "writeValue": { "buffer-is-detached.https.window.js": [ - "d900632c4b509099b272007861d513f2f8e16388", + "5d707775e11663579793f1a639ef1029e9f89d71", [ "bluetooth/characteristic/writeValue/buffer-is-detached.https.window.html", { @@ -373075,14 +373450,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "characteristic-is-removed.https.window.js": [ - "c0f5a3e6509c91efb5dae8cb9a3b07875ab6051b", + "6e9da8802c7adf343d0dd9683c2b03afe11d28e2", [ "bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.html", { @@ -373097,14 +373476,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-characteristic-is-removed.https.window.js": [ - "d5ac10fc611443cdde02761448e6f479390bf790", + "2ceeabdb145db08b4ad481eb3dbff94e36f3b6d0", [ "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.html", { @@ -373119,14 +373502,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "service-is-removed.https.window.js": [ - "e7a2837c389a1076b548dc5256fe78eaa1059162", + "89c3112475012de82ca637ec09fbd372f76516fc", [ "bluetooth/characteristic/writeValue/service-is-removed.https.window.html", { @@ -373141,14 +373528,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "write-succeeds.https.window.js": [ - "cdda9cec345b81297966b74ab2152f02010ec6b7", + "d5c173c47aefe80bb0eed42f2942694d3546ee7b", [ "bluetooth/characteristic/writeValue/write-succeeds.https.window.html", { @@ -373163,7 +373554,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373174,7 +373569,7 @@ "descriptor": { "readValue": { "gen-service-is-removed.https.window.js": [ - "aa95687094b50340503d8cc5bcdeaec7e5bf3bdf", + "2c46b99fd1de291992ca8f4d13364bfad9f43b02", [ "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.html", { @@ -373189,14 +373584,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "read-succeeds.https.window.js": [ - "fc1facaf58e37550c4fb9a4d5b66f2180072cbe8", + "d81db2f8c0ddb54042a6178677df309a7c6248ef", [ "bluetooth/descriptor/readValue/read-succeeds.https.window.html", { @@ -373211,7 +373610,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373220,7 +373623,7 @@ }, "writeValue": { "buffer-is-detached.https.window.js": [ - "4fd3d661f7d9ac2e97f5d215e41410fd027f7b52", + "49daf7cf86d16104536d7e50bc6401f81006da45", [ "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.html", { @@ -373235,14 +373638,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed.https.window.js": [ - "a486819b55a114e9e4bbde31b709cf00c7aae1c5", + "c681bcee419b33c6faa52ea40fc8ccf86c3f4113", [ "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.html", { @@ -373257,7 +373664,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373268,7 +373679,7 @@ "device": { "gattserverdisconnected-event": { "disconnected.https.window.js": [ - "dab54d5da2961eae72d6bd05eb15023dd8a2a46a", + "43a11a88cbf655ee4aab6ac70215ae3fb5f9a541", [ "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.html", { @@ -373283,14 +373694,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "disconnected_gc.https.window.js": [ - "a15cc943f4e1180ea092e24db9112658b40c5b99", + "a2c20ea4620aa620b0b12cbef642a785f32285f2", [ "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.html", { @@ -373305,14 +373720,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "one-event-per-disconnection.https.window.js": [ - "f5e45f99755dbd05f24cbca9584d67e5e6654c32", + "ab273adbc88bcd4d03c9bf5309a34cb30cf3246a", [ "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.html", { @@ -373327,14 +373746,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "reconnect-during-disconnected-event.https.window.js": [ - "8f264c7b02524a84ac67e6fbe343045ae8eb07a6", + "bdaf47c66198ce70f9a1951358f27b38dcfac4ca", [ "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.html", { @@ -373349,7 +373772,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373359,7 +373786,7 @@ }, "getDevices": { "granted-devices-with-services.https.window.js": [ - "34b5912315ab843ec9c49dbf9ec41912325da2ca", + "3228543617decdc9a213883d650ba33ffd9b90c1", [ "bluetooth/getDevices/granted-devices-with-services.https.window.html", { @@ -373374,14 +373801,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "no-granted-devices.https.window.js": [ - "d945c3ff242c069027e5b6558c3c1fed9286e7b2", + "304aa3820d5b80bff80928feabc982b8b156b591", [ "bluetooth/getDevices/no-granted-devices.https.window.html", { @@ -373396,14 +373827,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "returns-same-bluetooth-device-object.https.window.js": [ - "7c80703d5f5bb825b8d94f9c3a7fd7f2a7a6c7da", + "81c0f6a97e947c9a469ca74a180d595f493561e2", [ "bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.html", { @@ -373418,7 +373853,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -373434,7 +373873,7 @@ ] ], "idl-BluetoothDevice.https.html": [ - "6030d4e5acdcda0ac80d63100c8e6573c6194ae2", + "ef2863dc27403a02bfa03cbb531b5e7c6c4b2ed4", [ null, { @@ -373485,7 +373924,7 @@ "requestDevice": { "acceptAllDevices": { "device-with-empty-name.https.html": [ - "7b68acf1471bb7777cfd510a7ae38c3b4cf0612a", + "a47ee603f84287a0f0d22f1c9101ebf0c0bc718c", [ null, { @@ -373494,7 +373933,7 @@ ] ], "device-with-name.https.html": [ - "3c2dcb7f8a66e173c180608e785f3b27bce6fb25", + "a69b313b51e92474338fc17aaa86b6e65096efc0", [ null, { @@ -373503,7 +373942,7 @@ ] ], "optional-services-missing.https.html": [ - "d4c2677130565f4e497d2a5a7127c22aa5a2e9a0", + "5d1fec3342ef7c68dcf743e49bd94bc739c6603a", [ null, { @@ -373512,7 +373951,7 @@ ] ], "optional-services-present.https.html": [ - "86377c289f6579555be5c6b3598cbe68a9e958e6", + "06897f809929db1a2a8d52742126d7e4a8b38d93", [ null, { @@ -373522,7 +373961,7 @@ ] }, "blocklisted-service-in-filter.https.html": [ - "630548d68460ed6493f85928ec3ac1db2af713f6", + "cb2f989a47778b8b8387e3d7fe3316b9c7b0f40e", [ null, { @@ -373531,7 +373970,7 @@ ] ], "blocklisted-service-in-optionalServices.https.html": [ - "5c176b82b7f2e8629786c9cce79ab8ea2155699f", + "3f435f9ff183a22abb8979cb62820d4f2407e964", [ null, { @@ -373541,7 +373980,7 @@ ], "canonicalizeFilter": { "device-name-longer-than-29-bytes.https.html": [ - "5ca358a0e1ab753e6199a31c5abe7b88271fe91c", + "28f614bcbf29ef7194086732e264da9b3c6c2950", [ null, { @@ -373550,7 +373989,7 @@ ] ], "empty-filter.https.html": [ - "788d9f8036109e6c1bb6a6bb9f021fd920012631", + "4beb5266b680b4a75d13a4b81aa2e5e6fcfd2d66", [ null, { @@ -373559,7 +373998,7 @@ ] ], "empty-filters-member.https.html": [ - "65bfc6443a4592b7774a76aca651331c81bfc49f", + "2a6a0daa35f41986a384e55c1fed6167a8b16d79", [ null, { @@ -373568,7 +374007,7 @@ ] ], "empty-namePrefix.https.html": [ - "549f0d4059c723aad70e86944a0ca82c401f95de", + "3e490e17d993c4cb2390b640cf1e8f715dfa3f41", [ null, { @@ -373577,7 +374016,7 @@ ] ], "empty-services-member.https.html": [ - "b70a8a32087858aee74743df909200a749972bbc", + "3a485878be13293463b4d86d10edbcc033536065", [ null, { @@ -373586,7 +374025,7 @@ ] ], "filters-xor-acceptAllDevices.https.html": [ - "d3f6e5ccb1333a001e37448abf7a7f7cdde4715c", + "d6177caf7f8197cb2c9f5b88128a1cc191b6e28b", [ null, { @@ -373595,7 +374034,7 @@ ] ], "max-length-exceeded-name-unicode.https.html": [ - "5e1397dbd9a332cb3b8f6c1bd607654b42b9bb96", + "4ec036695bd990aa419a48506861841b559971b9", [ null, { @@ -373604,7 +374043,7 @@ ] ], "max-length-exceeded-name.https.html": [ - "a270cac43311bdf59422586c98b9e40fd00085d9", + "0fac15ec65d5e1a9295fddb9ca3e6fd2a806d031", [ null, { @@ -373613,7 +374052,7 @@ ] ], "max-length-exceeded-namePrefix-unicode.https.html": [ - "05a9bd31300fa0dacebcd5d346b52b62f9c92eee", + "d622da56df564da1d5ecf0ff0693cfe38fb686aa", [ null, { @@ -373622,7 +374061,7 @@ ] ], "max-length-exceeded-namePrefix.https.html": [ - "a31e4b398e7cda5d8c28032e1541695b2ce3540b", + "8251935be160db8190a97b9ee0951f07c2215306", [ null, { @@ -373631,7 +374070,7 @@ ] ], "max-length-name-unicode.https.html": [ - "dca018b49540be7e466cd38e680b5206c4da561f", + "c7cb0aa25e267dc0647850ec5da9135fcabe4d02", [ null, { @@ -373640,7 +374079,7 @@ ] ], "max-length-name.https.html": [ - "7244910afa4b1dd6299b26bdd4155c3128379872", + "4b57e4b0ac84fdcde4eb2f6f82f7ea7c14d5e62d", [ null, { @@ -373649,7 +374088,7 @@ ] ], "max-length-namePrefix-unicode.https.html": [ - "ba4bdf94c633627b5cc3739268645c28e136df28", + "72faac6de8b58131f8d9a17c00f5ee6a192bd396", [ null, { @@ -373658,7 +374097,7 @@ ] ], "max-length-namePrefix.https.html": [ - "ced34793355e05ef592b7ffd7daee83d4ad4f0fb", + "bf751501bfb836a399cb16e7f24d629fcbc033f7", [ null, { @@ -373667,7 +374106,7 @@ ] ], "no-arguments.https.html": [ - "33f933ad09c882d95ef4a6e61f8d65e87dce6848", + "a1cc4e5b4225faa9fbc50030ccda854c6ec3459a", [ null, { @@ -373676,7 +374115,7 @@ ] ], "unicode-valid-length-name-name.https.html": [ - "787f34d5c688b61a682984f8089c82716b08c5d6", + "70b284a2738d5fa1fd85183f8c8c50d2e9084018", [ null, { @@ -373685,7 +374124,7 @@ ] ], "unicode-valid-length-name-namePrefix.https.html": [ - "bafb36d710cadd495e4c79ede4a5fcac5ffa1517", + "726e293580fecb9389f5aef9cd50b3e2a8abbac7", [ null, { @@ -373694,7 +374133,7 @@ ] ], "wrong-service-in-optionalServices-member.https.html": [ - "e4880b6f57d0f87ff84b6acf1c4b6a27b76ae735", + "07187b4b7599b555dd28a8574645767ec5bf80a3", [ null, { @@ -373703,7 +374142,7 @@ ] ], "wrong-service-in-services-member.https.html": [ - "9d31b951be7b6ebdb7ed05571841561e9dec2f52", + "a78d75e6b4d662d5c52068af13a2ce7682bf92f3", [ null, { @@ -373713,7 +374152,7 @@ ] }, "cross-origin-iframe.sub.https.html": [ - "d5cf382f664cfb7fb105a49707cdf7652a9b9a62", + "543c8a586e9148c4c7462f437a3d914ee23d1942", [ null, { @@ -373722,7 +374161,7 @@ ] ], "discovery-succeeds.https.html": [ - "5bd7ff1246b3628882b0c49e7f094ef706cbec99", + "7bed9e0acb53d465cdfbea27c1ed8aa580bd273e", [ null, { @@ -373731,7 +374170,7 @@ ] ], "doesnt-consume-user-gesture.https.html": [ - "19ac36f80add1ee98e1c26b1b7968c7d5381aae0", + "d439bf79c9d985bb29a7cdd596d94b198c046f63", [ null, { @@ -373740,7 +374179,7 @@ ] ], "filter-matches.https.html": [ - "1aeae776f0691d2c0c2603a4fda75e8487e1fc7e", + "1c42d779216f138a1b271dda875c770e98390e8a", [ null, { @@ -373749,7 +374188,7 @@ ] ], "le-not-supported.https.html": [ - "3da9abeb773a7f7401b6378022c5737f17e41655", + "e130fe92e63c69db7a78281ae7dca02dc5c98a15", [ null, { @@ -373758,7 +374197,7 @@ ] ], "name-empty-device-from-name-empty-filter.https.html": [ - "944befdfe8344d3cdc42aa68889de6581e35bc8f", + "6d707a13850be317685783961dbecbd126d80b69", [ null, { @@ -373767,7 +374206,7 @@ ] ], "not-processing-user-gesture.https.html": [ - "f74540db958c2b5bc924be0f909e34196c937999", + "6795ae430154d81a6182adff6ba520d59d544821", [ null, { @@ -373776,7 +374215,7 @@ ] ], "radio-not-present.https.html": [ - "929af8ffb776ef9fc2763976883dbacc1af20a32", + "9494fa572a3ac7250e6c357048f5b3a60e289241", [ null, { @@ -373785,7 +374224,7 @@ ] ], "request-from-iframe.https.html": [ - "64ad3d592d1e09f02d533f6f1203cff0fd7f18b5", + "484a35b79be7f67af25f61d008720d4d82074273", [ null, { @@ -373794,7 +374233,7 @@ ] ], "request-from-sandboxed-iframe.https.html": [ - "4c4a5707e8ebfd9bf7ef16525a70e8e0fb75d483", + "26291b3b4c1589cb40ecc54a3a363e2594a650c1", [ null, { @@ -373803,7 +374242,7 @@ ] ], "same-device.https.html": [ - "b96af439973a21af7bd19d917533e195fdc39c1f", + "c0e83cc9c742824d85199068cb1bd9203883d1f6", [ null, { @@ -373812,7 +374251,7 @@ ] ], "single-filter-single-service.https.html": [ - "9c0d621c2374057fb42b44b424b25e017131a4fc", + "8873a45e31dfd785376dfc7e55f811948847be86", [ null, { @@ -373824,7 +374263,7 @@ "server": { "connect": { "connection-succeeds.https.html": [ - "aebd681c2add13d7aebe0ad3c97f118f94fd19fa", + "1326b073879e554e141390dd9c42c12f64681165", [ null, { @@ -373833,7 +374272,7 @@ ] ], "garbage-collection-ran-during-success.https.html": [ - "f70befcb4b4e1a2369d9c59c70fd587704763c80", + "d9c07b64bc05512ca9e45a69aeba6c8b65c73f0c", [ null, { @@ -373842,7 +374281,7 @@ ] ], "get-same-gatt-server.https.html": [ - "c3e35532835c11b9dba1aa17592d861a9c7d4000", + "5e9383851f39a316582d2e672cb5afa0c11b27ab", [ null, { @@ -373852,7 +374291,7 @@ ] }, "device-same-object.https.html": [ - "63624961ec7b11757fc04a5684dc702db4c3169c", + "b861040b2366aa98aca067b80218f030cb9c94d0", [ null, { @@ -373862,7 +374301,7 @@ ], "disconnect": { "connect-disconnect-twice.https.html": [ - "e0d8439ab66c0a4ffd29e51aa23de9ecd11a833b", + "7ed2cb946035c7a8a828b2830c60ded5eca0290f", [ null, { @@ -373871,7 +374310,7 @@ ] ], "detach-gc.https.html": [ - "8b1459db192d21f67d6185fb15dade72723c00ad", + "c1863e923227a6f80763e5c374d480a6169b6bf0", [ null, { @@ -373880,7 +374319,7 @@ ] ], "disconnect-twice-in-a-row.https.html": [ - "5dada7a9c9918e45620f685225e4cb9bb562a5e2", + "d4d6e2fca782eb4a23c92d9966d6235b19632440", [ null, { @@ -373889,7 +374328,7 @@ ] ], "gc-detach.https.html": [ - "04ccedeb5e9781923fe02d598a25218d3f59179e", + "41d2b151d33c6535241299b2cb3e55ffa40cafec", [ null, { @@ -373900,7 +374339,7 @@ }, "getPrimaryService": { "gen-disconnect-called-before.https.window.js": [ - "4a1baf3ebc2d89f541b7ad5e057d980317902a09", + "6f4f076110a8824c5bc1d5ce84f98b879d589e7e", [ "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.html", { @@ -373915,14 +374354,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-error.https.window.js": [ - "c7c80244193016db84dbbf8e9f3441e2a4937b96", + "24184ea8ba48ca281b86931f5c5c51317bb1662b", [ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.html", { @@ -373937,14 +374380,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-success.https.window.js": [ - "5655d8ee41cd1765f105772f42dcacfcf0a27e6f", + "8a8714bca579698346b6eb26694c30e343c98aac", [ "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.html", { @@ -373959,14 +374406,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-invalidates-objects.https.window.js": [ - "0d3e5cf18a4c708d0f9620148819150deeb7f682", + "52699ee0a089ac5529164ca9ceedcb4016404da7", [ "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.html", { @@ -373981,14 +374432,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnected-device.https.window.js": [ - "7bb1ef5cb634c5af76ae835247f967a51845f04e", + "e0a31f6136e46a0d7bcbd7cf4d52255caa0d0950", [ "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.html", { @@ -374003,14 +374458,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-discovery-complete-no-permission-absent-service.https.window.js": [ - "ee3cf97f4db9f68cffac91c55bf282ab54b8906b", + "52875b185489c50adb8c39fa78f8b4a694470258", [ "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.html", { @@ -374025,14 +374484,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-discovery-complete-service-not-found.https.window.js": [ - "5bf720cd48eb0eeec5f89488384f078ce37c9cd6", + "56362f20bfc38d7012e87bd5e2b29274ec5f3452", [ "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.html", { @@ -374047,14 +374510,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error.https.window.js": [ - "4c3111720c2c69d8e5e867bf4a3288ea1aba8115", + "06d6a31eeb5ffc8b4bc9ff08cae550ee9fc17e87", [ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.html", { @@ -374069,14 +374536,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-success.https.window.js": [ - "fe7d749063d8d75da9c389fffbe9dc68af9a30a2", + "cd4a0d39f28ab582cf8dfca727f58cb2dd7b78f3", [ "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.html", { @@ -374091,14 +374562,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-different-service-after-reconnection.https.window.js": [ - "301658c73bb8e4db78433c4072b83aa5f99d629a", + "6cd60732879a502b147c0f3e1a835ea22e2d4ba8", [ "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.html", { @@ -374113,14 +374588,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object.https.window.js": [ - "c46a1a52c031373b16718d3687a013109f45da62", + "f05adce27b1e877223684e00fce45bdbf5c92361", [ "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.html", { @@ -374135,14 +374614,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-invalid-service-name.https.window.js": [ - "704ab8bb2dac944d1a3e2a33b57c225edc994225", + "b30e4cc48f443d72e680ecc5420fe25eb1571758", [ "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.html", { @@ -374157,14 +374640,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-absent-service.https.window.js": [ - "8daab29eaf94bbae9e28a921a5a650f858ccdd7a", + "6df58222e0aec9623433e9939295161a55d41362", [ "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.html", { @@ -374179,14 +374666,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-for-any-service.https.window.js": [ - "d55dee753cf8b000089f1d8a5a21f383587427cd", + "d6ae0b6dc8f001c95155024244d9db607722d196", [ "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.html", { @@ -374201,14 +374692,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-present-service.https.window.js": [ - "d357a214dfd68723571c014d29f8f2e65773a245", + "e11ed9e41e210216b16412dd06e203dd557ef1bd", [ "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.html", { @@ -374223,14 +374718,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-not-found.https.window.js": [ - "32350e779dce890573bcf519ac74023818296f3e", + "0b8419a8042b0706c941e259ae7c2eb6b85acb35", [ "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.html", { @@ -374245,14 +374744,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "service-found.https.html": [ - "6fccff1813f01d17b68c8c11570008d00ed0a368", + "6484b8227d27bc474bdfa7d156d7d3acedd30f3e", [ null, { @@ -374261,7 +374764,7 @@ ] ], "two-iframes-from-same-origin.https.html": [ - "eb20225e4bad0f774aad0ef0e997cdfa4c55135e", + "064d8d2e3b4ca216179f912327f019f3f61d02df", [ null, { @@ -374272,7 +374775,7 @@ }, "getPrimaryServices": { "blocklisted-services-with-uuid.https.html": [ - "6ed24fda403b6d6fa305bcfff433b4154438e45c", + "90d776c77ee3ccc8c265ec82fff80423b9f392ba", [ null, { @@ -374281,7 +374784,7 @@ ] ], "blocklisted-services.https.html": [ - "2a34e0bf50a7b182ff15602dc40c484ea6d7d124", + "df83dfe193fe40b55f37aa0c1e1b4e204c7b340f", [ null, { @@ -374290,7 +374793,7 @@ ] ], "correct-services.https.html": [ - "9fffbd5d00e3c5d41e43e1b722d87f53933ea1a3", + "9672d50a2bc2291003823c2da1cdcde77f6edbae", [ null, { @@ -374299,7 +374802,7 @@ ] ], "gen-disconnect-called-before-with-uuid.https.window.js": [ - "8bc12f3c474441514a568c27d7f63c1883c99d1e", + "ea0c16160508aacf9845f45264c3e58ee6b9a895", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.html", { @@ -374314,14 +374817,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-before.https.window.js": [ - "1c77e4e710ae766e72bf13b82d290309ebe30bb0", + "04dc61083b87c0297b79d012575738e8c335954d", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.html", { @@ -374336,14 +374843,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-error-with-uuid.https.window.js": [ - "230325a8c76169a545010fb784999599e77463ad", + "3223049d2a8625ca0c10814053364371b3cfd05f", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.html", { @@ -374358,14 +374869,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-error.https.window.js": [ - "dce13c5d0065b26c082d042cb92c0cc2ac01f63e", + "646db21586fe6d237ac6e7431695af4346391c15", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.html", { @@ -374380,14 +374895,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-success-with-uuid.https.window.js": [ - "8e2e32ba4fddc843378c901e0ce933c54105a539", + "472eb991ece339dc64c59d7a100e50f2863b4de3", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.html", { @@ -374402,14 +374921,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-called-during-success.https.window.js": [ - "78dcffdcbb1861df8cfd7dc6108b40bbb9f57d1e", + "86d56889325b2a139e624f60e94eac0a3f46e873", [ "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.html", { @@ -374424,14 +374947,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-invalidates-objects-with-uuid.https.window.js": [ - "c226d2dc65ea69f19116906104a5d1fe5da750ac", + "0a5e07310faf9efbf0eb1f2b2f05c3974d9662c7", [ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.html", { @@ -374446,14 +374973,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnect-invalidates-objects.https.window.js": [ - "d69f6c5d5c27377958becb16fd660961e4e3c5e2", + "e87339d59d07470f98eac4feb2d54619769119ba", [ "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.html", { @@ -374468,14 +374999,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnected-device-with-uuid.https.window.js": [ - "a35984f85115ad27eb9903c1aeded5e627308365", + "bb440a7caa2d309468bb72eb9b27cd37b60986f0", [ "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.html", { @@ -374490,14 +375025,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-disconnected-device.https.window.js": [ - "36d7e64d5551cae9020834e49f5876e2a42bc7ca", + "26f3269a0c96d3fc029499adb952dff5dae38598", [ "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.html", { @@ -374512,14 +375051,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [ - "130657d228f4c7cada6d27a2ad8ff7fee403d9e0", + "b52dac0385f47c463d2302838e57425d0e8fc5c4", [ "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html", { @@ -374534,14 +375077,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-discovery-complete-service-not-found-with-uuid.https.window.js": [ - "3817a1a5a38723ce08e1650155c5fcd81ff54bdb", + "f944f72583ff6a9f4fbf1876246face6538486d9", [ "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.html", { @@ -374556,14 +375103,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ - "c986835ce31dcf5049e54bf553c3b12dac7151d5", + "455bd47a040727ceed3f435a6fc6b469c892c539", [ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.html", { @@ -374578,14 +375129,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error.https.window.js": [ - "bd438db09e350a0d7ee330a6c3eaa54f1fea02ba", + "2e832d89e175d46c78d8468ddf6d3fb29bd0524a", [ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.html", { @@ -374600,14 +375155,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [ - "3b441cedeff36c6b854bc4ea4e7952eac6284d1a", + "4555242ae823060dfcc56ea8965eb93b0af92242", [ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.html", { @@ -374622,14 +375181,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-success.https.window.js": [ - "1b3302a1ba6ffe049e44228280c652bf74310a50", + "0eb78ba1b32de808f10450c04061254b397ab86b", [ "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.html", { @@ -374644,14 +375207,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-different-service-after-reconnection-with-uuid.https.window.js": [ - "378ade0c90b5d7c49c31bb58efaa835b4c502d95", + "11671cbf7b3aae978cd943485aa2197b1b560876", [ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.html", { @@ -374666,14 +375233,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-different-service-after-reconnection.https.window.js": [ - "bdef5aa2f20ae4971784a566135ecc6b71fc03ca", + "efda6cf4a4150ea58f895671d0e286105d7af883", [ "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.html", { @@ -374688,14 +375259,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object-with-uuid.https.window.js": [ - "aca34e58ff06dd92d15b0bb1d09f81aa8c77402c", + "d84ca0aa7fc9b98dd3621d203b4d9e1050ffec23", [ "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.html", { @@ -374710,14 +375285,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object.https.window.js": [ - "0ea805e339d4dff1dea445e99cc8d661a7f8404a", + "3f876f5b76b29df00b85a5ec1e44a2d74e8ff249", [ "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.html", { @@ -374732,14 +375311,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-invalid-service-name.https.window.js": [ - "eeb6dd4dcf867345ff4cfad28b19a9ffa3fb509b", + "d26c0aa20a6f48073d71b2b63c252acbffbfdaee", [ "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.html", { @@ -374754,14 +375337,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-absent-service-with-uuid.https.window.js": [ - "c755dd7129df5ac3825e07d7c7b3d11e2a227f12", + "4aefb9955b384f6d5a762a2b6d09e1685a1f58a7", [ "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.html", { @@ -374776,14 +375363,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-for-any-service-with-uuid.https.window.js": [ - "03b7f2329c8d90fb326bf851c5275f42d2dc2007", + "a5006e6da846c599297638ca0cfc04b9d8c7c91f", [ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.html", { @@ -374798,14 +375389,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-for-any-service.https.window.js": [ - "e50c6d56128489fdde8475979ff8868f41d365a1", + "e7d20bd3f230b3e69d0d2720edb168ddf1f478f1", [ "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.html", { @@ -374820,14 +375415,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-no-permission-present-service-with-uuid.https.window.js": [ - "c703d0a936394d951a84d03ace7bc0b4d80abc7c", + "8f4811fe08b2f12c5cb5a03c7dda72787e9f5373", [ "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.html", { @@ -374842,14 +375441,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-not-found-with-uuid.https.window.js": [ - "9dc1877f9f2753862d106c4dad9830fddd6898f4", + "8bf9d8c0b6b43a13773a24d261ea60881cdc6b79", [ "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.html", { @@ -374864,14 +375467,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "services-found-with-uuid.https.html": [ - "6face0acfae82068d6dbf4a76a396e3cac533584", + "92ca4ea6a6e583d236381bbaaa97470d40e4be10", [ null, { @@ -374880,7 +375487,7 @@ ] ], "services-found.https.html": [ - "6edb1118c2a9b13b4c57acfbfc90254c3373aadd", + "d39c69fc7f1fd1d8213367bcfb1f4b7e11e65a4f", [ null, { @@ -374889,7 +375496,7 @@ ] ], "services-not-found.https.html": [ - "2632ec6e7fea2fc83c201733b60e565b306daf7b", + "4c78ad19d0ea8a8a3f2b38dc75e0a15f5ed3d083", [ null, { @@ -374901,7 +375508,7 @@ }, "service": { "device-same-from-2-services.https.html": [ - "0d5ab6496837d5aa13fa53c62ffe7a343caa0176", + "4c479dda90b3d5685e7e340fefa5204877e82e9c", [ null, { @@ -374910,7 +375517,7 @@ ] ], "device-same-object.https.html": [ - "de57c2e37607b453d76e867012dbd1079049197d", + "d9590b17dc23fe67a7aed39e1bae7eb6a25e4f45", [ null, { @@ -374920,7 +375527,7 @@ ], "getCharacteristic": { "characteristic-found.https.html": [ - "9746f4b058ca73a508a875d5749175a782b752bb", + "0fb2ff3532f050f41b5929ed65357233fa1e6744", [ null, { @@ -374929,7 +375536,7 @@ ] ], "gen-blocklisted-characteristic.https.window.js": [ - "72b9bac63a437b7367f10e772f4f598d491b2823", + "fb96df568ff19eb786ff92b39fb05e8e85c24f92", [ "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.html", { @@ -374944,14 +375551,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-characteristic-not-found.https.window.js": [ - "a8b2ef892c768476675c79f70fb3d546d019c4b1", + "c0987c68f5924f07442c52993487695935706ffd", [ "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.html", { @@ -374966,14 +375577,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error.https.window.js": [ - "7457161faa09235acfdc609df7e8e4d39fa4ebf7", + "1c429fc49451473332704f5a4b8863bf37bf5a76", [ "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.html", { @@ -374988,14 +375603,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object.https.window.js": [ - "54ab061deb9eb522dbed1f3d95d1ad485a26ea04", + "636ba9de773a39cf033e04c4efe719278204e071", [ "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.html", { @@ -375010,14 +375629,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-invalid-characteristic-name.https.window.js": [ - "8f44ecb08be4ff6ec2cc563b32038622dfc8f26d", + "2331f86c4ae418cdd9cc0a49ea5b4ef2cfb2c164", [ "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.html", { @@ -375032,14 +375655,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-reconnect-during.https.window.js": [ - "da5462a8bfa53a7a124a87c46fe9d30c7aedb83b", + "bc96ce5eefd6b66a23cf2cdda03c5cdb3e0fb449", [ "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.html", { @@ -375054,14 +375681,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed.https.window.js": [ - "0fe5b01146ebbc57172435dfe49e887ac6ad2d1b", + "d04967e3a8c611c1f6941770d1cac6986adbc449", [ "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.html", { @@ -375076,7 +375707,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -375085,7 +375720,7 @@ }, "getCharacteristics": { "blocklisted-characteristics.https.html": [ - "5620f2c9245f6fa57ef5c388f56def6939eb56a9", + "3298f5fd3d054c6bcdace31db0fdcf13e3214f89", [ null, { @@ -375094,7 +375729,7 @@ ] ], "characteristics-found-with-uuid.https.html": [ - "9139ae10f898c0021f8562f330728d032c85b321", + "6188adbafb9d66574e444daa8c6e296c559b5b4b", [ null, { @@ -375103,7 +375738,7 @@ ] ], "characteristics-found.https.html": [ - "952e3e6b5e985ef91837dbbeb9a7c8e5d1f665b8", + "6812cd977f2e5439b1fc135ec7ede321489cbe33", [ null, { @@ -375112,7 +375747,7 @@ ] ], "characteristics-not-found.https.html": [ - "6401740681a66b8581120671edcb70f5663621a3", + "a629b5e1c11bf35ea44af510b643953674973573", [ null, { @@ -375121,7 +375756,7 @@ ] ], "gen-blocklisted-characteristic-with-uuid.https.window.js": [ - "cd8a6fa380aade14eb256fb8440d15b6e7352ca2", + "c39a29c845bf59d68a4c8754e0c34217ba259972", [ "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.html", { @@ -375136,14 +375771,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-characteristic-not-found-with-uuid.https.window.js": [ - "fff2bd038a82698748acadaa3e85047bd77c79f1", + "ccaa7388e7e339bc223f57d90603fa1aa3fa512b", [ "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.html", { @@ -375158,14 +375797,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ - "925786c74deab9ad66080391652b60eba00598ee", + "ad4ab9f3f5067b8b042c3ec8a9225c39382beb57", [ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.html", { @@ -375180,14 +375823,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-garbage-collection-ran-during-error.https.window.js": [ - "d0ecff89f706b1bb4251232a369ea45b70e2e517", + "844814508f927f91b46f2035c365737220eab62e", [ "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.html", { @@ -375202,14 +375849,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object-with-uuid.https.window.js": [ - "fb3346dc4e4c1ca8cb601c41e8f120ccfdb149c3", + "35d277e3839c8375190f7e65dd60214bdc2a6fef", [ "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.html", { @@ -375224,14 +375875,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-get-same-object.https.window.js": [ - "576e0831501faa8b838081a96ef437abda2ed668", + "4326ee29079606daef6b6e1dda1eff08dec6c449", [ "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.html", { @@ -375246,14 +375901,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-invalid-characteristic-name.https.window.js": [ - "5b2bd39d3e052cb689bc2f668e87515563d4fa33", + "14b2e509be4f4941bc96f40cb6da3d3b08879765", [ "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.html", { @@ -375268,14 +375927,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-reconnect-during-with-uuid.https.window.js": [ - "95f22b11fcf8a5237c7bf0c2b3c40a3d2932b5be", + "34207a2f60d2af6dcb74e0e43f4c486d00f92226", [ "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.html", { @@ -375290,14 +375953,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-reconnect-during.https.window.js": [ - "184632f1d0581e76aed99bcb9a645c837b88af1f", + "4354cfc0671e4f008c1702f8f727ee22cae47fdb", [ "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.html", { @@ -375312,14 +375979,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed-with-uuid.https.window.js": [ - "6ff7b4f3631e669cf192e3864fe5bbef1d27f23c", + "8d0e7c2fc333c58b5fbbf3f25daad08a35208a8e", [ "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.html", { @@ -375334,14 +376005,18 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } ] ], "gen-service-is-removed.https.window.js": [ - "b4492885b83016d719161f705a33f7ada8a6d9c2", + "dff0d3d93975b31f3698bf3c004f92e387489438", [ "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.html", { @@ -375356,7 +376031,11 @@ ], [ "script", - "/bluetooth/resources/bluetooth-helpers.js" + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" ] ] } @@ -375582,6 +376261,15 @@ } ] ], + "same-origin-navigation-redirect.https.html": [ + "2ab128f2d8273841d53dcd301e032879f685693e", + [ + null, + { + "timeout": "long" + } + ] + ], "same-origin-navigation.https.html": [ "e35cbdcedd0f30e31834764cb23a574ce75feed5", [ @@ -375591,6 +376279,15 @@ } ] ], + "same-origin-subresource-redirect.https.html": [ + "4a8233bc3e5a8850680775b930dd57ab9ceec3e3", + [ + null, + { + "timeout": "long" + } + ] + ], "same-origin-subresource.https.html": [ "0b7151a2cca08d941d313e014e41769c08c350cc", [ @@ -375639,10 +376336,12 @@ }, "clipboard-apis": { "async-idlharness.https.html": [ - "06b777fbe328a191fc9625fe85e4f05eb751ed52", + "a1a51c98690f1c83679c3ae71f3bafe99824f025", [ null, - {} + { + "timeout": "long" + } ] ], "async-navigator-clipboard-basics.https.html": [ @@ -381858,10 +382557,12 @@ "linebox": { "animations": { "line-height-interpolation.html": [ - "db71ca0262ca3fcf88178d1b7e2a42c6513cc1fb", + "a0570f82a905af0ba601932b0447c92b28cbf303", [ null, - {} + { + "timeout": "long" + } ] ] }, @@ -392991,7 +393692,7 @@ }, "css-properties-values-api": { "at-property-animation.html": [ - "c0688870818493dae01121aa0b9332db6b0b2a1d", + "89ed671fdf1d838ee4a5c7f87e02b6bf1c6e4470", [ null, {} @@ -393018,6 +393719,13 @@ {} ] ], + "at-property-typedom.html": [ + "04c40c8be0f7fa9fe2ba025a359ebe3f0b93ff70", + [ + null, + {} + ] + ], "at-property.html": [ "e9945056aad87be835c2471bbe7ec78c425aa4f0", [ @@ -393033,7 +393741,7 @@ ] ], "determine-registration.html": [ - "9a68be51d793f537486a33edf0eb43462ca1f39e", + "e6bbbec9640ce5f567b372c7d5ef181961cedbec", [ null, {} @@ -423594,6 +424302,15 @@ ] }, "event-timing": { + "buffered-and-duration-threshold.html": [ + "cf5d63b02a1d3ccd8444f47f9fc3a56535594f45", + [ + null, + { + "testdriver": true + } + ] + ], "buffered-flag.html": [ "7ee152be9388fa8593c3c2a85981a7cb0ed7492a", [ @@ -423746,6 +424463,33 @@ } ] ], + "large-duration-threshold.html": [ + "5665d42d3345742f5364b085b2c137156652e212", + [ + null, + { + "testdriver": true + } + ] + ], + "medium-duration-threshold.html": [ + "a827f2211b12550fee8d0f5d1258dfbe29c830d9", + [ + null, + { + "testdriver": true + } + ] + ], + "min-duration-threshold.html": [ + "443b38a27833377e4ebbbe307290addd439eb508", + [ + null, + { + "testdriver": true + } + ] + ], "only-observe-firstInput.html": [ "54a6036f91adb89c7b6528e40850937d70520b77", [ @@ -423791,7 +424535,7 @@ ] ], "timingconditions.html": [ - "12280cb894a8767b9b3bc7ba1df61b4e9e8630d5", + "e7763c40dc09289149da15b00370385cc6271eb7", [ null, { @@ -428636,7 +429380,7 @@ ] ], "fetch.html": [ - "41ece6826ed8b5a2e9b2a0df092b75f4c67f4edb", + "c28708019fa4658a45e6637f045077585bb05605", [ null, {} @@ -428799,7 +429543,7 @@ ] }, "idlharness.window.js": [ - "a60b7fe838eba4c7ba4fc7970940debbf37b702f", + "ddcc59c4034afa38f826bd1984bac1e64c1ad47b", [ "fullscreen/idlharness.window.html", { @@ -428811,8 +429555,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -429151,15 +429900,6 @@ ] ] }, - "hit-test": { - "idlharness.https.html": [ - "b7f67845470efa9730bcc754c098b5457e089f34", - [ - null, - {} - ] - ] - }, "hr-time": { "basic.any.js": [ "364dd81a3448188bd76f6ff410807bfcca93177d", @@ -429173,7 +429913,7 @@ ] ], "idlharness.any.js": [ - "4e266c09e3358034e6fac6fb282bbeb138e4278a", + "6676b001a8b81671d0c4645841407fc58a59b8f2", [ "hr-time/idlharness.any.html", { @@ -429189,8 +429929,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -429208,8 +429953,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -429227,8 +429977,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -429246,8 +430001,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -431570,7 +432330,7 @@ ] ], "window-prototype-chain.html": [ - "d29a8e11f43c2979d7fc67f37d3a8b862bf11cbb", + "4cad94830036759260eebe3ca5ab957ff1392cd9", [ null, {} @@ -441531,7 +442291,7 @@ ] ], "type-change-state.html": [ - "a10ea1d285830c79feba57c8e0753a05016fafb7", + "35f151b12d682a367ebcbbcc6dcf64f42fba0f97", [ null, {} @@ -449235,7 +449995,7 @@ ] ], "navigator_user_agent.https.html": [ - "9409dd08e4d0e7a351de45419c310cdcccc97c86", + "9a22728ec7edf54cd5de0cf65208e59858e778d2", [ null, {} @@ -449366,7 +450126,7 @@ ] ], "idlharness.window.js": [ - "50faf83514fdccf0a0c1d2b82c89b74649af5724", + "d4d739ae8ebcd3ac12645b4a877f35649a72c5f4", [ "html-media-capture/idlharness.window.html", { @@ -449378,8 +450138,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ] @@ -451545,6 +452310,13 @@ {} ] ], + "sources.html": [ + "599a5c471b38d53481d347f4053dd67fe58607ee", + [ + null, + {} + ] + ], "supported-layout-type.html": [ "3ba209f50a427965b651c92701a62f9006b8a2b1", [ @@ -453573,7 +454345,7 @@ ] ], "MediaDevices-enumerateDevices.https.html": [ - "efb460731690df01e3b53d15eb4d097f2d16b106", + "92512eef0129bbc6d4791ad82287b5c7ce67fd56", [ null, {} @@ -455443,7 +456215,7 @@ }, "native-file-system": { "idlharness.https.any.js": [ - "567912ddd7788b871b00a2929f17dc47280dd2d7", + "98b27fd9e3842845771563b45f4161f766bad559", [ "native-file-system/idlharness.https.any.html", { @@ -455455,8 +456227,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -455470,8 +456247,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -456666,7 +457448,7 @@ ] ], "idlharness.window.js": [ - "504453b9aff1e7b497c64955a98dc384817f1ba6", + "530a9058faa334aab29b8a6e87ca0a44d1286e18", [ "navigation-timing/idlharness.window.html", { @@ -456678,8 +457460,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -468429,7 +469216,7 @@ ] ], "idlharness.https.window.js": [ - "55cfed9276b480d7f70c616fa8d815f6ec925d66", + "ba816bb87cf715fd860745d3b80ca30da688c430", [ "orientation-event/idlharness.https.window.html", { @@ -468441,8 +469228,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -468922,7 +469714,7 @@ ] }, "idlharness.any.js": [ - "c8ee8a326d1325ab38cae686c4647a81ec12e517", + "d239c29b47e86911e02584fdb1f49ad378f9e622", [ "origin-policy/idlharness.any.html", { @@ -468938,8 +469730,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -468957,8 +469754,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -468976,8 +469778,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -468995,8 +469802,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -469072,7 +469884,7 @@ }, "page-visibility": { "idlharness.window.js": [ - "8cc2f83095c1ce7ad04a06406a0d79b876aee32b", + "7af89b6ddf2076256c00a5af702189ead85eccbb", [ "page-visibility/idlharness.window.html", { @@ -469084,8 +469896,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -469515,7 +470332,7 @@ ] ], "idlharness.https.any.js": [ - "878114ec7ed878d3e754341cbffa138092fee129", + "dfb0190abacb96c61cf5c125c68a1ad346f60205", [ "payment-handler/idlharness.https.any.html", { @@ -469535,8 +470352,13 @@ [ "script", "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -469558,8 +470380,13 @@ [ "script", "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -469581,8 +470408,13 @@ [ "script", "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -469604,8 +470436,13 @@ [ "script", "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -470632,7 +471469,7 @@ }, "permissions-revoke": { "idlharness.any.js": [ - "53f36db7d9ed8f51b724571500cc279f712cc23e", + "51c63aadefcd800139041232df3cf03386e3bc53", [ "permissions-revoke/idlharness.any.html", { @@ -470644,8 +471481,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -470659,8 +471501,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ] @@ -472477,10 +473324,12 @@ ] ], "no-quirks.html": [ - "cd192029df4907dc8fd959828e8d4accb6ddf01b", + "82036f9a617062b3fc11755a894f7266021f8097", [ null, - {} + { + "timeout": "long" + } ] ], "quirks.html": [ @@ -483831,7 +484680,7 @@ ] ], "element-based-offset.html": [ - "1c7d99822855e619a3e53084a608a104970ccf27", + "064ab4c5f3ae43c4ea4476997a85c3836a1419ee", [ null, {} @@ -483855,8 +484704,15 @@ } ] ], + "scroll-animation-inactive-timeline.html": [ + "07dae95692eb58d1b0079ecf5b8f5048875ad3a9", + [ + null, + {} + ] + ], "scroll-animation.html": [ - "901549e7a44545e1ffe1ec1a4b00df1f605aac35", + "cb270d52f7c406523cc7705433267bdf33ede5cc", [ null, {} @@ -483877,7 +484733,7 @@ ] ], "setting-current-time.html": [ - "0b7dcc60034d16207b9e88f8da34bddeb044b23d", + "d46206d8257702d443e3b1e620bf9bad4f327ee3", [ null, {} @@ -485819,6 +486675,15 @@ null, {} ] + ], + "samesite-cookies.https.html": [ + "a860d9545662138570ef59808c465b33b7261b48", + [ + null, + { + "timeout": "long" + } + ] ] }, "navigation-redirect-body.https.html": [ @@ -486598,8 +487463,15 @@ {} ] ], - "declarative-shadow-dom.tentative.html": [ - "792d4bf4b3ecd0b8a611cccdae5bc2e726486f25", + "declarative-shadow-dom-attachment.tentative.html": [ + "0acdeb812ec7fa4fac541ef3bc19e1da2f455d64", + [ + null, + {} + ] + ], + "declarative-shadow-dom-basic.tentative.html": [ + "c8a00f59bc8981488b30553bb531f50c2abdc100", [ null, {} @@ -488287,7 +489159,7 @@ ] ], "idlharness.https.any.js": [ - "0ce4d5a0c8fccf07f6908a7a9ac9ac5ab5df6624", + "773fac4e4a8cabb09b6c3f838a83aac7c3b43f54", [ "storage/idlharness.https.any.html", { @@ -488299,8 +489171,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -488314,8 +489191,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -500090,7 +500972,7 @@ ] ], "idlharness.window.js": [ - "fbe14daa6119a8213ca58e2233345af015353a1b", + "a3cfbc11e03f18c741e779af8ed5ce59b2e18385", [ "vibration/idlharness.window.html", { @@ -500102,8 +500984,13 @@ [ "script", "/resources/idlharness.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -500651,7 +501538,7 @@ ] ], "toString.any.js": [ - "ca025576c2b49604f053c83002f3a9cc8ef41a7b", + "5f64d72de9d9df4a99e482cded5a30ac1c8a343c", [ null, { @@ -501037,7 +501924,7 @@ ] ], "toString.any.js": [ - "ccd665eb285379d1c4de00ae19a8dc3693b22d40", + "701ec8f9bad998bc26310e74a8a7e23f2cbf5c4d", [ null, { @@ -501260,7 +502147,7 @@ ] ], "toString.any.js": [ - "4e15d75ea20f1ebfeba5dc7c8a9a52c253dd01bf", + "bb9081d18617e1af72424ea700d30e5cb0efd98d", [ null, { @@ -501507,7 +502394,7 @@ ] ], "toString.any.js": [ - "2db2002ffd2ea51a8684e4b52c24b8b18010f0cd", + "7dd85a1c4ac6e525e1e4c0f9bacc3295e7eda7fc", [ null, { @@ -501556,6 +502443,13 @@ ] ] }, + "proto-from-ctor-realm.html": [ + "72931cca77cf2af6e06616af32b4608fb02d38c0", + [ + null, + {} + ] + ], "table": { "constructor.any.js": [ "5c9a6f13d91eba098ab59e893145222375e1b6cc", @@ -501827,7 +502721,7 @@ ] ], "toString.any.js": [ - "e576477910ad3198b446b4addf89ba9a571d020b", + "708c17b3acadfde2c9abda300c2d57e61f5a70ce", [ null, { @@ -502972,7 +503866,7 @@ ] ], "pending.html": [ - "fe7efe05aafa9a68327df513b1f5dc51fc6ad4b3", + "c200f9e97739e802488d416b79fc5f6084655c6c", [ null, {} @@ -503270,7 +504164,7 @@ ] ], "setting-the-timeline-of-an-animation.html": [ - "dd8617503951aafd71015d591914a1b54e3907a7", + "7e98ef4260f778c4257203f92db39a6bdaa92871", [ null, {} @@ -503519,7 +504413,7 @@ ] ], "idlharness.tentative.https.any.js": [ - "1ad570370e5cdf49fe1c457fc0d37eb44eeedada", + "2df7831c3405720f62428eb2c8722c7d172f743e", [ "web-locks/idlharness.tentative.https.any.html", { @@ -503535,8 +504429,13 @@ [ "global", "window,dedicatedworker,sharedworker,serviceworker" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -503554,8 +504453,13 @@ [ "global", "window,dedicatedworker,sharedworker,serviceworker" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -503573,8 +504477,13 @@ [ "global", "window,dedicatedworker,sharedworker,serviceworker" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ], [ @@ -503592,8 +504501,13 @@ [ "global", "window,dedicatedworker,sharedworker,serviceworker" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -514081,6 +514995,13 @@ {} ] ], + "idlharness.https.html": [ + "b7f67845470efa9730bcc754c098b5457e089f34", + [ + null, + {} + ] + ], "xrRay_constructor.https.html": [ "56b39313410b46bc1ab468fa00fedeb516b57b5d", [ @@ -515296,14 +516217,14 @@ ] ], "WorkerNavigator_userAgentData.http.html": [ - "e47e7e7ceba638eda3d946b420d817a7013aa217", + "4e8ca34eebccd53d0e00e39008d2da7f29945a68", [ null, {} ] ], "WorkerNavigator_userAgentData.https.html": [ - "91a63966c01fa30832b72bb16ce4c8926db716f9", + "c93cd1ed34598ac0dc4450b116f3e791f9be72e8", [ null, {} @@ -516459,7 +517380,7 @@ ] ], "dedicated-worker-parse-error-failure.html": [ - "e7cb1c476231f0cc8b19021548772caba14a3740", + "343bfe289f30c27509118741ace57db19b6b270f", [ null, {} @@ -519905,7 +520826,7 @@ ] ], "send-redirect-to-cors.htm": [ - "43bbe4b6d79079d623783fe15e15a8b7dd285e36", + "54d7eb550df7510a58c18bf57e6b1614e76e00e2", [ null, {} diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini new file mode 100644 index 00000000000..ff201e24186 --- /dev/null +++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-interface.any.js.ini @@ -0,0 +1,33 @@ +[class-string-interface.any.html] + [Object.prototype.toString applied to the prototype] + expected: FAIL + + [Object.prototype.toString applied to a null-prototype instance] + expected: FAIL + + [Object.prototype.toString applied after modifying the prototype's @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists on the prototype with the appropriate descriptor] + expected: FAIL + + +[class-string-interface.any.worker.html] + [Object.prototype.toString applied to the prototype] + expected: FAIL + + [Object.prototype.toString applied to a null-prototype instance] + expected: FAIL + + [Object.prototype.toString applied after modifying the prototype's @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists on the prototype with the appropriate descriptor] + expected: FAIL + diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini new file mode 100644 index 00000000000..0d1aec4f066 --- /dev/null +++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js.ini @@ -0,0 +1,33 @@ +[class-string-iterator-prototype-object.any.html] + [Object.prototype.toString] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after nulling the prototype] + expected: FAIL + + +[class-string-iterator-prototype-object.any.worker.html] + [Object.prototype.toString] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after nulling the prototype] + expected: FAIL + diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini new file mode 100644 index 00000000000..353805a5a06 --- /dev/null +++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js.ini @@ -0,0 +1,13 @@ +[class-string-named-properties-object.window.html] + [Object.prototype.toString applied after modifying @@toStringTag] + expected: FAIL + + [Object.prototype.toString applied after deleting @@toStringTag] + expected: FAIL + + [@@toStringTag exists with the appropriate descriptor] + expected: FAIL + + [Object.prototype.toString] + expected: FAIL + diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini new file mode 100644 index 00000000000..f64b45fea6b --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-002.html] + [Hit test float] + expected: FAIL + diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini new file mode 100644 index 00000000000..f29da48a2a0 --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-003.html] + [Miss float below something else] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini new file mode 100644 index 00000000000..d0b3bc98be7 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-iframe-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-iframe-root.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini new file mode 100644 index 00000000000..c69b7cbb3b0 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-root.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini new file mode 100644 index 00000000000..25f76c60b9b --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/background-margin-transformed-root.html.ini @@ -0,0 +1,2 @@ +[background-margin-transformed-root.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini new file mode 100644 index 00000000000..20e1b790822 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-011.html.ini @@ -0,0 +1,2 @@ +[gap-011.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini new file mode 100644 index 00000000000..9f3e416efc5 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-012.html.ini @@ -0,0 +1,2 @@ +[gap-012.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini new file mode 100644 index 00000000000..856975d6f05 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-013.html.ini @@ -0,0 +1,2 @@ +[gap-013.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini new file mode 100644 index 00000000000..f5e7fbecd47 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-014.html.ini @@ -0,0 +1,2 @@ +[gap-014.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini new file mode 100644 index 00000000000..660a042cb7f --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-015.html.ini @@ -0,0 +1,2 @@ +[gap-015.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini b/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini new file mode 100644 index 00000000000..d1071378ed9 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/gap-016.html.ini @@ -0,0 +1,2 @@ +[gap-016.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini b/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini new file mode 100644 index 00000000000..1569c50b18c --- /dev/null +++ b/tests/wpt/metadata/css/css-transforms/backface-visibility-hidden-animated.html.ini @@ -0,0 +1,2 @@ +[backface-visibility-hidden-animated.html] + expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini new file mode 100644 index 00000000000..8e9e7b13e49 --- /dev/null +++ b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-001.html.ini @@ -0,0 +1,2 @@ +[fill-box-001.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini new file mode 100644 index 00000000000..3f1877d85ad --- /dev/null +++ b/tests/wpt/metadata/css/css-transforms/transform-box/fill-box-002.html.ini @@ -0,0 +1,2 @@ +[fill-box-002.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini b/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini new file mode 100644 index 00000000000..d48f67c6c1f --- /dev/null +++ b/tests/wpt/metadata/css/css-transforms/transform-percent-010.html.ini @@ -0,0 +1,2 @@ +[transform-percent-010.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini index 42f61e8ed49..2dffa903119 100644 --- a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini +++ b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini @@ -509,3 +509,39 @@ [border-left-width length(pt) / values] expected: FAIL + [right length(pc) / values] + expected: FAIL + + [top length(pt) / values] + expected: FAIL + + [top length(pc) / values] + expected: FAIL + + [right length(px) / values] + expected: FAIL + + [top length(px) / values] + expected: FAIL + + [top percentage(%) / values] + expected: FAIL + + [top length(em) / values] + expected: FAIL + + [top length(in) / values] + expected: FAIL + + [top length(cm) / values] + expected: FAIL + + [top length(mm) / values] + expected: FAIL + + [top length(ex) / values] + expected: FAIL + + [right length(pt) / values] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index 628b1fab770..c884dc82eab 100644 --- a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -2,3 +2,6 @@ [listeners are called when <iframe> is resized] expected: FAIL + [listeners are called correct number of times] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index a5926d41b90..221f0bc51f8 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -318,9 +318,18 @@ [<iframe>: separate response Content-Type: text/html;" text/plain] expected: FAIL - [<iframe>: combined response Content-Type: text/html */*;charset=gbk] + [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html] expected: FAIL - [<iframe>: combined response Content-Type: text/html;x=" text/plain] + [<iframe>: separate response Content-Type: text/html */*;charset=gbk] + expected: FAIL + + [<iframe>: separate response Content-Type: text/plain */*] + expected: FAIL + + [<iframe>: combined response Content-Type: text/html;" \\" text/plain] + expected: FAIL + + [<iframe>: separate response Content-Type: text/plain */*;charset=gbk] expected: FAIL diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini index ac4cbcba706..279734168dc 100644 --- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini @@ -53,9 +53,9 @@ [combined text/javascript ] expected: FAIL - [separate text/javascript;charset=windows-1252 error text/javascript] + [separate text/javascript x/x] expected: FAIL - [separate text/javascript x/x] + [separate text/javascript;charset=windows-1252 text/javascript] expected: FAIL diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini index 30e1b851fd4..61682d248e2 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,3 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!] expected: FAIL + [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini new file mode 100644 index 00000000000..75d75b4cda2 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_2.html] + [Multiple history traversals, last would be aborted] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini new file mode 100644 index 00000000000..51f8272a6de --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_3.html] + [Multiple history traversals, last would be aborted] + expected: FAIL + diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index e3b55e1876a..328448ca87a 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -1379,6 +1379,15 @@ [ElementInternals interface: operation setFormValue((File or USVString or FormData)?, optional (File or USVString or FormData)?)] expected: FAIL + [Navigator interface: operation registerProtocolHandler(DOMString, USVString)] + expected: FAIL + + [Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString)" with the proper type] + expected: FAIL + + [Navigator interface: calling registerProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError] + expected: FAIL + [idlharness.https.html?include=(Document|Window)] [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type] diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini index 8b743f36e1d..dab21cae5d8 100644 --- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini +++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini @@ -4,7 +4,7 @@ expected: FAIL [Element with tabindex should support autofocus] - expected: TIMEOUT + expected: FAIL [Host element with delegatesFocus including no focusable descendants should be skipped] expected: NOTRUN @@ -13,8 +13,5 @@ expected: NOTRUN [Host element with delegatesFocus should support autofocus] - expected: NOTRUN - - [Non-HTMLElement should not support autofocus] - expected: NOTRUN + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index 9df1ac56f2a..963d4cd20ef 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,6 +1,6 @@ [iframe_sandbox_popups_nonescaping-1.html] type: testharness - expected: TIMEOUT + expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini index d43f38b40cd..45d8be1c898 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini @@ -1,6 +1,6 @@ [iframe_sandbox_popups_nonescaping-2.html] type: testharness - expected: TIMEOUT + expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: NOTRUN diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini index a1effd5f801..5ddb9bfeff6 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini @@ -1,9 +1,10 @@ [promise-job-entry.html] + expected: TIMEOUT [Fulfillment handler on fulfilled promise] expected: FAIL [Rejection handler on pending-then-rejected promise] - expected: FAIL + expected: TIMEOUT [Sanity check: this all works as expected with no promises involved] expected: FAIL @@ -15,5 +16,5 @@ expected: FAIL [Fulfillment handler on pending-then-fulfilled promise] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini b/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini new file mode 100644 index 00000000000..4af6bc07bbf --- /dev/null +++ b/tests/wpt/metadata/wasm/jsapi/proto-from-ctor-realm.html.ini @@ -0,0 +1,226 @@ +[proto-from-ctor-realm.html] + [WebAssembly.Table: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Global: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Global: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Module: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Instance: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Memory: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Memory: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Instance: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Module: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Instance: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Global: cross-realm NewTarget with `""` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Global: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of cross-realm NewTarget with `true` prototype] + expected: FAIL + + [WebAssembly.Module: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Table: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Instance: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Instance: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `"str"` prototype] + expected: FAIL + + [WebAssembly.Global: Proxy of Proxy of cross-realm NewTarget with `-0` prototype] + expected: FAIL + + [WebAssembly.Table: bound cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Memory: cross-realm NewTarget with `-1` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `0` prototype] + expected: FAIL + + [WebAssembly.Table: bound Proxy of cross-realm NewTarget with `false` prototype] + expected: FAIL + + [WebAssembly.Table: bound bound cross-realm NewTarget with `null` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `undefined` prototype] + expected: FAIL + + [WebAssembly.Memory: Proxy of bound cross-realm NewTarget with `NaN` prototype] + expected: FAIL + + [WebAssembly.Module: cross-realm NewTarget with `symbol "Symbol()"` prototype] + expected: FAIL + + [WebAssembly.Table: cross-realm NewTarget with `true` prototype] + expected: FAIL + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini index ef453d9ebcc..fb97f37983e 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini @@ -167,3 +167,6 @@ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 39026.\n\t[39026\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] expected: FAIL + [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 40530 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 29020.\n\t[29020\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] + expected: FAIL + diff --git a/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini b/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini new file mode 100644 index 00000000000..ba041c725fd --- /dev/null +++ b/tests/wpt/metadata/webxr/hit-test/idlharness.https.html.ini @@ -0,0 +1,73 @@ +[idlharness.https.html] + [XRTransientInputHitTestSource interface object length] + expected: FAIL + + [XRFrame interface: operation getHitTestResultsForTransientInput(XRTransientInputHitTestSource)] + expected: FAIL + + [XRRay interface: new XRRay() must inherit property "matrix" with the proper type] + expected: FAIL + + [XRSession interface: operation requestHitTestSource(XRHitTestOptionsInit)] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object] + expected: FAIL + + [XRTransientInputHitTestSource interface object name] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface object] + expected: FAIL + + [XRTransientInputHitTestResult interface object name] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [XRSession interface: calling requestHitTestSource(XRHitTestOptionsInit) on xrSession with too few arguments must throw TypeError] + expected: FAIL + + [XRTransientInputHitTestResult interface: attribute results] + expected: FAIL + + [XRSession interface: calling requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit) on xrSession with too few arguments must throw TypeError] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [XRTransientInputHitTestResult interface: attribute inputSource] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface object] + expected: FAIL + + [XRSession interface: xrSession must inherit property "requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)" with the proper type] + expected: FAIL + + [XRTransientInputHitTestResult interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [idl_test setup] + expected: FAIL + + [XRTransientInputHitTestSource interface: existence and properties of interface prototype object] + expected: FAIL + + [XRSession interface: xrSession must inherit property "requestHitTestSource(XRHitTestOptionsInit)" with the proper type] + expected: FAIL + + [XRTransientInputHitTestSource interface: operation cancel()] + expected: FAIL + + [XRSession interface: operation requestHitTestSourceForTransientInput(XRTransientInputHitTestOptionsInit)] + expected: FAIL + + [XRTransientInputHitTestResult interface object length] + expected: FAIL + diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index 14e1efa1e84..c71f54ddc07 100644 --- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini @@ -338,3 +338,27 @@ [Stringification of xrInputSourceArray] expected: FAIL + [XRLayer interface: existence and properties of interface prototype object] + expected: FAIL + + [XRLayer interface: existence and properties of interface object] + expected: FAIL + + [XRLayer interface object name] + expected: FAIL + + [XRLayer interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [XRWebGLLayer interface: existence and properties of interface object] + expected: FAIL + + [XRWebGLLayer interface: existence and properties of interface prototype object] + expected: FAIL + + [XRLayer interface object length] + expected: FAIL + + [XRLayer interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + diff --git a/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini deleted file mode 100644 index fe8654e447c..00000000000 --- a/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[WorkerGlobalScope-close.html] - [Test sending a message after closing.] - expected: FAIL - diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini new file mode 100644 index 00000000000..80f9a4f15b8 --- /dev/null +++ b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini @@ -0,0 +1,2 @@ +[Worker-constructor.html] + expected: ERROR diff --git a/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini b/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini index 83385f509bb..fcc36e00a53 100644 --- a/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini +++ b/tests/wpt/metadata/xhr/send-redirect-to-cors.htm.ini @@ -27,3 +27,9 @@ [XMLHttpRequest: send() - Redirect to CORS-enabled resource (303 FOO with string and explicit Content-Type safelisted)] expected: FAIL + [XMLHttpRequest: send() - Redirect to CORS-enabled resource (302 POST with string and explicit Content-Type)] + expected: FAIL + + [XMLHttpRequest: send() - Redirect to CORS-enabled resource (301 POST with string and explicit Content-Type)] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/.taskcluster.yml b/tests/wpt/web-platform-tests/.taskcluster.yml index 556b9914d5b..7f794e8c2b0 100644 --- a/tests/wpt/web-platform-tests/.taskcluster.yml +++ b/tests/wpt/web-platform-tests/.taskcluster.yml @@ -56,7 +56,7 @@ tasks: owner: ${owner} source: ${event.repository.clone_url} payload: - image: hexcles/web-platform-tests:0.35 + image: webplatformtests/wpt:0.36 maxRunTime: 7200 artifacts: public/results: diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html new file mode 100644 index 00000000000..633f7e4f7e3 --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<meta charset="utf-8"> +<title>createImageBitmap and drawImage from a blob with image orientation: from-image</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/drawImage-from-blob-ref.html"> + <script> + function makeBlob() { + return new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", '/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg'); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function() { + resolve(xhr.response); + }; + }); + } + + window.onload = function() { + var cfb = document.getElementById("canvasWithFileBitmap"); + makeBlob().then(function(blob){createImageBitmap(blob).then(bitmap => { + cfb.getContext("2d").drawImage(bitmap, 0, 0); + window.requestAnimationFrame(() => { + document.documentElement.removeAttribute("class"); + }); + }); + }); + } +</script> +</head> +<body> + <canvas id="canvasWithFileBitmap" width="300" height="300"></canvas> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html new file mode 100644 index 00000000000..72bd98fa252 --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/image-orientation/reference/drawImage-from-blob-ref.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>createImageBitmap and drawImage from a blob with image orientation: from-image, reference</title> +</head> +<body> + <img id="img-element" src="../../../../css/css-images/image-orientation/support/exif-orientation-3-lr.jpg"> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js new file mode 100644 index 00000000000..ee792d53683 --- /dev/null +++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-interface.any.js @@ -0,0 +1,62 @@ +"use strict"; + +test(() => { + assert_own_property(Blob.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(Blob.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "Blob", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); + +test(() => { + assert_not_own_property(new Blob(), Symbol.toStringTag); +}, "@@toStringTag must not exist on the instance"); + +test(() => { + assert_equals(Object.prototype.toString.call(Blob.prototype), "[object Blob]"); +}, "Object.prototype.toString applied to the prototype"); + +test(() => { + assert_equals(Object.prototype.toString.call(new Blob()), "[object Blob]"); +}, "Object.prototype.toString applied to an instance"); + +test(t => { + assert_own_property(Blob.prototype, Symbol.toStringTag, "Precondition for this test: @@toStringTag on the prototype"); + + t.add_cleanup(() => { + Object.defineProperty(Blob.prototype, Symbol.toStringTag, { value: "Blob" }); + }); + + Object.defineProperty(Blob.prototype, Symbol.toStringTag, { value: "NotABlob" }); + assert_equals(Object.prototype.toString.call(Blob.prototype), "[object NotABlob]", "prototype"); + assert_equals(Object.prototype.toString.call(new Blob()), "[object NotABlob]", "instance"); +}, "Object.prototype.toString applied after modifying the prototype's @@toStringTag"); + +test(t => { + const instance = new Blob(); + assert_not_own_property(instance, Symbol.toStringTag, "Precondition for this test: no @@toStringTag on the instance"); + + Object.defineProperty(instance, Symbol.toStringTag, { value: "NotABlob" }); + assert_equals(Object.prototype.toString.call(instance), "[object NotABlob]"); +}, "Object.prototype.toString applied to the instance after modifying the instance's @@toStringTag"); + +// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there +// was no @@toStringTag in the prototype, it would fall back to a magic class string. This tests +// that the bug is fixed. + +test(() => { + const instance = new Blob(); + Object.setPrototypeOf(instance, null); + + assert_equals(Object.prototype.toString.call(instance), "[object Object]"); +}, "Object.prototype.toString applied to a null-prototype instance"); + +// This test must be last. +test(() => { + delete Blob.prototype[Symbol.toStringTag]; + + assert_equals(Object.prototype.toString.call(Blob.prototype), "[object Object]", "prototype"); + assert_equals(Object.prototype.toString.call(new Blob()), "[object Object]", "instance"); +}, "Object.prototype.toString applied after deleting @@toStringTag"); diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js new file mode 100644 index 00000000000..2185ae0bb7b --- /dev/null +++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-iterator-prototype-object.any.js @@ -0,0 +1,50 @@ +"use strict"; + +const iteratorProto = Object.getPrototypeOf((new URLSearchParams()).entries()); + +test(() => { + assert_own_property(iteratorProto, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(iteratorProto, Symbol.toStringTag); + assert_equals(propDesc.value, "URLSearchParams Iterator", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists with the appropriate descriptor"); + +test(() => { + assert_equals(Object.prototype.toString.call(iteratorProto), "[object URLSearchParams Iterator]"); +}, "Object.prototype.toString"); + +test(t => { + assert_own_property(iteratorProto, Symbol.toStringTag, "Precondition for this test: @@toStringTag exists"); + + t.add_cleanup(() => { + Object.defineProperty(iteratorProto, Symbol.toStringTag, { value: "URLSearchParams Iterator" }); + }); + + Object.defineProperty(iteratorProto, Symbol.toStringTag, { value: "Not URLSearchParams Iterator" }); + assert_equals(Object.prototype.toString.call(iteratorProto), "[object Not URLSearchParams Iterator]"); +}, "Object.prototype.toString applied after modifying @@toStringTag"); + +// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there +// was no @@toStringTag, it would fall back to a magic class string. This tests that the bug is +// fixed. + +test(t => { + const proto = Object.getPrototypeOf(iteratorProto); + t.add_cleanup(() => { + Object.setPrototypeOf(iteratorProto, proto); + }); + + Object.setPrototypeOf(iteratorProto, null); + + assert_equals(Object.prototype.toString.call(iteratorProto), "[object Object]"); +}, "Object.prototype.toString applied after nulling the prototype"); + +// This test must be last. +test(() => { + delete iteratorProto[Symbol.toStringTag]; + + assert_equals(Object.prototype.toString.call(iteratorProto), "[object Object]", "prototype"); +}, "Object.prototype.toString applied after deleting @@toStringTag"); diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js new file mode 100644 index 00000000000..ad466188bae --- /dev/null +++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js @@ -0,0 +1,42 @@ +"use strict"; + +const namedPropertiesObject = Object.getPrototypeOf(Window.prototype); + +test(() => { + assert_own_property(namedPropertiesObject, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(namedPropertiesObject, Symbol.toStringTag); + assert_equals(propDesc.value, "WindowProperties", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists with the appropriate descriptor"); + +test(() => { + assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object WindowProperties]"); +}, "Object.prototype.toString"); + +test(t => { + assert_own_property(namedPropertiesObject, Symbol.toStringTag, "Precondition for this test: @@toStringTag exists"); + + t.add_cleanup(() => { + Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "WindowProperties" }); + }); + + Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "NotWindowProperties" }); + assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object NotWindowProperties]"); +}, "Object.prototype.toString applied after modifying @@toStringTag"); + +// Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there +// was no @@toStringTag, it would fall back to a magic class string. This tests that the bug is +// fixed. + +// Note: we cannot null out the prototype of the named properties object per +// https://heycam.github.io/webidl/#named-properties-object-setprototypeof so we don't have a test that does that. + +// This test must be last. +test(() => { + delete namedPropertiesObject[Symbol.toStringTag]; + + assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object EventTarget]", "prototype"); +}, "Object.prototype.toString applied after deleting @@toStringTag"); diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html index 03ada7aa0d4..d2d43eda9a9 100644 --- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html +++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/interface-prototype-object.html @@ -5,18 +5,6 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> -// A specification issue was raised for this behavior. -// https://www.w3.org/Bugs/Public/show_bug.cgi?id=28244 -test(function() { - // Checks toString() behavior. - assert_class_string(Document.prototype, "DocumentPrototype"); - - assert_true(Document.prototype.hasOwnProperty(Symbol.toStringTag), - "An interface prototype object should have toStringTag property."); - assert_equals(Document.prototype[Symbol.toStringTag], "DocumentPrototype"); -}, "The class string of an interface prototype object is the concatenation of " + - "the interface's identifier and the string 'Prototype'."); - test(function() { // https://heycam.github.io/webidl/#create-an-interface-prototype-object assert_own_property(Element.prototype, Symbol.unscopables, "Element.prototype has @@unscopables."); diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html index 466973dc08f..7859c1e46ac 100644 --- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html +++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/iterator-prototype-object.html @@ -37,16 +37,7 @@ test(() => { }); }, "next() throws TypeError when called on ineligible receiver"); -test(() => { - const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries()); - assert_equals(Object.prototype.toString.call(iteratorProto), "[object URLSearchParams Iterator]"); -}, "Object.prototype.toString returns correct value"); - -test(() => { - const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries()); - assert_equals(Object.getOwnPropertyDescriptor(iteratorProto, Symbol.toStringTag).value, "URLSearchParams Iterator"); - // Property attributes have not yet been fully spec'd. -}, "@@toStringTag has correct value"); +// class string behavior tested in a dedicated file test(() => { const iteratorProto1 = Object.getPrototypeOf(new URLSearchParams().entries()); diff --git a/tests/wpt/web-platform-tests/bluetooth/README.md b/tests/wpt/web-platform-tests/bluetooth/README.md index e7997c9fa26..abe277712bc 100644 --- a/tests/wpt/web-platform-tests/bluetooth/README.md +++ b/tests/wpt/web-platform-tests/bluetooth/README.md @@ -10,10 +10,11 @@ Testing] test API which must be provided by browsers under test. TODO([#485]): Update the links to [FakeBluetooth][Web Bluetooth Testing] to point to the [Testing Web Bluetooth specification]. -In this test suite `resources/bluetooth-helpers.js` detects and triggers -the API to be loaded as needed. This file also contains several helper methods -that are used in the tests to set up fake Bluetooth devices and to assert that -specific Bluetooth events happened. +In this test suite `resources/bluetooth-test.js` detects and triggers +the API to be loaded as needed. This file also contains test helper methods, +such as for asserting that Bluetooth events are fired in a specific order. +The `resources/bluetooth-fake-devices.js` contains several helper methods that set +up fake Bluetooth devices. [Web Bluetooth specification]: https://WebBluetoothCG.github.io/web-bluetooth [Web Bluetooth Testing]: @@ -115,4 +116,4 @@ Bug tracker: [Blink>Bluetooth] * [Web Bluetooth Service README] -[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2
\ No newline at end of file +[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2 diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js index a9f540ecd34..55f4a675da1 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with false if the system does ' + 'not have an adapter.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js index 30c47201f07..f8e25b2ac2f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with true after adapter is ' + 'inserted into a system with a platform that supports Bluetooth LE.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js index b760d4bc272..1ffcd3bb096 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with true if the Bluetooth ' + 'radio is powered off, but the platform that supports Bluetooth LE.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js index f98a88eea9e..84c7982d214 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with true if the Bluetooth ' + 'radio is powered on and the platform supports Bluetooth LE.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js index ac664a89812..c4ba9b5f3a9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() is not affected by the powered state of ' + 'the adapter.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js index 00425aa56f2..ca0b51f47dc 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with false after the powered ' + 'on adapter is removed.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js index ce633c63f98..54abfbb5cef 100644 --- a/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getAvailability() resolves with false if called from a ' + 'unique origin'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js index 5239accab97..f7a57a9c4b8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/characteristicProperties.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'HeartRate device properties'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js index eb91e972c4e..7789f4b7c46 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js index 4cff64bbdad..01d4e8f30f8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getDescriptor should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js index f5d1761994a..16b34dc0912 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py // TODO(https://crbug.com/672127) Use this test case to test the rest of // characteristic functions. diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js index 7405a8ee6e3..b924f052d37 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js index 470f7043be3..ae8127c87b3 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js index 1dc58aea155..11dd8bee80a 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getDescriptors should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js index 5ee7e0d2494..13e2e3751a8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py // TODO(https://crbug.com/672127) Use this test case to test the rest of // characteristic functions. diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js index 24a2087e938..99056cf209a 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py // TODO(https://crbug.com/672127) Use this test case to test the rest of // characteristic functions. diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js index 2ab165d9044..9641ad71e97 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Characteristic is removed. Reject with InvalidStateError.'; const expected = new DOMException( diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js index d2456934d83..a5851fc4733 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/notifications/service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Service is removed. Reject with InvalidStateError.'; const expected = diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js index 13709ea941e..0eeafd0b79b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/add-multiple-event-listeners.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Add multiple event listeners then readValue().'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js index 269f2cb4a1f..e97b94f7366 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; const expected = new DOMException( diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js index 03b8f2b4cee..52b70e7a080 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/event-is-fired.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Reading a characteristic should fire an event.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js index 26efe8b306b..e2599a16fae 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js index 82be128f312..e5ddfb81696 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-succeeds.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'A read request succeeds and returns the characteristic\'s ' + 'value.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js index 34da455ddff..bb98aeb18f2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/read-updates-value.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js const test_desc = 'Succesful read should update characteristic.value'; const EXPECTED_VALUE = [0, 1, 2]; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js index 20dd4ba1c05..1f699ca25ee 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Service gets removed. Reject with InvalidStateError.'; const expected = diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js index b34b3b9216a..dafd755fd1d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-from-2-characteristics.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Same parent service returned from multiple characteristics.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js index b58902ae519..01b3a25e35e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/service-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = '[SameObject] test for BluetoothRemoteGATTCharacteristic ' + 'service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js index af27f933d8f..62d0d15d10b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js index d900632c4b5..5d707775e11 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'writeValue() fails when passed a detached buffer'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js index c0f5a3e6509..6e9da8802c7 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; const expected = new DOMException( diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js index d5ac10fc611..2ceeabdb145 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js index e7a2837c389..89c31124750 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'Service gets removed. Reject with InvalidStateError.'; const expected = diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js index cdda9cec345..d5c173c47ae 100644 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/write-succeeds.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'A regular write request to a writable characteristic ' + 'should succeed.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js index aa95687094b..2c46b99fd1d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Service gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js index fc1facaf58e..d81db2f8c0d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = `A read request succeeds and returns the descriptor's value.`; diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js index 4fd3d661f7d..49daf7cf86d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'writeValue() fails when passed a detached buffer'; diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js index a486819b55a..c681bcee419 100644 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Service gets removed. Reject with InvalidStateError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js index dab54d5da29..43a11a88cbf 100644 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'A device disconnecting while connected should fire the ' + 'gattserverdisconnected event.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js index a15cc943f4e..a2c20ea4620 100644 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'A device disconnecting after the BluetoothDevice object ' + 'has been GC\'ed should not access freed memory.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js index f5e45f99755..ab273adbc88 100644 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'If a site disconnects from a device while the platform is ' + 'disconnecting that device, only one gattserverdisconnected event should ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js index 8f264c7b025..bdaf47c6619 100644 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'A device that reconnects during the ' + 'gattserverdisconnected event should still receive ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js index 34b5912315a..3228543617d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/granted-devices-with-services.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getDevices() resolves with permitted devices that can be ' + 'GATT connected to.'; @@ -68,4 +69,4 @@ bluetooth_test(async () => { } catch (err) { assert_unreached(`${err.name}: ${err.message}`); } -}, test_desc);
\ No newline at end of file +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js index d945c3ff242..304aa3820d5 100644 --- a/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/no-granted-devices.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'getDevices() resolves with empty array if no device ' + 'permissions have been granted.'; @@ -11,4 +12,4 @@ bluetooth_test(async () => { assert_equals( 0, devices.length, 'getDevices() should resolve with an empty array'); -}, test_desc);
\ No newline at end of file +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js index 7c80703d5f5..81c0f6a97e9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/getDevices/returns-same-bluetooth-device-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js 'use strict'; const test_desc = 'multiple calls to getDevices() resolves with the same' + 'BluetoothDevice objects for each granted Bluetooth device.'; @@ -19,4 +20,4 @@ bluetooth_test(async () => { firstDevices[0], secondDevices[0], 'getDevices() should produce the same BluetoothDevice objects for a ' + 'given Bluetooth device.'); -}, test_desc);
\ No newline at end of file +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html b/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html index 6030d4e5acd..ef2863dc274 100644 --- a/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/idl/idl-BluetoothDevice.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc_idl = 'BluetoothDevice IDL test.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html index 7b68acf1471..a47ee603f84 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Device with empty name and no UUIDs nearby. Should be ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html index 3c2dcb7f8a6..a69b313b51e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/device-with-name.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> const test_desc = 'A device with name and no UUIDs nearby. Should be found if ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html index d4c26771305..5d1fec3342e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-missing.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'requestDevice called with acceptAllDevices: true and ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html index 86377c289f6..06897f80992 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/acceptAllDevices/optional-services-present.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'requestDevice called with acceptAllDevices: true and with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html index 630548d6846..cb2f989a477 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-filter.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Reject with SecurityError if requesting a blocklisted ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html index 5c176b82b7f..3f435f9ff18 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/blocklisted-service-in-optionalServices.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Blocklisted UUID in optionalServices is removed and ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html index 5ca358a0e1a..28f614bcbf2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A device name between 29 and 248 bytes is valid.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html index 788d9f80361..4beb5266b68 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filter.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A filter must restrict the devices in some way.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html index 65bfc6443a4..2a6a0daa35f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-filters-member.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'An empty |filters| member should result in a TypeError'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html index 549f0d4059c..3e490e17d99 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-namePrefix.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'requestDevice with empty namePrefix. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html index b70a8a32087..3a485878be1 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Services member must contain at least one service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html index d3f6e5ccb13..d6177caf7f8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/filters-xor-acceptAllDevices.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'RequestDeviceOptions should have exactly one of ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html index 5e1397dbd9a..4ec036695bd 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name-unicode.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Unicode string with utf8 representation longer than 248 ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html index a270cac4331..0fac15ec65d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-name.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A device name longer than 248 must reject.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html index 05a9bd31300..d622da56df5 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix-unicode.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Unicode string with utf8 representation longer than 248 ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html index a31e4b398e7..8251935be16 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-exceeded-namePrefix.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A device name prefix longer than 248 must reject.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html index dca018b4954..c7cb0aa25e2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A unicode device name of 248 bytes is valid.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html index 7244910afa4..4b57e4b0ac8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-name.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A device name of 248 bytes is valid.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html index ba4bdf94c63..72faac6de8b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A unicode device namePrefix of 248 bytes is valid.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html index ced34793355..bf751501bfb 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A device namePrefix of 248 bytes is valid.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html index 33f933ad09c..a1cc4e5b422 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/no-arguments.https.html @@ -4,7 +4,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'requestDevice() requires an argument.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html index 787f34d5c68..70b284a2738 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A name containing unicode characters whose utf8 length ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html index bafb36d710c..726e293580f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'A namePrefix containing unicode characters whose utf8 ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html index e4880b6f57d..07187b4b759 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-optionalServices-member.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Invalid optional service must reject the promise.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html index 9d31b951be7..a78d75e6b4d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/canonicalizeFilter/wrong-service-in-services-member.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Invalid service must reject the promise.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html index d5cf382f664..543c8a586e9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/cross-origin-iframe.sub.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <body> <script> 'use strict'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html index 5bd7ff1246b..7bed9e0acb5 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/discovery-succeeds.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Discover a device using alias, name, or UUID.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html index 19ac36f80ad..d439bf79c9d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/doesnt-consume-user-gesture.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'requestDevice calls do not consume user gestures.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html index 1aeae776f06..1c42d779216 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/filter-matches.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Matches a filter if all present members match.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html index 3da9abeb773..e130fe92e63 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/le-not-supported.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Reject with NotFoundError if Bluetooth is not supported.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html index 944befdfe83..6d707a13850 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/name-empty-device-from-name-empty-filter.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'An empty name device can be obtained by empty name filter.' diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html index f74540db958..6795ae43015 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/not-processing-user-gesture.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Requires a user gesture.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html index 929af8ffb77..9494fa572a3 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/radio-not-present.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Reject with NotFoundError if there is no BT radio present.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html index 64ad3d592d1..484a35b79be 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-iframe.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Concurrent requestDevice calls in iframes work.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html index 4c4a5707e8e..26291b3b4c1 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/request-from-sandboxed-iframe.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <body> <script> 'use strict'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html index b96af439973..c0e83cc9c74 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/same-device.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Returned device should always be the same.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html b/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html index 9c0d621c237..8873a45e31d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/requestDevice/single-filter-single-service.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Simple filter selects matching device.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js new file mode 100644 index 00000000000..3bbcc6b322e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-fake-devices.js @@ -0,0 +1,991 @@ +'use strict'; + +/* Bluetooth Constants */ + +/** + * HCI Error Codes. + * Used for simulateGATT{Dis}ConnectionResponse. For a complete list of + * possible error codes see BT 4.2 Vol 2 Part D 1.3 List Of Error Codes. + */ +const HCI_SUCCESS = 0x0000; +const HCI_CONNECTION_TIMEOUT = 0x0008; + +/** + * GATT Error codes. + * Used for GATT operations responses. BT 4.2 Vol 3 Part F 3.4.1.1 Error + * Response + */ +const GATT_SUCCESS = 0x0000; +const GATT_INVALID_HANDLE = 0x0001; + +/* Bluetooth UUID Constants */ + +/* Service UUIDs */ +var blocklist_test_service_uuid = '611c954a-263b-4f4a-aab6-01ddb953f985'; +var request_disconnection_service_uuid = '01d7d889-7451-419f-aeb8-d65e7b9277af'; + +/* Characteristic UUIDs */ +var blocklist_exclude_reads_characteristic_uuid = + 'bad1c9a2-9a5b-4015-8b60-1579bbbf2135'; +var request_disconnection_characteristic_uuid = + '01d7d88a-7451-419f-aeb8-d65e7b9277af'; + +/* Descriptor UUIDs */ +var blocklist_test_descriptor_uuid = 'bad2ddcf-60db-45cd-bef9-fd72b153cf7c'; +var blocklist_exclude_reads_descriptor_uuid = + 'bad3ec61-3cc3-4954-9702-7977df514114'; + +/** + * Helper objects that associate Bluetooth names, aliases, and UUIDs. These are + * useful for tests that check that the same result is produces when using all + * three methods of referring to a Bluetooth UUID. + */ +var generic_access = { + alias: 0x1800, + name: 'generic_access', + uuid: '00001800-0000-1000-8000-00805f9b34fb' +}; +var device_name = { + alias: 0x2a00, + name: 'gap.device_name', + uuid: '00002a00-0000-1000-8000-00805f9b34fb' +}; +var reconnection_address = { + alias: 0x2a03, + name: 'gap.reconnection_address', + uuid: '00002a03-0000-1000-8000-00805f9b34fb' +}; +var heart_rate = { + alias: 0x180d, + name: 'heart_rate', + uuid: '0000180d-0000-1000-8000-00805f9b34fb' +}; +var health_thermometer = { + alias: 0x1809, + name: 'health_thermometer', + uuid: '00001809-0000-1000-8000-00805f9b34fb' +}; +var body_sensor_location = { + alias: 0x2a38, + name: 'body_sensor_location', + uuid: '00002a38-0000-1000-8000-00805f9b34fb' +}; +var glucose = { + alias: 0x1808, + name: 'glucose', + uuid: '00001808-0000-1000-8000-00805f9b34fb' +}; +var battery_service = { + alias: 0x180f, + name: 'battery_service', + uuid: '0000180f-0000-1000-8000-00805f9b34fb' +}; +var battery_level = { + alias: 0x2A19, + name: 'battery_level', + uuid: '00002a19-0000-1000-8000-00805f9b34fb' +}; +var user_description = { + alias: 0x2901, + name: 'gatt.characteristic_user_description', + uuid: '00002901-0000-1000-8000-00805f9b34fb' +}; +var client_characteristic_configuration = { + alias: 0x2902, + name: 'gatt.client_characteristic_configuration', + uuid: '00002902-0000-1000-8000-00805f9b34fb' +}; +var measurement_interval = { + alias: 0x2a21, + name: 'measurement_interval', + uuid: '00002a21-0000-1000-8000-00805f9b34fb' +}; + +/** + * An advertisement packet object that simulates a device. + * @type {ScanResult} + */ +const health_thermometer_ad_packet = { + deviceAddress: '09:09:09:09:09:09', + rssi: -10, + scanRecord: { + name: 'Health Thermometer', + uuids: [health_thermometer.uuid], + }, +}; + +/** Bluetooth Helpers */ + +/** + * Helper class to create a BluetoothCharacteristicProperties object using an + * array of strings corresponding to the property bit to set. + */ +class TestCharacteristicProperties { + /** @param {Array<string>} properties */ + constructor(properties) { + this.broadcast = false; + this.read = false; + this.writeWithoutResponse = false; + this.write = false; + this.notify = false; + this.indicate = false; + this.authenticatedSignedWrites = false; + this.reliableWrite = false; + this.writableAuxiliaries = false; + + properties.forEach(val => { + if (this.hasOwnProperty(val)) + this[val] = true; + else + throw `Invalid member '${val}'`; + }); + } +} + +/** + * Produces an array of BluetoothLEScanFilterInit objects containing the list of + * services in |services| and various permutations of the other + * BluetoothLEScanFilterInit properties. This method is used to test that the + * |services| are valid so the other properties do not matter. + * @param {BluetoothServiceUUID} services + * @returns {Array<RequestDeviceOptions>} A list of options containing + * |services| and various permutations of other options. + */ +function generateRequestDeviceArgsWithServices(services = ['heart_rate']) { + return [ + {filters: [{services: services}]}, + {filters: [{services: services, name: 'Name'}]}, + {filters: [{services: services, namePrefix: 'Pre'}]}, + {filters: [{services: services, name: 'Name', namePrefix: 'Pre'}]}, + {filters: [{services: services}], optionalServices: ['heart_rate']}, { + filters: [{services: services, name: 'Name'}], + optionalServices: ['heart_rate'] + }, + { + filters: [{services: services, namePrefix: 'Pre'}], + optionalServices: ['heart_rate'] + }, + { + filters: [{services: services, name: 'Name', namePrefix: 'Pre'}], + optionalServices: ['heart_rate'] + } + ]; +} + +/** + * Causes |fake_peripheral| to disconnect and returns a promise that resolves + * once `gattserverdisconnected` has been fired on |device|. + * @param {BluetoothDevice} device The device to check if the + * `gattserverdisconnected` promise was fired. + * @param {FakePeripheral} fake_peripheral The device fake that represents + * |device|. + * @returns {Promise<Array<Object>>} A promise that resolves when the device has + * successfully disconnected. + */ +function simulateGATTDisconnectionAndWait(device, fake_peripheral) { + return Promise.all([ + eventPromise(device, 'gattserverdisconnected'), + fake_peripheral.simulateGATTDisconnection(), + ]); +} + +/** + * Returns an array containing two FakePeripherals corresponding + * to the simulated devices. + * @returns {Promise<Array<FakePeripheral>>} The fake devices are initialized as + * Health Thermometer and Heart Rate devices. + */ +function setUpHealthThermometerAndHeartRateDevices() { + return navigator.bluetooth.test.simulateCentral({state: 'powered-on'}) + .then(fake_central => Promise.all([ + fake_central.simulatePreconnectedPeripheral({ + address: '09:09:09:09:09:09', + name: 'Health Thermometer', + knownServiceUUIDs: ['generic_access', 'health_thermometer'], + }), + fake_central.simulatePreconnectedPeripheral({ + address: '08:08:08:08:08:08', + name: 'Heart Rate', + knownServiceUUIDs: ['generic_access', 'heart_rate'], + }) + ])); +} + +/** + * Simulates a pre-connected device with |address|, |name| and + * |knownServiceUUIDs|. + * @param {string} address The device MAC address. + * @param {string} name The device name. + * @param {Array<string>} knownServiceUUIDs An array of GATT service UUIDs to + * set up the fake with. + * @returns {Promise<FakePeripheral>} The fake devices are initialized with the + * parameter values. + */ +function setUpPreconnectedDevice({ + address = '00:00:00:00:00:00', + name = 'LE Device', + knownServiceUUIDs = [] +}) { + return navigator.bluetooth.test.simulateCentral({state: 'powered-on'}) + .then(fake_central => fake_central.simulatePreconnectedPeripheral({ + address: address, + name: name, + knownServiceUUIDs: knownServiceUUIDs, + })); +} + +/** Blocklisted GATT Device Helper Methods */ + +/** + * Returns an object containing a BluetoothDevice discovered using |options|, + * its corresponding FakePeripheral and FakeRemoteGATTServices. + * The simulated device is called 'Blocklist Device' and it has one known + * service UUID |blocklist_test_service_uuid|. The |blocklist_test_service_uuid| + * service contains two characteristics: + * - |blocklist_exclude_reads_characteristic_uuid| (read, write) + * - 'gap.peripheral_privacy_flag' (read, write) + * The 'gap.peripheral_privacy_flag' characteristic contains three descriptors: + * - |blocklist_test_descriptor_uuid| + * - |blocklist_exclude_reads_descriptor_uuid| + * - 'gatt.client_characteristic_configuration' + * These are special UUIDs that have been added to the blocklist found at + * https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt + * There are also test UUIDs that have been added to the test environment which + * other implementations should add as test UUIDs as well. + * The device has been connected to and its attributes are ready to be + * discovered. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor}>} An + * object containing the BluetoothDevice object and its corresponding + * GATT fake objects. + */ +function getBlocklistDevice(options = { + filters: [{services: [blocklist_test_service_uuid]}] +}) { + let device, fake_peripheral, fake_blocklist_test_service, + fake_blocklist_exclude_reads_characteristic, + fake_blocklist_exclude_writes_characteristic, fake_blocklist_descriptor, + fake_blocklist_exclude_reads_descriptor, + fake_blocklist_exclude_writes_descriptor; + return setUpPreconnectedDevice({ + address: '11:11:11:11:11:11', + name: 'Blocklist Device', + knownServiceUUIDs: ['generic_access', blocklist_test_service_uuid], + }) + .then(_ => fake_peripheral = _) + .then(() => requestDeviceWithTrustedClick(options)) + .then(_ => device = _) + .then(() => fake_peripheral.setNextGATTConnectionResponse({ + code: HCI_SUCCESS, + })) + .then(() => device.gatt.connect()) + .then(() => fake_peripheral.addFakeService({ + uuid: blocklist_test_service_uuid, + })) + .then(_ => fake_blocklist_test_service = _) + .then(() => fake_blocklist_test_service.addFakeCharacteristic({ + uuid: blocklist_exclude_reads_characteristic_uuid, + properties: ['read', 'write'], + })) + .then(_ => fake_blocklist_exclude_reads_characteristic = _) + .then(() => fake_blocklist_test_service.addFakeCharacteristic({ + uuid: 'gap.peripheral_privacy_flag', + properties: ['read', 'write'], + })) + .then(_ => fake_blocklist_exclude_writes_characteristic = _) + .then( + () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor( + {uuid: blocklist_test_descriptor_uuid})) + .then(_ => fake_blocklist_descriptor = _) + .then( + () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor( + {uuid: blocklist_exclude_reads_descriptor_uuid})) + .then(_ => fake_blocklist_exclude_reads_descriptor = _) + .then( + () => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor( + {uuid: 'gatt.client_characteristic_configuration'})) + .then(_ => fake_blocklist_exclude_writes_descriptor = _) + .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ + code: HCI_SUCCESS, + })) + .then(() => ({ + device, + fake_peripheral, + fake_blocklist_test_service, + fake_blocklist_exclude_reads_characteristic, + fake_blocklist_exclude_writes_characteristic, + fake_blocklist_descriptor, + fake_blocklist_exclude_reads_descriptor, + fake_blocklist_exclude_writes_descriptor, + })); +} + +/** + * Returns an object containing a Blocklist Test BluetoothRemoveGattService and + * its corresponding FakeRemoteGATTService. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor, + * service: BluetoothRemoteGATTService, + * fake_service: FakeBluetoothRemoteGATTService}>} An object containing the + * BluetoothDevice object and its corresponding GATT fake objects. + */ +function getBlocklistTestService() { + let result; + return getBlocklistDevice() + .then(_ => result = _) + .then( + () => + result.device.gatt.getPrimaryService(blocklist_test_service_uuid)) + .then(service => Object.assign(result, { + service, + fake_service: result.fake_blocklist_test_service, + })); +} + +/** + * Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic + * that excludes reads and its corresponding FakeRemoteGATTCharacteristic. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor, + * service: BluetoothRemoteGATTService, + * fake_service: FakeBluetoothRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object + * containing the BluetoothDevice object and its corresponding GATT fake + * objects. + */ +function getBlocklistExcludeReadsCharacteristic() { + let result, fake_characteristic; + return getBlocklistTestService() + .then(_ => result = _) + .then( + () => result.service.getCharacteristic( + blocklist_exclude_reads_characteristic_uuid)) + .then(characteristic => Object.assign(result, { + characteristic, + fake_characteristic: result.fake_blocklist_exclude_reads_characteristic + })); +} + +/** + * Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic + * that excludes writes and its corresponding FakeRemoteGATTCharacteristic. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor, + * service: BluetoothRemoteGATTService, + * fake_service: FakeBluetoothRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object + * containing the BluetoothDevice object and its corresponding GATT fake + * objects. + */ +function getBlocklistExcludeWritesCharacteristic() { + let result, fake_characteristic; + return getBlocklistTestService() + .then(_ => result = _) + .then( + () => result.service.getCharacteristic('gap.peripheral_privacy_flag')) + .then(characteristic => Object.assign(result, { + characteristic, + fake_characteristic: result.fake_blocklist_exclude_writes_characteristic + })); +} + +/** + * Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that + * excludes reads and its corresponding FakeRemoteGATTDescriptor. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor, + * service: BluetoothRemoteGATTService, + * fake_service: FakeBluetoothRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic, + * descriptor: BluetoothRemoteGATTDescriptor, + * fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object + * containing the BluetoothDevice object and its corresponding GATT fake + * objects. + */ +function getBlocklistExcludeReadsDescriptor() { + let result; + return getBlocklistExcludeWritesCharacteristic() + .then(_ => result = _) + .then( + () => result.characteristic.getDescriptor( + blocklist_exclude_reads_descriptor_uuid)) + .then(descriptor => Object.assign(result, { + descriptor, + fake_descriptor: result.fake_blocklist_exclude_reads_descriptor + })); +} + +/** + * Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that + * excludes writes and its corresponding FakeRemoteGATTDescriptor. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_blocklist_test_service: FakeRemoteGATTService, + * fake_blocklist_exclude_reads_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_exclude_writes_characteristic: + * FakeRemoteGATTCharacteristic, + * fake_blocklist_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor, + * fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor, + * service: BluetoothRemoteGATTService, + * fake_service: FakeBluetoothRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeBluetoothRemoteGATTCharacteristic, + * descriptor: BluetoothRemoteGATTDescriptor, + * fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object + * containing the BluetoothDevice object and its corresponding GATT fake + * objects. + */ +function getBlocklistExcludeWritesDescriptor() { + let result; + return getBlocklistExcludeWritesCharacteristic() + .then(_ => result = _) + .then( + () => result.characteristic.getDescriptor( + 'gatt.client_characteristic_configuration')) + .then(descriptor => Object.assign(result, { + descriptor: descriptor, + fake_descriptor: result.fake_blocklist_exclude_writes_descriptor, + })); +} + +/** Bluetooth HID Device Helper Methods */ + +/** + * Similar to getHealthThermometerDevice except the GATT discovery + * response has not been set yet so more attributes can still be added. + * TODO(crbug.com/719816): Add descriptors. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object + * containing a requested BluetoothDevice and its fake counter part. + */ +function getConnectedHIDDevice(options) { + let device, fake_peripheral; + return setUpPreconnectedDevice({ + address: '10:10:10:10:10:10', + name: 'HID Device', + knownServiceUUIDs: [ + 'generic_access', + 'device_information', + 'human_interface_device', + ], + }) + .then(_ => (fake_peripheral = _)) + .then(() => requestDeviceWithTrustedClick(options)) + .then(_ => (device = _)) + .then(() => fake_peripheral.setNextGATTConnectionResponse({ + code: HCI_SUCCESS, + })) + .then(() => device.gatt.connect()) + .then(() => fake_peripheral.addFakeService({ + uuid: 'generic_access', + })) + .then(() => fake_peripheral.addFakeService({ + uuid: 'device_information', + })) + // Blocklisted Characteristic: + // https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt + .then(dev_info => dev_info.addFakeCharacteristic({ + uuid: 'serial_number_string', + properties: ['read'], + })) + .then(() => fake_peripheral.addFakeService({ + uuid: 'human_interface_device', + })) + .then(() => ({device, fake_peripheral})); +} + +/** + * Returns a BluetoothDevice discovered using |options| and its + * corresponding FakePeripheral. + * The simulated device is called 'HID Device' it has three known service + * UUIDs: 'generic_access', 'device_information', 'human_interface_device'. + * The primary service with 'device_information' UUID has a characteristics + * with UUID 'serial_number_string'. The device has been connected to and its + * attributes are ready to be discovered. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object + * containing a requested BluetoothDevice and its fake counter part. + */ +function getHIDDevice(options) { + let device, fake_peripheral; + return getConnectedHIDDevice(options) + .then(_ => ({device, fake_peripheral} = _)) + .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ + code: HCI_SUCCESS, + })) + .then(() => ({device, fake_peripheral})); +} + +/** Health Thermometer Bluetooth Device Helper Methods */ + +/** + * Returns a FakePeripheral that corresponds to a simulated pre-connected device + * called 'Health Thermometer'. The device has two known serviceUUIDs: + * 'generic_access' and 'health_thermometer'. + * @returns {FakePeripheral} The device fake initialized as a Health + * Thermometer device. + */ +function setUpHealthThermometerDevice() { + return setUpPreconnectedDevice({ + address: '09:09:09:09:09:09', + name: 'Health Thermometer', + knownServiceUUIDs: ['generic_access', 'health_thermometer'], + }); +} + +/** + * Returns the same fake peripheral as setUpHealthThermometerDevice() except + * that connecting to the peripheral will succeed. + * @returns {Promise<FakePeripheral>} The device fake initialized as a + * connectable Health Thermometer device. + */ +function setUpConnectableHealthThermometerDevice() { + let fake_peripheral; + return setUpHealthThermometerDevice() + .then(_ => fake_peripheral = _) + .then(() => fake_peripheral.setNextGATTConnectionResponse({ + code: HCI_SUCCESS, + })) + .then(() => fake_peripheral); +} + +/** + * Populates a fake_peripheral with various fakes appropriate for a health + * thermometer. This resolves to an associative array composed of the fakes, + * including the |fake_peripheral|. + * @param {FakePeripheral} fake_peripheral The Bluetooth fake to populate GATT + * services, characteristics, and descriptors on. + * @returns {Promise<{fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic}>} The FakePeripheral + * passed into this method along with the fake GATT services, characteristics, + * and descriptors added to it. + */ +function populateHealthThermometerFakes(fake_peripheral) { + let fake_generic_access, fake_health_thermometer, fake_measurement_interval, + fake_user_description, fake_cccd, fake_temperature_measurement, + fake_temperature_type; + return fake_peripheral.addFakeService({uuid: 'generic_access'}) + .then(_ => fake_generic_access = _) + .then(() => fake_peripheral.addFakeService({ + uuid: 'health_thermometer', + })) + .then(_ => fake_health_thermometer = _) + .then(() => fake_health_thermometer.addFakeCharacteristic({ + uuid: 'measurement_interval', + properties: ['read', 'write', 'indicate'], + })) + .then(_ => fake_measurement_interval = _) + .then(() => fake_measurement_interval.addFakeDescriptor({ + uuid: 'gatt.characteristic_user_description', + })) + .then(_ => fake_user_description = _) + .then(() => fake_measurement_interval.addFakeDescriptor({ + uuid: 'gatt.client_characteristic_configuration', + })) + .then(_ => fake_cccd = _) + .then(() => fake_health_thermometer.addFakeCharacteristic({ + uuid: 'temperature_measurement', + properties: ['indicate'], + })) + .then(_ => fake_temperature_measurement = _) + .then(() => fake_health_thermometer.addFakeCharacteristic({ + uuid: 'temperature_type', + properties: ['read'], + })) + .then(_ => fake_temperature_type = _) + .then(() => ({ + fake_peripheral, + fake_generic_access, + fake_health_thermometer, + fake_measurement_interval, + fake_cccd, + fake_user_description, + fake_temperature_measurement, + fake_temperature_type, + })); +} + +/** + * Returns the same device and fake peripheral as getHealthThermometerDevice() + * after another frame (an iframe we insert) discovered the device, + * connected to it and discovered its services. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getHealthThermometerDeviceWithServicesDiscovered(options) { + let device, fake_peripheral, fakes; + let iframe = document.createElement('iframe'); + return setUpConnectableHealthThermometerDevice() + .then(_ => fake_peripheral = _) + .then(() => populateHealthThermometerFakes(fake_peripheral)) + .then(_ => fakes = _) + .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ + code: HCI_SUCCESS, + })) + .then( + () => new Promise(resolve => { + let src = '/bluetooth/resources/health-thermometer-iframe.html'; + // TODO(509038): Can be removed once LayoutTests/bluetooth/* that + // use health-thermometer-iframe.html have been moved to + // LayoutTests/external/wpt/bluetooth/* + if (window.location.pathname.includes('/LayoutTests/')) { + src = + '../../../external/wpt/bluetooth/resources/health-thermometer-iframe.html'; + } + iframe.src = src; + document.body.appendChild(iframe); + iframe.addEventListener('load', resolve); + })) + .then(() => new Promise((resolve, reject) => { + callWithTrustedClick(() => { + iframe.contentWindow.postMessage( + {type: 'DiscoverServices', options: options}, '*'); + }); + + function messageHandler(messageEvent) { + if (messageEvent.data == 'DiscoveryComplete') { + window.removeEventListener('message', messageHandler); + resolve(); + } else { + reject(new Error(`Unexpected message: ${messageEvent.data}`)); + } + } + window.addEventListener('message', messageHandler); + })) + .then(() => requestDeviceWithTrustedClick(options)) + .then(_ => device = _) + .then(device => device.gatt.connect()) + .then(_ => Object.assign({device}, fakes)); +} + +/** + * Similar to getHealthThermometerDevice() except the device + * is not connected and thus its services have not been + * discovered. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object + * containing a requested BluetoothDevice and its fake counter part. + */ +function getDiscoveredHealthThermometerDevice(options = { + filters: [{services: ['health_thermometer']}] +}) { + return setUpHealthThermometerDevice().then(fake_peripheral => { + return requestDeviceWithTrustedClick(options).then( + device => ({device: device, fake_peripheral: fake_peripheral})); + }); +} + +/** + * Similar to getHealthThermometerDevice() except the device has no services, + * characteristics, or descriptors. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object + * containing a requested BluetoothDevice and its fake counter part. + */ +function getEmptyHealthThermometerDevice(options) { + return getDiscoveredHealthThermometerDevice(options).then( + ({device, fake_peripheral}) => { + return fake_peripheral + .setNextGATTConnectionResponse({code: HCI_SUCCESS}) + .then(() => device.gatt.connect()) + .then( + () => fake_peripheral.setNextGATTDiscoveryResponse( + {code: HCI_SUCCESS})) + .then(() => ({device: device, fake_peripheral: fake_peripheral})); + }); +} + +/** + * Similar to getHealthThermometerService() except the service has no + * characteristics or included services. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {service: BluetoothRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService} An object containing the + * health themometer service object and its corresponding fake. + */ +function getEmptyHealthThermometerService(options) { + let device; + let fake_peripheral; + let fake_health_thermometer; + return getDiscoveredHealthThermometerDevice(options) + .then(result => ({device, fake_peripheral} = result)) + .then( + () => fake_peripheral.setNextGATTConnectionResponse( + {code: HCI_SUCCESS})) + .then(() => device.gatt.connect()) + .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'})) + .then(s => fake_health_thermometer = s) + .then( + () => + fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS})) + .then(() => device.gatt.getPrimaryService('health_thermometer')) + .then(service => ({ + service: service, + fake_health_thermometer: fake_health_thermometer, + })); +} + +/** + * Similar to getHealthThermometerDevice except the GATT discovery + * response has not been set yet so more attributes can still be added. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getConnectedHealthThermometerDevice(options) { + let device, fake_peripheral, fakes; + return getDiscoveredHealthThermometerDevice(options) + .then(_ => ({device, fake_peripheral} = _)) + .then(() => fake_peripheral.setNextGATTConnectionResponse({ + code: HCI_SUCCESS, + })) + .then(() => populateHealthThermometerFakes(fake_peripheral)) + .then(_ => fakes = _) + .then(() => device.gatt.connect()) + .then(() => Object.assign({device}, fakes)); +} + +/** + * Returns an object containing a BluetoothDevice discovered using |options|, + * its corresponding FakePeripheral and FakeRemoteGATTServices. + * The simulated device is called 'Health Thermometer' it has two known service + * UUIDs: 'generic_access' and 'health_thermometer' which correspond to two + * services with the same UUIDs. The 'health thermometer' service contains three + * characteristics: + * - 'temperature_measurement' (indicate), + * - 'temperature_type' (read), + * - 'measurement_interval' (read, write, indicate) + * The 'measurement_interval' characteristic contains a + * 'gatt.client_characteristic_configuration' descriptor and a + * 'characteristic_user_description' descriptor. + * The device has been connected to and its attributes are ready to be + * discovered. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getHealthThermometerDevice(options) { + let result; + return getConnectedHealthThermometerDevice(options) + .then(_ => result = _) + .then(() => result.fake_peripheral.setNextGATTDiscoveryResponse({ + code: HCI_SUCCESS, + })) + .then(() => result); +} + +/** + * Similar to getHealthThermometerDevice except that the peripheral has two + * 'health_thermometer' services. + * @param {RequestDeviceOptions} options The options for requesting a Bluetooth + * Device. + * @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, fake_health_thermometer1: + * FakeRemoteGATTService, fake_health_thermometer2: FakeRemoteGATTService}>} An + * object containing a requested Bluetooth device and two fake health + * thermometer GATT services. + */ +function getTwoHealthThermometerServicesDevice(options) { + let device; + let fake_peripheral; + let fake_generic_access; + let fake_health_thermometer1; + let fake_health_thermometer2; + + return getConnectedHealthThermometerDevice(options) + .then(result => { + ({ + device, + fake_peripheral, + fake_generic_access, + fake_health_thermometer: fake_health_thermometer1, + } = result); + }) + .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'})) + .then(s => fake_health_thermometer2 = s) + .then( + () => + fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS})) + .then(() => ({ + device: device, + fake_peripheral: fake_peripheral, + fake_generic_access: fake_generic_access, + fake_health_thermometer1: fake_health_thermometer1, + fake_health_thermometer2: fake_health_thermometer2 + })); +} + +/** + * Returns an object containing a Health Thermometer BluetoothRemoteGattService + * and its corresponding FakeRemoteGATTService. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic, + * service: BluetoothRemoteGATTService, + * fake_service: FakeRemoteGATTService}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getHealthThermometerService() { + let result; + return getHealthThermometerDevice() + .then(r => result = r) + .then(() => result.device.gatt.getPrimaryService('health_thermometer')) + .then(service => Object.assign(result, { + service, + fake_service: result.fake_health_thermometer, + })); +} + +/** + * Returns an object containing a Measurement Interval + * BluetoothRemoteGATTCharacteristic and its corresponding + * FakeRemoteGATTCharacteristic. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic, + * service: BluetoothRemoteGATTService, + * fake_service: FakeRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeRemoteGATTCharacteristic}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getMeasurementIntervalCharacteristic() { + let result; + return getHealthThermometerService() + .then(r => result = r) + .then(() => result.service.getCharacteristic('measurement_interval')) + .then(characteristic => Object.assign(result, { + characteristic, + fake_characteristic: result.fake_measurement_interval, + })); +} + +/** + * Returns an object containing a User Description + * BluetoothRemoteGATTDescriptor and its corresponding + * FakeRemoteGATTDescriptor. + * @returns {Promise<{device: BluetoothDevice, fakes: { + * fake_peripheral: FakePeripheral, + * fake_generic_access: FakeRemoteGATTService, + * fake_health_thermometer: FakeRemoteGATTService, + * fake_measurement_interval: FakeRemoteGATTCharacteristic, + * fake_cccd: FakeRemoteGATTDescriptor, + * fake_user_description: FakeRemoteGATTDescriptor, + * fake_temperature_measurement: FakeRemoteGATTCharacteristic, + * fake_temperature_type: FakeRemoteGATTCharacteristic, + * service: BluetoothRemoteGATTService, + * fake_service: FakeRemoteGATTService, + * characteristic: BluetoothRemoteGATTCharacteristic, + * fake_characteristic: FakeRemoteGATTCharacteristic + * descriptor: BluetoothRemoteGATTDescriptor, + * fake_descriptor: FakeRemoteGATTDescriptor}}>} An object + * containing a requested BluetoothDevice and all of the GATT fake + * objects. + */ +function getUserDescriptionDescriptor() { + let result; + return getMeasurementIntervalCharacteristic() + .then(r => result = r) + .then( + () => result.characteristic.getDescriptor( + 'gatt.characteristic_user_description')) + .then(descriptor => Object.assign(result, { + descriptor, + fake_descriptor: result.fake_user_description, + })); +} diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js deleted file mode 100644 index 2d863b16037..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js +++ /dev/null @@ -1,1022 +0,0 @@ -'use strict'; - -function loadScript(path) { - let script = document.createElement('script'); - let promise = new Promise(resolve => script.onload = resolve); - script.src = path; - script.async = false; - document.head.appendChild(script); - return promise; -} - -function loadScripts(paths) { - let chain = Promise.resolve(); - for (let path of paths) { - chain = chain.then(() => loadScript(path)); - } - return chain; -} - -function performChromiumSetup() { - // Make sure we are actually on Chromium with Mojo enabled. - if (typeof Mojo === 'undefined') { - return; - } - - // Load the Chromium-specific resources. - let prefix = '/resources/chromium'; - let genPrefix = '/gen'; - let extra = []; - const pathname = window.location.pathname; - if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) { - let root = pathname.match(/.*(?:LayoutTests|web_tests)/); - prefix = `${root}/external/wpt/resources/chromium`; - extra = [ - `${root}/resources/bluetooth/bluetooth-fake-adapter.js`, - ]; - genPrefix = 'file:///gen'; - } else if (window.location.pathname.startsWith('/bluetooth/https/')) { - extra = [ - '/js-test-resources/bluetooth/bluetooth-fake-adapter.js', - ]; - } - return loadScripts([ - `${genPrefix}/layout_test_data/mojo/public/js/mojo_bindings.js`, - `${genPrefix}/content/test/data/mojo_web_test_helper_test.mojom.js`, - `${genPrefix}/device/bluetooth/public/mojom/uuid.mojom.js`, - `${genPrefix}/url/mojom/origin.mojom.js`, - `${genPrefix}/device/bluetooth/public/mojom/test/fake_bluetooth.mojom.js`, - `${genPrefix}/content/shell/common/web_test/fake_bluetooth_chooser.mojom.js`, - `${prefix}/web-bluetooth-test.js`, - ].concat(extra)) - // Call setBluetoothFakeAdapter() to clean up any fake adapters left over - // by legacy tests. - // Legacy tests that use setBluetoothFakeAdapter() sometimes fail to clean - // their fake adapter. This is not a problem for these tests because the - // next setBluetoothFakeAdapter() will clean it up anyway but it is a - // problem for the new tests that do not use setBluetoothFakeAdapter(). - // TODO(crbug.com/569709): Remove once setBluetoothFakeAdapter is no - // longer used. - .then(() => typeof setBluetoothFakeAdapter === 'undefined' ? - undefined : setBluetoothFakeAdapter('')); -} - - -// These tests rely on the User Agent providing an implementation of the -// Web Bluetooth Testing API. -// https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/edit?ts=59b6d823#heading=h.7nki9mck5t64 -function bluetooth_test(func, name, properties) { - Promise.resolve() - .then(() => promise_test(t => Promise.resolve() - // Trigger Chromium-specific setup. - .then(performChromiumSetup) - .then(() => func(t)) - .then(() => navigator.bluetooth.test.allResponsesConsumed()) - .then(consumed => assert_true(consumed)), name, properties)); -} - -// HCI Error Codes. Used for simulateGATT[Dis]ConnectionResponse. -// For a complete list of possible error codes see -// BT 4.2 Vol 2 Part D 1.3 List Of Error Codes. -const HCI_SUCCESS = 0x0000; -const HCI_CONNECTION_TIMEOUT = 0x0008; - -// GATT Error codes. Used for GATT operations responses. -// BT 4.2 Vol 3 Part F 3.4.1.1 Error Response -const GATT_SUCCESS = 0x0000; -const GATT_INVALID_HANDLE = 0x0001; - -// Bluetooth UUID constants: -// Services: -var blocklist_test_service_uuid = "611c954a-263b-4f4a-aab6-01ddb953f985"; -var request_disconnection_service_uuid = "01d7d889-7451-419f-aeb8-d65e7b9277af"; -// Characteristics: -var blocklist_exclude_reads_characteristic_uuid = - "bad1c9a2-9a5b-4015-8b60-1579bbbf2135"; -var request_disconnection_characteristic_uuid = - "01d7d88a-7451-419f-aeb8-d65e7b9277af"; -// Descriptors: -var blocklist_test_descriptor_uuid = "bad2ddcf-60db-45cd-bef9-fd72b153cf7c"; -var blocklist_exclude_reads_descriptor_uuid = - "bad3ec61-3cc3-4954-9702-7977df514114"; - -// Sometimes we need to test that using either the name, alias, or UUID -// produces the same result. The following objects help us do that. -var generic_access = { - alias: 0x1800, - name: 'generic_access', - uuid: '00001800-0000-1000-8000-00805f9b34fb' -}; -var device_name = { - alias: 0x2a00, - name: 'gap.device_name', - uuid: '00002a00-0000-1000-8000-00805f9b34fb' -}; -var reconnection_address = { - alias: 0x2a03, - name: 'gap.reconnection_address', - uuid: '00002a03-0000-1000-8000-00805f9b34fb' -}; -var heart_rate = { - alias: 0x180d, - name: 'heart_rate', - uuid: '0000180d-0000-1000-8000-00805f9b34fb' -}; -var health_thermometer = { - alias: 0x1809, - name: 'health_thermometer', - uuid: '00001809-0000-1000-8000-00805f9b34fb' -}; -var body_sensor_location = { - alias: 0x2a38, - name: 'body_sensor_location', - uuid: '00002a38-0000-1000-8000-00805f9b34fb' -}; -var glucose = { - alias: 0x1808, - name: 'glucose', - uuid: '00001808-0000-1000-8000-00805f9b34fb' -}; -var battery_service = { - alias: 0x180f, - name: 'battery_service', - uuid: '0000180f-0000-1000-8000-00805f9b34fb' -}; -var battery_level = { - alias: 0x2A19, - name: 'battery_level', - uuid: '00002a19-0000-1000-8000-00805f9b34fb' -}; -var user_description = { - alias: 0x2901, - name: 'gatt.characteristic_user_description', - uuid: '00002901-0000-1000-8000-00805f9b34fb' -}; -var client_characteristic_configuration = { - alias: 0x2902, - name: 'gatt.client_characteristic_configuration', - uuid: '00002902-0000-1000-8000-00805f9b34fb' -}; -var measurement_interval = { - alias: 0x2a21, - name: 'measurement_interval', - uuid: '00002a21-0000-1000-8000-00805f9b34fb' -}; - -// The following tests make sure the Web Bluetooth implementation -// responds correctly to the different types of errors the -// underlying platform might return for GATT operations. - -// Each browser should map these characteristics to specific code paths -// that result in different errors thus increasing code coverage -// when testing. Therefore some of these characteristics might not be useful -// for all browsers. -// -// TODO(ortuno): According to the testing spec errorUUID(0x101) to -// errorUUID(0x1ff) should be use for the uuids of the characteristics. -var gatt_errors_tests = [{ - testName: 'GATT Error: Unknown.', - uuid: errorUUID(0xA1), - error: new DOMException( - 'GATT Error Unknown.', - 'NotSupportedError') -}, { - testName: 'GATT Error: Failed.', - uuid: errorUUID(0xA2), - error: new DOMException( - 'GATT operation failed for unknown reason.', - 'NotSupportedError') -}, { - testName: 'GATT Error: In Progress.', - uuid: errorUUID(0xA3), - error: new DOMException( - 'GATT operation already in progress.', - 'NetworkError') -}, { - testName: 'GATT Error: Invalid Length.', - uuid: errorUUID(0xA4), - error: new DOMException( - 'GATT Error: invalid attribute length.', - 'InvalidModificationError') -}, { - testName: 'GATT Error: Not Permitted.', - uuid: errorUUID(0xA5), - error: new DOMException( - 'GATT operation not permitted.', - 'NotSupportedError') -}, { - testName: 'GATT Error: Not Authorized.', - uuid: errorUUID(0xA6), - error: new DOMException( - 'GATT operation not authorized.', - 'SecurityError') -}, { - testName: 'GATT Error: Not Paired.', - uuid: errorUUID(0xA7), - // TODO(ortuno): Change to InsufficientAuthenticationError or similiar - // once https://github.com/WebBluetoothCG/web-bluetooth/issues/137 is - // resolved. - error: new DOMException( - 'GATT Error: Not paired.', - 'NetworkError') -}, { - testName: 'GATT Error: Not Supported.', - uuid: errorUUID(0xA8), - error: new DOMException( - 'GATT Error: Not supported.', - 'NotSupportedError') -}]; - -// Waits until the document has finished loading. -function waitForDocumentReady() { - return new Promise(resolve => { - if (document.readyState === 'complete') { - resolve(); - } - - window.addEventListener('load', () => { - resolve(); - }, {once: true}); - }); -} - -function callWithTrustedClick(callback) { - return waitForDocumentReady() - .then(() => new Promise(resolve => { - let button = document.createElement('button'); - button.textContent = 'click to continue test'; - button.style.display = 'block'; - button.style.fontSize = '20px'; - button.style.padding = '10px'; - button.onclick = () => { - document.body.removeChild(button); - resolve(callback()); - }; - document.body.appendChild(button); - test_driver.click(button); - })); -} - -// Calls requestDevice() in a context that's 'allowed to show a popup'. -function requestDeviceWithTrustedClick() { - let args = arguments; - return callWithTrustedClick( - () => navigator.bluetooth.requestDevice.apply(navigator.bluetooth, args)); -} - -// Calls requestLEScan() in a context that's 'allowed to show a popup'. -function requestLEScanWithTrustedClick() { - let args = arguments; - return callWithTrustedClick( - () => navigator.bluetooth.requestLEScan.apply(navigator.bluetooth, args)); -} - -// errorUUID(alias) returns a UUID with the top 32 bits of -// '00000000-97e5-4cd7-b9f1-f5a427670c59' replaced with the bits of |alias|. -// For example, errorUUID(0xDEADBEEF) returns -// 'deadbeef-97e5-4cd7-b9f1-f5a427670c59'. The bottom 96 bits of error UUIDs -// were generated as a type 4 (random) UUID. -function errorUUID(uuidAlias) { - // Make the number positive. - uuidAlias >>>= 0; - // Append the alias as a hex number. - var strAlias = '0000000' + uuidAlias.toString(16); - // Get last 8 digits of strAlias. - strAlias = strAlias.substr(-8); - // Append Base Error UUID - return strAlias + '-97e5-4cd7-b9f1-f5a427670c59'; -} - -// Function to test that a promise rejects with the expected error type and -// message. -function assert_promise_rejects_with_message(promise, expected, description) { - return promise.then(() => { - assert_unreached('Promise should have rejected: ' + description); - }, error => { - assert_equals(error.name, expected.name, 'Unexpected Error Name:'); - if (expected.message) { - assert_equals(error.message, expected.message, 'Unexpected Error Message:'); - } - }); -} - -function runGarbageCollection() -{ - // Run gc() as a promise. - return new Promise( - function(resolve, reject) { - GCController.collect(); - step_timeout(resolve, 0); - }); -} - -function eventPromise(target, type, options) { - return new Promise(resolve => { - let wrapper = function(event) { - target.removeEventListener(type, wrapper); - resolve(event); - }; - target.addEventListener(type, wrapper, options); - }); -} - -// Helper function to assert that events are fired and a promise resolved -// in the correct order. -// 'event' should be passed as |should_be_first| to indicate that the events -// should be fired first, otherwise 'promiseresolved' should be passed. -// Attaches |num_listeners| |event| listeners to |object|. If all events have -// been fired and the promise resolved in the correct order, returns a promise -// that fulfills with the result of |object|.|func()| and |event.target.value| -// of each of event listeners. Otherwise throws an error. -function assert_promise_event_order_(should_be_first, object, func, event, num_listeners) { - let order = []; - let event_promises = []; - for (let i = 0; i < num_listeners; i++) { - event_promises.push(new Promise(resolve => { - let event_listener = (e) => { - object.removeEventListener(event, event_listener); - order.push('event'); - resolve(e.target.value); - }; - object.addEventListener(event, event_listener); - })); - } - - let func_promise = object[func]().then(result => { - order.push('promiseresolved'); - return result; - }); - - return Promise.all([func_promise, ...event_promises]) - .then((result) => { - if (should_be_first !== order[0]) { - throw should_be_first === 'promiseresolved' ? - `'${event}' was fired before promise resolved.` : - `Promise resolved before '${event}' was fired.`; - } - - if (order[0] !== 'promiseresolved' && - order[order.length - 1] !== 'promiseresolved') { - throw 'Promise resolved in between event listeners.'; - } - - return result; - }); -} - -// See assert_promise_event_order_ above. -function assert_promise_resolves_before_event( - object, func, event, num_listeners=1) { - return assert_promise_event_order_( - 'promiseresolved', object, func, event, num_listeners); -} - -// See assert_promise_event_order_ above. -function assert_promise_resolves_after_event( - object, func, event, num_listeners=1) { - return assert_promise_event_order_( - 'event', object, func, event, num_listeners); -} - -// Returns a promise that resolves after 100ms unless -// the the event is fired on the object in which case -// the promise rejects. -function assert_no_events(object, event_name) { - return new Promise((resolve, reject) => { - let event_listener = (e) => { - object.removeEventListener(event_name, event_listener); - assert_unreached('Object should not fire an event.'); - }; - object.addEventListener(event_name, event_listener); - // TODO: Remove timeout. - // http://crbug.com/543884 - step_timeout(() => { - object.removeEventListener(event_name, event_listener); - resolve(); - }, 100); - }); -} - -class TestCharacteristicProperties { - // |properties| is an array of strings for property bits to be set - // as true. - constructor(properties) { - this.broadcast = false; - this.read = false; - this.writeWithoutResponse = false; - this.write = false; - this.notify = false; - this.indicate = false; - this.authenticatedSignedWrites = false; - this.reliableWrite = false; - this.writableAuxiliaries = false; - - properties.forEach(val => { - if (this.hasOwnProperty(val)) - this[val] = true; - else - throw `Invalid member '${val}'`; - }); - } -} - -function assert_properties_equal(properties, expected_properties) { - for (let key in expected_properties) { - assert_equals(properties[key], expected_properties[key]); - } -} - -class EventCatcher { - constructor(object, event) { - this.eventFired = false; - let event_listener = () => { - object.removeEventListener(event, event_listener); - this.eventFired = true; - }; - object.addEventListener(event, event_listener); - } -} - -// Returns a function that when called returns a promise that resolves when -// the device has disconnected. Example: -// device.gatt.connect() -// .then(gatt => get_request_disconnection(gatt)) -// .then(requestDisconnection => requestDisconnection()) -// .then(() => // device is now disconnected) -function get_request_disconnection(gattServer) { - return gattServer.getPrimaryService(request_disconnection_service_uuid) - .then(service => service.getCharacteristic(request_disconnection_characteristic_uuid)) - .then(characteristic => { - return () => assert_promise_rejects_with_message( - characteristic.writeValue(new Uint8Array([0])), - new DOMException( - 'GATT Server is disconnected. Cannot perform GATT operations. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError')); - }); -} - -function generateRequestDeviceArgsWithServices(services = ['heart_rate']) { - return [{ - filters: [{ services: services }] - }, { - filters: [{ services: services, name: 'Name' }] - }, { - filters: [{ services: services, namePrefix: 'Pre' }] - }, { - filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }] - }, { - filters: [{ services: services }], - optionalServices: ['heart_rate'] - }, { - filters: [{ services: services, name: 'Name' }], - optionalServices: ['heart_rate'] - }, { - filters: [{ services: services, namePrefix: 'Pre' }], - optionalServices: ['heart_rate'] - }, { - filters: [{ services: services, name: 'Name', namePrefix: 'Pre' }], - optionalServices: ['heart_rate'] - }]; -} - -// Causes |fake_peripheral| to disconnect and returns a promise that resolves -// once `gattserverdisconnected` has been fired on |device|. -function simulateGATTDisconnectionAndWait(device, fake_peripheral) { - return Promise.all([ - eventPromise(device, 'gattserverdisconnected'), - fake_peripheral.simulateGATTDisconnection(), - ]); -} - -// Simulates a pre-connected device with |address|, |name| and -// |knownServiceUUIDs|. -function setUpPreconnectedDevice({ - address = '00:00:00:00:00:00', name = 'LE Device', knownServiceUUIDs = []}) { - return navigator.bluetooth.test.simulateCentral({state: 'powered-on'}) - .then(fake_central => fake_central.simulatePreconnectedPeripheral({ - address: address, - name: name, - knownServiceUUIDs: knownServiceUUIDs, - })); -} - -const health_thermometer_ad_packet = { - deviceAddress: '09:09:09:09:09:09', - rssi: -10, - scanRecord: { - name: 'Health Thermometer', - uuids: [health_thermometer.uuid], - }, -}; - -// Returns a FakePeripheral that corresponds to a simulated pre-connected device -// called 'Health Thermometer'. The device has two known serviceUUIDs: -// 'generic_access' and 'health_thermometer'. -function setUpHealthThermometerDevice() { - return setUpPreconnectedDevice({ - address: '09:09:09:09:09:09', - name: 'Health Thermometer', - knownServiceUUIDs: ['generic_access', 'health_thermometer'], - }); -} - -// Returns an array containing two FakePeripherals corresponding -// to the simulated devices. -function setUpHealthThermometerAndHeartRateDevices() { - return navigator.bluetooth.test.simulateCentral({state: 'powered-on'}) - .then(fake_central => Promise.all([ - fake_central.simulatePreconnectedPeripheral({ - address: '09:09:09:09:09:09', - name: 'Health Thermometer', - knownServiceUUIDs: ['generic_access', 'health_thermometer'], - }), - fake_central.simulatePreconnectedPeripheral({ - address: '08:08:08:08:08:08', - name: 'Heart Rate', - knownServiceUUIDs: ['generic_access', 'heart_rate'], - })])); -} - -// Returns the same fake peripheral as setUpHealthThermometerDevice() except -// that connecting to the peripheral will succeed. -function setUpConnectableHealthThermometerDevice() { - let fake_peripheral; - return setUpHealthThermometerDevice() - .then(_ => fake_peripheral = _) - .then(() => fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS, - })) - .then(() => fake_peripheral); -} - -// Returns an object containing a BluetoothDevice discovered using |options|, -// its corresponding FakePeripheral and FakeRemoteGATTServices. -// The simulated device is called 'Health Thermometer' it has two known service -// UUIDs: 'generic_access' and 'health_thermometer' which correspond to two -// services with the same UUIDs. The 'health thermometer' service contains three -// characteristics: -// - 'temperature_measurement' (indicate), -// - 'temperature_type' (read), -// - 'measurement_interval' (read, write, indicate) -// The 'measurement_interval' characteristic contains a -// 'gatt.client_characteristic_configuration' descriptor and a -// 'characteristic_user_description' descriptor. -// The device has been connected to and its attributes are ready to be -// discovered. -function getHealthThermometerDevice(options) { - let result; - return getConnectedHealthThermometerDevice(options) - .then(_ => result = _) - .then(() => result.fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS, - })) - .then(() => result); -} - -// Similar to getHealthThermometerDevice except that the peripheral has -// two 'health_thermometer' services. -function getTwoHealthThermometerServicesDevice(options) { - let device; - let fake_peripheral; - let fake_generic_access; - let fake_health_thermometer1; - let fake_health_thermometer2; - - return getConnectedHealthThermometerDevice(options) - .then(result => { - ({ - device, - fake_peripheral, - fake_generic_access, - fake_health_thermometer: fake_health_thermometer1, - } = result); - }) - .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'})) - .then(s => fake_health_thermometer2 = s) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS})) - .then(() => ({ - device: device, - fake_peripheral: fake_peripheral, - fake_generic_access: fake_generic_access, - fake_health_thermometer1: fake_health_thermometer1, - fake_health_thermometer2: fake_health_thermometer2 - })); -} - -// Returns an object containing a Health Thermometer BluetoothRemoteGattService -// and its corresponding FakeRemoteGATTService. -function getHealthThermometerService() { - let result; - return getHealthThermometerDevice() - .then(r => result = r) - .then(() => result.device.gatt.getPrimaryService('health_thermometer')) - .then(service => Object.assign(result, { - service, - fake_service: result.fake_health_thermometer, - })); -} - -// Returns an object containing a Measurement Interval -// BluetoothRemoteGATTCharacteristic and its corresponding -// FakeRemoteGATTCharacteristic. -function getMeasurementIntervalCharacteristic() { - let result; - return getHealthThermometerService() - .then(r => result = r) - .then(() => result.service.getCharacteristic('measurement_interval')) - .then(characteristic => Object.assign(result, { - characteristic, - fake_characteristic: result.fake_measurement_interval, - })); -} - -function getUserDescriptionDescriptor() { - let result; - return getMeasurementIntervalCharacteristic() - .then(r => result = r) - .then(() => result.characteristic.getDescriptor( - 'gatt.characteristic_user_description')) - .then(descriptor => Object.assign(result, { - descriptor, - fake_descriptor: result.fake_user_description, - })); -} - -// Populates a fake_peripheral with various fakes appropriate for a health -// thermometer. This resolves to an associative array composed of the fakes, -// including the |fake_peripheral|. -function populateHealthThermometerFakes(fake_peripheral) { - let fake_generic_access, fake_health_thermometer, fake_measurement_interval, - fake_user_description, fake_cccd, fake_temperature_measurement, - fake_temperature_type; - return fake_peripheral.addFakeService({uuid: 'generic_access'}) - .then(_ => fake_generic_access = _) - .then(() => fake_peripheral.addFakeService({ - uuid: 'health_thermometer', - })) - .then(_ => fake_health_thermometer = _) - .then(() => fake_health_thermometer.addFakeCharacteristic({ - uuid: 'measurement_interval', - properties: ['read', 'write', 'indicate'], - })) - .then(_ => fake_measurement_interval = _) - .then(() => fake_measurement_interval.addFakeDescriptor({ - uuid: 'gatt.characteristic_user_description', - })) - .then(_ => fake_user_description = _) - .then(() => fake_measurement_interval.addFakeDescriptor({ - uuid: 'gatt.client_characteristic_configuration', - })) - .then(_ => fake_cccd = _) - .then(() => fake_health_thermometer.addFakeCharacteristic({ - uuid: 'temperature_measurement', - properties: ['indicate'], - })) - .then(_ => fake_temperature_measurement = _) - .then(() => fake_health_thermometer.addFakeCharacteristic({ - uuid: 'temperature_type', - properties: ['read'], - })) - .then(_ => fake_temperature_type = _) - .then(() => ({ - fake_peripheral, - fake_generic_access, - fake_health_thermometer, - fake_measurement_interval, - fake_cccd, - fake_user_description, - fake_temperature_measurement, - fake_temperature_type, - })); -} - -// Similar to getHealthThermometerDevice except the GATT discovery -// response has not been set yet so more attributes can still be added. -function getConnectedHealthThermometerDevice(options) { - let device, fake_peripheral, fakes; - return getDiscoveredHealthThermometerDevice(options) - .then(_ => ({device, fake_peripheral} = _)) - .then(() => fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS, - })) - .then(() => populateHealthThermometerFakes(fake_peripheral)) - .then(_ => fakes = _) - .then(() => device.gatt.connect()) - .then(() => Object.assign({device}, fakes)); -} - -// Returns an object containing a BluetoothDevice discovered using |options|, -// its corresponding FakePeripheral and FakeRemoteGATTServices. -// The simulated device is called 'Blocklist Device' and it has one known -// service UUIDs |blocklist_test_service_uuid| which -// correspond to a service with the same UUID. The -// |blocklist_test_service_uuid| service contains two characteristics: -// - |blocklist_exclude_reads_characteristic_uuid| (read, write) -// - 'gap.peripheral_privacy_flag' (read, write) -// The 'gap.peripheral_privacy_flag' characteristic contains three descriptors: -// - |blocklist_test_descriptor_uuid| -// - |blocklist_exclude_reads_descriptor_uuid| -// - 'gatt.client_characteristic_configuration' -// These are special UUIDs that have been added to the blocklist found at -// https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt -// There are also test UUIDs that have been added to the test environment which -// other implementations should add as test UUIDs as well. -// The device has been connected to and its attributes are ready to be -// discovered. -function getBlocklistDevice( - options = {filters: [{services: [blocklist_test_service_uuid]}]}) { - let device, fake_peripheral, fake_blocklist_test_service, - fake_blocklist_exclude_reads_characteristic, - fake_blocklist_exclude_writes_characteristic, - fake_blocklist_descriptor, - fake_blocklist_exclude_reads_descriptor, - fake_blocklist_exclude_writes_descriptor; - return setUpPreconnectedDevice({ - address: '11:11:11:11:11:11', - name: 'Blocklist Device', - knownServiceUUIDs: ['generic_access', blocklist_test_service_uuid], - }) - .then(_ => fake_peripheral = _) - .then(() => requestDeviceWithTrustedClick(options)) - .then(_ => device = _) - .then(() => fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS, - })) - .then(() => device.gatt.connect()) - .then(() => fake_peripheral.addFakeService({ - uuid: blocklist_test_service_uuid, - })) - .then(_ => fake_blocklist_test_service = _) - .then(() => fake_blocklist_test_service.addFakeCharacteristic({ - uuid: blocklist_exclude_reads_characteristic_uuid, - properties: ['read', 'write'], - })) - .then(_ => fake_blocklist_exclude_reads_characteristic = _) - .then(() => fake_blocklist_test_service.addFakeCharacteristic({ - uuid: 'gap.peripheral_privacy_flag', - properties: ['read', 'write'], - })) - .then(_ => fake_blocklist_exclude_writes_characteristic = _) - .then(() => fake_blocklist_exclude_writes_characteristic - .addFakeDescriptor({uuid: blocklist_test_descriptor_uuid})) - .then(_ => fake_blocklist_descriptor = _) - .then(() => fake_blocklist_exclude_writes_characteristic - .addFakeDescriptor({uuid: blocklist_exclude_reads_descriptor_uuid})) - .then(_ => fake_blocklist_exclude_reads_descriptor = _) - .then(() => fake_blocklist_exclude_writes_characteristic - .addFakeDescriptor({ - uuid: 'gatt.client_characteristic_configuration' - })) - .then(_ => fake_blocklist_exclude_writes_descriptor = _) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS, - })) - .then(() => ({ - device, - fake_peripheral, - fake_blocklist_test_service, - fake_blocklist_exclude_reads_characteristic, - fake_blocklist_exclude_writes_characteristic, - fake_blocklist_descriptor, - fake_blocklist_exclude_reads_descriptor, - fake_blocklist_exclude_writes_descriptor, - })); -} - -// Returns an object containing a Blocklist Test BluetoothRemoveGattService and -// its corresponding FakeRemoteGATTService. -function getBlocklistTestService() { - let result; - return getBlocklistDevice() - .then(_ => result = _) - .then(() => - result.device.gatt.getPrimaryService(blocklist_test_service_uuid)) - .then(service => Object.assign(result, { - service, - fake_service: result.fake_blocklist_test_service, - })); -} - -// Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic -// that excludes reads and its corresponding FakeRemoteGATTCharacteristic. -function getBlocklistExcludeReadsCharacteristic() { - let result, fake_characteristic; - return getBlocklistTestService() - .then(_ => result = _) - .then(() => result.service.getCharacteristic( - blocklist_exclude_reads_characteristic_uuid)) - .then(characteristic => - Object.assign( - result, { - characteristic, - fake_characteristic: - result.fake_blocklist_exclude_reads_characteristic - })); -} - -// Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic -// that excludes writes and its corresponding FakeRemoteGATTCharacteristic. -function getBlocklistExcludeWritesCharacteristic() { - let result, fake_characteristic; - return getBlocklistTestService() - .then(_ => result = _) - .then(() => result.service.getCharacteristic( - 'gap.peripheral_privacy_flag')) - .then(characteristic => - Object.assign( - result, { - characteristic, - fake_characteristic: - result.fake_blocklist_exclude_writes_characteristic - })); -} - -// Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that -// excludes reads and its corresponding FakeRemoteGATTDescriptor. -function getBlocklistExcludeReadsDescriptor() { - let result; - return getBlocklistExcludeWritesCharacteristic() - .then(_ => result = _) - .then(() => result.characteristic.getDescriptor( - blocklist_exclude_reads_descriptor_uuid)) - .then(descriptor => Object.assign( - result, { - descriptor, - fake_descriptor: result.fake_blocklist_exclude_reads_descriptor - })); -} - -// Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that -// excludes writes and its corresponding FakeRemoteGATTDescriptor. -function getBlocklistExcludeWritesDescriptor() { - let result; - return getBlocklistExcludeWritesCharacteristic() - .then(_ => result = _) - .then(() => result.characteristic.getDescriptor( - 'gatt.client_characteristic_configuration')) - .then(descriptor => Object.assign( - result, { - descriptor: descriptor, - fake_descriptor: result.fake_blocklist_exclude_writes_descriptor, - })); -} - -// Returns the same device and fake peripheral as getHealthThermometerDevice() -// after another frame (an iframe we insert) discovered the device, -// connected to it and discovered its services. -function getHealthThermometerDeviceWithServicesDiscovered(options) { - let device, fake_peripheral, fakes; - let iframe = document.createElement('iframe'); - return setUpConnectableHealthThermometerDevice() - .then(_ => fake_peripheral = _) - .then(() => populateHealthThermometerFakes(fake_peripheral)) - .then(_ => fakes = _) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS, - })) - .then(() => new Promise(resolve => { - let src = '/bluetooth/resources/health-thermometer-iframe.html'; - // TODO(509038): Can be removed once LayoutTests/bluetooth/* that use - // health-thermometer-iframe.html have been moved to - // LayoutTests/external/wpt/bluetooth/* - if (window.location.pathname.includes('/LayoutTests/')) { - src = '../../../external/wpt/bluetooth/resources/health-thermometer-iframe.html'; - } - iframe.src = src; - document.body.appendChild(iframe); - iframe.addEventListener('load', resolve); - })) - .then(() => new Promise((resolve, reject) => { - callWithTrustedClick(() => { - iframe.contentWindow.postMessage({ - type: 'DiscoverServices', - options: options - }, '*'); - }); - - function messageHandler(messageEvent) { - if (messageEvent.data == 'DiscoveryComplete') { - window.removeEventListener('message', messageHandler); - resolve(); - } else { - reject(new Error(`Unexpected message: ${messageEvent.data}`)); - } - } - window.addEventListener('message', messageHandler); - })) - .then(() => requestDeviceWithTrustedClick(options)) - .then(_ => device = _) - .then(device => device.gatt.connect()) - .then(_ => Object.assign({device}, fakes)); -} - -// Similar to getHealthThermometerDevice() except the device has no services, -// characteristics, or descriptors. -function getEmptyHealthThermometerDevice(options) { - return getDiscoveredHealthThermometerDevice(options) - .then(({device, fake_peripheral}) => { - return fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}) - .then(() => device.gatt.connect()) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS})) - .then(() => ({ - device: device, - fake_peripheral: fake_peripheral - })); - }); -} - -// Similar to getHealthThermometerService() except the service has no -// characteristics or included services. -function getEmptyHealthThermometerService(options) { - let device; - let fake_peripheral; - let fake_health_thermometer; - return getDiscoveredHealthThermometerDevice(options) - .then(result => ({device, fake_peripheral} = result)) - .then(() => fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS})) - .then(() => device.gatt.connect()) - .then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'})) - .then(s => fake_health_thermometer = s) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS})) - .then(() => device.gatt.getPrimaryService('health_thermometer')) - .then(service => ({ - service: service, - fake_health_thermometer: fake_health_thermometer, - })); -} - -// Returns a BluetoothDevice discovered using |options| and its -// corresponding FakePeripheral. -// The simulated device is called 'HID Device' it has three known service -// UUIDs: 'generic_access', 'device_information', 'human_interface_device'. -// The primary service with 'device_information' UUID has a characteristics -// with UUID 'serial_number_string'. The device has been connected to and its -// attributes are ready to be discovered. -function getHIDDevice(options) { - let device, fake_peripheral; - return getConnectedHIDDevice(options) - .then(_ => ({device, fake_peripheral} = _)) - .then(() => fake_peripheral.setNextGATTDiscoveryResponse({ - code: HCI_SUCCESS, - })) - .then(() => ({device, fake_peripheral})); -} - -// Similar to getHealthThermometerDevice except the GATT discovery -// response has not been set yet so more attributes can still be added. -// TODO(crbug.com/719816): Add descriptors. -function getConnectedHIDDevice(options) { - let device, fake_peripheral; - return setUpPreconnectedDevice({ - address: '10:10:10:10:10:10', - name: 'HID Device', - knownServiceUUIDs: [ - 'generic_access', - 'device_information', - 'human_interface_device', - ], - }) - .then(_ => (fake_peripheral = _)) - .then(() => requestDeviceWithTrustedClick(options)) - .then(_ => (device = _)) - .then(() => fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS, - })) - .then(() => device.gatt.connect()) - .then(() => fake_peripheral.addFakeService({ - uuid: 'generic_access', - })) - .then(() => fake_peripheral.addFakeService({ - uuid: 'device_information', - })) - // Blocklisted Characteristic: - // https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt - .then(dev_info => dev_info.addFakeCharacteristic({ - uuid: 'serial_number_string', - properties: ['read'], - })) - .then(() => fake_peripheral.addFakeService({ - uuid: 'human_interface_device', - })) - .then(() => ({device, fake_peripheral})); -} - -// Similar to getHealthThermometerDevice() except the device -// is not connected and thus its services have not been -// discovered. -function getDiscoveredHealthThermometerDevice( - options = {filters: [{services: ['health_thermometer']}]}) { - return setUpHealthThermometerDevice() - .then(fake_peripheral => { - return requestDeviceWithTrustedClick(options) - .then(device => ({ - device: device, - fake_peripheral: fake_peripheral - })); - }); -} diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js index 9b173e6367c..f474c9c3066 100644 --- a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js +++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-scanning-helpers.js @@ -39,4 +39,4 @@ function verifyBluetoothAdvertisingEvent(e) { assert_equals(data[0], e.serviceData.get(health_uuid).getUint8(0)) assert_equals(data[1], e.serviceData.get(health_uuid).getUint8(1)) assert_equals(data[2], e.serviceData.get(health_uuid).getUint8(2)) -}
\ No newline at end of file +} diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js new file mode 100644 index 00000000000..d2c6bcbdb73 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-test.js @@ -0,0 +1,384 @@ +'use strict'; + +/** + * Test Setup Helpers + */ + +/** + * Loads a script by creating a <script> element pointing to |path|. + * @param {string} path The path of the script to load. + * @returns {Promise<void>} Resolves when the script has finished loading. + */ +function loadScript(path) { + let script = document.createElement('script'); + let promise = new Promise(resolve => script.onload = resolve); + script.src = path; + script.async = false; + document.head.appendChild(script); + return promise; +} + +/** + * Loads the scripts in |paths|. + * @param {string[]} paths + * @returns {Promise<void>} A promise chain that resolves when all scripts have + * finished loading. + */ +function loadScripts(paths) { + let chain = Promise.resolve(); + for (let path of paths) { + chain = chain.then(() => loadScript(path)); + } + return chain; +} + +/** + * Performs the Chromium specific setup necessary to run the tests in the + * Chromium browser. This test file is shared between Web Platform Tests and + * Blink Web Tests, so this method figures out the correct paths to use for + * loading scripts. + * + * TODO(https://crbug.com/569709): Update this description when all Web + * Bluetooth Blink Web Tests have been migrated into this repository. + * @returns {Promise<void>} Resolves when Chromium specific setup is complete. + */ +function performChromiumSetup() { + // Make sure we are actually on Chromium with Mojo enabled. + if (typeof Mojo === 'undefined') { + return; + } + + // Load the Chromium-specific resources. + let prefix = '/resources/chromium'; + let genPrefix = '/gen'; + let extra = []; + const pathname = window.location.pathname; + if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) { + let root = pathname.match(/.*(?:LayoutTests|web_tests)/); + prefix = `${root}/external/wpt/resources/chromium`; + extra = [ + `${root}/resources/bluetooth/bluetooth-fake-adapter.js`, + ]; + genPrefix = 'file:///gen'; + } else if (window.location.pathname.startsWith('/bluetooth/https/')) { + extra = [ + '/js-test-resources/bluetooth/bluetooth-fake-adapter.js', + ]; + } + return loadScripts([ + `${genPrefix}/layout_test_data/mojo/public/js/mojo_bindings.js`, + `${genPrefix}/content/test/data/mojo_web_test_helper_test.mojom.js`, + `${genPrefix}/device/bluetooth/public/mojom/uuid.mojom.js`, + `${genPrefix}/url/mojom/origin.mojom.js`, + `${genPrefix}/device/bluetooth/public/mojom/test/fake_bluetooth.mojom.js`, + `${genPrefix}/content/shell/common/web_test/fake_bluetooth_chooser.mojom.js`, + `${prefix}/web-bluetooth-test.js`, + ].concat(extra)) + // Call setBluetoothFakeAdapter() to clean up any fake adapters left over + // by legacy tests. + // Legacy tests that use setBluetoothFakeAdapter() sometimes fail to clean + // their fake adapter. This is not a problem for these tests because the + // next setBluetoothFakeAdapter() will clean it up anyway but it is a + // problem for the new tests that do not use setBluetoothFakeAdapter(). + // TODO(https://crbug.com/569709): Remove once setBluetoothFakeAdapter is + // no longer used. + .then( + () => typeof setBluetoothFakeAdapter === 'undefined' ? + undefined : + setBluetoothFakeAdapter('')); +} + +/** + * These tests rely on the User Agent providing an implementation of the Web + * Bluetooth Testing API. + * https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/edit?ts=59b6d823#heading=h.7nki9mck5t64 + * @param {function{*}: Promise<*>} test_function The Web Bluetooth test to run. + * @param {string} name The name or description of the test. + * @param {object} properties An object containing extra options for the test. + * @returns {Promise<void>} Resolves if Web Bluetooth test ran successfully, or + * rejects if the test failed. + */ +function bluetooth_test(test_function, name, properties) { + Promise.resolve().then( + () => promise_test( + t => Promise + .resolve() + // Trigger Chromium-specific setup. + .then(performChromiumSetup) + .then(() => test_function(t)) + .then(() => navigator.bluetooth.test.allResponsesConsumed()) + .then(consumed => assert_true(consumed)), + name, properties)); +} + +/** + * Test Helpers + */ + +/** + * Waits until the document has finished loading. + * @returns {Promise<void>} Resolves if the document is already completely + * loaded or when the 'onload' event is fired. + */ +function waitForDocumentReady() { + return new Promise(resolve => { + if (document.readyState === 'complete') { + resolve(); + } + + window.addEventListener('load', () => { + resolve(); + }, {once: true}); + }); +} + +/** + * Simulates a user activation prior to running |callback|. + * @param {Function} callback The function to run after the user activation. + * @returns {Promise<*>} Resolves when the user activation has been simulated + * with the result of |callback|. + */ +function callWithTrustedClick(callback) { + return waitForDocumentReady().then(() => new Promise(resolve => { + let button = + document.createElement('button'); + button.textContent = + 'click to continue test'; + button.style.display = 'block'; + button.style.fontSize = '20px'; + button.style.padding = '10px'; + button.onclick = () => { + document.body.removeChild(button); + resolve(callback()); + }; + document.body.appendChild(button); + test_driver.click(button); + })); +} + +/** + * Calls requestDevice() in a context that's 'allowed to show a popup'. + * @returns {Promise<BluetoothDevice>} Resolves with a Bluetooth device if + * successful or rejects with an error. + */ +function requestDeviceWithTrustedClick() { + let args = arguments; + return callWithTrustedClick( + () => navigator.bluetooth.requestDevice.apply(navigator.bluetooth, args)); +} + +/** + * Calls requestLEScan() in a context that's 'allowed to show a popup'. + * @returns {Promise<BluetoothLEScan>} Resolves with the properties of the scan + * if successful or rejects with an error. + */ +function requestLEScanWithTrustedClick() { + let args = arguments; + return callWithTrustedClick( + () => navigator.bluetooth.requestLEScan.apply(navigator.bluetooth, args)); +} + +/** + * Function to test that a promise rejects with the expected error type and + * message. + * @param {Promise} promise + * @param {object} expected + * @param {string} description + * @returns {Promise<void>} Resolves if |promise| rejected with |expected| + * error. + */ +function assert_promise_rejects_with_message(promise, expected, description) { + return promise.then( + () => { + assert_unreached('Promise should have rejected: ' + description); + }, + error => { + assert_equals(error.name, expected.name, 'Unexpected Error Name:'); + if (expected.message) { + assert_equals( + error.message, expected.message, 'Unexpected Error Message:'); + } + }); +} + +/** + * Runs the garbage collection. + * @returns {Promise<void>} Resolves when garbage collection has finished. + */ +function runGarbageCollection() { + // Run gc() as a promise. + return new Promise(function(resolve, reject) { + GCController.collect(); + step_timeout(resolve, 0); + }); +} + +/** + * Helper class that can be created to check that an event has fired. + */ +class EventCatcher { + /** + * @param {EventTarget} object The object to listen for events on. + * @param {string} event The type of event to listen for. + */ + constructor(object, event) { + /** @type {boolean} */ + this.eventFired = false; + + /** @type {function()} */ + let event_listener = () => { + object.removeEventListener(event, event_listener); + this.eventFired = true; + }; + object.addEventListener(event, event_listener); + } +} + +/** + * Notifies when the event |type| has fired. + * @param {EventTarget} target The object to listen for the event. + * @param {string} type The type of event to listen for. + * @param {object} options Characteristics about the event listener. + * @returns {Promise<Event>} Resolves when an event of |type| has fired. + */ +function eventPromise(target, type, options) { + return new Promise(resolve => { + let wrapper = function(event) { + target.removeEventListener(type, wrapper); + resolve(event); + }; + target.addEventListener(type, wrapper, options); + }); +} + +/** + * The action that should occur first in assert_promise_event_order_(). + * @enum {string} + */ +const ShouldBeFirst = { + EVENT: 'event', + PROMISE_RESOLUTION: 'promiseresolved', +}; + +/** + * Helper function to assert that events are fired and a promise resolved + * in the correct order. + * 'event' should be passed as |should_be_first| to indicate that the events + * should be fired first, otherwise 'promiseresolved' should be passed. + * Attaches |num_listeners| |event| listeners to |object|. If all events have + * been fired and the promise resolved in the correct order, returns a promise + * that fulfills with the result of |object|.|func()| and |event.target.value| + * of each of event listeners. Otherwise throws an error. + * @param {ShouldBeFirst} should_be_first Indicates whether |func| should + * resolve before |event| is fired. + * @param {EventTarget} object The target object to add event listeners to. + * @param {function(*): Promise<*>} func The function to test the resolution + * order for. + * @param {string} event The event type to listen for. + * @param {number} num_listeners The number of events to listen for. + * @returns {Promise<*>} The return value of |func|. + */ +function assert_promise_event_order_( + should_be_first, object, func, event, num_listeners) { + let order = []; + let event_promises = []; + for (let i = 0; i < num_listeners; i++) { + event_promises.push(new Promise(resolve => { + let event_listener = (e) => { + object.removeEventListener(event, event_listener); + order.push(ShouldBeFirst.EVENT); + resolve(e.target.value); + }; + object.addEventListener(event, event_listener); + })); + } + + let func_promise = object[func]().then(result => { + order.push(ShouldBeFirst.PROMISE_RESOLUTION); + return result; + }); + + return Promise.all([func_promise, ...event_promises]).then((result) => { + if (should_be_first !== order[0]) { + throw should_be_first === ShouldBeFirst.PROMISE_RESOLUTION ? + `'${event}' was fired before promise resolved.` : + `Promise resolved before '${event}' was fired.`; + } + + if (order[0] !== ShouldBeFirst.PROMISE_RESOLUTION && + order[order.length - 1] !== ShouldBeFirst.PROMISE_RESOLUTION) { + throw 'Promise resolved in between event listeners.'; + } + + return result; + }); +} + +/** + * Asserts that the promise returned by |func| resolves before events of type + * |event| are fired |num_listeners| times on |object|. See + * assert_promise_event_order_ above for more details. + * @param {EventTarget} object The target object to add event listeners to. + * @param {function(*): Promise<*>} func The function whose promise should + * resolve first. + * @param {string} event The event type to listen for. + * @param {number} num_listeners The number of events to listen for. + * @returns {Promise<*>} The return value of |func|. + */ +function assert_promise_resolves_before_event( + object, func, event, num_listeners = 1) { + return assert_promise_event_order_( + ShouldBeFirst.PROMISE_RESOLUTION, object, func, event, num_listeners); +} + +/** + * Asserts that the promise returned by |func| resolves after events of type + * |event| are fired |num_listeners| times on |object|. See + * assert_promise_event_order_ above for more details. + * @param {EventTarget} object The target object to add event listeners to. + * @param {function(*): Promise<*>} func The function whose promise should + * resolve first. + * @param {string} event The event type to listen for. + * @param {number} num_listeners The number of events to listen for. + * @returns {Promise<*>} The return value of |func|. + */ +function assert_promise_resolves_after_event( + object, func, event, num_listeners = 1) { + return assert_promise_event_order_( + ShouldBeFirst.EVENT, object, func, event, num_listeners); +} + +/** + * Returns a promise that resolves after 100ms unless the the event is fired on + * the object in which case the promise rejects. + * @param {EventTarget} object The target object to listen for events. + * @param {string} event_name The event type to listen for. + * @returns {Promise<void>} Resolves if no events were fired. + */ +function assert_no_events(object, event_name) { + return new Promise((resolve, reject) => { + let event_listener = (e) => { + object.removeEventListener(event_name, event_listener); + assert_unreached('Object should not fire an event.'); + }; + object.addEventListener(event_name, event_listener); + // TODO: Remove timeout. + // http://crbug.com/543884 + step_timeout(() => { + object.removeEventListener(event_name, event_listener); + resolve(); + }, 100); + }); +} + +/** + * Asserts that |properties| contains the same properties in + * |expected_properties| with equivalent values. + * @param {object} properties Actual object to compare. + * @param {object} expected_properties Expected object to compare with. + */ +function assert_properties_equal(properties, expected_properties) { + for (let key in expected_properties) { + assert_equals(properties[key], expected_properties[key]); + } +} diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template index c0fa4aed552..e677f00f087 100644 --- a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template +++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template @@ -1,5 +1,6 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py TEST diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html index aebd681c2ad..1326b073879 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/connection-succeeds.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Device will connect'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html index f70befcb4b4..d9c07b64bc0 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/garbage-collection-ran-during-success.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Garbage Collection ran during a connect call that ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html b/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html index c3e35532835..5e9383851f3 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/connect/get-same-gatt-server.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Multiple connects should return the same gatt object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html index 63624961ec7..b861040b236 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/device-same-object.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = '[SameObject] test for BluetoothRemoteGATTServer\'s device.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html index e0d8439ab66..7ed2cb94603 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/connect-disconnect-twice.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Connect + Disconnect twice still results in ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html index 8b1459db192..c1863e92322 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/detach-gc.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <body> <script> 'use strict'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html index 5dada7a9c99..d4d6e2fca78 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/disconnect-twice-in-a-row.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Calling disconnect twice in a row still results in ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html index 04ccedeb5e9..41d2b151d33 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/disconnect/gc-detach.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <body> <script> 'use strict'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js index 4a1baf3ebc2..6f4f076110a 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called before getPrimaryService. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js index c7c80244193..24184ea8ba4 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryService ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js index 5655d8ee41c..8a8714bca57 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryService call that ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js index 0d3e5cf18a4..52699ee0a08 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls on services after we disconnect and connect again. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js index 7bb1ef5cb63..e0a31f6136e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'getPrimaryService called before connecting. Reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js index ee3cf97f4db..52875b18548 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service without permission. Should ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js index 5bf720cd48e..56362f20bfc 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service. Must reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js index 4c3111720c2..06d6a31eeb5 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during a getPrimaryService ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js index fe7d749063d..cd4a0d39f28 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js index 301658c73bb..6cd60732879 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js index c46a1a52c03..f05adce27b1 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getPrimaryService should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js index 704ab8bb2da..b30e4cc48f4 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Wrong Service name. Reject with TypeError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js index 8daab29eaf9..6df58222e0a 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service without permission. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js index d55dee753cf..d6ae0b6dc8f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for present service without permission to access ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js index d357a214dfd..e11ed9e41e2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for present service without permission. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js index 32350e779dc..0b8419a8042 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service. Reject with NotFoundError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html index 6fccff1813f..6484b8227d2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/service-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for service. Should return right service'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html index eb20225e4ba..064d8d2e3b4 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> "use strict"; const test_desc = 'Two iframes in the same origin should be able to access ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html index 6ed24fda403..90d776c77ee 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for services. Does not return blocklisted service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html index 2a34e0bf50a..df83dfe193f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/blocklisted-services.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for services. Does not return blocklisted service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html index 9fffbd5d00e..9672d50a2bc 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/correct-services.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Find correct services with UUID.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js index 8bc12f3c474..ea0c1616050 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called before getPrimaryServices. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js index 1c77e4e710a..04dc61083b8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called before getPrimaryServices. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js index 230325a8c76..3223049d2a8 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryServices ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js index dce13c5d006..646db21586f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryServices ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js index 8e2e32ba4fd..472eb991ece 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryServices call that ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js index 78dcffdcbb1..86d56889325 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() called during a getPrimaryServices call that ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js index c226d2dc65e..0a5e07310fa 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls on services after we disconnect and connect again. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js index d69f6c5d5c2..e87339d59d0 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls on services after we disconnect and connect again. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js index a35984f8511..bb440a7caa2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'getPrimaryServices called before connecting. Reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js index 36d7e64d555..26f3269a0c9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'getPrimaryServices called before connecting. Reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js index 130657d228f..b52dac0385f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service without permission. Should ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js index 3817a1a5a38..f944f72583f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service. Must reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js index c986835ce31..455bd47a040 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js index bd438db09e3..2e832d89e17 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js index 3b441cedeff..4555242ae82 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js index 1b3302a1ba6..0eb78ba1b32 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js index 378ade0c90b..11671cbf7b3 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js index bdef5aa2f20..efda6cf4a41 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js index aca34e58ff0..d84ca0aa7fc 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getPrimaryServices should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js index 0ea805e339d..3f876f5b76b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getPrimaryServices should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js index eeb6dd4dcf8..d26c0aa20a6 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Wrong Service name. Reject with TypeError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js index c755dd7129d..4aefb9955b3 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service without permission. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js index 03b7f2329c8..a5006e6da84 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for present service without permission to access ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js index e50c6d56128..e7d20bd3f23 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for present service without permission to access ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js index c703d0a9363..8f4811fe08b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for present service without permission. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js index 9dc1877f9f2..8bf9d8c0b6b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent service. Reject with NotFoundError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html index 6face0acfae..92ca4ea6a6e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for services. Should return right number of ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html index 6edb1118c2a..d39c69fc7f1 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Find all services in a device.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html index 2632ec6e7fe..4c78ad19d0e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/services-not-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for services in a device with no services. Reject ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html b/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html index 0d5ab649683..4c479dda90b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/device-same-from-2-services.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Same parent device returned from multiple services.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html index de57c2e3760..d9590b17dc2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/device-same-object.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = '[SameObject] test for BluetoothRemoteGATTService device.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html index 9746f4b058c..0fb2ff3532f 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/characteristic-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for characteristic. Should return right ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js index 72b9bac63a4..fb96df568ff 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Serial Number String characteristic is blocklisted. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js index a8b2ef892c7..c0987c68f59 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent characteristics with UUID. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js index 7457161faa0..1c429fc4945 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during getCharacteristic ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js index 54ab061deb9..636ba9de773 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getCharacteristic should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js index 8f44ecb08be..2331f86c4ae 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js index da5462a8bfa..bc96ce5eefd 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() and connect() called during ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js index 0fe5b01146e..d04967e3a8c 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Service is removed before getCharacteristic call. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html index 5620f2c9245..3298f5fd3d0 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'The Device Information service is composed of blocklisted ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html index 9139ae10f89..6188adbafb9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found-with-uuid.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Find characteristics with UUID in service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html index 952e3e6b5e9..6812cd977f2 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Find all characteristics in a service.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html index 6401740681a..a629b5e1c11 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/characteristics-not-found.https.html @@ -3,7 +3,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> +<script src="/bluetooth/resources/bluetooth-test.js"></script> +<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script> <script> 'use strict'; const test_desc = 'Request for absent characteristics. Reject with ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js index cd8a6fa380a..c39a29c845b 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Serial Number String characteristic is blocklisted. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js index fff2bd038a8..ccaa7388e7e 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Request for absent characteristics with UUID. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js index 925786c74de..ad4ab9f3f50 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during getCharacteristics ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js index d0ecff89f70..844814508f9 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Garbage Collection ran during getCharacteristics ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js index fb3346dc4e4..35d277e3839 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getCharacteristics should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js index 576e0831501..4326ee29079 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Calls to getCharacteristics should return the same object.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js index 5b2bd39d3e0..14b2e509be4 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js index 95f22b11fcf..34207a2f60d 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() and connect() called during ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js index 184632f1d05..4354cfc0671 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'disconnect() and connect() called during ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js index 6ff7b4f3631..8d0e7c2fc33 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Service is removed before getCharacteristics call. ' + diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js index b4492885b83..dff0d3d9397 100644 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js -// META: script=/bluetooth/resources/bluetooth-helpers.js +// META: script=/bluetooth/resources/bluetooth-test.js +// META: script=/bluetooth/resources/bluetooth-fake-devices.js // Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py 'use strict'; const test_desc = 'Service is removed before getCharacteristics call. ' + diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py new file mode 100644 index 00000000000..eaca03fe76d --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-do-not-expect.py @@ -0,0 +1,2 @@ +def main(request, response): + return 301, [('Location', 'do-not-expect-received.py'),('Accept-CH', 'device-memory, DPR')], '' diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py new file mode 100644 index 00000000000..835ef396b8b --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-and-redir-to-expect.py @@ -0,0 +1,2 @@ +def main(request, response): + return 301, [('Location', 'expect-received.py'),('Accept-CH', 'device-memory, DPR')], '' diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js index 46b499a5e41..5275057c3e5 100644 --- a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/accept-ch-test.js @@ -5,19 +5,54 @@ const expect = "/client-hints/accept-ch-stickiness/resources/expect-client-hints const do_not_expect = "/client-hints/accept-ch-stickiness/resources/do-not-expect-client-hints-headers.html" const host_info = get_host_info(); -const run_test = test => { - // First, verify the initial state to make sure that the browser does not have - // client hints preferences cached from a previous run of the test. + +function verify_initial_state(initial_url, test_name) { promise_test(t => { - return fetch(test.initial_url).then(r => { + return fetch(initial_url).then(r => { assert_equals(r.status, 200) // Verify that the browser did not include client hints in the request // headers when fetching echo-client-hints-received.py. assert_false(r.headers.has("device-memory-received"), "device-memory-received"); }); - }, test.name + " precondition: Test that the browser does not have client " + + }, test_name + " precondition: Test that the browser does not have client " + "hints preferences cached"); +} + +function verify_navigation_state(expect_url, test_name) { + promise_test(t => { + return new Promise(resolve => { + let win; + window.addEventListener('message', t.step_func(function(e) { + win.close(); + assert_equals(e.data, "PASS", "message from opened page"); + fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve); + })); + // Open a new window. Verify that the user agent attaches client hints. + win = window.open(expect_url); + assert_not_equals(win, null, "Popup windows not allowed?"); + }); + }, test_name + " got client hints according to expectations."); +} + +function verify_subresource_state(expect_url, test_name) { + promise_test(t => { + return new Promise(resolve => { + let win; + window.addEventListener('message', t.step_func(function(e) { + win.close(); + assert_equals(e.data, "PASS", "message from opened page"); + fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve); + })); + // Open expect_url as a subresource. + fetch(expect_url).then(resolve); + }); + }, test_name + " got client hints according to expectations."); +} +const run_test = test => { + // First, verify the initial state to make sure that the browser does not have + // client hints preferences cached from a previous run of the test. + verify_initial_state(test.initial_url, test.name); // Then, attempt to set Accept-CH promise_test(t => { @@ -53,18 +88,6 @@ const run_test = test => { }, test.name + " set Accept-CH"); // Finally, verify that CH are actually sent (or not) on requests - promise_test(t => { - return new Promise(resolve => { - let win; - window.addEventListener('message', t.step_func(function(e) { - win.close(); - assert_equals(e.data, "PASS", "message from opened page"); - fetch("/client-hints/accept-ch-stickiness/resources/clear-site-data.html").then(resolve); - })); - // Open a new window. Verify that the user agent attaches client hints. - win = window.open(test.expect_url); - assert_not_equals(win, null, "Popup windows not allowed?"); - }); - }, test.name + " got client hints according to expectations."); + verify_navigation_state(test.expect_url, test.name); }; diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py new file mode 100644 index 00000000000..6b0e61af9db --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/do-not-expect-received.py @@ -0,0 +1,19 @@ +def main(request, response): + """ + Check that headers sent to navigate here *do not* contain the device-memory client + hint, and report success/failure in a way compatible with + verify_subresource_state() in accept-ch-test.js + """ + + if "device-memory" in request.headers: + result = "FAIL" + else: + result = "PASS" + + content = ''' +<script> + window.opener.postMessage("%s" , "*"); +</script> +''' % (result) + headers = [("Content-Type", "text/html")] + return 200, headers, content diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py new file mode 100644 index 00000000000..5aab578ae34 --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/resources/expect-received.py @@ -0,0 +1,19 @@ +def main(request, response): + """ + Check that headers sent to navigate here contain the device-memory client + hint, and report success/failure in a way compatible with + verify_navigation_state() in accept-ch-test.js + """ + + if "device-memory" in request.headers: + result = "PASS" + else: + result = "FAIL" + + content = ''' +<script> + window.opener.postMessage("%s" , "*"); +</script> +''' % (result) + headers = [("Content-Type", "text/html")] + return 200, headers, content diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html new file mode 100644 index 00000000000..2ab128f2d82 --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-navigation-redirect.https.html @@ -0,0 +1,19 @@ +<!doctype html> +<meta name="timeout" content="long"> +<title>Accept-CH Persistence test</title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="resources/accept-ch-test.js"></script> + +<script> +// This is similar to accept-ch-test.js tests, except setting and checking +// header here are a single step, connected via redirect. +const test_name = "redirect on navigation"; +verify_initial_state(echo, test_name); +verify_navigation_state("resources/accept-ch-and-redir-to-expect.py", test_name); +</script> +</body> +</html> + diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html new file mode 100644 index 00000000000..4a8233bc3e5 --- /dev/null +++ b/tests/wpt/web-platform-tests/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html @@ -0,0 +1,19 @@ +<!doctype html> +<meta name="timeout" content="long"> +<title>Accept-CH Persistence test</title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="resources/accept-ch-test.js"></script> + +<script> +// This is similar to accept-ch-test.js tests, except setting and checking +// header here are a single step, connected via redirect. +const test_name = "redirect on navigation"; +verify_initial_state(echo, test_name); +verify_subresource_state("resources/accept-ch-and-redir-to-do-not-expect.py", test_name); +</script> +</body> +</html> + diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html index 06b777fbe32..a1a51c98690 100644 --- a/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html +++ b/tests/wpt/web-platform-tests/clipboard-apis/async-idlharness.https.html @@ -1,6 +1,7 @@ <!doctype html> <meta charset=utf-8> <title>Clipboard IDL test</title> +<meta name="timeout" content="long"> <link rel='help' href='https://w3c.github.io/clipboard-apis/#async-clipboard-api'> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html b/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html index db71ca0262c..a0570f82a90 100644 --- a/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html +++ b/tests/wpt/web-platform-tests/css/CSS2/linebox/animations/line-height-interpolation.html @@ -3,6 +3,7 @@ <title>line-height interpolation</title> <link rel="help" href="https://www.w3.org/TR/CSS2/visudet.html#propdef-line-height"> <meta name="assert" content="line-height supports animation by computation"> +<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html new file mode 100644 index 00000000000..e7f00b00e8c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root-ref.html @@ -0,0 +1,16 @@ +<!doctype HTML> +<iframe srcdoc=" +<!doctype HTML> +<style> + div { + background: linear-gradient(lightblue, yellow); + background-size: 300px 300px; + background-position: 50px 50px; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } +</style> +<div></div>"></iframe> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html new file mode 100644 index 00000000000..08464fc9eb4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-iframe-root.html @@ -0,0 +1,15 @@ +<!doctype HTML> +<title>Backgrounds on the root element of an iframe should extend to cover the entire canvas of the iframe in the presence of margin</title> +<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background"> +<link rel="match" href="background-margin-iframe-root-ref.html"> +<iframe srcdoc=" +<!doctype HTML> +<style> + html { + background: linear-gradient(lightblue, yellow); + height: 300px; + margin: 50px; + overflow: hidden; + } +</style>"></iframe> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html new file mode 100644 index 00000000000..2e5ec36ec08 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root-ref.html @@ -0,0 +1,14 @@ +<!doctype HTML> +<style> + div { + background: linear-gradient(lightblue, yellow); + background-size: 300px 300px; + background-position: 50px 50px; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } +</style> +<div></div> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html new file mode 100644 index 00000000000..cbba6c012d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-root.html @@ -0,0 +1,12 @@ +<!doctype HTML> +<title>Backgrounds on the root element should extend to cover the entire canvas in the presence of margin</title> +<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background"> +<link rel="match" href="background-margin-root-ref.html"> +<style> + html { + background: linear-gradient(lightblue, yellow); + height: 300px; + margin: 50px; + } +</style> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html new file mode 100644 index 00000000000..2e5ec36ec08 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root-ref.html @@ -0,0 +1,14 @@ +<!doctype HTML> +<style> + div { + background: linear-gradient(lightblue, yellow); + background-size: 300px 300px; + background-position: 50px 50px; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } +</style> +<div></div> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html new file mode 100644 index 00000000000..87129f38184 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-margin-transformed-root.html @@ -0,0 +1,13 @@ +<!doctype HTML> +<title>Backgrounds on the root element should extend to cover the entire canvas in the presence of margin and transform</title> +<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#root-background"> +<link rel="match" href="background-margin-transformed-root-ref.html"> +<style> + html { + background: linear-gradient(lightblue, yellow); + height: 300px; + margin: 50px; + transform: rotateZ(0deg); + } +</style> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html index d772748564f..25c0c5cb357 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-lr-ref.html @@ -11,7 +11,6 @@ background-color: green; block-size: 100px; display: flex; - gap: 20px; } section > div{ background-color: grey; diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html index 66d104a86d1..5aac91817f3 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rl-ref.html @@ -11,7 +11,6 @@ background-color: green; block-size: 100px; display: flex; - gap: 20px; } section > div{ background-color: grey; diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html index 7556857e052..bb0cf3c0eb0 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-001-rtl-ref.html @@ -11,7 +11,6 @@ background-color: green; block-size: 100px; display: flex; - gap: 20px; } section > div{ background-color: grey; diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html index f9c0c55eaaf..8d761c6dfbc 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-lr-ref.html @@ -12,7 +12,6 @@ block-size: 200px; display: flex; flex-direction: column; - gap: 20px; } section > div{ background-color: gray; diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html index c9148e2976a..9310e9ae488 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-002-rl-ref.html @@ -12,7 +12,6 @@ block-size: 200px; display: flex; flex-direction: column; - gap: 20px; } section > div{ background-color: grey; diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html new file mode 100644 index 00000000000..d1d579e30b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-011.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-line-break"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="Gaps are respected when gathering items into lines for row flexboxes." /> + +<style> +.item { + width: 100px; + height: 50px; + flex: 0 0 auto; + background: green; +} +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id=reference-overlapped-red></div> + +<div style="display: flex; width: 200px; column-gap: 50px; flex-flow: row wrap"> + <div class=item></div> + <div class=item></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html new file mode 100644 index 00000000000..19b39b9a783 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-012.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-line-break"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="Gaps are respected when gathering items into lines for column flexboxes." /> + +<style> +.item { + width: 50px; + height: 100px; + flex: 0 0 auto; + background: green; +} +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id=reference-overlapped-red></div> + +<div style="display: flex; height: 200px; width: 100px; row-gap: 50px; flex-flow: column wrap;"> + <div class=item></div> + <div class=item></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html new file mode 100644 index 00000000000..30e4c43e719 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-013.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="Main axis gap makes grow turn to shrink." /> + +<style> +.item { + width: 30px; + flex: 1 1 auto; + background: red; +} +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div style="display: flex; height: 100px; width: 100px; column-gap: 100px; background: green;"> + <div class=item></div> + <div class=item></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html new file mode 100644 index 00000000000..c600478c73c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-014.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#main-alignment"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="There are gaps between 0-main-size items" /> + +<style> +.item { + height: 10px; + flex: 0 0 auto; +} +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id=reference-overlapped-red></div> + +<div style="display: flex; width: 100px; row-gap: 40px; background: green; flex-direction: column;"> + <div class=item></div> + <div class=item style="height: 0px"></div> + <div class=item></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html new file mode 100644 index 00000000000..e54598e2000 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-015.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#intrinsic-sizes"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="Intrinsic min size includes gaps" /> + +<style> +.item { + flex: 0 0 auto; + line-height: 0px; +} + +.inline-block { + display: inline-block; + width: 10px; +} + +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id=reference-overlapped-red></div> + +<div style="display: flex; column-gap: 80px; background: green; height: 100px; width: min-content"> + <div class=item> <!-- min: 10 max: 20 --> + <div class=inline-block></div><div class=inline-block></div> + </div> + <div class=item style="width: 10px"></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html b/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html new file mode 100644 index 00000000000..a5441772567 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/gap-016.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>Flex gaps</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#intrinsic-sizes"> +<link rel="help" href="https://drafts.csswg.org/css-align/#gaps"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" content="Intrinsic max size includes gaps" /> + +<style> +.item { + flex: 0 0 auto; + line-height: 0px; +} + +.inline-block { + display: inline-block; + width: 10px; +} + +#reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id=reference-overlapped-red></div> + +<div style="display: flex; column-gap: 70px; background: green; height: 100px; width: max-content"> + <div class=item> <!-- min: 10 max: 20 --> + <div class=inline-block></div><div class=inline-block></div> + </div> + <div class=item style="width: 10px"></div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html index c0688870818..89ed671fdf1 100644 --- a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html +++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-animation.html @@ -187,4 +187,112 @@ test_with_at_property({ } }, 'Ongoing animation picks up redeclared meaning of \'unset\''); +test_with_at_property({ + syntax: '"<color>"', + inherits: false, + initialValue: 'red' +}, (name) => { + try { + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(255, 0, 0)'); + div.style = `transition: ${name} steps(2, start) 100s; ${name}: blue`; + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(128, 0, 128)'); + } finally { + div.style = ''; + } +}, 'Transitioning from initial value'); + +test_with_at_property({ + syntax: '"<color>"', + inherits: false, + initialValue: 'red' +}, (name) => { + try { + div.style = `${name}: blue;`; + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 0, 255)'); + div.style = `transition: ${name} steps(2, start) 100s; ${name}: green`; + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 64, 128)'); + } finally { + div.style = ''; + } +}, 'Transitioning from specified value'); + +test_with_at_property({ + syntax: '"<length>"', + inherits: false, + initialValue: '100px' +}, (name) => { + with_style_node(`div { transition: ${name} steps(2, start) 100s; }`, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '100px'); + // Re-declaring the property with a different initial value effectively + // means the computed value has changed. This means we should transition + // from the old initial value to the new initial value. + with_at_property({ + name: name, + syntax: '"<length>"', + inherits: false, + initialValue: '200px' + }, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '150px'); + }); + }); +}, 'Transition triggered by initial value change'); + +test_with_at_property({ + syntax: '"<length>"', + inherits: false, + initialValue: '100px' +}, (name) => { + with_style_node(`div { transition: ${name} steps(2, start) 100s; }`, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '100px'); + with_at_property({ + name: name, + syntax: '"<color>"', + inherits: false, + initialValue: 'green' + }, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)'); + }); + }); +}, 'No transition when changing types'); + +test(() => { + let name = generate_name(); + with_style_node(`div { ${name}: 100px; transition: ${name} steps(2, start) 100s; }`, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), ' 100px'); + + let style1 = document.createElement('style'); + style1.textContent = ` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 200px; + } + `; + + let style2 = document.createElement('style'); + style2.textContent = `div { ${name}: 400px; }`; + + try { + // Register the property: + document.body.append(style1); + // The token sequence ' 100px' is now interpreted as a length '100px'. + assert_equals(getComputedStyle(div).getPropertyValue(name), '100px'); + + // Change the computed value: + document.body.append(style2); + // This should cause an interpolation between 100px and 400px: + assert_equals(getComputedStyle(div).getPropertyValue(name), '250px'); + + // In the middle of the transition above, remove the @property rule + // (making the computed value a token sequence again). We should snap + // to the new token sequence. + style1.remove(); + assert_equals(getComputedStyle(div).getPropertyValue(name), ' 400px'); + } finally { + style1.remove(); + style2.remove(); + } + }); +}, 'No transition when removing @property rule'); + </script> diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html new file mode 100644 index 00000000000..04c40c8be0f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/at-property-typedom.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#css-style-value-reification"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/utils.js"></script> +<div id=div></div> +<script> + +test(() => { + let name = generate_name(); + with_style_node(`div { ${name}: 100px; }`, () => { + // Before registering the property, ${name} should reify as a + // a token sequence. + assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnparsedValue'); + assert_equals(div.computedStyleMap().get(name).toString(), ' 100px'); + + with_at_property({ + name: name, + syntax: '"<length>"', + inherits: false, + initialValue: '0px' + }, () => { + // After registering, it should reify as a <length>. + assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue'); + assert_equals(div.computedStyleMap().get(name).value, 100); + assert_equals(div.computedStyleMap().get(name).unit, 'px'); + }); + + // After @property is removed, the computed value is once again a token + // sequence. + assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnparsedValue'); + assert_equals(div.computedStyleMap().get(name).toString(), ' 100px'); + }); +}, 'Properties declared with @property reify correctly'); + +test(() => { + let name = generate_name(); + // 0 is valid as a both <length> and <integer>, which reify differently. + with_style_node(`div { ${name}: 0; }`, () => { + with_at_property({ + name: name, + syntax: '"<length>"', + inherits: false, + initialValue: '1000px' + }, () => { + assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue'); + assert_equals(div.computedStyleMap().get(name).value, 0); + assert_equals(div.computedStyleMap().get(name).unit, 'px'); + + with_at_property({ + name: name, + syntax: '"<integer>"', + inherits: false, + initialValue: '1000' + }, () => { + assert_equals(div.computedStyleMap().get(name).constructor.name, 'CSSUnitValue'); + assert_equals(div.computedStyleMap().get(name).value, 0); + assert_equals(div.computedStyleMap().get(name).unit, 'number'); + }); + }); + }); +}, 'Re-declaring a property with a different type affects reification'); + +</script> diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html index 9a68be51d79..e6bbbec9640 100644 --- a/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html +++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/determine-registration.html @@ -3,132 +3,230 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="./resources/utils.js"></script> -<style> -@property --a { - syntax: "<length>"; - inherits: false; - initial-value: 1px; -} - -@property --b { - syntax: "<length>"; - inherits: false; - initial-value: 2px; -} - -@property --c { - syntax: "<length>"; - inherits: false; - initial-value: 3px; -} - -@property --d { - syntax: "<length>"; - inherits: false; - initial-value: 4px; -} - -@property --d { - syntax: "<color>"; - inherits: false; - initial-value: red; -} -</style> -<style> -@property --c { - syntax: "<integer>"; - inherits: false; - initial-value: 6; -} -</style> <div id=outer> <div id=div></div> </div> <script> -CSS.registerProperty({ - name: '--b', - syntax: '<color>', +test_with_at_property({ + syntax: '"<length>"', inherits: false, - initialValue: 'green' -}); - -CSS.registerProperty({ - name: '--e', - syntax: '<color>', - inherits: false, - initialValue: 'blue' -}); - -test(() => { - assert_equals(getComputedStyle(div).getPropertyValue('--a'), '1px'); + initialValue: '1px' +}, (name) => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); }, '@property determines the registration when uncontested'); -test(() => { - assert_equals(getComputedStyle(div).getPropertyValue('--b'), 'rgb(0, 128, 0)'); +test_with_at_property({ + syntax: '"<length>"', + inherits: false, + initialValue: '2px' +}, (name) => { + CSS.registerProperty({ + name: name, + syntax: '<color>', + inherits: false, + initialValue: 'green' + }); + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)'); }, 'CSS.registerProperty wins over @property'); -test(() => { - assert_equals(getComputedStyle(div).getPropertyValue('--c'), '6'); +test_with_at_property({ + syntax: '"<length>"', + inherits: false, + initialValue: '3px' +}, (name1) => { + with_at_property({ + name: name1, + syntax: '"<integer>"', + inherits: false, + initialValue: '6' + }, (name2) => { + assert_equals(name1, name2); + assert_equals(getComputedStyle(div).getPropertyValue(name2), '6'); + }); }, '@property later in document order wins'); test(() => { - assert_equals(getComputedStyle(div).getPropertyValue('--d'), 'rgb(255, 0, 0)'); + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 4px; + } + + @property ${name} { + syntax: "<color>"; + inherits: false; + initial-value: red; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(255, 0, 0)'); + }); }, '@property later in stylesheet wins'); test(() => { - assert_equals(getComputedStyle(div).getPropertyValue('--e'), 'rgb(0, 0, 255)'); + let name = generate_name(); + CSS.registerProperty({ + name: name, + syntax: '<color>', + inherits: false, + initialValue: 'green' + }); + assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)'); }, 'CSS.registerProperty determines the registration when uncontested'); test(() => { - // --f is initially not registered, hence has no initial value. - assert_equals(getComputedStyle(div).getPropertyValue('--f'), ''); + let name = generate_name(); + + // ${name} is initially not registered, hence has no initial value. + assert_equals(getComputedStyle(div).getPropertyValue(name), ''); with_at_property({ - name: '--f', + name: name, syntax: '"<length>"', inherits: false, initialValue: '10px' }, () => { - assert_equals(getComputedStyle(div).getPropertyValue('--f'), '10px'); + assert_equals(getComputedStyle(div).getPropertyValue(name), '10px'); }); - // When the style node is removed, --f should be unregistered again. - assert_equals(getComputedStyle(div).getPropertyValue('--f'), ''); + // When the style node is removed, ${name} should be unregistered again. + assert_equals(getComputedStyle(div).getPropertyValue(name), ''); }, '@property registrations are cleared when rule removed'); -test_with_style_node('div { --g: calc(1px + 1px); }', () => { - // --g should be a token sequence at this point. - assert_equals(getComputedStyle(div).getPropertyValue('--g'), ' calc(1px + 1px)'); +test(() => { + let name = generate_name(); + + with_style_node(`div { ${name}: calc(1px + 1px); }`, () => { + // ${name} should be a token sequence at this point. + assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)'); + + with_at_property({ + name: name, + syntax: '"<length>"', + inherits: false, + initialValue: '0px' + }, () => { + // ${name} is now a <length>, hence the calc() should be simplified. + assert_equals(getComputedStyle(div).getPropertyValue(name), '2px'); + }); + + // ${name} should be a token sequence again. + assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)'); + }); +}, 'Computed value becomes token sequence when @property is removed'); - with_at_property({ - name: '--g', - syntax: '"<length>"', - inherits: false, - initialValue: '0px' - }, () => { - // --g is now a <length>, hence the calc() should be simplified. - assert_equals(getComputedStyle(div).getPropertyValue('--g'), '2px'); +test(() => { + let name = generate_name(); + + with_style_node(`#outer { ${name}: 10px; }`, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px'); + + with_at_property({ + name: name, + syntax: '"<length>"', + inherits: false, + initialValue: '0px' + }, () => { + // ${name} is no longer inherited + assert_equals(getComputedStyle(div).getPropertyValue(name), '0px'); + }); + + assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px'); }); +}, 'Inherited status is reflected in computed styles when @property is removed'); - // --g should be a token sequence again. - assert_equals(getComputedStyle(div).getPropertyValue('--g'), ' calc(1px + 1px)'); -}, 'Computed value becomes token sequence when @property is removed'); +test(() => { + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 1px; + } + + @property ${name} { + inherits: false; + initial-value: green; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); + }); +}, 'Invalid @property rule (missing syntax) does not overwrite previous valid rule'); -test_with_style_node('#outer { --h: 10px; }', () => { - assert_equals(getComputedStyle(div).getPropertyValue('--h'), ' 10px'); +test(() => { + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 1px; + } + + @property ${name} { + syntax: "<color>"; + initial-value: green; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); + }); +}, 'Invalid @property rule (missing inherits descriptor) does not overwrite previous valid rule'); - with_at_property({ - name: '--h', - syntax: '"<length>"', - inherits: false, - initialValue: '0px' - }, () => { - // --h is no longer inherited - assert_equals(getComputedStyle(div).getPropertyValue('--h'), '0px'); +test(() => { + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 1px; + } + + @property ${name} { + syntax: "<color>"; + inherits: false; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); }); +}, 'Invalid @property rule (missing initial-value) does not overwrite previous valid rule'); - assert_equals(getComputedStyle(div).getPropertyValue('--h'), ' 10px'); -}, 'Inherited status is reflected in computed styles when @property is removed'); +test(() => { + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<color>"; + inherits: false; + } + + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 1px; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); + }); +}, 'Previous invalid rule does not prevent valid rule from causing registration'); + +test(() => { + let name = generate_name(); + + with_style_node(` + @property ${name} { + syntax: "<length>"; + inherits: false; + initial-value: 1px; + quite-unknown: 200; + } + `, () => { + assert_equals(getComputedStyle(div).getPropertyValue(name), '1px'); + }); +}, 'Unknown descriptors are ignored and do not invalidate rule'); </script> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html new file mode 100644 index 00000000000..3441050a59d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated-ref.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-backface-visibility"> + <style> + #flip { + height: 100px; + width: 100px; + transform: rotateY(180deg); + transform-style: preserve-3d; + } + + #back { + background: lightblue; + transform: rotateY(180deg); + position: absolute; + top: 0; + left: 0; + width: 200px; + height: 200px; + backface-visibility: hidden; + } + + #posabs { + position: absolute; + bottom: 0; + right: 0; + background: yellow; + } + </style> + <div id="flip"> + <div id="back"> + <i id="posabs">Text</i> + </div> + </div> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html new file mode 100644 index 00000000000..6cdefad6620 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-transforms/backface-visibility-hidden-animated.html @@ -0,0 +1,51 @@ +<!doctype html> +<html class=reftest-wait> + <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org"> + <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-backface-visibility"> + <link rel="match" href="backface-visibility-hidden-animated-ref.html"> + <style> + @keyframes show-backface { + 0% { transform: rotateY(60deg); } + 0.01% { transform: rotateY(180deg); } + 100% { transform: rotateY(180deg); } + } + + .flip { + animation: 10s linear 0s infinite forwards show-backface; + height: 100px; + width: 100px; + transform: rotateY(60deg); + transform-style: preserve-3d; + } + + #back { + background: lightblue; + transform: rotateY(180deg); + position: absolute; + top: 0; + left: 0; + width: 200px; + height: 200px; + backface-visibility: hidden; + } + + #posabs { + position: absolute; + bottom: 0; + right: 0; + background: yellow; + } + </style> + <div id="flip"> + <div id="back"> + <i id="posabs">Text</i> + </div> + </div> + <script> + onload = () => requestAnimationFrame(() => requestAnimationFrame(() => { + flip.classList.add("flip"); + requestAnimationFrame(() => requestAnimationFrame(() => + document.documentElement.classList.remove("reftest-wait"))); + })); + </script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-001.html index 7e9b133aead..7e9b133aead 100644 --- a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box.html +++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-001.html diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html new file mode 100644 index 00000000000..9044048e387 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-box/fill-box-002.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>transform-box: fill-box on an SVG container element</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box"> +<link rel="match" href="reference/greensquare200x200.html"> +<style> +#container { + transform-box: fill-box; + transform-origin: center; + transform: scale(2); +} +</style> +<p>There should be a green 200x200 rectangle below, and no red.</p> +<svg width="200" height="200"> + <rect width="200" height="200" fill="red"/> + <g id="container"> + <rect x="50" y="50" width="100" height="100" fill="green"/> + </g> +</svg> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html new file mode 100644 index 00000000000..92ebe78c1d5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-percent-010.html @@ -0,0 +1,28 @@ +<!doctype html> +<html class="reftest-wait"> +<title>CSS Transforms: 'transform' resolved percentage values in SVG after mutation</title> +<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-property"> +<link rel="match" href="transform-box/reference/greensquare200x200.html"> +<script src="/common/reftest-wait.js"></script> +<script src="/common/rendering-utils.js"></script> +<style> + #container { + width: 400px; + height: 200px; + } +</style> +<p>There should be a green 200x200 rectangle below, and no red.</p> +<div id="container"> + <svg width="100%" height="100%"> + <rect width="200" height="200" fill="red"/> + <g id="target" style="transform: translate(50%, 50%)"> + <rect x="-100" y="-100" width="100%" height="100%" fill="green"/> + </g> + </svg> +</div> +<script> + waitForAtLeastOneFrame().then(() => { + document.getElementById('container').style.width = '200px'; + takeScreenshot(); + }); +</script> diff --git a/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html new file mode 100644 index 00000000000..cf5d63b02a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/event-timing/buffered-and-duration-threshold.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: PerformanceObserver with buffered flag and durationThreshold</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=resources/event-timing-test-utils.js></script> +<div id='myDiv'>Click me</div> +<script> +promise_test(async t => { + assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); + // Add a PerformanceObserver and observe with a durationThreshold of 30 and buffered flag. + return new Promise(async resolve1 => { + // Add a slow click event and make sure it's dispatched to observers. + await new Promise(async resolve2 => { + // Observer to await until event entry is dispatched. + new PerformanceObserver(() => { + resolve2(); + }).observe({type: "event", durationThreshold: 16}); + await clickOnElementAndDelay('myDiv', 30); + }); + const afterFirstClick = performance.now(); + new PerformanceObserver(t.step_func(list => { + const mouseDowns = list.getEntriesByName('mousedown'); + assert_equals(mouseDowns.length, 1, 'Should only observe 1 click!'); + assert_greater_than(mouseDowns[0].processingStart, afterFirstClick, + 'The entry should not be the first click!!'); + verifyClickEvent(mouseDowns[0], 'myDiv', false /* isFirst */, 16 /* minDuration*/); + resolve1(); + })).observe({type: 'event', durationThreshold: 16, buffered: true}); + // This should be the only click observed since the other one would not be buffered. + await clickOnElementAndDelay('myDiv', 30); + }); +}, "PerformanceObserver buffering independent of durationThreshold"); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html new file mode 100644 index 00000000000..5665d42d334 --- /dev/null +++ b/tests/wpt/web-platform-tests/event-timing/large-duration-threshold.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: PerformanceObserver with a durationThreshold of 125</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=resources/event-timing-test-utils.js></script> +<div id='myDiv'>Click me</div> +<script> +promise_test(async t => { + return testDuration(t, 'myDiv', numEntries=2, dur=125, fastDur=70, slowDur=140); +}, "PerformanceObserver observes events according to its durationThreshold"); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html new file mode 100644 index 00000000000..a827f2211b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/event-timing/medium-duration-threshold.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: PerformanceObserver with a durationThreshold of 50</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=resources/event-timing-test-utils.js></script> +<div id='myDiv'>Click me</div> +<script> +promise_test(async t => { + return testDuration(t, 'myDiv', numEntries=3, dur=50, fastDur=20, slowDur=70); +}, "PerformanceObserver observes events according to its durationThreshold"); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html b/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html new file mode 100644 index 00000000000..443b38a2783 --- /dev/null +++ b/tests/wpt/web-platform-tests/event-timing/min-duration-threshold.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: PerformanceObserver with a durationThreshold less than 16</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=resources/event-timing-test-utils.js></script> +<div id='myDiv'>Click me</div> +<script> +promise_test(async t => { + return testDuration(t, 'myDiv', numEntries=5, dur=0, fastDur=0, slowDur=20); +}, "PerformanceObserver with durationThreshold of 0 sees events of duration >= 16"); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js b/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js index cc824d9cba6..bceaa5053d5 100644 --- a/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js +++ b/tests/wpt/web-platform-tests/event-timing/resources/event-timing-test-utils.js @@ -1,16 +1,16 @@ -// Clicks on the element with the given ID. It adds an event handler to the element -// which ensures that the events have a long duration and reported by EventTiming -// where appropriate. Calls |callback| during event handler. -function clickOnElement(id, callback) { +// Clicks on the element with the given ID. It adds an event handler to the element which +// ensures that the events have a duration of at least |delay|. Calls |callback| during +// event handler if |callback| is provided. +async function clickOnElementAndDelay(id, delay, callback) { const element = document.getElementById(id); const clickHandler = () => { - mainThreadBusy(120); + mainThreadBusy(delay); if (callback) callback(); element.removeEventListener("mousedown", clickHandler); }; element.addEventListener("mousedown", clickHandler); - test_driver.click(element); + await test_driver.click(element); } function mainThreadBusy(duration) { @@ -18,15 +18,16 @@ function mainThreadBusy(duration) { while (performance.now() < now + duration); } -// This method should receive an entry of type 'event'. |is_first| is true only -// when the event also happens to correspond to the first event. In this case, -// the timings of the 'first-input' entry should be equal to those of this entry. -function verifyClickEvent(entry, targetId, is_first=false) { +// This method should receive an entry of type 'event'. |isFirst| is true only when we want +// to check that the event also happens to correspond to the first event. In this case, the +// timings of the 'first-input' entry should be equal to those of this entry. |minDuration| +// is used to compared against entry.duration. +function verifyClickEvent(entry, targetId, isFirst=false, minDuration=104) { assert_true(entry.cancelable); assert_equals(entry.name, 'mousedown'); assert_equals(entry.entryType, 'event'); - assert_greater_than_equal(entry.duration, 104, - "The entry's duration should be greater than or equal to 104 ms."); + assert_greater_than_equal(entry.duration, minDuration, + "The entry's duration should be greater than or equal to " + minDuration + " ms."); assert_greater_than(entry.processingStart, entry.startTime, "The entry's processingStart should be greater than startTime."); assert_greater_than_equal(entry.processingEnd, entry.processingStart, @@ -35,7 +36,7 @@ function verifyClickEvent(entry, targetId, is_first=false) { // on the actual duration. assert_greater_than_equal(entry.duration + 4, entry.processingEnd - entry.startTime, "The entry's duration must be at least as large as processingEnd - startTime."); - if (is_first) { + if (isFirst) { let firstInputs = performance.getEntriesByType('first-input'); assert_equals(firstInputs.length, 1, 'There should be a single first-input entry'); let firstInput = firstInputs[0]; @@ -61,6 +62,58 @@ function wait() { function clickAndBlockMain(id) { return new Promise((resolve, reject) => { - clickOnElement(id, resolve); + clickOnElementAndDelay(id, 120, resolve); }); } + + // Add a PerformanceObserver and observe with a durationThreshold of |dur|. This test will + // attempt to check that the duration is appropriately checked by: + // * Asserting that entries received have a duration which is the smallest multiple of 8 + // that is greater than or equal to |dur|. + // * Issuing |numEntries| entries that are fast, of duration |slowDur|. + // * Issuing |numEntries| entries that are slow, of duration |fastDur|. + // * Asserting that at least |numEntries| entries are received (at least the slow ones). + // Parameters: + // |t| - the test harness. + // |dur| - the durationThreshold for the PerformanceObserver. + // |id| - the ID of the element to be clicked. + // |numEntries| - the number of slow and number of fast entries. + // |slowDur| - the min duration of a slow entry. + // |fastDur| - the min duration of a fast entry. +async function testDuration(t, id, numEntries, dur, fastDur, slowDur) { + assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); + const observerPromise = new Promise(async resolve => { + let minDuration = Math.ceil(dur / 8) * 8; + // Exposed events must always have a minimum duration of 16. + minDuration = Math.max(minDuration, 16); + let numEntriesReceived = 0; + new PerformanceObserver(list => { + const mouseDowns = list.getEntriesByName('mousedown'); + mouseDowns.forEach(e => { + t.step(() => { + verifyClickEvent(e, id, false /* isFirst */, minDuration); + }); + }); + numEntriesReceived += mouseDowns.length; + // Note that we may receive more entries if the 'fast' click events turn out slower + // than expected. + if (numEntriesReceived >= numEntries) + resolve(); + }).observe({type: "event", durationThreshold: dur}); + }); + const clicksPromise = new Promise(async resolve => { + for (let index = 0; index < numEntries; index++) { + // Add some fast click events. + await clickOnElementAndDelay(id, slowDur); + // Add some slow click events. + if (fastDur > 0) { + await clickOnElementAndDelay(id, fastDur); + } else { + // We can just directly call test_driver when |fastDur| is 0. + await test_driver.click(document.getElementById(id)); + } + } + resolve(); + }); + return Promise.all([observerPromise, clicksPromise]); +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/event-timing/timingconditions.html b/tests/wpt/web-platform-tests/event-timing/timingconditions.html index 12280cb894a..e7763c40dc0 100644 --- a/tests/wpt/web-platform-tests/event-timing/timingconditions.html +++ b/tests/wpt/web-platform-tests/event-timing/timingconditions.html @@ -15,10 +15,8 @@ <script> let trustedClickStart; function trustedClickAndBlockMain(id) { - return new Promise((resolve, reject) => { - trustedClickStart = performance.now(); - clickOnElement(id, resolve); - }); + trustedClickStart = performance.now(); + return clickAndBlockMain(id); } function untrustedClickAndBlockMain(id) { diff --git a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html index 41ece6826ed..c28708019fa 100644 --- a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html +++ b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html @@ -17,9 +17,13 @@ promise_test(async (test) => { var request_token = token(); const response = await fetch(`resources/stale-script.py?token=` + request_token); + // Wait until resource is completely fetched to allow caching before next fetch. + const body = await response.text(); const response2 = await fetch(`resources/stale-script.py?token=` + request_token); assert_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id')); + const body2 = await response2.text(); + assert_equals(body, body2); while(true) { const revalidation_check = await fetch(`resources/stale-script.py?query&token=` + request_token); diff --git a/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js b/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js index a60b7fe838e..ddcc59c4034 100644 --- a/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js +++ b/tests/wpt/web-platform-tests/fullscreen/idlharness.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/hr-time/idlharness.any.js b/tests/wpt/web-platform-tests/hr-time/idlharness.any.js index 4e266c09e33..6676b001a8b 100644 --- a/tests/wpt/web-platform-tests/hr-time/idlharness.any.js +++ b/tests/wpt/web-platform-tests/hr-time/idlharness.any.js @@ -1,6 +1,7 @@ // META: global=window,worker // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js b/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js index 50faf83514f..d4d739ae8eb 100644 --- a/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js +++ b/tests/wpt/web-platform-tests/html-media-capture/idlharness.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html index d29a8e11f43..4cad9483003 100644 --- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html +++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-prototype-chain.html @@ -15,7 +15,6 @@ test(function() { }, "window object"); test(function() { var proto = Object.getPrototypeOf(window); - assert_class_string(proto, "WindowPrototype"); assert_equals(proto, Window.prototype); }, "Window.prototype"); test(function() { @@ -24,12 +23,10 @@ test(function() { }, "Global scope polluter"); test(function() { var protoproto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(window))); - assert_class_string(protoproto, "EventTargetPrototype"); assert_equals(protoproto, EventTarget.prototype); }, "EventTarget.prototype"); test(function() { var protoprotoproto = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(window)))); - assert_class_string(protoprotoproto, "Object"); assert_equals(protoprotoproto, Object.prototype); }, "Object.prototype"); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html index a10ea1d2858..35f151b12d6 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html @@ -53,6 +53,11 @@ // We have no test cases using valid colors other than "#000000". return "#000000"; } + function browserSupportsInputTypeOf(inputType) { + var inputTest = document.createElement("input"); + inputTest.type = inputType; + return (inputTest.type === inputType); + } var types = [ @@ -99,6 +104,8 @@ for (var j = 0; j < types.length; j++) { if (types[i] != types[j]) { test(function() { + assert_implements(browserSupportsInputTypeOf(types[i].type), "Support for input type " + types[i].type + " is required for this test."); + assert_implements(browserSupportsInputTypeOf(types[j].type), "Support for input type " + types[j].type + " is required for this test."); var input = document.createElement("input"); var expected = INITIAL_VALUE; input.type = types[i].type; diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html index 9409dd08e4d..9a22728ec7e 100644 --- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html +++ b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html @@ -10,9 +10,9 @@ promise_test(async t => { const uaData = navigator.userAgentData; - for (ua of uaData.uaList) { - assert_equals(typeof ua.brand, "string", "brand should be a string"); - assert_equals(typeof ua.version, "string", "version should be a string"); + for (brandVersionPair of uaData.brands) { + assert_equals(typeof brandVersionPair.brand, "string", "brand should be a string"); + assert_equals(typeof brandVersionPair.version, "string", "version should be a string"); } assert_equals(typeof uaData.mobile, "boolean", "mobile should be a boolean"); const highEntropyData = await uaData.getHighEntropyValues(["platform", "platformVersion", "architecture", "model"]); diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl index f102510db47..b7d9c33d596 100644 --- a/tests/wpt/web-platform-tests/interfaces/cssom.idl +++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl @@ -14,7 +14,7 @@ typedef DOMString CSSOMString; [Exposed=Window] interface MediaList { - stringifier attribute [TreatNullAs=EmptyString] CSSOMString mediaText; + stringifier attribute [LegacyNullToEmptyString] CSSOMString mediaText; readonly attribute unsigned long length; getter CSSOMString? item(unsigned long index); void appendMedium(CSSOMString medium); @@ -130,10 +130,10 @@ interface CSSStyleDeclaration { getter CSSOMString item(unsigned long index); CSSOMString getPropertyValue(CSSOMString property); CSSOMString getPropertyPriority(CSSOMString property); - [CEReactions] void setProperty(CSSOMString property, [TreatNullAs=EmptyString] CSSOMString value, optional [TreatNullAs=EmptyString] CSSOMString priority = ""); + [CEReactions] void setProperty(CSSOMString property, [LegacyNullToEmptyString] CSSOMString value, optional [LegacyNullToEmptyString] CSSOMString priority = ""); [CEReactions] CSSOMString removeProperty(CSSOMString property); readonly attribute CSSRule? parentRule; - [CEReactions] attribute [TreatNullAs=EmptyString] CSSOMString cssFloat; + [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString cssFloat; }; interface mixin ElementCSSInlineStyle { diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl index a8b9b423301..c9018f1b63d 100644 --- a/tests/wpt/web-platform-tests/interfaces/html.idl +++ b/tests/wpt/web-platform-tests/interfaces/html.idl @@ -45,10 +45,10 @@ interface DOMStringList { enum DocumentReadyState { "loading", "interactive", "complete" }; typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement; -[OverrideBuiltins] +[LegacyOverrideBuiltIns] partial interface Document { // resource metadata management - [PutForwards=href, Unforgeable] readonly attribute Location? location; + [PutForwards=href, LegacyUnforgeable] readonly attribute Location? location; attribute USVString domain; readonly attribute USVString referrer; attribute USVString cookie; @@ -89,7 +89,7 @@ partial interface Document { DOMString queryCommandValue(DOMString commandId); // special event handler IDL attributes that only apply to Document objects - [LenientThis] attribute EventHandler onreadystatechange; + [LegacyLenientThis] attribute EventHandler onreadystatechange; // also has obsolete members }; @@ -119,7 +119,7 @@ interface HTMLElement : Element { [CEReactions] attribute boolean spellcheck; [CEReactions] attribute DOMString autocapitalize; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText; ElementInternals attachInternals(); }; @@ -145,7 +145,7 @@ interface mixin HTMLOrSVGElement { }; [Exposed=Window, - OverrideBuiltins] + LegacyOverrideBuiltIns] interface DOMStringMap { getter DOMString (DOMString name); [CEReactions] setter void (DOMString name, DOMString value); @@ -365,7 +365,7 @@ interface HTMLSourceElement : HTMLElement { }; [Exposed=Window, - NamedConstructor=Image(optional unsigned long width, optional unsigned long height)] + LegacyFactoryFunction=Image(optional unsigned long width, optional unsigned long height)] interface HTMLImageElement : HTMLElement { [HTMLConstructor] constructor(); @@ -463,7 +463,7 @@ interface HTMLVideoElement : HTMLMediaElement { }; [Exposed=Window, - NamedConstructor=Audio(optional DOMString src)] + LegacyFactoryFunction=Audio(optional DOMString src)] interface HTMLAudioElement : HTMLMediaElement { [HTMLConstructor] constructor(); }; @@ -766,7 +766,7 @@ interface HTMLTableCellElement : HTMLElement { }; [Exposed=Window, - OverrideBuiltins, + LegacyOverrideBuiltIns, LegacyUnenumerableNamedProperties] interface HTMLFormElement : HTMLElement { [HTMLConstructor] constructor(); @@ -840,7 +840,7 @@ interface HTMLInputElement : HTMLElement { [CEReactions] attribute DOMString step; [CEReactions] attribute DOMString type; [CEReactions] attribute DOMString defaultValue; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString value; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString value; attribute object? valueAsDate; attribute unrestricted double valueAsNumber; [CEReactions] attribute unsigned long width; @@ -944,7 +944,7 @@ interface HTMLOptGroupElement : HTMLElement { }; [Exposed=Window, - NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)] + LegacyFactoryFunction=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)] interface HTMLOptionElement : HTMLElement { [HTMLConstructor] constructor(); @@ -979,7 +979,7 @@ interface HTMLTextAreaElement : HTMLElement { readonly attribute DOMString type; [CEReactions] attribute DOMString defaultValue; - attribute [TreatNullAs=EmptyString] DOMString value; + attribute [LegacyNullToEmptyString] DOMString value; readonly attribute unsigned long textLength; readonly attribute boolean willValidate; @@ -1269,7 +1269,7 @@ interface mixin CanvasFillStrokeStyles { attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black) CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1); CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1); - CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition); + CanvasPattern? createPattern(CanvasImageSource image, [LegacyNullToEmptyString] DOMString repetition); }; @@ -1593,11 +1593,11 @@ dictionary DragEventInit : MouseEventInit { LegacyUnenumerableNamedProperties] interface Window : EventTarget { // the current browsing context - [Unforgeable] readonly attribute WindowProxy window; + [LegacyUnforgeable] readonly attribute WindowProxy window; [Replaceable] readonly attribute WindowProxy self; - [Unforgeable] readonly attribute Document document; + [LegacyUnforgeable] readonly attribute Document document; attribute DOMString name; - [PutForwards=href, Unforgeable] readonly attribute Location location; + [PutForwards=href, LegacyUnforgeable] readonly attribute Location location; readonly attribute History history; readonly attribute CustomElementRegistry customElements; [Replaceable] readonly attribute BarProp locationbar; @@ -1616,11 +1616,11 @@ interface Window : EventTarget { // other browsing contexts [Replaceable] readonly attribute WindowProxy frames; [Replaceable] readonly attribute unsigned long length; - [Unforgeable] readonly attribute WindowProxy? top; + [LegacyUnforgeable] readonly attribute WindowProxy? top; attribute any opener; [Replaceable] readonly attribute WindowProxy? parent; readonly attribute Element? frameElement; - WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = ""); + WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = ""); getter object (DOMString name); // Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic // object on the prototype chain. Indeed, this does not make the global object an exotic object. @@ -1668,21 +1668,21 @@ interface History { [Exposed=Window] interface Location { // but see also additional creation steps and overridden internal methods - [Unforgeable] stringifier attribute USVString href; - [Unforgeable] readonly attribute USVString origin; - [Unforgeable] attribute USVString protocol; - [Unforgeable] attribute USVString host; - [Unforgeable] attribute USVString hostname; - [Unforgeable] attribute USVString port; - [Unforgeable] attribute USVString pathname; - [Unforgeable] attribute USVString search; - [Unforgeable] attribute USVString hash; + [LegacyUnforgeable] stringifier attribute USVString href; + [LegacyUnforgeable] readonly attribute USVString origin; + [LegacyUnforgeable] attribute USVString protocol; + [LegacyUnforgeable] attribute USVString host; + [LegacyUnforgeable] attribute USVString hostname; + [LegacyUnforgeable] attribute USVString port; + [LegacyUnforgeable] attribute USVString pathname; + [LegacyUnforgeable] attribute USVString search; + [LegacyUnforgeable] attribute USVString hash; - [Unforgeable] void assign(USVString url); - [Unforgeable] void replace(USVString url); - [Unforgeable] void reload(); + [LegacyUnforgeable] void assign(USVString url); + [LegacyUnforgeable] void replace(USVString url); + [LegacyUnforgeable] void reload(); - [Unforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins; + [LegacyUnforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins; }; [Exposed=Window, @@ -1787,15 +1787,15 @@ dictionary PromiseRejectionEventInit : EventInit { any reason; }; -[TreatNonObjectAsNull] +[LegacyTreatNonObjectAsNull] callback EventHandlerNonNull = any (Event event); typedef EventHandlerNonNull? EventHandler; -[TreatNonObjectAsNull] +[LegacyTreatNonObjectAsNull] callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error); typedef OnErrorEventHandlerNonNull? OnErrorEventHandler; -[TreatNonObjectAsNull] +[LegacyTreatNonObjectAsNull] callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event); typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler; @@ -1836,8 +1836,8 @@ interface mixin GlobalEventHandlers { attribute EventHandler onloadedmetadata; attribute EventHandler onloadstart; attribute EventHandler onmousedown; - [LenientThis] attribute EventHandler onmouseenter; - [LenientThis] attribute EventHandler onmouseleave; + [LegacyLenientThis] attribute EventHandler onmouseenter; + [LegacyLenientThis] attribute EventHandler onmouseleave; attribute EventHandler onmousemove; attribute EventHandler onmouseout; attribute EventHandler onmouseover; @@ -1969,7 +1969,7 @@ interface mixin NavigatorLanguage { }; interface mixin NavigatorContentUtils { - [SecureContext] void registerProtocolHandler(DOMString scheme, USVString url, DOMString title); + [SecureContext] void registerProtocolHandler(DOMString scheme, USVString url); [SecureContext] void unregisterProtocolHandler(DOMString scheme, USVString url); }; @@ -2361,8 +2361,8 @@ interface HTMLFrameElement : HTMLElement { readonly attribute Document? contentDocument; readonly attribute WindowProxy? contentWindow; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth; }; partial interface HTMLAnchorElement { @@ -2378,11 +2378,11 @@ partial interface HTMLAreaElement { }; partial interface HTMLBodyElement { - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString text; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString link; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vLink; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString aLink; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString text; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString link; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString vLink; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString aLink; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; [CEReactions] attribute DOMString background; }; @@ -2426,7 +2426,7 @@ partial interface HTMLEmbedElement { interface HTMLFontElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString color; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString color; [CEReactions] attribute DOMString face; [CEReactions] attribute DOMString size; }; @@ -2453,8 +2453,8 @@ partial interface HTMLIFrameElement { [CEReactions] attribute DOMString frameBorder; [CEReactions] attribute USVString longDesc; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth; }; partial interface HTMLImageElement { @@ -2465,7 +2465,7 @@ partial interface HTMLImageElement { [CEReactions] attribute unsigned long vspace; [CEReactions] attribute USVString longDesc; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString border; }; partial interface HTMLInputElement { @@ -2506,7 +2506,7 @@ partial interface HTMLObjectElement { [CEReactions] attribute DOMString codeBase; [CEReactions] attribute DOMString codeType; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString border; }; partial interface HTMLOListElement { @@ -2544,9 +2544,9 @@ partial interface HTMLTableElement { [CEReactions] attribute DOMString summary; [CEReactions] attribute DOMString width; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellPadding; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellSpacing; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellPadding; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellSpacing; }; partial interface HTMLTableSectionElement { @@ -2567,7 +2567,7 @@ partial interface HTMLTableCellElement { [CEReactions] attribute boolean noWrap; [CEReactions] attribute DOMString vAlign; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; }; partial interface HTMLTableRowElement { @@ -2576,7 +2576,7 @@ partial interface HTMLTableRowElement { [CEReactions] attribute DOMString chOff; [CEReactions] attribute DOMString vAlign; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; }; partial interface HTMLUListElement { @@ -2585,11 +2585,11 @@ partial interface HTMLUListElement { }; partial interface Document { - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString fgColor; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString linkColor; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vlinkColor; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString alinkColor; - [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString fgColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString linkColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString vlinkColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString alinkColor; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; [SameObject] readonly attribute HTMLCollection anchors; [SameObject] readonly attribute HTMLCollection applets; diff --git a/tests/wpt/web-platform-tests/interfaces/pointerevents.idl b/tests/wpt/web-platform-tests/interfaces/pointerevents.idl index 728fff98d91..8a42b5a8446 100644 --- a/tests/wpt/web-platform-tests/interfaces/pointerevents.idl +++ b/tests/wpt/web-platform-tests/interfaces/pointerevents.idl @@ -12,6 +12,8 @@ dictionary PointerEventInit : MouseEventInit { long tiltX = 0; long tiltY = 0; long twist = 0; + double altitudeAngle = 0; + double azimuthAngle = 0; DOMString pointerType = ""; boolean isPrimary = false; sequence<PointerEvent> coalescedEvents = []; @@ -29,6 +31,8 @@ interface PointerEvent : MouseEvent { readonly attribute long tiltX; readonly attribute long tiltY; readonly attribute long twist; + readonly attribute double altitudeAngle; + readonly attribute double azimuthAngle; readonly attribute DOMString pointerType; readonly attribute boolean isPrimary; [SecureContext] sequence<PointerEvent> getCoalescedEvents(); diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl index e3c2da8d2ab..24b76ad0fe6 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl @@ -28,17 +28,17 @@ enum RTCStatsType { }; dictionary RTCRtpStreamStats : RTCStats { - unsigned long ssrc; - DOMString kind; + required unsigned long ssrc; + required DOMString kind; DOMString transportId; DOMString codecId; }; dictionary RTCCodecStats : RTCStats { - unsigned long payloadType; + required unsigned long payloadType; RTCCodecType codecType; - DOMString transportId; - DOMString mimeType; + required DOMString transportId; + required DOMString mimeType; unsigned long clockRate; unsigned long channels; DOMString sdpFmtpLine; @@ -70,8 +70,7 @@ dictionary RTCReceivedRtpStreamStats : RTCRtpStreamStats { }; dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats { - DOMString trackId; - DOMString receiverId; + required DOMString receiverId; DOMString remoteId; unsigned long framesDecoded; unsigned long keyFramesDecoded; @@ -131,7 +130,6 @@ dictionary RTCSentRtpStreamStats : RTCRtpStreamStats { dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { unsigned long rtxSsrc; - DOMString trackId; DOMString mediaSourceId; DOMString senderId; DOMString remoteId; @@ -187,8 +185,8 @@ dictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats { }; dictionary RTCMediaSourceStats : RTCStats { - DOMString trackIdentifier; - DOMString kind; + required DOMString trackIdentifier; + required DOMString kind; boolean relayedSource; }; @@ -209,8 +207,8 @@ dictionary RTCVideoSourceStats : RTCMediaSourceStats { }; dictionary RTCRtpContributingSourceStats : RTCStats { - unsigned long contributorSsrc; - DOMString inboundRtpStreamId; + required unsigned long contributorSsrc; + required DOMString inboundRtpStreamId; unsigned long packetsContributedTo; double audioLevel; }; @@ -223,15 +221,15 @@ dictionary RTCPeerConnectionStats : RTCStats { }; dictionary RTCRtpTransceiverStats : RTCStats { - DOMString senderId; - DOMString receiverId; + required DOMString senderId; + required DOMString receiverId; DOMString mid; }; dictionary RTCMediaHandlerStats : RTCStats { DOMString trackIdentifier; boolean ended; - DOMString kind; + required DOMString kind; }; dictionary RTCVideoHandlerStats : RTCMediaHandlerStats { @@ -258,8 +256,8 @@ dictionary RTCDataChannelStats : RTCStats { DOMString label; DOMString protocol; unsigned short dataChannelIdentifier; - DOMString transportId; - RTCDataChannelState state; + required DOMString transportId; + required RTCDataChannelState state; unsigned long messagesSent; unsigned long long bytesSent; unsigned long messagesReceived; @@ -274,7 +272,7 @@ dictionary RTCTransportStats : RTCStats { DOMString rtcpTransportStatsId; RTCIceRole iceRole; DOMString iceLocalUsernameFragment; - RTCDtlsTransportState dtlsState; + required RTCDtlsTransportState dtlsState; RTCIceTransportState iceState; DOMString selectedCandidatePairId; DOMString localCertificateId; @@ -295,21 +293,21 @@ dictionary RTCSctpTransportStats : RTCStats { }; dictionary RTCIceCandidateStats : RTCStats { - DOMString transportId; + required DOMString transportId; DOMString? address; long port; DOMString protocol; - RTCIceCandidateType candidateType; + required RTCIceCandidateType candidateType; long priority; DOMString url; DOMString relayProtocol; }; dictionary RTCIceCandidatePairStats : RTCStats { - DOMString transportId; - DOMString localCandidateId; - DOMString remoteCandidateId; - RTCStatsIceCandidatePairState state; + required DOMString transportId; + required DOMString localCandidateId; + required DOMString remoteCandidateId; + required RTCStatsIceCandidatePairState state; boolean nominated; unsigned long long packetsSent; unsigned long long packetsReceived; @@ -349,14 +347,14 @@ enum RTCStatsIceCandidatePairState { }; dictionary RTCCertificateStats : RTCStats { - DOMString fingerprint; - DOMString fingerprintAlgorithm; - DOMString base64Certificate; + required DOMString fingerprint; + required DOMString fingerprintAlgorithm; + required DOMString base64Certificate; DOMString issuerCertificateId; }; dictionary RTCIceServerStats : RTCStats { - DOMString url; + required DOMString url; long port; DOMString protocol; unsigned long totalRequestsSent; diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl index 5f5320c2055..2d83277526d 100644 --- a/tests/wpt/web-platform-tests/interfaces/webxr.idl +++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl @@ -65,6 +65,7 @@ dictionary XRRenderStateInit { double depthFar; double inlineVerticalFieldOfView; XRWebGLLayer? baseLayer; + sequence<XRLayer>? layers; }; [SecureContext, Exposed=Window] interface XRRenderState { @@ -172,6 +173,9 @@ interface XRInputSourceArray { getter XRInputSource(unsigned long index); }; +[SecureContext, Exposed=Window] +interface XRLayer {}; + typedef (WebGLRenderingContext or WebGL2RenderingContext) XRWebGLRenderingContext; @@ -185,7 +189,7 @@ dictionary XRWebGLLayerInit { }; [SecureContext, Exposed=Window] -interface XRWebGLLayer { +interface XRWebGLLayer: XRLayer { constructor(XRSession session, XRWebGLRenderingContext context, optional XRWebGLLayerInit layerInit = {}); diff --git a/tests/wpt/web-platform-tests/layout-instability/resources/util.js b/tests/wpt/web-platform-tests/layout-instability/resources/util.js index 515914e11fa..2ef971ddb79 100644 --- a/tests/wpt/web-platform-tests/layout-instability/resources/util.js +++ b/tests/wpt/web-platform-tests/layout-instability/resources/util.js @@ -59,6 +59,7 @@ ScoreWatcher = function() { resetPromise(); const observer = new PerformanceObserver(list => { list.getEntries().forEach(entry => { + this.lastEntry = entry; this.score += entry.value; if (!entry.hadRecentInput) this.scoreWithInputExclusion += entry.value; diff --git a/tests/wpt/web-platform-tests/layout-instability/sources.html b/tests/wpt/web-platform-tests/layout-instability/sources.html new file mode 100644 index 00000000000..599a5c471b3 --- /dev/null +++ b/tests/wpt/web-platform-tests/layout-instability/sources.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>Layout Instability: sources attribute</title> +<link rel="help" href="https://wicg.github.io/layout-instability/" /> +<style> + +body { margin: 10px; } +#shifter { position: relative; width: 300px; height: 100px; } + +</style> +<div id="shifter"></div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/util.js"></script> +<script> + +strrect = r => `[${r.x},${r.y},${r.width},${r.height}]`; + +promise_test(async () => { + const watcher = new ScoreWatcher; + const shifter = document.querySelector("#shifter"); + + // Wait for the initial render to complete. + await waitForAnimationFrames(2); + + // Modify the position of the div. + shifter.style = "top: 60px; left: 10px"; + await watcher.promise; + + const sources = watcher.lastEntry.sources; + assert_equals(sources.length, 1); + + const source = sources[0]; + assert_equals(source.node, shifter); + assert_equals(strrect(source.previousRect), "[10,10,300,100]"); + assert_equals(strrect(source.currentRect), "[20,70,300,100]"); +}, "Sources attribute."); + +</script> diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 42102299396..726b64c56ac 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -756,3 +756,12 @@ TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-circul TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-clip-path-crash.html TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-defs-crash.html TESTHARNESS-IN-OTHER-TYPE: svg/svg-in-svg/svg-in-svg-circular-filter-reference-crash.html + +# TODO: Temporary inclusions while we deprecate assert_precondition +# https://github.com/web-platform-tests/wpt/issues/21971 +ASSERT-PRECONDITION: infrastructure/expected-fail/precondition.html +ASSERT-PRECONDITION: infrastructure/expected-fail/precondition-in-setup.html +ASSERT-PRECONDITION: infrastructure/expected-fail/precondition-in-promise.html +ASSERT-PRECONDITION: resources/testharness.js +ASSERT-PRECONDITION: webrtc/protocol/crypto-suite.https.html +ASSERT-PRECONDITION: webrtc-extensions/RTCRtpSynchronizationSource-captureTimestamp.html diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html index efb46073169..92512eef012 100644 --- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html +++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-enumerateDevices.https.html @@ -15,18 +15,33 @@ <script src=/resources/testharnessreport.js></script> <script> "use strict"; + //NOTE ALEX: for completion, a test for ondevicechange event is missing. + promise_test(async () => { assert_not_equals(navigator.mediaDevices.enumerateDevices, undefined, "navigator.mediaDevices.enumerateDevices exists"); const deviceList = await navigator.mediaDevices.enumerateDevices(); for (const mediaInfo of deviceList) { - assert_not_equals(mediaInfo.deviceId, undefined, "mediaInfo's deviceId should exist."); - assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist."); - assert_not_equals(mediaInfo.label, undefined, "mediaInfo's label should exist."); - assert_not_equals(mediaInfo.groupId, undefined, "mediaInfo's groupId should exist."); + assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist."); + assert_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and be empty if getUserMedia was never called successfully."); + assert_equals(mediaInfo.label, "", "mediaInfo's label should exist and be empty if getUserMedia was never called successfully."); + assert_equals(mediaInfo.groupId, "", "mediaInfo's groupId should exist and be empty if getUserMedia was never called successfully."); + assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]); + } + assert_less_than_equal(deviceList.filter((item) => { return item.kind == "audioinput"; }).length, 1, "there should be zero or one audio input device "); + assert_less_than_equal(deviceList.filter((item) => { return item.kind == "videoinput"; }).length, 1, "there should be zero or one video input device "); + +}, "mediaDevices.enumerateDevices() is present and working - before capture"); + +promise_test(async () => { + await navigator.mediaDevices.getUserMedia({ audio : true }); + const deviceList = await navigator.mediaDevices.enumerateDevices(); + for (const mediaInfo of deviceList) { + assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist."); + assert_not_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and not be empty."); assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]); } -}, "mediaDevices.enumerateDevices() is present and working"); +}, "mediaDevices.enumerateDevices() is present and working - after capture"); promise_test(async () => { const deviceList = await navigator.mediaDevices.enumerateDevices(); diff --git a/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js b/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js index 567912ddd77..98b27fd9e38 100644 --- a/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js +++ b/tests/wpt/web-platform-tests/native-file-system/idlharness.https.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js b/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js index 504453b9aff..530a9058faa 100644 --- a/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js +++ b/tests/wpt/web-platform-tests/navigation-timing/idlharness.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js b/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js index 55cfed9276b..ba816bb87cf 100644 --- a/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js +++ b/tests/wpt/web-platform-tests/orientation-event/idlharness.https.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long // https://w3c.github.io/deviceorientation/spec-source-orientation.html diff --git a/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js b/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js index c8ee8a326d1..d239c29b47e 100644 --- a/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js +++ b/tests/wpt/web-platform-tests/origin-policy/idlharness.any.js @@ -1,6 +1,7 @@ // META: global=window,worker // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js b/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js index 8cc2f83095c..7af89b6ddf2 100644 --- a/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js +++ b/tests/wpt/web-platform-tests/page-visibility/idlharness.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js b/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js index 878114ec7ed..dfb0190abac 100644 --- a/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js +++ b/tests/wpt/web-platform-tests/payment-handler/idlharness.https.any.js @@ -2,6 +2,7 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: script=/service-workers/service-worker/resources/test-helpers.sub.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js b/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js index 53f36db7d9e..51c63aadefc 100644 --- a/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js +++ b/tests/wpt/web-platform-tests/permissions-revoke/idlharness.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html b/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html index cd192029df4..82036f9a617 100644 --- a/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html +++ b/tests/wpt/web-platform-tests/quirks/unitless-length/no-quirks.html @@ -2,6 +2,7 @@ <html> <head> <title>The unitless length quirk (no-quirks)</title> + <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <style> iframe { width:20px; height:20px; } </style> diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js index d01da49c2d5..a5e2ca0b25a 100644 --- a/tests/wpt/web-platform-tests/resources/idlharness.js +++ b/tests/wpt/web-platform-tests/resources/idlharness.js @@ -1333,7 +1333,8 @@ function IdlInterface(obj, is_callback, is_mixin) /** An array of IdlInterfaceMembers. */ this.members = obj.members.map(function(m){return new IdlInterfaceMember(m); }); - if (this.has_extended_attribute("Unforgeable")) { + if (this.has_extended_attribute("Unforgeable") || + this.has_extended_attribute("LegacyUnforgeable")) { this.members .filter(function(m) { return m.special !== "static" && (m.type == "attribute" || m.type == "operation"); }) .forEach(function(m) { return m.isUnforgeable = true; }); @@ -1795,11 +1796,12 @@ IdlInterface.prototype.test_self = function() }.bind(this), this.name + " interface: legacy window alias"); } - if (this.has_extended_attribute("NamedConstructor")) { + if (this.has_extended_attribute("NamedConstructor") || + this.has_extended_attribute("LegacyFactoryFunction")) { var constructors = this.extAttrs - .filter(function(attr) { return attr.name == "NamedConstructor"; }); + .filter(function(attr) { return attr.name == "NamedConstructor" || attr.name == "LegacyFactoryFunction"; }); if (constructors.length !== 1) { - throw new IdlHarnessError("Internal error: missing support for multiple NamedConstructor extended attributes"); + throw new IdlHarnessError("Internal error: missing support for multiple LegacyFactoryFunction extended attributes"); } var constructor = constructors[0]; var min_length = minOverloadLength([constructor]); @@ -1808,10 +1810,10 @@ IdlInterface.prototype.test_self = function() { // This function tests WebIDL as of 2019-01-14. - // "for every [NamedConstructor] extended attribute on an exposed + // "for every [LegacyFactoryFunction] extended attribute on an exposed // interface, a corresponding property must exist on the ECMAScript // global object. The name of the property is the - // [NamedConstructor]'s identifier, and its value is an object + // [LegacyFactoryFunction]'s identifier, and its value is an object // called a named constructor, ... . The property has the attributes // { [[Writable]]: true, [[Enumerable]]: false, // [[Configurable]]: true }." @@ -2371,7 +2373,8 @@ IdlInterface.prototype.test_member_attribute = function(member) "The prototype object must have a property " + format_value(member.name)); - if (!member.has_extended_attribute("LenientThis")) { + if (!member.has_extended_attribute("LenientThis") && + !member.has_extended_attribute("LegacyLenientThis")) { if (member.idlType.generic !== "Promise") { // this.get_interface_object() returns a thing in our global assert_throws_js(TypeError, function() { @@ -3027,7 +3030,7 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_ // "The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]: // true, [[Configurable]]: configurable }, where: // "configurable is false if the attribute was declared with the - // [Unforgeable] extended attribute and true otherwise; + // [LegacyUnforgeable] extended attribute and true otherwise; // "G is the attribute getter, defined below; and // "S is the attribute setter, also defined below." var desc = Object.getOwnPropertyDescriptor(obj, member.name); @@ -3036,7 +3039,7 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_ assert_true(desc.enumerable, "property should be enumerable"); if (member.isUnforgeable) { - assert_false(desc.configurable, "[Unforgeable] property must not be configurable"); + assert_false(desc.configurable, "[LegacyUnforgeable] property must not be configurable"); } else { @@ -3051,10 +3054,11 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_ // "If the attribute is a regular attribute, then:" if (member.special !== "static") { // "If O is not a platform object that implements I, then: - // "If the attribute was specified with the [LenientThis] extended + // "If the attribute was specified with the [LegacyLenientThis] extended // attribute, then return undefined. // "Otherwise, throw a TypeError." - if (!member.has_extended_attribute("LenientThis")) { + if (!member.has_extended_attribute("LenientThis") && + !member.has_extended_attribute("LegacyLenientThis")) { if (member.idlType.generic !== "Promise") { assert_throws_js(globalOf(desc.get).TypeError, function() { desc.get.call({}); @@ -3101,12 +3105,13 @@ IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_ // "If the attribute is a regular attribute, then:" if (member.special !== "static") { // "If /validThis/ is false and the attribute was not specified - // with the [LenientThis] extended attribute, then throw a + // with the [LegacyLenientThis] extended attribute, then throw a // TypeError." // "If the attribute is declared with a [Replaceable] extended // attribute, then: ..." // "If validThis is false, then return." - if (!member.has_extended_attribute("LenientThis")) { + if (!member.has_extended_attribute("LenientThis") && + !member.has_extended_attribute("LegacyLenientThis")) { assert_throws_js(globalOf(desc.set).TypeError, function() { desc.set.call({}); }.bind(this), "calling setter on wrong object type must throw TypeError"); @@ -3146,7 +3151,8 @@ function IdlInterfaceMember(obj) this.extAttrs = []; } - this.isUnforgeable = this.has_extended_attribute("Unforgeable"); + this.isUnforgeable = this.has_extended_attribute("Unforgeable") || + this.has_extended_attribute("LegacyUnforgeable"); this.isUnscopable = this.has_extended_attribute("Unscopable"); } diff --git a/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html b/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html index 1c7d9982285..064ab4c5f3a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html +++ b/tests/wpt/web-platform-tests/scroll-animations/element-based-offset.html @@ -89,6 +89,10 @@ endScrollOffset: {target: end, ...config.end } }); + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + const animation = createScrollLinkedAnimation(t, timeline); const scrollRange = end.offsetTop - start.offsetTop; const timeRange = animation.timeline.timeRange; @@ -100,11 +104,12 @@ "The start time is null in Idle state."); animation.play(); + assert_true(animation.pending, "Animation is in pending state."); // Verify initial start and current times in Pending state. assert_times_equal(animation.currentTime, 0, - "The current time is a hold time in Pending state."); - assert_equals(animation.startTime, null, - "The start time is null in Pending state."); + "The current time is zero in Pending state."); + assert_equals(animation.startTime, 0, + "The start time is zero in Pending state."); await animation.ready; // Verify initial start and current times in Playing state. diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html new file mode 100644 index 00000000000..07dae95692e --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation-inactive-timeline.html @@ -0,0 +1,144 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test basic functionality of scroll linked animation.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> +<script src="testcommon.js"></script> +<style> + .scroller { + overflow: auto; + height: 100px; + width: 100px; + } + .contents { + height: 1000px; + width: 100%; + } +</style> +<div id="log"></div> +<script> + 'use strict'; + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + // Make the scroll timeline inactive. + scroller.style.overflow = 'visible'; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + // Play the animation when the timeline is inactive. + animation.play(); + assert_equals(animation.currentTime, null, + 'The current time is null when the timeline is inactive.'); + assert_equals(animation.startTime, 0, + 'The start time is zero in Pending state.'); + await waitForNextFrame(); + assert_true(animation.pending, + 'Animation has play pending task while the timeline is inactive.'); + assert_equals(animation.playState, 'running', + 'State is \'running\' in Pending state.'); +}, 'Play pending task doesn\'t run when the timeline is inactive.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + // Make the scroll timeline inactive. + scroller.style.overflow = 'visible'; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + // Play the animation when the timeline is inactive. + animation.play(); + + // Make the scroll timeline active. + scroller.style.overflow = 'auto'; + await animation.ready; + // Ready promise is resolved as a result of the timeline becoming active. + assert_equals(animation.currentTime, 0, + 'Animation current time is resolved when the animation is ready.'); + assert_equals(animation.startTime, 0, + 'Animation start time is resolved when the animation is ready.'); +}, 'Animation start and current times are correct if scroll timeline is ' + + 'activated after animation.play call.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + const maxScroll = scroller.scrollHeight - scroller.clientHeight; + const target = animation.effect.target; + // Advance the scroller. + scroller.scrollTop = 0.2 * maxScroll; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + // Play the animation when the timeline is active. + animation.play(); + await animation.ready; + + // Make the scroll timeline inactive. + scroller.style.overflow = 'visible'; + scroller.scrollTop; + await waitForNextFrame(); + assert_equals(animation.playState, 'running', + 'State is \'running\' when the timeline is inactive.'); + assert_equals(animation.currentTime, null, + 'Current time is unresolved when the timeline is inactive.'); + assert_equals(animation.startTime, 0, + 'Start time is zero when the timeline is inactive.'); + assert_equals( + animation.effect.getComputedTiming().localTime, + null, + 'Effect local time is null when the timeline is inactive.'); + assert_equals(Number(getComputedStyle(target).opacity), 1, + 'Animation does not have an effect when the timeline is inactive.'); + + // Make the scroll timeline active. + scroller.style.overflow = 'auto'; + await waitForNextFrame(); + + assert_equals(animation.playState, 'running', + 'State is \'running\' when the timeline is active.'); + assert_equals(animation.currentTime, 200, + 'Current time is resolved when the timeline is active.'); + assert_equals(animation.startTime, 0, + 'Start time is zero when the timeline is active.'); + assert_times_equal( + animation.effect.getComputedTiming().localTime, + 200, + 'Effect local time is resolved when the timeline is active.'); + assert_equals(Number(getComputedStyle(target).opacity), 0.2, + 'Animation has an effect when the timeline is active.'); +}, 'Animation current time is correct when the timeline becomes newly ' + + 'inactive and then active again.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + scroller.scrollTop; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + animation.play(); + await animation.ready; + + // Make the scroll timeline inactive. + scroller.style.overflow = 'visible'; + scroller.scrollTop; + await waitForNextFrame(); + + const eventWatcher = new EventWatcher(t, animation, 'cancel'); + animation.cancel(); + const cancelEvent = await eventWatcher.wait_for('cancel'); + + assert_equals(cancelEvent.currentTime, null, + 'event.currentTime should be unresolved when the timeline is inactive.'); + assert_equals(cancelEvent.timelineTime, null, + 'event.timelineTime should be unresolved when the timeline is inactive'); +}, 'oncancel event is fired when the timeline is inactive.'); + + +</script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html index 901549e7a44..cb270d52f7c 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html @@ -23,7 +23,10 @@ const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; - const timeRange = animation.timeline.timeRange; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); // Verify initial start and current times in Idle state. assert_equals(animation.currentTime, null, @@ -31,11 +34,12 @@ assert_equals(animation.startTime, null, "The start time is null in Idle state."); animation.play(); + assert_true(animation.pending, "Animation is in pending state."); // Verify initial start and current times in Pending state. assert_equals(animation.currentTime, 0, - "The current time is a hold time in Pending state."); - assert_equals(animation.startTime, null, - "The start time is null in Pending state."); + "The current time is zero in Pending state."); + assert_equals(animation.startTime, 0, + "The start time is zero in Pending state."); await animation.ready; // Verify initial start and current times in Playing state. @@ -62,7 +66,7 @@ promise_test(async t => { const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; - const timeRange = animation.timeline.timeRange; + // Advance the scroller. scroller.scrollTop = 0.2 * maxScroll; // Wait for new animation frame which allows the timeline to compute new @@ -78,8 +82,8 @@ promise_test(async t => { // Verify initial start and current times in Pending state. assert_equals(animation.currentTime, animation.timeline.currentTime, "The current time is a hold time in Pending state."); - assert_equals(animation.startTime, null, - "The start time is null in Pending state."); + assert_equals(animation.startTime, 0, + "The start time is zero in Pending state."); await animation.ready; // Verify initial start and current times in Playing state. @@ -96,7 +100,7 @@ promise_test(async t => { const animation2 = createScrollLinkedAnimation(t, timeline); const scroller = timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; - const timeRange = timeline.timeRange; + // Advance the scroller. scroller.scrollTop = 0.2 * maxScroll; // Wait for new animation frame which allows the timeline to compute new @@ -118,13 +122,13 @@ promise_test(async t => { assert_equals(animation1.currentTime, timeline.currentTime, "The current time corresponds to the scroll position of the scroller" + " in Pending state."); - assert_equals(animation1.startTime, null, - "The start time is null in Pending state."); + assert_equals(animation1.startTime, 0, + "The start time is zero in Pending state."); assert_equals(animation2.currentTime, timeline.currentTime, "The current time corresponds to the scroll position of the scroller" + " in Pending state."); - assert_equals(animation2.startTime, null, - "The start time is null in Pending state."); + assert_equals(animation2.startTime, 0, + "The start time is zero in Pending state."); await animation1.ready; await animation2.ready; @@ -143,30 +147,6 @@ promise_test(async t => { promise_test(async t => { const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; - // Make the scroll timeline inactive. - scroller.style.overflow = "visible"; - // Trigger layout; - scroller.scrollTop; - assert_equals(animation.timeline.currentTime, null, - "Timeline current time is null in inactive state."); - // Play the animation when the timeline is inactive. - animation.play(); - // Make the scroll timeline active. - scroller.style.overflow = "auto"; - await animation.ready; - // Ready promise is resolved as a result of the timeline becoming active. - assert_equals(animation.timeline.currentTime, 0, - "Timeline current time is resolved in active state."); - assert_equals(animation.currentTime, 0, - "Animation current time is resolved when the animation is ready."); - assert_equals(animation.startTime, 0, - "Animation start time is resolved when the animation is ready."); -}, 'Animation start and current times are correct if scroll timeline is ' + - 'activated after animation.play call.'); - -promise_test(async t => { - const animation = createScrollLinkedAnimation(t); - const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; const timeRange = animation.timeline.timeRange; diff --git a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html index 0b7dcc60034..d46206d8257 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html +++ b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html @@ -223,5 +223,71 @@ " source has been scrolled." ); }, 'Set Animation current time then scroll.'); + + promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + animation.play(); + await animation.ready; + + // Make the timeline inactive. + scroller.style.overflow = 'visible'; + scroller.scrollTop; + await waitForNextFrame(); + + assert_equals(animation.currentTime, null, + 'Current time is unresolved when the timeline is inactive.'); + + animation.currentTime = 300; + assert_equals(animation.currentTime, 300, + 'Animation current time should be equal to the set value.'); + assert_equals(animation.playState, 'paused', + 'Animation play state is \'paused\' when current time is set and ' + + 'timeline is inactive.'); +}, 'Animation current time and play state are correct when current time is ' + + 'set while the timeline is inactive.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + animation.play(); + await animation.ready; + + // Make the timeline inactive. + scroller.style.overflow = 'visible'; + scroller.scrollTop; + await waitForNextFrame(); + + assert_equals(animation.timeline.currentTime, null, + 'Current time is unresolved when the timeline is inactive.'); + + animation.currentTime = 300; + assert_equals(animation.currentTime, 300, + 'Animation current time should be equal to the set value.'); + assert_equals(animation.playState, 'paused', + 'Animation play state is \'paused\' when current time is set and ' + + 'timeline is inactive.'); + + // Make the timeline active. + scroller.style.overflow = 'auto'; + scroller.scrollTop; + await waitForNextFrame(); + + assert_equals(animation.timeline.currentTime, 0, + 'Current time is resolved when the timeline is active.'); + assert_equals(animation.currentTime, 300, + 'Animation current time holds the set value.'); + assert_equals(animation.playState, 'paused', + 'Animation holds \'paused\' state.'); +}, 'Animation current time set while the timeline is inactive holds when the ' + + 'timeline becomes active again.'); </script> </body> diff --git a/tests/wpt/web-platform-tests/scroll-animations/testcommon.js b/tests/wpt/web-platform-tests/scroll-animations/testcommon.js index 2a89d8e022f..733b5f9f643 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/testcommon.js +++ b/tests/wpt/web-platform-tests/scroll-animations/testcommon.js @@ -27,7 +27,7 @@ function createScrollLinkedAnimation(test, timeline) { if (timeline === undefined) timeline = createScrollTimeline(test); const DURATION = 1000; // ms - const KEYFRAMES = { opacity: [1, 0] }; + const KEYFRAMES = { opacity: [0, 1] }; return new Animation( new KeyframeEffect(createDiv(test), KEYFRAMES, DURATION), timeline); } diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py new file mode 100644 index 00000000000..60688d94382 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/cookie.py @@ -0,0 +1,20 @@ +def main(request, response): + """ + Returns a response with a Set-Cookie header based on the query params. + The body will be "1" if the cookie is present in the request and `drop` parameter is "0", + otherwise the body will be "0". + """ + same_site = request.GET.first("same-site") + cookie_name = request.GET.first("cookie-name") + drop = request.GET.first("drop") + cookie_in_request = "0" + cookie = "%s=1; Secure; SameSite=%s" % (cookie_name, same_site) + + if drop == "1": + cookie += "; Max-Age=0" + + if request.cookies.get(cookie_name): + cookie_in_request = request.cookies[cookie_name].value + + headers = [('Content-Type', 'text/html'), ('Set-Cookie', cookie)] + return (200, headers, cookie_in_request) diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js new file mode 100644 index 00000000000..6e1ab232907 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/navigation-preload-worker.js @@ -0,0 +1,3 @@ +self.addEventListener('fetch', event => { + event.respondWith(event.preloadResponse); +}); diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html new file mode 100644 index 00000000000..a860d954566 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/samesite-cookies.https.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name="timeout" content="long"> +<title>Navigation Preload: SameSite cookies</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../resources/test-helpers.sub.js"></script> +<body> +<script> +const scope = 'resources/cookie.py'; +const script = 'resources/navigation-preload-worker.js'; + +async function drop_cookie(t, same_site, cookie) { + const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=1'); + t.add_cleanup(() => frame.remove()); +} + +async function same_site_cookies_test(t, same_site, cookie) { + // Remove the cookie before the first visit. + await drop_cookie(t, same_site, cookie); + + { + const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=0'); + t.add_cleanup(() => frame.remove()); + // The body will be 0 because this is the first visit. + assert_equals(frame.contentDocument.body.textContent, '0', 'first visit'); + } + + { + const frame = await with_iframe(scope + '?same-site=' + same_site + '&cookie-name=' + cookie + '&drop=0'); + t.add_cleanup(() => frame.remove()); + // The body will be 1 because this is the second visit. + assert_equals(frame.contentDocument.body.textContent, '1', 'second visit'); + } + + // Remove the cookie after the test. + t.add_cleanup(() => drop_cookie(t, same_site, cookie)); +} + +promise_test(async t => { + const registration = + await service_worker_unregister_and_register(t, script, scope); + promise_test(t => registration.unregister(), 'Unregister a service worker.'); + + await wait_for_state(t, registration.installing, 'activated'); + await registration.navigationPreload.enable(); +}, 'Set up a service worker for navigation preload tests.'); + +promise_test(async t => { + await same_site_cookies_test(t, 'None', 'cookie-key-none'); +}, 'Navigation Preload for same site cookies (None).'); + +promise_test(async t => { + await same_site_cookies_test(t, 'Strict', 'cookie-key-strict'); +}, 'Navigation Preload for same site cookies (Strict).'); + +promise_test(async t => { + await same_site_cookies_test(t, 'Lax', 'cookie-key-lax'); +}, 'Navigation Preload for same site cookies (Lax).'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html new file mode 100644 index 00000000000..0acdeb812ec --- /dev/null +++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<title>Declarative Shadow DOM Element Attachment</title> +<link rel='author' title='Mason Freed' href='mailto:masonfreed@chromium.org'> +<link rel='help' href='https://github.com/whatwg/dom/issues/831'> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script src='../resources/shadow-dom-utils.js'></script> + +<script> +const shadowContent = '<span>Shadow tree</span><slot></slot>'; +function getDeclarativeContent(mode, delegatesFocus) { + const delegatesFocusText = delegatesFocus ? ' shadowrootdelegatesfocus' : ''; + return `<template shadowroot=${mode}${delegatesFocusText}>${shadowContent}</template>`; +} + +const lightDomTextContent = 'Light DOM'; +function addDeclarativeShadowRoot(elementType, mode, delegatesFocus) { + const declarativeString = `<${elementType} id=theelement>${getDeclarativeContent(mode, delegatesFocus)} + <span class='lightdom'>${lightDomTextContent}</span></${elementType}>`; + const wrapper = document.createElement('div'); + wrapper.innerHTML = declarativeString; + const element = wrapper.querySelector('#theelement'); + return {wrapper: wrapper, element: element}; +} + +function testElementType(allowed, nochildren, elementType, mode, delegatesFocus) { + var t = test(function() { + const nodes = addDeclarativeShadowRoot(elementType, mode, delegatesFocus); + if (allowed) { + const element = nodes.element; + assert_true(!!element, 'Unable to locate the element'); + // Just one light DOM child, and no leftover template. + assert_true(!nodes.wrapper.querySelector('template')); + assert_equals(element.children.length, 1); + assert_equals(element.children[0].textContent, lightDomTextContent); + let originalShadowRoot = null; + if (mode === 'open') { + // TODO(masonfreed): Add a check for ElementInternals.shadowRoot once that exists. + assert_true(!!element.shadowRoot, 'Shadow root should be present'); + assert_equals(element.shadowRoot.innerHTML, shadowContent, 'Correct shadow content'); + originalShadowRoot = element.shadowRoot; + } + + // Now, call attachShadow() and make sure we get back the same (original) shadowRoot, but empty. + const oppositeMode = (mode === 'open') ? 'closed' : 'open'; + const newShadow = element.attachShadow({mode: oppositeMode}); // Should be no exception here + if (mode === 'open') { + // TODO(masonfreed): Add a check for ElementInternals.shadowRoot once that exists. + assert_equals(element.shadowRoot, originalShadowRoot, 'The same shadow root should be returned'); + assert_equals(element.shadowRoot.innerHTML, '', 'Empty shadow content'); + assert_equals(element.shadowRoot.mode, mode, 'Original shadow mode'); + } + } else { + const wrapper = nodes.wrapper; + if (!nochildren) { + // Invalid elements should retain a <template> element child with a shadowroot attribute. + const template = nodes.wrapper.querySelector('template[shadowroot]'); + assert_true(!!template); + assert_equals(template.getAttribute('shadowroot'), mode, `Template with shadowroot=${mode} should be left over`); + const span = nodes.wrapper.querySelector('span.lightdom'); + assert_true(!!span); + assert_equals(span.textContent, lightDomTextContent); + if (nodes.element) { + // For some tags (e.g. <html>) there won't be an element inside wrapper. + assert_true(!nodes.element.shadowRoot, 'Shadow root should not be present'); + } + } + } + }, `Declarative Shadow DOM as a child of <${elementType}>, with mode=${mode}, delegatesFocus=${delegatesFocus}. Should be ${allowed ? 'safelisted' : 'disallowed'}.`); +} + +function runAllTests() { + const noChildElements = ['iframe','noscript','script','select','style','textarea','title']; + const noCheck = ['body']; + const safelisted = ATTACHSHADOW_SAFELISTED_ELEMENTS.filter(el => !noCheck.includes(el)); + const disallowed = ATTACHSHADOW_DISALLOWED_ELEMENTS.filter(el => !noCheck.includes(el)); + const minimumKnownElements = 113; // We should have at least this many elements in the lists from shadow-dom-utils.js. + assert_true(safelisted.length + disallowed.length + noChildElements.length >= minimumKnownElements,'All element types should be tested'); + for (let delegatesFocus of [false, true]) { + for (let mode of ['open', 'closed', 'invalid']) { + for (let elementName of safelisted) { + testElementType(mode !== 'invalid', false, elementName, mode, delegatesFocus); + } + for (let elementName of disallowed) { + testElementType(false, noChildElements.includes(elementName), elementName, mode, delegatesFocus); + } + } + } +} + +runAllTests(); + +</script> diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-basic.tentative.html index 792d4bf4b3e..c8a00f59bc8 100644 --- a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom.tentative.html +++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-basic.tentative.html @@ -113,5 +113,24 @@ test(() => { assert_true(!!host.shadowRoot,"No shadow root found"); assert_false(host.shadowRoot.delegatesFocus,"delegatesFocus should be false without the shadowrootdelegatesfocus attribute"); }, 'Declarative Shadow DOM: delegates focus attribute'); +</script> + +<div id="multi-host"> + <template shadowroot="open"> + <span>root 1</span> + </template> + <template shadowroot="closed"> + <span>root 2</span> + </template> +</div> + +<script> +test(() => { + const host = document.querySelector('#multi-host'); + assert_equals(host.querySelector('template'), null, "No leftover template nodes from either root"); + assert_true(!!host.shadowRoot,"No open shadow root found - first root should remain"); + const innerSpan = host.shadowRoot.querySelector('span'); + assert_equals(innerSpan.textContent, 'root 2', "Content should come from last declarative shadow root"); +}, 'Declarative Shadow DOM: Multiple roots'); </script> diff --git a/tests/wpt/web-platform-tests/storage/idlharness.https.any.js b/tests/wpt/web-platform-tests/storage/idlharness.https.any.js index 0ce4d5a0c8f..773fac4e4a8 100644 --- a/tests/wpt/web-platform-tests/storage/idlharness.https.any.js +++ b/tests/wpt/web-platform-tests/storage/idlharness.https.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg b/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg new file mode 100644 index 00000000000..c90cfb317f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/linking/reftests/url-reference-local-textpath.svg @@ -0,0 +1,10 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml"> + <title>Local URL reference on <textPath> with base URL different from document URL</title> + <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css"/> + <h:link rel="help" href="https://svgwg.org/svg2-draft/linking.html#linkRefAttrs"/> + <h:link rel="match" href="reference/green-100x100.svg"/> + <h:base href="http://www.example.com/"/> + + <path id="path" d="M0,80h100"/> + <text font-size="100" font-family="Ahem" fill="green"><textPath href="#path">X</textPath></text> +</svg> diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py index e8dfa6163e5..a5a8ca7db29 100755 --- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py +++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py @@ -174,13 +174,13 @@ def install_webkitgtk_from_apt_repository(channel): run(["sudo", "apt-get", "-qqy", "-t", "bionic-wpt-webkit-updates", "install", "webkit2gtk-driver"]) -def download_url_to_descriptor(fd, url, max_retries=3): +def download_url_to_descriptor(fd, url, max_retries=5): """Download an URL in chunks and saves it to a file descriptor (truncating it) It doesn't close the descriptor, but flushes it on success. It retries the download in case of ECONNRESET up to max_retries.""" if max_retries < 1: max_retries = 1 - wait = 1 + wait = 2 for current_retry in range(1, max_retries+1): try: print("INFO: Downloading %s Try %d/%d" % (url, current_retry, max_retries)) diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml index 562239c31e3..d2d76df13a7 100644 --- a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml +++ b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml @@ -4,7 +4,7 @@ components: workerType: ci schedulerId: taskcluster-github deadline: "24 hours" - image: harjgam/web-platform-tests:0.34 + image: webplatformtests/wpt:0.36 maxRunTime: 7200 artifacts: public/results: @@ -103,8 +103,6 @@ components: env: TOXENV: py36 PY_COLORS: 0 - install: - - python3-pip tox-python38: env: diff --git a/tests/wpt/web-platform-tests/tools/docker/Dockerfile b/tests/wpt/web-platform-tests/tools/docker/Dockerfile index 0a842de1ab8..f3927fd0d71 100644 --- a/tests/wpt/web-platform-tests/tools/docker/Dockerfile +++ b/tests/wpt/web-platform-tests/tools/docker/Dockerfile @@ -25,6 +25,8 @@ RUN apt-get -qqy update \ pulseaudio \ python \ python-pip \ + python3 \ + python3-pip \ qemu-kvm \ tzdata \ sudo \ diff --git a/tests/wpt/web-platform-tests/tools/docker/README.md b/tests/wpt/web-platform-tests/tools/docker/README.md index 8b0737359ea..9342aded298 100644 --- a/tests/wpt/web-platform-tests/tools/docker/README.md +++ b/tests/wpt/web-platform-tests/tools/docker/README.md @@ -1,11 +1,18 @@ This docker images is used for testing Chrome, Firefox, WebKitGTK and running other tasks on Taskcluster. When any of the files in this directory change, the -images must be updated as well. To do this, assuming you have docker installed: +images must be updated as well. Doing this requires you be part of the +'webplatformtests' organization on Docker Hub; ping @Hexcles or @stephenmcgruer +if you are not a member. + +In this directory, run the following, where `<tag>` is of the form +`webplatformtests/wpt:{current-version + 0.01}`: -In this directory, run ```sh # --pull forces Docker to get the newest base image. docker build --pull -t <tag> . docker push <tag> ``` +Then update the following Taskcluster configurations to use the new image: +* `.taskcluster.yml` (the decision task) +* `tools/ci/tc/tasks/test.yml` (all the other tasks) diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py index 2cfd41e967e..1762049d198 100644 --- a/tests/wpt/web-platform-tests/tools/lint/lint.py +++ b/tests/wpt/web-platform-tests/tools/lint/lint.py @@ -392,7 +392,8 @@ regexps = [item() for item in # type: ignore rules.MissingDepsRegexp, rules.SpecialPowersRegexp, rules.AssertThrowsRegexp, - rules.PromiseRejectsRegexp]] + rules.PromiseRejectsRegexp, + rules.AssertPreconditionRegexp]] def check_regexp_line(repo_root, path, f): diff --git a/tests/wpt/web-platform-tests/tools/lint/rules.py b/tests/wpt/web-platform-tests/tools/lint/rules.py index b36681d092a..6fbdc1c360d 100644 --- a/tests/wpt/web-platform-tests/tools/lint/rules.py +++ b/tests/wpt/web-platform-tests/tools/lint/rules.py @@ -478,3 +478,11 @@ class PromiseRejectsRegexp(Regexp): file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] description = "Test-file line has a `promise_rejects(...)` call" to_fix = """Replace with promise_rejects_dom or promise_rejects_js or `promise_rejects_exactly`""" + + +class AssertPreconditionRegexp(Regexp): + pattern = br"[^.]assert_precondition\(" + name = "ASSERT-PRECONDITION" + file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] + description = "Test-file line has an `assert_precondition(...)` call" + to_fix = """Replace with `assert_implements` or `assert_implements_optional`""" diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py index 62ed53865d7..086560b6a87 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py @@ -64,7 +64,9 @@ class ChromiumFormatter(base.BaseFormatter): """ if "artifacts" not in cur_dict.keys(): cur_dict["artifacts"] = {} - cur_dict["artifacts"][artifact_name] = artifact_value + # Artifacts are all expected to be lists, so even though we only have a + # single |artifact_value| we still put it in a list. + cur_dict["artifacts"][artifact_name] = [artifact_value] def _store_test_result(self, name, actual, expected, message, wpt_actual, subtest_failure): """ @@ -151,13 +153,15 @@ class ChromiumFormatter(base.BaseFormatter): :return str: the expected statuses as a string """ expected_statuses = self._map_status_name(data["expected"]) if "expected" in data else actual_status - if "known_intermittent" in data: + if data.get("known_intermittent"): expected_statuses += " " + " ".join( [self._map_status_name(other_status) for other_status in data["known_intermittent"]]) return expected_statuses def suite_start(self, data): - self.start_timestamp_seconds = (data["time"] if "time" in data + # |data| contains a timestamp in microseconds, while time.time() gives + # it in seconds. + self.start_timestamp_seconds = (float(data["time"]) / 1000 if "time" in data else time.time()) def test_status(self, data): diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py index cb6f1ad370f..2a5d3e79280 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py @@ -157,11 +157,11 @@ def test_subtest_messages(capfd): output_json = json.load(output) t1_artifacts = output_json["tests"]["t1"]["artifacts"] - assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \ - "[PASS] t1_b: t1_b_message\n" - assert t1_artifacts["wpt_subtest_failure"] == "true" + assert t1_artifacts["log"] == ["[FAIL expected PASS] t1_a: t1_a_message\n" + "[PASS] t1_b: t1_b_message\n"] + assert t1_artifacts["wpt_subtest_failure"] == ["true"] t2_artifacts = output_json["tests"]["t2"]["artifacts"] - assert t2_artifacts["log"] == "[TIMEOUT expected PASS] t2_message\n" + assert t2_artifacts["log"] == ["[TIMEOUT expected PASS] t2_message\n"] assert "wpt_subtest_failure" not in t2_artifacts.keys() @@ -204,14 +204,14 @@ def test_subtest_failure(capfd): test_obj = output_json["tests"]["t1"] t1_artifacts = test_obj["artifacts"] - assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \ - "[PASS] t1_b: t1_b_message\n" \ - "[TIMEOUT expected PASS] t1_c: t1_c_message\n" - assert t1_artifacts["wpt_subtest_failure"] == "true" + assert t1_artifacts["log"] == ["[FAIL expected PASS] t1_a: t1_a_message\n" + "[PASS] t1_b: t1_b_message\n" + "[TIMEOUT expected PASS] t1_c: t1_c_message\n"] + assert t1_artifacts["wpt_subtest_failure"] == ["true"] # The status of the test in the output is a failure because subtests failed, # despite the harness reporting that the test passed. But the harness status # is logged as an artifact. - assert t1_artifacts["wpt_actual_status"] == "PASS" + assert t1_artifacts["wpt_actual_status"] == ["PASS"] assert test_obj["actual"] == "FAIL" assert test_obj["expected"] == "PASS" # Also ensure that the formatter cleaned up its internal state @@ -258,9 +258,9 @@ def test_expected_subtest_failure(capfd): test_obj = output_json["tests"]["t1"] t1_log = test_obj["artifacts"]["log"] - assert t1_log == "[FAIL] t1_a: t1_a_message\n" \ - "[PASS] t1_b: t1_b_message\n" \ - "[TIMEOUT] t1_c: t1_c_message\n" + assert t1_log == ["[FAIL] t1_a: t1_a_message\n" + "[PASS] t1_b: t1_b_message\n" + "[TIMEOUT] t1_c: t1_c_message\n"] # The status of the test in the output is a pass because the subtest # failures were all expected. assert test_obj["actual"] == "PASS" @@ -303,11 +303,11 @@ def test_unexpected_subtest_pass(capfd): test_obj = output_json["tests"]["t1"] t1_artifacts = test_obj["artifacts"] - assert t1_artifacts["log"] == "[PASS expected FAIL] t1_a: t1_a_message\n" - assert t1_artifacts["wpt_subtest_failure"] == "true" + assert t1_artifacts["log"] == ["[PASS expected FAIL] t1_a: t1_a_message\n"] + assert t1_artifacts["wpt_subtest_failure"] == ["true"] # Since the subtest status is unexpected, we fail the test. But we report # wpt_actual_status as an artifact - assert t1_artifacts["wpt_actual_status"] == "PASS" + assert t1_artifacts["wpt_actual_status"] == ["PASS"] assert test_obj["actual"] == "FAIL" assert test_obj["expected"] == "PASS" # Also ensure that the formatter cleaned up its internal state @@ -482,7 +482,39 @@ def test_precondition_failed(capfd): # The precondition failure should map to FAIL status, but we should also # have an artifact containing the original PRECONDITION_FAILED status. assert test_obj["actual"] == "FAIL" - assert test_obj["artifacts"]["wpt_actual_status"] == "PRECONDITION_FAILED" + assert test_obj["artifacts"]["wpt_actual_status"] == ["PRECONDITION_FAILED"] # ...this is an unexpected regression because we expected a pass but failed assert test_obj["is_regression"] is True assert test_obj["is_unexpected"] is True + + +def test_known_intermittent_empty(capfd): + # If the known_intermittent list is empty, we want to ensure we don't append + # any extraneous characters to the output. + + # set up the handler. + output = StringIO() + logger = structuredlog.StructuredLogger("test_a") + logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter())) + + # Run a test and include an empty known_intermittent list + logger.suite_start(["t1"], run_info={}, time=123) + logger.test_start("t1") + logger.test_end("t1", status="OK", expected="OK", known_intermittent=[]) + logger.suite_end() + + # check nothing got output to stdout/stderr + # (note that mozlog outputs exceptions during handling to stderr!) + captured = capfd.readouterr() + assert captured.out == "" + assert captured.err == "" + + # check the actual output of the formatter + output.seek(0) + output_json = json.load(output) + + test_obj = output_json["tests"]["t1"] + # Both actual and expected statuses get mapped to Pass. No extra whitespace + # anywhere. + assert test_obj["actual"] == "PASS" + assert test_obj["expected"] == "PASS" diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py index 1e27f90d91a..8f828ff43ab 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py @@ -349,6 +349,9 @@ class Test(object): if implementation_status: return implementation_status + # assuming no specific case, we are implementing it + return "implementing" + def known_intermittent(self, subtest=None): metadata = self._get_metadata(subtest) if metadata is None: diff --git a/tests/wpt/web-platform-tests/vibration/idlharness.window.js b/tests/wpt/web-platform-tests/vibration/idlharness.window.js index fbe14daa611..a3cfbc11e03 100644 --- a/tests/wpt/web-platform-tests/vibration/idlharness.window.js +++ b/tests/wpt/web-platform-tests/vibration/idlharness.window.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js b/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js new file mode 100644 index 00000000000..572db0c01b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/wasm/jsapi/error-interfaces-no-symbol-tostringtag.js @@ -0,0 +1,13 @@ +// META: global=jsshell + +test(() => { + assert_not_own_property(WebAssembly.CompileError.prototype, Symbol.toStringTag); +}, "WebAssembly.CompileError"); + +test(() => { + assert_not_own_property(WebAssembly.LinkError.prototype, Symbol.toStringTag); +}, "WebAssembly.LinkError"); + +test(() => { + assert_not_own_property(WebAssembly.RuntimeError.prototype, Symbol.toStringTag); +}, "WebAssembly.RuntimeError"); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js index ca025576c2b..5f64d72de9d 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/global/toString.any.js @@ -5,3 +5,13 @@ test(() => { const global = new WebAssembly.Global(argument); assert_class_string(global, "WebAssembly.Global"); }, "Object.prototype.toString on an Global"); + +test(() => { + assert_own_property(WebAssembly.Global.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "WebAssembly.Global", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js index ccd665eb285..701ec8f9bad 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/instance/toString.any.js @@ -7,3 +7,13 @@ test(() => { const instance = new WebAssembly.Instance(module); assert_class_string(instance, "WebAssembly.Instance"); }, "Object.prototype.toString on an Instance"); + +test(() => { + assert_own_property(WebAssembly.Instance.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Instance.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "WebAssembly.Instance", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js index 4e15d75ea20..bb9081d1861 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/memory/toString.any.js @@ -5,3 +5,13 @@ test(() => { const memory = new WebAssembly.Memory(argument); assert_class_string(memory, "WebAssembly.Memory"); }, "Object.prototype.toString on an Memory"); + +test(() => { + assert_own_property(WebAssembly.Memory.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Memory.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "WebAssembly.Memory", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js index 2db2002ffd2..7dd85a1c4ac 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/module/toString.any.js @@ -6,3 +6,13 @@ test(() => { const module = new WebAssembly.Module(emptyModuleBinary); assert_class_string(module, "WebAssembly.Module"); }, "Object.prototype.toString on an Module"); + +test(() => { + assert_own_property(WebAssembly.Module.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Module.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "WebAssembly.Module", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html b/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html new file mode 100644 index 00000000000..72931cca77c --- /dev/null +++ b/tests/wpt/web-platform-tests/wasm/jsapi/proto-from-ctor-realm.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>WebAssembly JS API: Default [[Prototype]] value is from NewTarget's Realm</title> +<link rel="help" href="https://heycam.github.io/webidl/#internally-create-a-new-object-implementing-the-interface"> +<link rel="help" href="https://tc39.es/ecma262/#sec-nativeerror"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="wasm-module-builder.js"></script> +<body> +<iframe id="constructor-iframe" hidden></iframe> +<iframe id="new-target-iframe" hidden></iframe> +<iframe id="other-iframe" hidden></iframe> +<script> +"use strict"; + +const constructorRealm = document.querySelector("#constructor-iframe").contentWindow; +const newTargetRealm = document.querySelector("#new-target-iframe").contentWindow; +const otherRealm = document.querySelector("#other-iframe").contentWindow; + +const emptyModuleBinary = new WasmModuleBuilder().toBuffer(); +const interfaces = [ + ["Module", emptyModuleBinary], + ["Instance", new WebAssembly.Module(emptyModuleBinary)], + ["Memory", {initial: 0}], + ["Table", {element: "anyfunc", initial: 0}], + ["Global", {value: "i32"}], + + // See step 2 of https://tc39.es/ecma262/#sec-nativeerror + ["CompileError"], + ["LinkError"], + ["RuntimeError"], +]; + +const primitives = [ + undefined, + null, + false, + true, + 0, + -1, + "", + "str", + Symbol(), +]; + +const getNewTargets = function* (realm) { + for (const primitive of primitives) { + const newTarget = new realm.Function(); + newTarget.prototype = primitive; + yield [newTarget, "cross-realm NewTarget with `" + format_value(primitive) + "` prototype"]; + } + + // GetFunctionRealm (https://tc39.es/ecma262/#sec-getfunctionrealm) coverage: + const bindOther = otherRealm.Function.prototype.bind; + const ProxyOther = otherRealm.Proxy; + + const bound = new realm.Function(); + bound.prototype = undefined; + yield [bindOther.call(bound), "bound cross-realm NewTarget with `undefined` prototype"]; + + const boundBound = new realm.Function(); + boundBound.prototype = null; + yield [bindOther.call(bindOther.call(boundBound)), "bound bound cross-realm NewTarget with `null` prototype"]; + + const boundProxy = new realm.Function(); + boundProxy.prototype = false; + yield [bindOther.call(new ProxyOther(boundProxy, {})), "bound Proxy of cross-realm NewTarget with `false` prototype"]; + + const proxy = new realm.Function(); + proxy.prototype = true; + yield [new ProxyOther(proxy, {}), "Proxy of cross-realm NewTarget with `true` prototype"]; + + const proxyProxy = new realm.Function(); + proxyProxy.prototype = -0; + yield [new ProxyOther(new ProxyOther(proxyProxy, {}), {}), "Proxy of Proxy of cross-realm NewTarget with `-0` prototype"]; + + const proxyBound = new realm.Function(); + proxyBound.prototype = NaN; + yield [new ProxyOther(bindOther.call(proxyBound), {}), "Proxy of bound cross-realm NewTarget with `NaN` prototype"]; +}; + +for (const [interfaceName, constructorArg] of interfaces) { + for (const [newTarget, testDescription] of getNewTargets(newTargetRealm)) { + test(() => { + const Constructor = constructorRealm.WebAssembly[interfaceName]; + const object = Reflect.construct(Constructor, [constructorArg], newTarget); + + const NewTargetConstructor = newTargetRealm.WebAssembly[interfaceName]; + assert_true(object instanceof NewTargetConstructor); + assert_equals(Object.getPrototypeOf(object), NewTargetConstructor.prototype); + }, `WebAssembly.${interfaceName}: ${testDescription}`); + } +} +</script> +</body> diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js index e576477910a..708c17b3aca 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/table/toString.any.js @@ -5,3 +5,13 @@ test(() => { const table = new WebAssembly.Table(argument); assert_class_string(table, "WebAssembly.Table"); }, "Object.prototype.toString on an Table"); + +test(() => { + assert_own_property(WebAssembly.Table.prototype, Symbol.toStringTag); + + const propDesc = Object.getOwnPropertyDescriptor(WebAssembly.Table.prototype, Symbol.toStringTag); + assert_equals(propDesc.value, "WebAssembly.Table", "value"); + assert_equals(propDesc.configurable, true, "configurable"); + assert_equals(propDesc.enumerable, false, "enumerable"); + assert_equals(propDesc.writable, false, "writable"); +}, "@@toStringTag exists on the prototype with the appropriate descriptor"); diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html index fe7efe05aaf..c200f9e9773 100644 --- a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html +++ b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/pending.html @@ -31,5 +31,25 @@ promise_test(t => { }); }, 'reports true -> false when paused'); +promise_test(async t => { + const animation = + new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC), + null); + animation.play(); + assert_true(animation.pending); + await waitForAnimationFrames(2); + assert_true(animation.pending); +}, 'reports true -> true when played without a timeline'); + +promise_test(async t => { + const animation = + new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC), + null); + animation.pause(); + assert_true(animation.pending); + await waitForAnimationFrames(2); + assert_true(animation.pending); +}, 'reports true -> true when paused without a timeline'); + </script> </body> diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html index dd861750395..7e98ef4260f 100644 --- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html @@ -60,7 +60,7 @@ test(t => { new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC), null); animation.startTime = document.timeline.currentTime; - assert_equals(animation.playState, 'idle'); + assert_equals(animation.playState, 'running'); animation.timeline = document.timeline; @@ -73,7 +73,7 @@ test(t => { new Animation(new KeyframeEffect(createDiv(t), null, 100 * MS_PER_SEC), null); animation.startTime = document.timeline.currentTime - 200 * MS_PER_SEC; - assert_equals(animation.playState, 'idle'); + assert_equals(animation.playState, 'running'); animation.timeline = document.timeline; diff --git a/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js b/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js index 1ad570370e5..2df7831c340 100644 --- a/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js +++ b/tests/wpt/web-platform-tests/web-locks/idlharness.tentative.https.any.js @@ -1,6 +1,7 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: global=window,dedicatedworker,sharedworker,serviceworker +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/hit-test/idlharness.https.html b/tests/wpt/web-platform-tests/webxr/hit-test/idlharness.https.html index b7f67845470..b7f67845470 100644 --- a/tests/wpt/web-platform-tests/hit-test/idlharness.https.html +++ b/tests/wpt/web-platform-tests/webxr/hit-test/idlharness.https.html diff --git a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html index e47e7e7ceba..4e8ca34eebc 100644 --- a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html +++ b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.http.html @@ -10,7 +10,7 @@ worker.onmessage = resolve; }); - assert_equals(e.data.uaList, undefined); + assert_equals(e.data.brands, undefined); assert_equals(e.data.mobile, undefined); assert_equals(e.data.getHighEntropyValues, undefined); }, "Test that userAgentData is not available in workers in non-secure contexts"); diff --git a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html index 91a63966c01..c93cd1ed345 100644 --- a/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html +++ b/tests/wpt/web-platform-tests/workers/WorkerNavigator_userAgentData.https.html @@ -10,10 +10,10 @@ worker.onmessage = resolve; }); - assert_equals(e.data.uaList.length, navigator.userAgentData.uaList.length); - for (let i = 0; i < e.data.uaList.length; ++i) { - const workerUA = e.data.uaList[i]; - const windowUA = navigator.userAgentData.uaList[i]; + assert_equals(e.data.brands.length, navigator.userAgentData.brands.length); + for (let i = 0; i < e.data.brands.length; ++i) { + const workerUA = e.data.brands[i]; + const windowUA = navigator.userAgentData.brands[i]; assert_equals(workerUA.brand, windowUA.brand); assert_equals(workerUA.version, windowUA.version); } diff --git a/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html b/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html index e7cb1c47623..343bfe289f3 100644 --- a/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html +++ b/tests/wpt/web-platform-tests/workers/modules/dedicated-worker-parse-error-failure.html @@ -24,7 +24,7 @@ promise_setup(async () => { }; worker.onerror = () => resolve(false); }); - assert_precondition( + assert_implements( supportsModuleWorkers, "Static import must be supported on module dedicated worker to run this test." ); diff --git a/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js b/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js index eec2f6884a1..88e994959b3 100644 --- a/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js +++ b/tests/wpt/web-platform-tests/workers/support/WorkerNavigator.js @@ -6,8 +6,8 @@ obj.userAgent = navigator.userAgent; obj.onLine = navigator.onLine; if (navigator.userAgentData) { - obj.uaList = navigator.userAgentData.uaList; - obj.mobile = navigator.userAgentData.mobile; + obj.brands = navigator.userAgentData.brands; + obj.mobile = navigator.userAgentData.mobile; const highEntropyValues = await navigator.userAgentData.getHighEntropyValues(["platform", "platformVersion", "architecture", "model", "uaFullVersion"]); obj.platform = highEntropyValues.platform; obj.platformVersion = highEntropyValues.platformVersion; diff --git a/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm b/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm index 43bbe4b6d79..54d7eb550df 100644 --- a/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm +++ b/tests/wpt/web-platform-tests/xhr/send-redirect-to-cors.htm @@ -24,20 +24,20 @@ function redirect(code, name = code, method = "GET", body = null, explicitType = null, safelistContentType = false) { async_test(t => { - var client = new XMLHttpRequest() + let { body: expectedBody, type: expectedType } = extractBody(body); + if (explicitType !== null) { + expectedType = explicitType; + } + let expectedMethod = method; + if (((code === "301" || code === "302") && method === "POST") || (code === "303" && method !== "GET" && method !== "HEAD")) { + expectedMethod = "GET"; + expectedBody = ""; + expectedType = "NO"; + } + const client = new XMLHttpRequest(); client.onreadystatechange = t.step_func(() => { if (client.readyState === 4) { - if (explicitType !== "application/x-pony" || safelistContentType) { - let { body: expectedBody, type: expectedType } = extractBody(body); - if (explicitType !== null) { - expectedType = explicitType - } - let expectedMethod = method; - if (((code === "301" || code === "302") && method === "POST") || code === "303") { - expectedMethod = "GET"; - expectedBody = ""; - expectedType = "NO"; - } + if ((expectedMethod === "GET" && expectedType === "NO") || explicitType !== "application/x-pony" || safelistContentType) { assert_equals(client.status, 200); assert_equals(client.getResponseHeader("x-request-method"), expectedMethod); assert_equals(client.getResponseHeader("x-request-content-type"), expectedType); @@ -51,7 +51,7 @@ } t.done(); } - }) + }); let safelist = ""; if (safelistContentType) { safelist = "?safelist_content_type"; @@ -67,6 +67,7 @@ redirect("301") redirect("301", "301 GET with explicit Content-Type", "GET", null, "application/x-pony") redirect("301", "301 GET with explicit Content-Type safelisted", "GET", null, "application/x-pony", true) + redirect("303", "303 GET with explicit Content-Type safelisted", "GET", null, "application/x-pony", true) redirect("302") redirect("303") redirect("302", "302 FOO with string and explicit Content-Type safelisted", "FOO", "test", "application/x-pony", true) diff --git a/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini b/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini index 4c7e8ccd177..2a86fa51b59 100644 --- a/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini +++ b/tests/wpt/webgl/meta/conformance2/rendering/draw-buffers.html.ini @@ -107,3 +107,6 @@ [WebGL test #52: attachment 7 should be 0,255,0,255\nat (4, 0) expected: 0,255,0,255 was 255,255,0,0] expected: FAIL + [WebGL test #52: attachment 7 should be 0,255,0,255\nat (0, 0) expected: 0,255,0,255 was 0,0,255,255] + expected: FAIL + |