aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-08-03 10:25:42 +0000
committerWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-08-03 15:03:51 +0000
commitb68253eac07a8ca2903859b3148ac1c721930cc4 (patch)
treeda3408a7a8e2a1127b568a5b6ea98157632f3e9f
parentecd32570c0d20b1cf9ea1711d2f819725f74ad17 (diff)
downloadservo-b68253eac07a8ca2903859b3148ac1c721930cc4.tar.gz
servo-b68253eac07a8ca2903859b3148ac1c721930cc4.zip
Update web-platform-tests to revision 097043b336e46876e281ddec3bb014fe9c480128
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json1808
-rw-r--r--tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-fonts/inheritance.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini13
-rw-r--r--tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini16
-rw-r--r--tests/wpt/metadata/css/css-transitions/properties-value-inherit-002.html.ini12
-rw-r--r--tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-computed.html.ini7
-rw-r--r--tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-valid.html.ini7
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini14
-rw-r--r--tests/wpt/metadata/fetch/content-type/script.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini34
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini34
-rw-r--r--tests/wpt/metadata/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html.ini28
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini7
-rw-r--r--tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-data.html.ini4
-rw-r--r--tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html.ini5
-rw-r--r--tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html.ini5
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/metadata/webdriver/tests/execute_script/execute.py.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrWebGLLayer_constructor.https.html.ini3
-rw-r--r--tests/wpt/web-platform-tests/.github/main.workflow11
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/tools/generate.py63
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/tools/util.py11
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-basic-blocked-error-event.html10
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-1.html35
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-2.html35
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-1.html31
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-2.html31
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scripthash-before-execute.js10
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scriptnonce-before-execute.js8
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/support/empty.css0
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/support/inline-script-should-be-blocked.js14
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/inheritance.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-computed.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-invalid.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-valid.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001-ref.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002-ref.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a-ref.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b-ref.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b.html50
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005-ref.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005.html48
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001.html45
-rw-r--r--tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.html (renamed from tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.html (renamed from tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.html (renamed from tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.html (renamed from tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-overscroll-behavior/inheritance.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/before-dynamic-display-none.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-001.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/reference/line-break-anywhere-001-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html18
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-computed.html19
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-invalid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-valid.html18
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-interpolation.html12
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-001.html35
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/motion/offset-supports-calc.html6
-rw-r--r--tests/wpt/web-platform-tests/css/motion/parsing/offset-anchor-parsing-valid.html2
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLInputElement.html4
-rw-r--r--tests/wpt/web-platform-tests/docs/assets/reftest-tutorial-test-screenshot.pngbin0 -> 20239 bytes
-rw-r--r--tests/wpt/web-platform-tests/docs/running-tests/chrome.md16
-rw-r--r--tests/wpt/web-platform-tests/docs/running-tests/chrome_android.md38
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/index.md1
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/reftest-tutorial.md276
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/reftests.md45
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md21
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md9
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.htm18
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.js9
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.htm12
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.js3
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm15
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js10
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.js7
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmesage.js9
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmessage.htm18
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.htm18
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.js9
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.htm17
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.js8
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.htm16
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.js7
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.htm21
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.js12
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm18
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.js13
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-url-bogus.js10
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.htm22
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.js13
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmesage.js12
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmessage.htm21
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.htm21
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.js12
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.htm20
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.js11
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.htm19
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.js10
-rw-r--r--tests/wpt/web-platform-tests/html-media-capture/capture_reflect.html4
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html59
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/layout-instability.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-nfc.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webauthn.idl4
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/idlharness.window.js16
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html122
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-2.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html3
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-001.html4
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-002.html3
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002.html3
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.html54
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html111
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.html6
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html88
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html83
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-4.html59
-rw-r--r--tests/wpt/web-platform-tests/mathml/support/attribute-values.js31
-rw-r--r--tests/wpt/web-platform-tests/mathml/support/box-comparison.js8
-rw-r--r--tests/wpt/web-platform-tests/mathml/support/mathml-fragments.js7
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getUserMedia.https.html2
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html164
-rwxr-xr-xtests/wpt/web-platform-tests/mixed-content/generic/tools/generate.py19
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-data.html43
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html50
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html (renamed from tests/wpt/web-platform-tests/referrer-policy/generic/iframe-inheritance.html)20
-rwxr-xr-xtests/wpt/web-platform-tests/referrer-policy/generic/tools/generate.py27
-rw-r--r--tests/wpt/web-platform-tests/resources/SVGAnimationTestCase-testharness.js100
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webxr-test.js6
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/scripted/onhover-syncbases.html43
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgnumberoptionalnumber-animation-4.html92
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgpath-animation-1.html67
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-1.html72
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-2.html72
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgrect-animation-1.html85
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgrect-animation-2.html85
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgstring-animation-1.html66
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgstring-animation-fallback-to-discrete.html62
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-1.html117
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-discrete.html74
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/marker-computed.svg27
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/marker-invalid.svg19
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/marker-valid.svg20
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tests/test_update_pr_preview.py403
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/update_pr_preview.py255
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/__init__.py0
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/commands.json6
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/frontend.py43
-rwxr-xr-xtests/wpt/web-platform-tests/tools/docker/start.sh16
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/tests/test_item.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/pytest.ini6
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini2
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py95
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/install.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/paths1
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py38
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py51
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py20
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servo.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servodriver.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py131
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py18
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py49
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py963
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py229
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py132
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py883
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py16
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py49
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/node.py18
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py14
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py4
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html1
-rwxr-xr-xtests/wpt/web-platform-tests/web-animations/resources/timing-override.js18
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/finishing-an-animation.html1
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html3
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/the-current-time-of-an-animation.html1
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/timelines/document-timelines.html6
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/execute_script/execute.py15
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/perform_actions/validity.py13
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html2
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt2
-rw-r--r--tests/wpt/web-platform-tests/webxr/exclusive_requestFrame_nolayer.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_util.js4
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrInputSource_profiles.https.html39
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html3
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html12
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrWebGLLayer_opaque_framebuffer.https.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-name.html8
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.html10
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.js0
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty-name.html8
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty.js0
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.js13
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-properties.html8
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-readonly.html8
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.html19
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.js4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js10
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js7
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html16
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html15
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html15
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html16
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html24
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js14
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.html19
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.js4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.html27
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.js19
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.js7
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.html28
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.js13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html19
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js7
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.html20
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.js8
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html19
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.js7
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html16
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.html27
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.js17
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.js2
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.js4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.html18
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.js8
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.js13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.html19
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.js2
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.html20
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.html21
-rw-r--r--tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/001.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/001.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/001.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/001.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/002.html11
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/002.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/002.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/002.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/003.html16
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/003.js5
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/004.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/encodings/004.js7
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.html93
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.js82
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.html56
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.js45
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.html15
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.html22
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.js13
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008-1.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.html17
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.js6
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.html38
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.js28
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.html44
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.js34
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.html18
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.js8
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004-1.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.html15
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.js6
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.html12
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.js4
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/001.html23
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/001.js13
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/002.html20
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/002.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/003.html27
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/003.js17
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/004.html20
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/xhr/004.js11
405 files changed, 9165 insertions, 3051 deletions
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 76b398963ae..a9e46713244 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: FAIL
+ expected: TIMEOUT
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 70faa1f516f..6a770f6290a 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -132295,6 +132295,30 @@
{}
]
],
+ "css/css-multicol/multicol-rule-nested-balancing-001.html": [
+ [
+ "css/css-multicol/multicol-rule-nested-balancing-001.html",
+ [
+ [
+ "/css/css-multicol/multicol-rule-nested-balancing-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-multicol/multicol-rule-nested-balancing-002.html": [
+ [
+ "css/css-multicol/multicol-rule-nested-balancing-002.html",
+ [
+ [
+ "/css/css-multicol/multicol-rule-nested-balancing-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/multicol-rule-none-000.xht": [
[
"css/css-multicol/multicol-rule-none-000.xht",
@@ -132655,6 +132679,54 @@
{}
]
],
+ "css/css-multicol/multicol-span-all-children-height-004a.html": [
+ [
+ "css/css-multicol/multicol-span-all-children-height-004a.html",
+ [
+ [
+ "/css/css-multicol/multicol-span-all-children-height-004a-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-multicol/multicol-span-all-children-height-004b.html": [
+ [
+ "css/css-multicol/multicol-span-all-children-height-004b.html",
+ [
+ [
+ "/css/css-multicol/multicol-span-all-children-height-004b-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-multicol/multicol-span-all-children-height-005.html": [
+ [
+ "css/css-multicol/multicol-span-all-children-height-005.html",
+ [
+ [
+ "/css/css-multicol/multicol-span-all-children-height-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-multicol/multicol-span-all-children-height-006.html": [
+ [
+ "css/css-multicol/multicol-span-all-children-height-006.html",
+ [
+ [
+ "/css/css-multicol/multicol-span-all-children-height-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/multicol-span-all-dynamic-add-001.html": [
[
"css/css-multicol/multicol-span-all-dynamic-add-001.html",
@@ -133075,6 +133147,18 @@
{}
]
],
+ "css/css-multicol/multicol-span-all-rule-001.html": [
+ [
+ "css/css-multicol/multicol-span-all-rule-001.html",
+ [
+ [
+ "/css/css-multicol/multicol-span-all-rule-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/multicol-span-float-001.xht": [
[
"css/css-multicol/multicol-span-float-001.xht",
@@ -133639,9 +133723,9 @@
{}
]
],
- "css/css-overflow/overflow-body-propagation-001.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-001.html": [
[
- "css/css-overflow/overflow-body-propagation-001.tentative.html",
+ "css/css-overflow/overflow-body-propagation-001.html",
[
[
"/css/css-overflow/reference/overflow-body-propagation-ref.html",
@@ -133651,9 +133735,9 @@
{}
]
],
- "css/css-overflow/overflow-body-propagation-002.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-002.html": [
[
- "css/css-overflow/overflow-body-propagation-002.tentative.html",
+ "css/css-overflow/overflow-body-propagation-002.html",
[
[
"/css/reference/blank.html",
@@ -133663,9 +133747,9 @@
{}
]
],
- "css/css-overflow/overflow-body-propagation-003.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-003.html": [
[
- "css/css-overflow/overflow-body-propagation-003.tentative.html",
+ "css/css-overflow/overflow-body-propagation-003.html",
[
[
"/css/reference/blank.html",
@@ -133675,9 +133759,9 @@
{}
]
],
- "css/css-overflow/overflow-body-propagation-004.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-004.html": [
[
- "css/css-overflow/overflow-body-propagation-004.tentative.html",
+ "css/css-overflow/overflow-body-propagation-004.html",
[
[
"/css/css-overflow/reference/overflow-body-no-propagation-ref.html",
@@ -136135,6 +136219,18 @@
{}
]
],
+ "css/css-pseudo/before-dynamic-display-none.html": [
+ [
+ "css/css-pseudo/before-dynamic-display-none.html",
+ [
+ [
+ "/css/reference/pass_if_pass_below.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-pseudo/first-letter-001.html": [
[
"css/css-pseudo/first-letter-001.html",
@@ -180849,6 +180945,18 @@
{}
]
],
+ "css/motion/animation/reftests/offset-path-with-transforms-001.html": [
+ [
+ "css/motion/animation/reftests/offset-path-with-transforms-001.html",
+ [
+ [
+ "/css/motion/animation/reftests/offset-path-with-transforms-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/motion/animation/reftests/offset-rotate-interpolation-001.html": [
[
"css/motion/animation/reftests/offset-rotate-interpolation-001.html",
@@ -227742,9 +227850,21 @@
"content-security-policy/script-src/simpleSourcedScript.js": [
[]
],
+ "content-security-policy/script-src/support/change-scripthash-before-execute.js": [
+ []
+ ],
+ "content-security-policy/script-src/support/change-scriptnonce-before-execute.js": [
+ []
+ ],
+ "content-security-policy/script-src/support/empty.css": [
+ []
+ ],
"content-security-policy/script-src/support/inject-script.js": [
[]
],
+ "content-security-policy/script-src/support/inline-script-should-be-blocked.js": [
+ []
+ ],
"content-security-policy/script-src/support/post-message.js": [
[]
],
@@ -251418,6 +251538,12 @@
"css/css-multicol/multicol-rule-large-001-ref.xht": [
[]
],
+ "css/css-multicol/multicol-rule-nested-balancing-001-ref.html": [
+ []
+ ],
+ "css/css-multicol/multicol-rule-nested-balancing-002-ref.html": [
+ []
+ ],
"css/css-multicol/multicol-rule-ref.xht": [
[]
],
@@ -251490,6 +251616,18 @@
"css/css-multicol/multicol-span-all-children-height-003-ref.html": [
[]
],
+ "css/css-multicol/multicol-span-all-children-height-004a-ref.html": [
+ []
+ ],
+ "css/css-multicol/multicol-span-all-children-height-004b-ref.html": [
+ []
+ ],
+ "css/css-multicol/multicol-span-all-children-height-005-ref.html": [
+ []
+ ],
+ "css/css-multicol/multicol-span-all-children-height-006-ref.html": [
+ []
+ ],
"css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [
[]
],
@@ -251571,6 +251709,9 @@
"css/css-multicol/multicol-span-all-restyle-004-ref.html": [
[]
],
+ "css/css-multicol/multicol-span-all-rule-001-ref.html": [
+ []
+ ],
"css/css-multicol/multicol-span-float-001-ref.xht": [
[]
],
@@ -260181,6 +260322,9 @@
"css/motion/animation/reftests/offset-path-path-interpolation-ref.html": [
[]
],
+ "css/motion/animation/reftests/offset-path-with-transforms-ref.html": [
+ []
+ ],
"css/motion/offset-anchor-transform-box-fill-box-ref.html": [
[]
],
@@ -263484,6 +263628,9 @@
"docs/assets/pullrequestbtn.png": [
[]
],
+ "docs/assets/reftest-tutorial-test-screenshot.png": [
+ []
+ ],
"docs/assets/reftest_graph_example.svg": [
[]
],
@@ -263574,6 +263721,9 @@
"docs/writing-tests/python-handlers/index.md": [
[]
],
+ "docs/writing-tests/reftest-tutorial.md": [
+ []
+ ],
"docs/writing-tests/reftests.md": [
[]
],
@@ -264921,6 +265071,30 @@
"eventsource/README.md": [
[]
],
+ "eventsource/dedicated-worker/eventsource-close.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-close2.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-constructor-url-bogus.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-onmesage.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-onopen.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-prototype.js": [
+ []
+ ],
+ "eventsource/dedicated-worker/eventsource-url.js": [
+ []
+ ],
"eventsource/resources/accept.event_stream": [
[]
],
@@ -264957,6 +265131,30 @@
"eventsource/resources/status-reconnect.py": [
[]
],
+ "eventsource/shared-worker/eventsource-close.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-constructor-non-same-origin.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-constructor-url-bogus.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-eventtarget.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-onmesage.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-onopen.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-prototype.js": [
+ []
+ ],
+ "eventsource/shared-worker/eventsource-url.js": [
+ []
+ ],
"feature-policy/META.yml": [
[]
],
@@ -273342,6 +273540,9 @@
"interfaces/largest-contentful-paint.idl": [
[]
],
+ "interfaces/layout-instability.idl": [
+ []
+ ],
"interfaces/longtasks.idl": [
[]
],
@@ -273954,6 +274155,9 @@
"mathml/relations/text-and-math/use-typo-metrics-1-ref.html": [
[]
],
+ "mathml/support/attribute-values.js": [
+ []
+ ],
"mathml/support/box-comparison.js": [
[]
],
@@ -277548,6 +277752,9 @@
"resources/META.yml": [
[]
],
+ "resources/SVGAnimationTestCase-testharness.js": [
+ []
+ ],
"resources/check-layout-th.js": [
[]
],
@@ -280737,6 +280944,12 @@
"tools/ci/tests/test_run_tc.py": [
[]
],
+ "tools/ci/tests/test_update_pr_preview.py": [
+ []
+ ],
+ "tools/ci/update_pr_preview.py": [
+ []
+ ],
"tools/ci/website_build.sh": [
[]
],
@@ -280749,9 +280962,18 @@
"tools/docker/Dockerfile": [
[]
],
+ "tools/docker/__init__.py": [
+ []
+ ],
+ "tools/docker/commands.json": [
+ []
+ ],
"tools/docker/documentation/Dockerfile": [
[]
],
+ "tools/docker/frontend.py": [
+ []
+ ],
"tools/docker/github/Dockerfile": [
[]
],
@@ -284664,6 +284886,9 @@
"tools/wptrunner/wptrunner/expected.py": [
[]
],
+ "tools/wptrunner/wptrunner/expectedtree.py": [
+ []
+ ],
"tools/wptrunner/wptrunner/font.py": [
[]
],
@@ -284736,6 +284961,9 @@
"tools/wptrunner/wptrunner/tests/browsers/test_sauce.py": [
[]
],
+ "tools/wptrunner/wptrunner/tests/test_expectedtree.py": [
+ []
+ ],
"tools/wptrunner/wptrunner/tests/test_formatters.py": [
[]
],
@@ -285438,6 +285666,9 @@
"web-animations/resources/keyframe-utils.js": [
[]
],
+ "web-animations/resources/timing-override.js": [
+ []
+ ],
"web-animations/resources/timing-tests.js": [
[]
],
@@ -287736,24 +287967,54 @@
"workers/constructors/SharedWorker/1": [
[]
],
+ "workers/constructors/SharedWorker/connect-event.js": [
+ []
+ ],
+ "workers/constructors/SharedWorker/dummy-shared-worker.js": [
+ []
+ ],
+ "workers/constructors/SharedWorker/empty.js": [
+ []
+ ],
+ "workers/constructors/SharedWorker/global-members.js": [
+ []
+ ],
+ "workers/constructors/SharedWorker/interface-objects.js": [
+ []
+ ],
+ "workers/constructors/SharedWorker/name.js": [
+ []
+ ],
"workers/constructors/SharedWorker/null": [
[]
],
+ "workers/constructors/SharedWorker/port-onmessage.js": [
+ []
+ ],
"workers/constructors/SharedWorker/shared-worker.js": [
[]
],
"workers/constructors/SharedWorker/undefined": [
[]
],
+ "workers/constructors/SharedWorker/unexpected-global-properties.js": [
+ []
+ ],
"workers/constructors/Worker/1": [
[]
],
+ "workers/constructors/Worker/AbstractWorker.onerror.js": [
+ []
+ ],
"workers/constructors/Worker/null": [
[]
],
"workers/constructors/Worker/sample_worker/worker.js": [
[]
],
+ "workers/constructors/Worker/terminate.js": [
+ []
+ ],
"workers/constructors/Worker/undefined": [
[]
],
@@ -287763,18 +288024,135 @@
"workers/examples/fetch_tests_from_worker.js": [
[]
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js": [
+ []
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.js": [
[]
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js": [
+ []
+ ],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js": [
+ []
+ ],
+ "workers/interfaces/SharedWorkerGlobalScope/name/getting.js": [
+ []
+ ],
+ "workers/interfaces/SharedWorkerGlobalScope/name/setting.js": [
+ []
+ ],
+ "workers/interfaces/SharedWorkerGlobalScope/onconnect.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/close/incoming-message.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/close/sending-messages.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/close/setInterval.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/close/setTimeout.js": [
+ []
+ ],
"workers/interfaces/WorkerGlobalScope/location/helper-redirect.py": [
[]
],
+ "workers/interfaces/WorkerGlobalScope/location/members.js": [
+ []
+ ],
"workers/interfaces/WorkerGlobalScope/location/post-location-members.js": [
[]
],
"workers/interfaces/WorkerGlobalScope/location/redirect.js": [
[]
],
+ "workers/interfaces/WorkerGlobalScope/location/returns-same-object.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/location/setting-members.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/onerror/handled.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/onerror/not-handled.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js": [
+ []
+ ],
+ "workers/interfaces/WorkerGlobalScope/self.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/WindowTimers/001.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/WindowTimers/002.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/WindowTimers/003.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/WindowTimers/004.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/WindowTimers/005.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/003.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/004.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/005.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/006.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/007.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/008.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/009.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/010.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/011.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/importScripts/012.js": [
+ []
+ ],
"workers/interfaces/WorkerUtils/importScripts/1": [
[]
],
@@ -287793,6 +288171,27 @@
"workers/interfaces/WorkerUtils/importScripts/undefined.headers": [
[]
],
+ "workers/interfaces/WorkerUtils/navigator/002.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/003.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/004.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/005.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/006.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/007.js": [
+ []
+ ],
+ "workers/interfaces/WorkerUtils/navigator/language.js": [
+ []
+ ],
"workers/modules/dedicated-worker-options-credentials.html.headers": [
[]
],
@@ -287925,18 +288324,48 @@
"workers/non-automated/navigator-onLine.html": [
[]
],
+ "workers/non-automated/navigator-onLine.js": [
+ []
+ ],
"workers/non-automated/post-a-1.js": [
[]
],
- "workers/semantics/encodings/001.html.headers": [
+ "workers/semantics/encodings/001.js": [
+ []
+ ],
+ "workers/semantics/encodings/001.js.headers": [
[]
],
- "workers/semantics/encodings/002.html.headers": [
+ "workers/semantics/encodings/002.js": [
+ []
+ ],
+ "workers/semantics/encodings/002.js.headers": [
[]
],
"workers/semantics/encodings/003-1.py": [
[]
],
+ "workers/semantics/encodings/003.js": [
+ []
+ ],
+ "workers/semantics/encodings/004.js": [
+ []
+ ],
+ "workers/semantics/interface-objects/003.js": [
+ []
+ ],
+ "workers/semantics/interface-objects/004.js": [
+ []
+ ],
+ "workers/semantics/multiple-workers/001.js": [
+ []
+ ],
+ "workers/semantics/multiple-workers/002.js": [
+ []
+ ],
+ "workers/semantics/multiple-workers/003.js": [
+ []
+ ],
"workers/semantics/multiple-workers/004-1.html": [
[]
],
@@ -287949,15 +288378,51 @@
"workers/semantics/multiple-workers/008-1.html": [
[]
],
+ "workers/semantics/multiple-workers/008.js": [
+ []
+ ],
"workers/semantics/navigation/001-1.html": [
[]
],
+ "workers/semantics/navigation/001-1.js": [
+ []
+ ],
+ "workers/semantics/reporting-errors/001.js": [
+ []
+ ],
+ "workers/semantics/reporting-errors/002.js": [
+ []
+ ],
+ "workers/semantics/reporting-errors/003.js": [
+ []
+ ],
"workers/semantics/reporting-errors/004-1.html": [
[]
],
+ "workers/semantics/reporting-errors/004.js": [
+ []
+ ],
+ "workers/semantics/run-a-worker/001.js": [
+ []
+ ],
+ "workers/semantics/run-a-worker/002.js": [
+ []
+ ],
"workers/semantics/xhr/001-1.xml": [
[]
],
+ "workers/semantics/xhr/001.js": [
+ []
+ ],
+ "workers/semantics/xhr/002.js": [
+ []
+ ],
+ "workers/semantics/xhr/003.js": [
+ []
+ ],
+ "workers/semantics/xhr/004.js": [
+ []
+ ],
"workers/semantics/xhr/support/001-1.xml": [
[]
],
@@ -307901,12 +308366,30 @@
{}
]
],
+ "content-security-policy/script-src/scripthash-basic-blocked-error-event.html": [
+ [
+ "content-security-policy/script-src/scripthash-basic-blocked-error-event.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/scripthash-basic-blocked.sub.html": [
[
"content-security-policy/script-src/scripthash-basic-blocked.sub.html",
{}
]
],
+ "content-security-policy/script-src/scripthash-changed-1.html": [
+ [
+ "content-security-policy/script-src/scripthash-changed-1.html",
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/scripthash-changed-2.html": [
+ [
+ "content-security-policy/script-src/scripthash-changed-2.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/scripthash-default-src.sub.html": [
[
"content-security-policy/script-src/scripthash-default-src.sub.html",
@@ -307943,6 +308426,18 @@
{}
]
],
+ "content-security-policy/script-src/scriptnonce-changed-1.html": [
+ [
+ "content-security-policy/script-src/scriptnonce-changed-1.html",
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/scriptnonce-changed-2.html": [
+ [
+ "content-security-policy/script-src/scriptnonce-changed-2.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html": [
[
"content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html",
@@ -312955,6 +313450,24 @@
{}
]
],
+ "css/css-fonts/parsing/font-variation-settings-computed.html": [
+ [
+ "css/css-fonts/parsing/font-variation-settings-computed.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/parsing/font-variation-settings-invalid.html": [
+ [
+ "css/css-fonts/parsing/font-variation-settings-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-fonts/parsing/font-variation-settings-valid.html": [
+ [
+ "css/css-fonts/parsing/font-variation-settings-valid.html",
+ {}
+ ]
+ ],
"css/css-fonts/parsing/font-weight-computed.html": [
[
"css/css-fonts/parsing/font-weight-computed.html",
@@ -315191,6 +315704,24 @@
{}
]
],
+ "css/css-inline/parsing/dominant-baseline-computed.html": [
+ [
+ "css/css-inline/parsing/dominant-baseline-computed.html",
+ {}
+ ]
+ ],
+ "css/css-inline/parsing/dominant-baseline-invalid.html": [
+ [
+ "css/css-inline/parsing/dominant-baseline-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-inline/parsing/dominant-baseline-valid.html": [
+ [
+ "css/css-inline/parsing/dominant-baseline-valid.html",
+ {}
+ ]
+ ],
"css/css-layout-api/at-supports-rule.https.html": [
[
"css/css-layout-api/at-supports-rule.https.html",
@@ -316253,6 +316784,12 @@
{}
]
],
+ "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html": [
+ [
+ "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html",
+ {}
+ ]
+ ],
"css/css-overscroll-behavior/inheritance.html": [
[
"css/css-overscroll-behavior/inheritance.html",
@@ -320945,6 +321482,12 @@
{}
]
],
+ "css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html": [
+ [
+ "css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html",
+ {}
+ ]
+ ],
"css/css-text/white-space/seg-break-transformation-000.html": [
[
"css/css-text/white-space/seg-break-transformation-000.html",
@@ -325401,6 +325944,24 @@
{}
]
],
+ "css/cssom-view/parsing/scroll-behavior-computed.html": [
+ [
+ "css/cssom-view/parsing/scroll-behavior-computed.html",
+ {}
+ ]
+ ],
+ "css/cssom-view/parsing/scroll-behavior-invalid.html": [
+ [
+ "css/cssom-view/parsing/scroll-behavior-invalid.html",
+ {}
+ ]
+ ],
+ "css/cssom-view/parsing/scroll-behavior-valid.html": [
+ [
+ "css/cssom-view/parsing/scroll-behavior-valid.html",
+ {}
+ ]
+ ],
"css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html": [
[
"css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html",
@@ -349166,6 +349727,12 @@
}
]
],
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html": [
+ [
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html",
+ {}
+ ]
+ ],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.tentative.html": [
[
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.tentative.html",
@@ -361299,6 +361866,23 @@
{}
]
],
+ "layout-instability/idlharness.window.js": [
+ [
+ "layout-instability/idlharness.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/WebIDLParser.js"
+ ],
+ [
+ "script",
+ "/resources/idlharness.js"
+ ]
+ ]
+ }
+ ]
+ ],
"layout-instability/observe-layout-shift.html": [
[
"layout-instability/observe-layout-shift.html",
@@ -361829,12 +362413,24 @@
{}
]
],
+ "mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html": [
+ [
+ "mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html",
+ {}
+ ]
+ ],
"mathml/relations/css-styling/writing-mode/writing-mode-002.html": [
[
"mathml/relations/css-styling/writing-mode/writing-mode-002.html",
{}
]
],
+ "mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html": [
+ [
+ "mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html",
+ {}
+ ]
+ ],
"mathml/relations/html5-tree/class-2.html": [
[
"mathml/relations/html5-tree/class-2.html",
@@ -361855,6 +362451,12 @@
}
]
],
+ "mathml/relations/html5-tree/integration-point-4.html": [
+ [
+ "mathml/relations/html5-tree/integration-point-4.html",
+ {}
+ ]
+ ],
"mathml/relations/html5-tree/unique-identifier-2.html": [
[
"mathml/relations/html5-tree/unique-identifier-2.html",
@@ -378647,15 +379249,27 @@
{}
]
],
- "referrer-policy/generic/iframe-inheritance.html": [
+ "referrer-policy/generic/iframe-src-change.html": [
[
- "referrer-policy/generic/iframe-inheritance.html",
+ "referrer-policy/generic/iframe-src-change.html",
{}
]
],
- "referrer-policy/generic/iframe-src-change.html": [
+ "referrer-policy/generic/inheritance/iframe-inheritance-data.html": [
[
- "referrer-policy/generic/iframe-src-change.html",
+ "referrer-policy/generic/inheritance/iframe-inheritance-data.html",
+ {}
+ ]
+ ],
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html": [
+ [
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html",
+ {}
+ ]
+ ],
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html": [
+ [
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html",
{}
]
],
@@ -397968,6 +398582,72 @@
{}
]
],
+ "svg/animations/scripted/onhover-syncbases.html": [
+ [
+ "svg/animations/scripted/onhover-syncbases.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgnumberoptionalnumber-animation-4.html": [
+ [
+ "svg/animations/svgnumberoptionalnumber-animation-4.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgpath-animation-1.html": [
+ [
+ "svg/animations/svgpath-animation-1.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgpointlist-animation-1.html": [
+ [
+ "svg/animations/svgpointlist-animation-1.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgpointlist-animation-2.html": [
+ [
+ "svg/animations/svgpointlist-animation-2.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgrect-animation-1.html": [
+ [
+ "svg/animations/svgrect-animation-1.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgrect-animation-2.html": [
+ [
+ "svg/animations/svgrect-animation-2.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgstring-animation-1.html": [
+ [
+ "svg/animations/svgstring-animation-1.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgstring-animation-fallback-to-discrete.html": [
+ [
+ "svg/animations/svgstring-animation-fallback-to-discrete.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgtransform-animation-1.html": [
+ [
+ "svg/animations/svgtransform-animation-1.html",
+ {}
+ ]
+ ],
+ "svg/animations/svgtransform-animation-discrete.html": [
+ [
+ "svg/animations/svgtransform-animation-discrete.html",
+ {}
+ ]
+ ],
"svg/coordinate-systems/outer-svg-intrinsic-size-001.html": [
[
"svg/coordinate-systems/outer-svg-intrinsic-size-001.html",
@@ -398428,6 +399108,12 @@
{}
]
],
+ "svg/painting/parsing/marker-computed.svg": [
+ [
+ "svg/painting/parsing/marker-computed.svg",
+ {}
+ ]
+ ],
"svg/painting/parsing/marker-end-computed.svg": [
[
"svg/painting/parsing/marker-end-computed.svg",
@@ -398446,6 +399132,12 @@
{}
]
],
+ "svg/painting/parsing/marker-invalid.svg": [
+ [
+ "svg/painting/parsing/marker-invalid.svg",
+ {}
+ ]
+ ],
"svg/painting/parsing/marker-mid-computed.svg": [
[
"svg/painting/parsing/marker-mid-computed.svg",
@@ -398482,6 +399174,12 @@
{}
]
],
+ "svg/painting/parsing/marker-valid.svg": [
+ [
+ "svg/painting/parsing/marker-valid.svg",
+ {}
+ ]
+ ],
"svg/painting/parsing/paint-order-computed.svg": [
[
"svg/painting/parsing/paint-order-computed.svg",
@@ -412220,6 +412918,12 @@
{}
]
],
+ "webxr/xrInputSource_profiles.https.html": [
+ [
+ "webxr/xrInputSource_profiles.https.html",
+ {}
+ ]
+ ],
"webxr/xrRay_constructor.https.html": [
[
"webxr/xrRay_constructor.https.html",
@@ -437958,7 +438662,7 @@
"support"
],
".github/main.workflow": [
- "4f4447fdf0ff12f0910d20f16e6e31c9dd696749",
+ "20a0f33256d791dcb59a057b319fadd2b58bd663",
"support"
],
".gitignore": [
@@ -449714,7 +450418,7 @@
"support"
],
"common/security-features/tools/generate.py": [
- "fc10e635dbd0d52469e5a105764fa681c86dc654",
+ "0b18a391a62279680e2cbb6905d41084a622f236",
"support"
],
"common/security-features/tools/spec_validator.py": [
@@ -449738,7 +450442,7 @@
"support"
],
"common/security-features/tools/util.py": [
- "1f6c86e6efcc3bb5dbde41ba484a026d55a5961e",
+ "fc8d3b30ef71ca3b63c325837cf58f768f5805f4",
"support"
],
"common/sleep.py": [
@@ -469465,10 +470169,22 @@
"c46a99136d8b1f80029178d575cb32990007da61",
"testharness"
],
+ "content-security-policy/script-src/scripthash-basic-blocked-error-event.html": [
+ "62b869335f0d01fe49e7fbd0a7d18ce90e5dede3",
+ "testharness"
+ ],
"content-security-policy/script-src/scripthash-basic-blocked.sub.html": [
"d254053ecedad157389460beef5b54990c5ae751",
"testharness"
],
+ "content-security-policy/script-src/scripthash-changed-1.html": [
+ "9da41dd1ef3869df2daf56d33f2a5a4a9b8aca73",
+ "testharness"
+ ],
+ "content-security-policy/script-src/scripthash-changed-2.html": [
+ "927d60a8d78fcf531970793ac7778c895d4f8167",
+ "testharness"
+ ],
"content-security-policy/script-src/scripthash-default-src.sub.html": [
"6025a67179fe2e71c60e811e7740f84f16da5d2a",
"testharness"
@@ -469493,6 +470209,14 @@
"2001afcd9cac51a007569bf8ea0642dc905b5422",
"testharness"
],
+ "content-security-policy/script-src/scriptnonce-changed-1.html": [
+ "75f92f354ad1c550104d6c6f75096ad0f8e8916f",
+ "testharness"
+ ],
+ "content-security-policy/script-src/scriptnonce-changed-2.html": [
+ "f2321dd656e64c9b4831aae39c0717e53cec3aca",
+ "testharness"
+ ],
"content-security-policy/script-src/scriptnonce-ignore-unsafeinline.sub.html": [
"b595b76389ffce3e8ee642e9581073f4dbbe04a1",
"testharness"
@@ -469509,10 +470233,26 @@
"2cae85ec301fa2cd15005468b7efab6440ec2f17",
"testharness"
],
+ "content-security-policy/script-src/support/change-scripthash-before-execute.js": [
+ "a04e8575b2599f6ad40760957c8483cdc1023f58",
+ "support"
+ ],
+ "content-security-policy/script-src/support/change-scriptnonce-before-execute.js": [
+ "2676b34728f9e3d965adb36b59f15ccf54b0c3a0",
+ "support"
+ ],
+ "content-security-policy/script-src/support/empty.css": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ "support"
+ ],
"content-security-policy/script-src/support/inject-script.js": [
"c04033c46f09b55eb604d22d23fc2595a0928335",
"support"
],
+ "content-security-policy/script-src/support/inline-script-should-be-blocked.js": [
+ "f32d25074bd3c906de734fcf65cc3b23a8637e81",
+ "support"
+ ],
"content-security-policy/script-src/support/post-message.js": [
"69daa31d2f1b645d394ca41dab119924209d4871",
"support"
@@ -546966,7 +547706,7 @@
"testharness"
],
"css/css-fonts/inheritance.html": [
- "f0c46bec5083dd5b7f5bd0d8da49d5fc0ce01d81",
+ "6192e50638c0106abe798d2e5b8f004534646ad5",
"testharness"
],
"css/css-fonts/language-specific-01.html": [
@@ -547257,6 +547997,18 @@
"3887ab0cc4b59024544338d2338c3a723fe3b625",
"testharness"
],
+ "css/css-fonts/parsing/font-variation-settings-computed.html": [
+ "0b01320a7f6e2a473a44bc435bfe9507321ce135",
+ "testharness"
+ ],
+ "css/css-fonts/parsing/font-variation-settings-invalid.html": [
+ "b957c31009222be77397b82f7f044594e31d1866",
+ "testharness"
+ ],
+ "css/css-fonts/parsing/font-variation-settings-valid.html": [
+ "fe7f6bf7806891540a5fc495e7568cc5763c59b9",
+ "testharness"
+ ],
"css/css-fonts/parsing/font-weight-computed.html": [
"08208e5dd493a42bfdd1b9c0277ca49c151a9937",
"testharness"
@@ -556925,6 +557677,18 @@
"8054ebbb39cfc654192aa97e928264d7859319db",
"testharness"
],
+ "css/css-inline/parsing/dominant-baseline-computed.html": [
+ "e844dd71f84712bd2f60cce56ccdda00627ed5ee",
+ "testharness"
+ ],
+ "css/css-inline/parsing/dominant-baseline-invalid.html": [
+ "2c4b76e02698e172c290051892ee08d0b7cf751c",
+ "testharness"
+ ],
+ "css/css-inline/parsing/dominant-baseline-valid.html": [
+ "1a6c7a400cbec8117953389b5c54854991a66ad0",
+ "testharness"
+ ],
"css/css-layout-api/META.yml": [
"c85c2d4ccc0b02f3e22ca444952fb7583d96e7c7",
"support"
@@ -559250,19 +560014,19 @@
"reftest"
],
"css/css-multicol/multicol-breaking-000-ref.html": [
- "3d496cd391a09975106410abd5f4d297d93d1337",
+ "916f7161de60cf4dae2dab6baf29cba9483847db",
"support"
],
"css/css-multicol/multicol-breaking-000.html": [
- "391985d6a897c50955d2259cea4eedf1718f02a7",
+ "98f808164e7d83e789811f48964e85ea0efac064",
"reftest"
],
"css/css-multicol/multicol-breaking-001-ref.html": [
- "46357f940d29e578e07fd505c4143084ce58afee",
+ "db2b45c4dd669ae3d35af6b910c97e318a2cb700",
"support"
],
"css/css-multicol/multicol-breaking-001.html": [
- "69c9049266d12abcedfdb8fd8bdadeacbf8c505d",
+ "e1ba966923368009e785427483a8ee3cc65981a0",
"reftest"
],
"css/css-multicol/multicol-breaking-002-ref.html": [
@@ -559282,27 +560046,27 @@
"reftest"
],
"css/css-multicol/multicol-breaking-004-ref.html": [
- "016885a9e640a7e1cbd5e59fc0886cfb63219d60",
+ "f48ebb2108eb26239792981ae87dd7d2c4b4ef4f",
"support"
],
"css/css-multicol/multicol-breaking-004.html": [
- "34b9f59137eca3a63caacb860e0b4a7487121e66",
+ "82931ac85165637a5114a8b41be14ccfcf2e1857",
"reftest"
],
"css/css-multicol/multicol-breaking-nobackground-000-ref.html": [
- "e7ebcff4a082e2455d303163ee7b86131331427f",
+ "7a99354061cfeb982fffb921c850484dd02eac15",
"support"
],
"css/css-multicol/multicol-breaking-nobackground-000.html": [
- "a66a58fc746bff81deda9918d00dba816e1b9a72",
+ "768ec63298f03eb28a80a4e33f140314168b010d",
"reftest"
],
"css/css-multicol/multicol-breaking-nobackground-001-ref.html": [
- "006ec1d2221d80cb39e58228aacc5a779349d4bf",
+ "ecba5cd0d9a1cc25ff1d8111ab780cb89ee80747",
"support"
],
"css/css-multicol/multicol-breaking-nobackground-001.html": [
- "d47fcd31a0a78194e872f1b26f561b4377cc8766",
+ "78eda2331f0de812df260c48b63a679a08c39a0f",
"reftest"
],
"css/css-multicol/multicol-breaking-nobackground-002-ref.html": [
@@ -559925,6 +560689,22 @@
"055a015d7779866d9f5ee9f0c84c8e77c37e2151",
"visual"
],
+ "css/css-multicol/multicol-rule-nested-balancing-001-ref.html": [
+ "29acc05a2223a01015cc01106be6a49fee821237",
+ "support"
+ ],
+ "css/css-multicol/multicol-rule-nested-balancing-001.html": [
+ "0491bd37f1a6dea3428c04ac441a45c128a81860",
+ "reftest"
+ ],
+ "css/css-multicol/multicol-rule-nested-balancing-002-ref.html": [
+ "f557966178833f12063fa9b228f152cf66dce13b",
+ "support"
+ ],
+ "css/css-multicol/multicol-rule-nested-balancing-002.html": [
+ "b38f90947a917fba51d6b7192e567ec7816de1c8",
+ "reftest"
+ ],
"css/css-multicol/multicol-rule-none-000.xht": [
"32ca043957782f09c69bd77bd4933345228b81d7",
"reftest"
@@ -560141,6 +560921,38 @@
"1f2cbef4ab03b71872bd7b84927ca0681beb56a4",
"reftest"
],
+ "css/css-multicol/multicol-span-all-children-height-004a-ref.html": [
+ "0d6d44cc076a60fd9298096fac92b1e06939871b",
+ "support"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-004a.html": [
+ "366ca33d0785372c1b333268e82f89e1a4cb4059",
+ "reftest"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-004b-ref.html": [
+ "c6412ceaf3de72bd746c7cc060529ed80e891f16",
+ "support"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-004b.html": [
+ "19202323047093362e0e9970e19088394e040174",
+ "reftest"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-005-ref.html": [
+ "d5102e1f42073fa2691a97e0b3924e80ed3e2966",
+ "support"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-005.html": [
+ "33a820d32c5040da78edaf427a0ea6dc4a94d5ab",
+ "reftest"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-006-ref.html": [
+ "e34036b008b6d30fe5784a5519e54b52412590e5",
+ "support"
+ ],
+ "css/css-multicol/multicol-span-all-children-height-006.html": [
+ "dd63cd8716f58c4cae15b894196081607c1cb4fd",
+ "reftest"
+ ],
"css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [
"9f76ea15a0daa7753e76ad9b9a99948988c702d3",
"support"
@@ -560389,6 +561201,14 @@
"41ac007f00009d60c43b034bce68ded4cf23a007",
"reftest"
],
+ "css/css-multicol/multicol-span-all-rule-001-ref.html": [
+ "0ab9ac553457c0f801a724029f7b6dd20764da48",
+ "support"
+ ],
+ "css/css-multicol/multicol-span-all-rule-001.html": [
+ "215aa567409735ecc234002321eb38d19b7543cf",
+ "reftest"
+ ],
"css/css-multicol/multicol-span-float-001-ref.xht": [
"50addc37797b085d7c59e7389f99fca1c54c50c1",
"support"
@@ -561005,19 +561825,19 @@
"df1128316f6010f010e6d27c395d7751fa05d7b1",
"testharness"
],
- "css/css-overflow/overflow-body-propagation-001.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-001.html": [
"0998fe68e007d5a46ff11d5ff87fdbad12d1dfe2",
"reftest"
],
- "css/css-overflow/overflow-body-propagation-002.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-002.html": [
"5991dd52e8b6aec74f55780587f15c2b9399c968",
"reftest"
],
- "css/css-overflow/overflow-body-propagation-003.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-003.html": [
"a329a8dfe3e44c92368bf0496897f74ccec5a63a",
"reftest"
],
- "css/css-overflow/overflow-body-propagation-004.tentative.html": [
+ "css/css-overflow/overflow-body-propagation-004.html": [
"2ed8d2687a33608e0e70884ad2ea59330d2b09e3",
"reftest"
],
@@ -561221,6 +562041,10 @@
"8f5b1ef53eb72dd82f1211744a21c34dede17b46",
"support"
],
+ "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html": [
+ "c0f0214ee186a0b13787f6f86bd199e7d6df7ac0",
+ "testharness"
+ ],
"css/css-overflow/webkit-line-clamp-001.html": [
"bba3d1c49f2dab5055fbceb7313659f463454166",
"reftest"
@@ -561362,7 +562186,7 @@
"support"
],
"css/css-overscroll-behavior/inheritance.html": [
- "e49fa49bc4e26572a68ad947e8e82a63ee46d4e2",
+ "823d6239471a819dfb4e33bdeb646f7fbbfa220f",
"testharness"
],
"css/css-overscroll-behavior/overscroll-behavior-logical.html": [
@@ -562981,6 +563805,10 @@
"ae3222595453ec46cf48810cb2f276126897bac6",
"support"
],
+ "css/css-pseudo/before-dynamic-display-none.html": [
+ "d8844f9c961e94b2fd353628cb2c6e3e12123054",
+ "reftest"
+ ],
"css/css-pseudo/first-letter-001-ref.html": [
"d832a308ef93d85437ea23fccc70447b0c2a339f",
"support"
@@ -572314,7 +573142,7 @@
"support"
],
"css/css-text/line-break/line-break-anywhere-001.html": [
- "a031765b3245aa8b4efe303b5d4cd6019b6aa4a0",
+ "6ae60eadb9e59021736da5a25c685230cd36d0eb",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-002.html": [
@@ -572502,7 +573330,7 @@
"reftest"
],
"css/css-text/line-break/reference/line-break-anywhere-001-ref.html": [
- "ff74b3bce2d5ece698b404ecd30b53538c0eb420",
+ "daf17c9c0aa310ec26ea0d2510add74675f6216c",
"support"
],
"css/css-text/line-break/reference/line-break-anywhere-003-ref.html": [
@@ -575529,6 +576357,10 @@
"8dd08d80992e6d6310a6697f84c2533d399c8e5e",
"reftest"
],
+ "css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html": [
+ "c7e1855f9794f42f965e64fc390e1b50b83059fb",
+ "testharness"
+ ],
"css/css-text/white-space/pre-wrap-001.html": [
"87ffad96310532a6501e1b75c30f986433cc634e",
"reftest"
@@ -595161,6 +595993,18 @@
"3b062c7548f1485269b4b74570975beab4d0760f",
"testharness"
],
+ "css/cssom-view/parsing/scroll-behavior-computed.html": [
+ "ffea289ea0bf1e5b443c3f0a02151ddfa06638c2",
+ "testharness"
+ ],
+ "css/cssom-view/parsing/scroll-behavior-invalid.html": [
+ "6dfe36e21100efd31a058d5f3e1bcd5c50efd7e6",
+ "testharness"
+ ],
+ "css/cssom-view/parsing/scroll-behavior-valid.html": [
+ "6e708b9d81c31420c7e6b80f9b8a90a73fb21e2f",
+ "testharness"
+ ],
"css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html": [
"ec1f6e2f40f32b77676ae545fd095987117d4ffe",
"testharness"
@@ -597598,7 +598442,7 @@
"support"
],
"css/motion/animation/offset-anchor-interpolation.html": [
- "7ad9482a2b4b65eda290a9ed33f3db24acd7bce9",
+ "75f855a2c8aff046c2817201197b3eb345327a4a",
"testharness"
],
"css/motion/animation/offset-distance-interpolation.html": [
@@ -597645,6 +598489,14 @@
"9bc2409061d0ca3df287d33fdfb84bdecf522d01",
"support"
],
+ "css/motion/animation/reftests/offset-path-with-transforms-001.html": [
+ "c554264032737899f8ff5e3e6816085ba5a90a29",
+ "reftest"
+ ],
+ "css/motion/animation/reftests/offset-path-with-transforms-ref.html": [
+ "413369e0effe0b2cf0236be14c419f2cfeaaf5f3",
+ "support"
+ ],
"css/motion/animation/reftests/offset-rotate-interpolation-001.html": [
"360caeea68242cc80cbdb131884c633a6f3f7b47",
"reftest"
@@ -597754,7 +598606,7 @@
"support"
],
"css/motion/offset-supports-calc.html": [
- "9ec737e6a87198e390b4adc0c0cc5a349dc1bc43",
+ "907694f7fc32ebb1c44787fcfbf5980627d2919e",
"testharness"
],
"css/motion/parsing/offset-anchor-parsing-invalid.html": [
@@ -597762,7 +598614,7 @@
"testharness"
],
"css/motion/parsing/offset-anchor-parsing-valid.html": [
- "a69a5ce9f8117262db576430ea9c840b958a14fa",
+ "6cb4d44117fa6361fc87efdee22e79bc6df749b5",
"testharness"
],
"css/motion/parsing/offset-distance-parsing-invalid.html": [
@@ -609658,7 +610510,7 @@
"testharness"
],
"custom-elements/reactions/HTMLInputElement.html": [
- "65e33e8411f7d1109a54cecf72c84c96d51f5503",
+ "13d1591b01fdf9b4fcc5b3f89438bff55df75278",
"testharness"
],
"custom-elements/reactions/HTMLLIElement.html": [
@@ -609929,6 +610781,10 @@
"0fb15da15387ed4bf32a14e01536c7d2b4f81030",
"support"
],
+ "docs/assets/reftest-tutorial-test-screenshot.png": [
+ "611fffbd220b8a8ab56216786dd3f85e2934906b",
+ "support"
+ ],
"docs/assets/reftest_graph_example.svg": [
"48e6488dbb47dc8fccab9193bb34871f2bb930a2",
"support"
@@ -609966,11 +610822,11 @@
"support"
],
"docs/running-tests/chrome.md": [
- "3d68506f2c855e4ea0755f6bcb56646ae7f4098a",
+ "c56d3c56f846f0318e452765192df27beb05e2b9",
"support"
],
"docs/running-tests/chrome_android.md": [
- "5851cd5572264cb06066b9c8d6721bd1fe995a0a",
+ "a216a8a68b8f7287a0a9295c59fdeeac4d2ddd65",
"support"
],
"docs/running-tests/command-line-arguments.md": [
@@ -610034,7 +610890,7 @@
"support"
],
"docs/writing-tests/index.md": [
- "08a90ff5763405ee5eae0830f40c71336372e222",
+ "8af5aef5fed5a65eb993f596b04e98a7d2bea6f6",
"support"
],
"docs/writing-tests/lint-tool.md": [
@@ -610049,8 +610905,12 @@
"f75703bb9efdb1a467b9172be9385bfdd63ad537",
"support"
],
+ "docs/writing-tests/reftest-tutorial.md": [
+ "5eabb07089467c8752461827f65017683fdcb86e",
+ "support"
+ ],
"docs/writing-tests/reftests.md": [
- "c28a5d56566bd99bc79bd76150ae731b3091b26e",
+ "845d6f8dc4fcff2b12e6c06b320684d6b7cba70d",
"support"
],
"docs/writing-tests/rendering.md": [
@@ -610066,7 +610926,7 @@
"support"
],
"docs/writing-tests/submission-process.md": [
- "d6ddce5a7655603a17c9cbd60f57ec3a00d42413",
+ "a970f47cf1d64461ed5cbdb01f246b05908ba685",
"support"
],
"docs/writing-tests/testdriver-tutorial.md": [
@@ -610078,7 +610938,7 @@
"support"
],
"docs/writing-tests/testharness-api.md": [
- "17fc37dcc6121512e35a8346536d79492cd0fda4",
+ "329359caad6bb8f1764206d902f86380f1cc5780",
"support"
],
"docs/writing-tests/testharness.md": [
@@ -614874,37 +615734,69 @@
"support"
],
"eventsource/dedicated-worker/eventsource-close.htm": [
- "42ebb1da875174fbb18d2f5c0211c1df0a6c3516",
+ "f26aaaa4a900dcb8cafcbe36734bc888e0c638ab",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-close.js": [
+ "875c9098bac380f122d075143d239da63bb33b31",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-close2.htm": [
- "b1b74e88b82d3f6be6e2e7a7fb4b3a49b92e47b0",
+ "34e07a2694e26e759f2b66e6749f192e77639d7b",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-close2.js": [
+ "4a9cbd20b8ab178b184dc0f853eaf0419d6b047e",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm": [
- "a90bbeb0bdc62e8433b1913a119609e22c1afd39",
+ "b49d7ed609d071a91079143a4538b12ef2d725f4",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js": [
+ "5ec25a0678ce3a4153d5c8998ac0bd8a9f54f44b",
+ "support"
+ ],
+ "eventsource/dedicated-worker/eventsource-constructor-url-bogus.js": [
+ "2a450a346314dec2253a0641de81b81dfc6d78f5",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-eventtarget.worker.js": [
"73b30556c497863efc611cbf35e81f7953883b3e",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-onmesage.js": [
+ "9629f5e7936430b17c8ca99b150054aa7917c669",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-onmessage.htm": [
- "2de142ca5af6f922b82d2c1d13cb777f9ab6f9df",
+ "c61855f5249da7984e6869caf735e10779a75ea5",
"testharness"
],
"eventsource/dedicated-worker/eventsource-onopen.htm": [
- "e753b42f7b5f065d7835cb86bc233e1ef8deb3ac",
+ "010b0c66a8c0656cd65112926bb0be1b2d1d3075",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-onopen.js": [
+ "72a1053263040b94653d9d2090b00c999c599c24",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-prototype.htm": [
- "b16e24c86176446652fade5d099ecb4387b34fe7",
+ "5a5ac4ec2a72173103f934ef1c64b17361e3c56a",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-prototype.js": [
+ "26993cb4efdc50d73d60f33c27381925bb50a054",
+ "support"
+ ],
"eventsource/dedicated-worker/eventsource-url.htm": [
- "c1ed078271300e8bbeeb3c3ea31ecb9b643d0dc0",
+ "59e77cba57c3b48c5f5d53e7f1e9e78e7a50cd70",
"testharness"
],
+ "eventsource/dedicated-worker/eventsource-url.js": [
+ "7a3c8030d27581daccd610007ae87637dda0c120",
+ "support"
+ ],
"eventsource/event-data.html": [
"3751f8e7b1cf938c3248bdeddd0f85d2cf68c6a7",
"testharness"
@@ -615134,33 +616026,65 @@
"support"
],
"eventsource/shared-worker/eventsource-close.htm": [
- "0a0bdc7b866566566fc87baeff08f47ee0072f89",
+ "30fbc309ab67c2d2cd6c2334c661874ad5ab9453",
"testharness"
],
+ "eventsource/shared-worker/eventsource-close.js": [
+ "8d160b605f2b17ead47ed7191c04ad2b9aff0fe3",
+ "support"
+ ],
"eventsource/shared-worker/eventsource-constructor-non-same-origin.htm": [
- "1cf4a15ee664c16bb665fcf5fe9da3baf19bec0c",
+ "690cde360024569e5d77e1d992713adfcb995d82",
"testharness"
],
+ "eventsource/shared-worker/eventsource-constructor-non-same-origin.js": [
+ "a68dc5b0b7dac67037315d293ae879cc70fc2a4d",
+ "support"
+ ],
+ "eventsource/shared-worker/eventsource-constructor-url-bogus.js": [
+ "80847357b5519769c47e2731817b3577375e2900",
+ "support"
+ ],
"eventsource/shared-worker/eventsource-eventtarget.htm": [
- "f5f9439d12720cd7acb7c0ca6317c69a6af19d3f",
+ "f25509dfd4a8586dbc719f1a74cf203eaed3b902",
"testharness"
],
+ "eventsource/shared-worker/eventsource-eventtarget.js": [
+ "761165118ac788fb7df2ae0c62e1d43d32041852",
+ "support"
+ ],
+ "eventsource/shared-worker/eventsource-onmesage.js": [
+ "f5e2c898df0cdacb7da29e84858abef4eb6f2ad7",
+ "support"
+ ],
"eventsource/shared-worker/eventsource-onmessage.htm": [
- "82c3ce7f2388b28cf9b089246108dabfb9a906c2",
+ "bcd6093454d2a074db09233ef747d46147ca3248",
"testharness"
],
"eventsource/shared-worker/eventsource-onopen.htm": [
- "25467817ff9e7aaee0255e2c6049af51cab579f8",
+ "752a6e449f958ebc3ecb8604c35cfa0d6927ddfe",
"testharness"
],
+ "eventsource/shared-worker/eventsource-onopen.js": [
+ "6dc9424a213d793e52e7e6788a849b6f08107488",
+ "support"
+ ],
"eventsource/shared-worker/eventsource-prototype.htm": [
- "27d51a8587b8b66acc9c22686b9fa03818580395",
+ "16c932a3384eb661e501bc5e11f8be0f4fb2c89d",
"testharness"
],
+ "eventsource/shared-worker/eventsource-prototype.js": [
+ "f4c809a9b3e33225c33ca5e883c993621a812e18",
+ "support"
+ ],
"eventsource/shared-worker/eventsource-url.htm": [
- "0491085e9e379e5f40d7f883b3e97dadd927d70c",
+ "a1c9ca8455fb8a6e9aa95e9a0f644d5398e9afa1",
"testharness"
],
+ "eventsource/shared-worker/eventsource-url.js": [
+ "491dbac33320d99b714747c864ca2b42467c0b57",
+ "support"
+ ],
"feature-policy/META.yml": [
"a4136f77e3fbd8524939de235eaff9c0211bfdba",
"support"
@@ -619002,7 +619926,7 @@
"manual"
],
"html-media-capture/capture_reflect.html": [
- "39f391eb674dd33f2250d00a1fcdd3d509a43a9a",
+ "f593236b5325eb756ee6b43f653a3138cb1d8d6b",
"testharness"
],
"html-media-capture/capture_video_cancel-manual.html": [
@@ -628189,6 +629113,10 @@
"888e6d0a3ff7ade1f9f3c5849f94cdcd4f13b231",
"testharness"
],
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html": [
+ "b5f3ec1aa62d8238628409fcda14b189e7ed2a65",
+ "testharness"
+ ],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.tentative.html": [
"ae266882b1957080b28f1204a0183c6ca015cadc",
"testharness"
@@ -639394,7 +640322,7 @@
"support"
],
"interfaces/css-properties-values-api.idl": [
- "ee444ebb29d8b5b15c96d259bb8a1f2bdd280d5f",
+ "d8f54b1e15bc020ef101ab53626eee6985c63dcb",
"support"
],
"interfaces/css-pseudo.idl": [
@@ -639418,7 +640346,7 @@
"support"
],
"interfaces/cssom.idl": [
- "798adc19f2a974beef4dd4ab8822524f807496b7",
+ "dc9b78fda6180dba6b7958c3429a77e0fb5048b2",
"support"
],
"interfaces/dedicated-workers.idl": [
@@ -639502,7 +640430,7 @@
"support"
],
"interfaces/html.idl": [
- "5ae46f742922f4c455380745f124769399086eb9",
+ "47abcda810a1f94f5704623db63fdec9805cc9c9",
"support"
],
"interfaces/image-capture.idl": [
@@ -639529,6 +640457,10 @@
"f16a7ff812c96ab28f7d3b8d0f1b92d141e552a0",
"support"
],
+ "interfaces/layout-instability.idl": [
+ "1bacea77bcef8913b1df220a29cf35448074707c",
+ "support"
+ ],
"interfaces/longtasks.idl": [
"333b842f86e5d41f6f1aab8827cf086356c5a782",
"support"
@@ -639762,7 +640694,7 @@
"support"
],
"interfaces/web-nfc.idl": [
- "365b38ff191920a39a98417097c2e7fc8a7e3574",
+ "13afc27663da2f3deb9c939032836073d49f83e9",
"support"
],
"interfaces/web-share.idl": [
@@ -639774,7 +640706,7 @@
"support"
],
"interfaces/webauthn.idl": [
- "bf57b8bccf4ebf1e93927fcbe047b8037ad047aa",
+ "67fd504a54e1bcb346c71cb27c89fca7e40c1876",
"support"
],
"interfaces/webdriver.idl": [
@@ -640365,6 +641297,10 @@
"dabc8068931ff3b15eb4b80481ed2102a7725a62",
"testharness"
],
+ "layout-instability/idlharness.window.js": [
+ "7d97446a57808576722a823f604effa94bb95e76",
+ "testharness"
+ ],
"layout-instability/observe-layout-shift.html": [
"8e5624e09a3d92975f315f7601c8cfc474c89c9e",
"testharness"
@@ -641054,11 +641990,11 @@
"reftest"
],
"mathml/relations/css-styling/displaystyle-1.html": [
- "c59e690f162f4977fb172e37ae7b34fe100379ae",
+ "73e5020e74ce3c77c38b0b7224ed4a0245f5f1b0",
"testharness"
],
"mathml/relations/css-styling/displaystyle-2.html": [
- "f89ade019b52d66d12737517e54436768ac7605a",
+ "fc1bd7a432db692f695e101cf07d183fff71a5a5",
"testharness"
],
"mathml/relations/css-styling/dynamic-dir-1-ref.html": [
@@ -641246,15 +642182,15 @@
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/border-002.html": [
- "85a3dc2e2ac5797fea9a311cde82854eb80b33f2",
+ "f78bc588c04cc3d7b7939a194b2b577bab8f1ae7",
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/margin-001.html": [
- "67146882319b40398caa461a3ce86501bee19557",
+ "e7e2584cc45215aabc608b006529d0799e7c7617",
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/margin-002.html": [
- "87583b584a34faf3cf7cd54551f74ebf09009618",
+ "69e1fd6b033c1a4be5e8f46bb699d08caf558eca",
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/padding-001.html": [
@@ -641262,7 +642198,7 @@
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/padding-002.html": [
- "c634e4076e066686bb7bd5dd77e36716020f82c3",
+ "a2f167a34040e067e3f41db33034ecb891204d58",
"testharness"
],
"mathml/relations/css-styling/padding-border-margin/padding-border-margin-001-ref.html": [
@@ -641310,11 +642246,19 @@
"testharness"
],
"mathml/relations/css-styling/writing-mode/writing-mode-001.html": [
- "01a93eb15f0af1b4fc7455e5b208898cca6e88e3",
+ "cbc8ce7da217a3b990cc2493cd8fe666b3517a8e",
+ "testharness"
+ ],
+ "mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html": [
+ "642ee66965181d2894d0c5ea67e21939f48eb66f",
"testharness"
],
"mathml/relations/css-styling/writing-mode/writing-mode-002.html": [
- "97be6292eb0b40f4431dd8c7f11fe0e5711d838f",
+ "85c869eba3bc3ebc5c1c209b81b29d6f03b0ae9a",
+ "testharness"
+ ],
+ "mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html": [
+ "e86f03a4f0267bd2f62b36c7e1aa32352ee2adc6",
"testharness"
],
"mathml/relations/html5-tree/class-1-ref.html": [
@@ -641338,7 +642282,7 @@
"reftest"
],
"mathml/relations/html5-tree/display-1.html": [
- "6747413e477a0baeb8dc8ea75a2ddd7b97b6f280",
+ "9ecd45f9a4087e41a98546d1afb6faca9d396403",
"testharness"
],
"mathml/relations/html5-tree/dynamic-1-ref.html": [
@@ -641393,6 +642337,10 @@
"1f62d8e630a1361ca65c5c76679f4e61bb2688dc",
"reftest"
],
+ "mathml/relations/html5-tree/integration-point-4.html": [
+ "7121db645b2761f999c9492a44601d54531d6170",
+ "testharness"
+ ],
"mathml/relations/html5-tree/required-extensions-2-ref.html": [
"dcc5b2b7d337e769299df17a0eacafddc92665c6",
"support"
@@ -641437,8 +642385,12 @@
"4e92a846461b65d150cef9a9444de27abf40a26d",
"reftest"
],
+ "mathml/support/attribute-values.js": [
+ "8408124f49a3f7c3dcb2bec53fa4ccec8a049e1f",
+ "support"
+ ],
"mathml/support/box-comparison.js": [
- "b1e91cdd99ad197bd1302353dcedf71b74c0edb3",
+ "77d145b36324d1ac4f06b97a49f8609d6202c9bc",
"support"
],
"mathml/support/feature-detection.js": [
@@ -641450,7 +642402,7 @@
"support"
],
"mathml/support/mathml-fragments.js": [
- "097ca8690b452a147be295a17c90bd7b4e0342f4",
+ "013171cf8c2af515d69d60d58795dedcd75780bd",
"support"
],
"mathml/tools/axisheight.py": [
@@ -642402,7 +643354,7 @@
"testharness"
],
"mediacapture-streams/MediaDevices-getUserMedia.https.html": [
- "70fe67b30f507b065963e1764aea1eddb5bc927b",
+ "693f3bd11cfaa6be7ca21bae110467c265be5a07",
"testharness"
],
"mediacapture-streams/MediaStream-MediaElement-firstframe.https.html": [
@@ -642482,7 +643434,7 @@
"testharness"
],
"mediacapture-streams/MediaStreamTrack-getSettings.https.html": [
- "4d51f9dc831efe53fd69eec08fd18a046ede2aa2",
+ "1bc1f9b5740e30ef3635ed76f974c535563ac9da",
"testharness"
],
"mediacapture-streams/MediaStreamTrack-id.https.html": [
@@ -643018,7 +643970,7 @@
"support"
],
"mixed-content/generic/tools/generate.py": [
- "ed978bcef9cc9322ef600e5217ae1d754588d50b",
+ "9c911aa6c4102a411c1b134e33afeab69f600647",
"support"
],
"mixed-content/generic/tools/regenerate": [
@@ -654637,14 +655589,22 @@
"93b6037ca632a678f8c3f1e071392e8e3bf1540c",
"testharness"
],
- "referrer-policy/generic/iframe-inheritance.html": [
- "28e83df6c2ab9b27417b15948929d044095fdceb",
- "testharness"
- ],
"referrer-policy/generic/iframe-src-change.html": [
"15202a76a1ea3b7ad8deb35cdb33826414d7a95b",
"testharness"
],
+ "referrer-policy/generic/inheritance/iframe-inheritance-data.html": [
+ "06c3c9b0c4bcf4297f903d422110c2de420679e3",
+ "testharness"
+ ],
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html": [
+ "08acb405c211e4cf84ae6565a84120ad45b0271b",
+ "testharness"
+ ],
+ "referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html": [
+ "34ea0045b4871d97acc9b9359e7920c7e04d8c59",
+ "testharness"
+ ],
"referrer-policy/generic/link-rel-prefetch.html": [
"914ddfc4b225d26c675c61ecf623fdebb10e4524",
"testharness"
@@ -654746,7 +655706,7 @@
"support"
],
"referrer-policy/generic/tools/generate.py": [
- "98374982a8d17909e7f192c6d90ae7998e21953b",
+ "ba1e963787bef98bdd0a3eb2016296995f631f97",
"support"
],
"referrer-policy/generic/tools/regenerate": [
@@ -664005,6 +664965,10 @@
"8f988f99a82e0991c20cb816be6378a973028733",
"support"
],
+ "resources/SVGAnimationTestCase-testharness.js": [
+ "8fabc9a8c110ac6210a298ed08cbb33d8ecd9266",
+ "support"
+ ],
"resources/check-layout-th.js": [
"928b0cf2a1041ecb831fadb44943e8907a29b872",
"support"
@@ -664150,7 +665114,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
- "43857bdc69599323f55ae453d092036fb8c27db6",
+ "19b207ff4284af82e1c36cf9f584df793e8238f0",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@@ -670153,6 +671117,50 @@
"34be9b9781f707d488e284c3285b82009557366b",
"testharness"
],
+ "svg/animations/scripted/onhover-syncbases.html": [
+ "86a0a40fa2de116c5b2076641180b24688d56f9b",
+ "testharness"
+ ],
+ "svg/animations/svgnumberoptionalnumber-animation-4.html": [
+ "4c734b5373762e9844511f5ac7b550743a50f0b2",
+ "testharness"
+ ],
+ "svg/animations/svgpath-animation-1.html": [
+ "220130532e9fbd223e0ed8b02e1771a06229e3bf",
+ "testharness"
+ ],
+ "svg/animations/svgpointlist-animation-1.html": [
+ "a3340ba83a2a0f6846d0a9e7faa1c27dd49a1383",
+ "testharness"
+ ],
+ "svg/animations/svgpointlist-animation-2.html": [
+ "e0819cd519c7e0a6a05bdd8e6cfa0991433f0f99",
+ "testharness"
+ ],
+ "svg/animations/svgrect-animation-1.html": [
+ "d13ccff418ff36c3f928e45aa14766a0d041e988",
+ "testharness"
+ ],
+ "svg/animations/svgrect-animation-2.html": [
+ "86f5368a3adfa4e40e84327f9170a74c231d0b03",
+ "testharness"
+ ],
+ "svg/animations/svgstring-animation-1.html": [
+ "259dfbd27a0a1f203dd3faf6feaad106d782a2b0",
+ "testharness"
+ ],
+ "svg/animations/svgstring-animation-fallback-to-discrete.html": [
+ "8cf6c34af0d4af11e4fa89a9d495936bda0cbfa9",
+ "testharness"
+ ],
+ "svg/animations/svgtransform-animation-1.html": [
+ "618ba9a31c00bf2ff56bf842ad1ec40fdbfc73fa",
+ "testharness"
+ ],
+ "svg/animations/svgtransform-animation-discrete.html": [
+ "17b78a2787d0becf64b90136fcf0f6f966404baa",
+ "testharness"
+ ],
"svg/coordinate-systems/abspos.html": [
"fb37bbe7f3ae4a61d1c216970c8a263673aed0dc",
"reftest"
@@ -672961,6 +673969,10 @@
"18402493f3c779b9427b383cc668033ac46c4936",
"testharness"
],
+ "svg/painting/parsing/marker-computed.svg": [
+ "329dedbbce239c627ccf47c7a14b59b00ac7ebd2",
+ "testharness"
+ ],
"svg/painting/parsing/marker-end-computed.svg": [
"da641abb9441a49829f5e8f1f4b5a599914b5515",
"testharness"
@@ -672973,6 +673985,10 @@
"5be036e994637be7abfe4440618cd4bb16b5d5a7",
"testharness"
],
+ "svg/painting/parsing/marker-invalid.svg": [
+ "64112cd6a779547dfc6d23ceb92ff9003f1b4669",
+ "testharness"
+ ],
"svg/painting/parsing/marker-mid-computed.svg": [
"eddfd6171143906feb118a1bb6534c245a7ea8ff",
"testharness"
@@ -672997,6 +674013,10 @@
"fd6f2d6fe425ec1e4ab5c7ee6425a5e4ead823bc",
"testharness"
],
+ "svg/painting/parsing/marker-valid.svg": [
+ "23d3f24f5cca3077002f1a02f669df9505ec745b",
+ "testharness"
+ ],
"svg/painting/parsing/paint-order-computed.svg": [
"29f5fa91bae31a8f55e895ead7fe999e53fdc963",
"testharness"
@@ -674357,6 +675377,14 @@
"a72dcfe5cfdd516528312488c0d731557fb85492",
"support"
],
+ "tools/ci/tests/test_update_pr_preview.py": [
+ "08e46b9a63ee77f6635d27b482e1c727774fe606",
+ "support"
+ ],
+ "tools/ci/update_pr_preview.py": [
+ "9b104c66bb6a8089e81f633ad5e64cb33ea4f7c1",
+ "support"
+ ],
"tools/ci/website_build.sh": [
"aadfcbd6a212574fa5462447072b996ae214de6b",
"support"
@@ -674373,10 +675401,22 @@
"e60b4ea6a3a1c909c715fb7248a6f1b0cc6e9d4e",
"support"
],
+ "tools/docker/__init__.py": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ "support"
+ ],
+ "tools/docker/commands.json": [
+ "15182cc9e6531d5a5ba3d42c9f00821946c5e8a3",
+ "support"
+ ],
"tools/docker/documentation/Dockerfile": [
"e01f98e4d4df0e7f7501bb5d7057d1d528221bde",
"support"
],
+ "tools/docker/frontend.py": [
+ "c4a207345820d534df5cc092c8b46838a5b8ce1f",
+ "support"
+ ],
"tools/docker/github/Dockerfile": [
"22d47f3e5fa9032e5f016f6f15720fa98e1ba625",
"support"
@@ -674386,7 +675426,7 @@
"support"
],
"tools/docker/start.sh": [
- "b1ff4a7faa5ef7a3519fb8797a02557432de2c34",
+ "dbeeed41c149398cb12202a9e10b71e745d06d90",
"support"
],
"tools/gitignore/__init__.py": [
@@ -674622,7 +675662,7 @@
"support"
],
"tools/manifest/tests/test_item.py": [
- "1cbe84708b4888faabe97c63568c7f1aea970d56",
+ "cf52fe80aad04e5dcb35034352e9fb8edd53ecb6",
"support"
],
"tools/manifest/tests/test_manifest.py": [
@@ -674662,7 +675702,7 @@
"support"
],
"tools/pytest.ini": [
- "b52e465598ab97faa6b718859617f2194141fbb4",
+ "6bdb4d563f6dd5086ed3e09715187e549edf255a",
"support"
],
"tools/pywebsocket/CONTRIBUTING": [
@@ -679062,7 +680102,7 @@
"support"
],
"tools/tox.ini": [
- "63fb8ed9832ba9d11dae965e3c335e3d26289720",
+ "52e749e4bdc4c7626df8ba67fb08a6209ea35ff2",
"support"
],
"tools/webdriver/.gitignore": [
@@ -679102,7 +680142,7 @@
"support"
],
"tools/wpt/browser.py": [
- "1f0134153169703b897f70849193d4076c64673b",
+ "0943ee9f3d74fa1e7542712682563f0badfea54d",
"support"
],
"tools/wpt/commands.json": [
@@ -679114,7 +680154,7 @@
"support"
],
"tools/wpt/install.py": [
- "b107752d81b6fd6ae6bd70bc330e8575aa3d7822",
+ "8215dfe09161ad49ba3975e1eacc927c61715acf",
"support"
],
"tools/wpt/markdown.py": [
@@ -679122,7 +680162,7 @@
"support"
],
"tools/wpt/paths": [
- "4528222fbf56e40ac8db2342553bf889fe7e4a53",
+ "093a71568920a944b0b8361165f5ea5fa002ee14",
"support"
],
"tools/wpt/requirements.txt": [
@@ -679130,7 +680170,7 @@
"support"
],
"tools/wpt/run.py": [
- "d5d7e7a21f5f3b195ce5b93141d6798bdfeb5e2d",
+ "617ea7282b893fc17e8a794191f3223911d63dde",
"support"
],
"tools/wpt/testfiles.py": [
@@ -679146,7 +680186,7 @@
"support"
],
"tools/wpt/tests/test_run.py": [
- "cd70fef5e8bf48d73a0e3cc36f11d28088140139",
+ "bc43e647c31ab7023461e6ed83329a4ae76ca6f9",
"support"
],
"tools/wpt/tests/test_testfiles.py": [
@@ -679234,7 +680274,7 @@
"support"
],
"tools/wptrunner/requirements_chrome_android.txt": [
- "1bf6ef32ad473a716cc969d06f147e5e827ade35",
+ "470aaf9a93996d0231e13e05cc35557a36d25de9",
"support"
],
"tools/wptrunner/requirements_chrome_ios.txt": [
@@ -679418,7 +680458,7 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/chrome_android.py": [
- "31ae7995b4010a6fcef0c585eed1128815837fcb",
+ "b8ebedef0487d267c0da59b488d159c776319316",
"support"
],
"tools/wptrunner/wptrunner/browsers/chrome_ios.py": [
@@ -679442,11 +680482,11 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/firefox.py": [
- "7e6d017d541ac85a4b711f18c037a832c134b9ef",
+ "13739e5103ea0452cc9b6bbda784ebc811027b53",
"support"
],
"tools/wptrunner/wptrunner/browsers/firefox_android.py": [
- "b6d7bc8851e0fd9b8cb2745e7360a665152b7cba",
+ "30e53a593cff7ec3fa026c2a4f2495402650c1dc",
"support"
],
"tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -679474,11 +680514,11 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/servo.py": [
- "2e0b0a25c142b5f5b1f9e75949761d3d1276d7d9",
+ "d3ed4b3fb1d464ecb012a68323dde7c942db14e1",
"support"
],
"tools/wptrunner/wptrunner/browsers/servodriver.py": [
- "2bf6b282819dd1f1c6f23e8f0fa47b99dacdba24",
+ "54a22b4f729e88a30a7fba8f231f83f1a2aa6ad2",
"support"
],
"tools/wptrunner/wptrunner/browsers/webkit.py": [
@@ -679542,7 +680582,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/executorwebdriver.py": [
- "37f735d5751167cc946e18f9002d75653fcce099",
+ "898447df6f5b8059a209863f6b4f15f326ebd850",
"support"
],
"tools/wptrunner/wptrunner/executors/executorwebkit.py": [
@@ -679593,6 +680633,10 @@
"f06abb946af16f690d434715c7b933f12d5a3335",
"support"
],
+ "tools/wptrunner/wptrunner/expectedtree.py": [
+ "4d505086bd8d991c953c34d38d8e1fa0cb920f99",
+ "support"
+ ],
"tools/wptrunner/wptrunner/font.py": [
"6647a8580be7ab4050bbd37593b2e6595bc3ac72",
"support"
@@ -679602,11 +680646,11 @@
"support"
],
"tools/wptrunner/wptrunner/formatters/chromium.py": [
- "15e8e0b0ce9d09ef4783cd429610d221c91255f3",
+ "707a8519a55950143137cd04038a67b9ad387f38",
"support"
],
"tools/wptrunner/wptrunner/formatters/tests/test_chromium.py": [
- "b2c261f92f7e9b4ef8b225e337044d50dfa0c46c",
+ "87691cf5a980b8d00b1b4e77eed80429009b46ee",
"support"
],
"tools/wptrunner/wptrunner/formatters/wptreport.py": [
@@ -679626,15 +680670,15 @@
"support"
],
"tools/wptrunner/wptrunner/manifestupdate.py": [
- "2b0288668cc1c86c5bed2b3e0e4a49dd3294b6c6",
+ "4753fde00834313337e6d78cd48f78cdaf27983f",
"support"
],
"tools/wptrunner/wptrunner/metadata.py": [
- "6c8f9ee37f46512705adab9dabfbeba2bbce01cc",
+ "ca6165f7ad09bb831552177d0df6e6dde8a80e52",
"support"
],
"tools/wptrunner/wptrunner/products.py": [
- "4575dfb5e95c016168f68dd4377b4345cac75f16",
+ "e3117042709f99f4e0443dc0dfaf561ad0b548b0",
"support"
],
"tools/wptrunner/wptrunner/stability.py": [
@@ -679670,7 +680714,7 @@
"support"
],
"tools/wptrunner/wptrunner/testrunner.py": [
- "d7b51c5eb275842b873c3cd7dbba6d065a8b0373",
+ "c6dbd70f1bfdcf00706317c1315a16a0a6128b2a",
"support"
],
"tools/wptrunner/wptrunner/tests/__init__.py": [
@@ -679689,6 +680733,10 @@
"06a5641d50fbbaed4de9df511c567753ef1a326d",
"support"
],
+ "tools/wptrunner/wptrunner/tests/test_expectedtree.py": [
+ "2308be9590e9004f41a492682d187a7b4fc57231",
+ "support"
+ ],
"tools/wptrunner/wptrunner/tests/test_formatters.py": [
"72f3a591ad7f90532671ccb897dfcb161bc8f45d",
"support"
@@ -679710,7 +680758,7 @@
"support"
],
"tools/wptrunner/wptrunner/tests/test_update.py": [
- "0c1fa78dc0610dfc0d93235b30103cadb92581a6",
+ "3860ba6f36d1f6dea7c11616586c257fe7174e85",
"support"
],
"tools/wptrunner/wptrunner/tests/test_wpttest.py": [
@@ -679726,7 +680774,7 @@
"support"
],
"tools/wptrunner/wptrunner/update/metadata.py": [
- "62569fbd9ff27e44adacc652b3f9c409f6ce8df6",
+ "4bc70d311040d3397e1d0120ad82d40124705190",
"support"
],
"tools/wptrunner/wptrunner/update/state.py": [
@@ -679742,7 +680790,7 @@
"support"
],
"tools/wptrunner/wptrunner/update/update.py": [
- "0bcaf823b72c30e346a64f3c0344bc2275df64f5",
+ "c4f1e7e93ec5b93efede7853103cb48ff52c0767",
"support"
],
"tools/wptrunner/wptrunner/vcs.py": [
@@ -679754,7 +680802,7 @@
"support"
],
"tools/wptrunner/wptrunner/wptcommandline.py": [
- "928a153dbd9d1f9595e55d2b69ddd2447f811754",
+ "5ac29b302e65a7e6fd8330e4ad787233de7d5ec6",
"support"
],
"tools/wptrunner/wptrunner/wptlogging.py": [
@@ -679774,7 +680822,7 @@
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py": [
- "5719a859fa4bc7e4ab4d1e9329ca74b2af6666f7",
+ "43225a1e72861ee4ee3b8b6e1fb0594a17a0891d",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/backends/static.py": [
@@ -679782,15 +680830,15 @@
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/node.py": [
- "24d523f924a2cf668de84975671207ada65720bf",
+ "200605c05aa4ab3a77dc9db19b168d7ade7398be",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/parser.py": [
- "8f1897b08f3e50602afc77d47cf41ee45f70f5fc",
+ "833e0b8ed1a6b63e5954c80d77b102b8b220cfa8",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/serializer.py": [
- "d24becbec6d0d9ef78d30d9f43614638f7911d07",
+ "3b29c99ede7cac58ede5d48237696e30c9d856c7",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/tests/__init__.py": [
@@ -679802,11 +680850,11 @@
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py": [
- "c00320fa5ed9beac16221d4ea14d782e52a39b68",
+ "ad532dd92ea207ffefec9fc2be5f7457b8c861dc",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py": [
- "14c2ef2e2281e6c784568cbc1689bc1899248916",
+ "7fe7ac85cb8a14f05113cbfd483b8d042a07b989",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py": [
@@ -682862,7 +683910,7 @@
"testharness"
],
"web-animations/interfaces/DocumentTimeline/constructor.html": [
- "e4714be02f8e31aa3663f372ab04c8a466226058",
+ "ca0997ac8f9012b7d019760be97e09fa0f837179",
"testharness"
],
"web-animations/interfaces/DocumentTimeline/idlharness.window.js": [
@@ -682933,6 +683981,10 @@
"971e82ed81d6fef46a65f11ec66331a9f1954dfc",
"support"
],
+ "web-animations/resources/timing-override.js": [
+ "a1d65030f02ba6973efaf4d73839e86803291f47",
+ "support"
+ ],
"web-animations/resources/timing-tests.js": [
"4b0f021f74e09f6cbde5e27fc7cb8240b7bd9788",
"support"
@@ -682974,7 +684026,7 @@
"testharness"
],
"web-animations/timing-model/animations/finishing-an-animation.html": [
- "cb824ae30ed16ef92138fee23a9939e2b3013832",
+ "779bee184b8dbde227db6ae72dc7ff83a79c4176",
"testharness"
],
"web-animations/timing-model/animations/pausing-an-animation.html": [
@@ -683006,7 +684058,7 @@
"testharness"
],
"web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html": [
- "454a294239aa61130dc56af910fe1aa8faf4900b",
+ "a1727994bdb9b8da10bfdd36baa3d8e0ccc4ef1d",
"testharness"
],
"web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html": [
@@ -683018,7 +684070,7 @@
"testharness"
],
"web-animations/timing-model/animations/the-current-time-of-an-animation.html": [
- "a0e1a111fd433761afc25486fe4fb23c0ef1164b",
+ "77a6b716d22062998529b58382e0205e6f017980",
"testharness"
],
"web-animations/timing-model/animations/updating-the-finished-state.html": [
@@ -683030,7 +684082,7 @@
"testharness"
],
"web-animations/timing-model/timelines/document-timelines.html": [
- "4023bba55612b689d98a9773c9c6fafe11408e2b",
+ "f45865ac7c0e37abeddee73ad5435dcc8acd6e89",
"testharness"
],
"web-animations/timing-model/timelines/timelines.html": [
@@ -684722,7 +685774,7 @@
"wdspec"
],
"webdriver/tests/execute_script/execute.py": [
- "2af16c1e5e8a3bed01c5703db24a1d399a0e2270",
+ "1dde379c8a8e0b362c8a242333b67dff1ebc3b91",
"wdspec"
],
"webdriver/tests/execute_script/json_serialize_windowproxy.py": [
@@ -685234,7 +686286,7 @@
"wdspec"
],
"webdriver/tests/perform_actions/validity.py": [
- "ce8a0d60f7df192e21c6abbad1871bb0ac8f5f78",
+ "656406718e725d353643f863ba820abb313538c3",
"wdspec"
],
"webdriver/tests/permissions/set.py": [
@@ -688946,11 +689998,11 @@
"reftest"
],
"webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html": [
- "1848cdf67f662de24f07a75a1846eadab81fad77",
+ "85683c7ba5c5d8c7f202c079c470e959fde60976",
"support"
],
"webvtt/rendering/cues-with-video/processing-model/cue_too_long.html": [
- "7f020bcd96d97c2a93fc85c3d5a686e3eaaa8c90",
+ "1dc19e62594926570457b09952ca8a97863595fd",
"reftest"
],
"webvtt/rendering/cues-with-video/processing-model/decode_escaped_entities-ref.html": [
@@ -690958,7 +692010,7 @@
"support"
],
"webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt": [
- "fc62842108f4f2ea3d4610a194dd80b97c106f51",
+ "fa1aad85c504400261da2bac01b364a4111c7782",
"support"
],
"webvtt/rendering/cues-with-video/processing-model/support/voice_long.vtt": [
@@ -691030,7 +692082,7 @@
"testharness"
],
"webxr/exclusive_requestFrame_nolayer.https.html": [
- "d31b927631f91128933c1badd56747315c767780",
+ "f76847a8769073bb4753702f32dd5c2ccc9d3532",
"testharness"
],
"webxr/getInputPose_handedness.https.html": [
@@ -691070,7 +692122,7 @@
"support"
],
"webxr/resources/webxr_util.js": [
- "61b25991b37d4f21470cd821778137658e05168d",
+ "935f49a1fc911ffbb735a424c37d71c9a1b95c8a",
"support"
],
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [
@@ -691157,6 +692209,10 @@
"9213657a367bb0dd8872ff10120d705b08c0f6e6",
"testharness"
],
+ "webxr/xrInputSource_profiles.https.html": [
+ "32073c631f8ecfc3b19c33ed03e6b9999553cfec",
+ "testharness"
+ ],
"webxr/xrRay_constructor.https.html": [
"b955db4509c2f60facee570e6011a1441297e3dd",
"testharness"
@@ -691166,11 +692222,11 @@
"testharness"
],
"webxr/xrReferenceSpace_originOffset.https.html": [
- "b4e1c8e5c97cfaf8cc09ae718118c40986010ef1",
+ "516df836b1bb886ea79002e7121dc33b7ce6b7fc",
"testharness"
],
"webxr/xrReferenceSpace_originOffsetBounded.https.html": [
- "f76c3c430e084709a73f6b419fba659667cd53a5",
+ "ae1767ba74e0638217b590b4c2d620ec76ddef2f",
"testharness"
],
"webxr/xrRigidTransform_constructor.https.html": [
@@ -691254,7 +692310,7 @@
"testharness"
],
"webxr/xrWebGLLayer_constructor.https.html": [
- "74f0e7611e5e201a275b1a444a6d4b367af3e53d",
+ "0584da79c12def757f951ec53c4c048f18c39b8c",
"testharness"
],
"webxr/xrWebGLLayer_framebuffer_draw.https.html": [
@@ -691266,7 +692322,7 @@
"testharness"
],
"webxr/xrWebGLLayer_opaque_framebuffer.https.html": [
- "37955f3988d125b9b16959d0a55e40ce75934de6",
+ "4d27a9155e6a63e70a4a0f22e16c51f10214d796",
"testharness"
],
"webxr/xrWebGLLayer_viewports.https.html": [
@@ -691710,33 +692766,57 @@
"testharness"
],
"workers/constructors/SharedWorker/connect-event.html": [
- "a9719d9dea651f75858e652389ae905a4d1b2a32",
+ "a8dc71406716a2e0d061b8fe5407cd31af48e7e4",
"testharness"
],
+ "workers/constructors/SharedWorker/connect-event.js": [
+ "c397152fe9ecabdad041466c00c01edb7e9bc7d7",
+ "support"
+ ],
"workers/constructors/SharedWorker/dummy-name.html": [
- "9e2732923ec047d240ff4e703524b4f41cf4343f",
+ "59097c722e67d2cf326f90988bdf925c2c1c9827",
"testharness"
],
"workers/constructors/SharedWorker/dummy-shared-worker.html": [
- "e9aff9c5b4c88736c73e4a9a444aafc3e0887742",
+ "0c04f1f5fecd2ccbf4b14d9706d1725a9d1caf7c",
"testharness"
],
+ "workers/constructors/SharedWorker/dummy-shared-worker.js": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ "support"
+ ],
"workers/constructors/SharedWorker/empty-name.html": [
- "95ff6d1ad29d236fb6ffdee3304691662f2e8eab",
+ "c37f6b629b0ab8abc4a56815ef77f904419b89cb",
"testharness"
],
+ "workers/constructors/SharedWorker/empty.js": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ "support"
+ ],
"workers/constructors/SharedWorker/global-members.html": [
- "1396dc7b0ba1c5e50edc14faed1989206aa194c8",
+ "6860e68579b76473237332bf0c5842e278fc3f80",
"testharness"
],
+ "workers/constructors/SharedWorker/global-members.js": [
+ "47834479316348a3d8b41ad22688ed4d0cb05219",
+ "support"
+ ],
"workers/constructors/SharedWorker/interface-objects.html": [
- "e91b2dc6a8c61f0f050ecafdca7c2411116ab89d",
+ "01949ddbf75a63bb1be105ea34a24f2a336a4892",
"testharness"
],
+ "workers/constructors/SharedWorker/interface-objects.js": [
+ "15de7c9a545649b0edd10d3d94e3bc809ec28be4",
+ "support"
+ ],
"workers/constructors/SharedWorker/name.html": [
- "823e16c7c1f8ae62ed54df08fd988dd554866902",
+ "83b00725bccb6311716a3b509b361bd04bca68f3",
"testharness"
],
+ "workers/constructors/SharedWorker/name.js": [
+ "88b2684760215ad4dacd338eb4fff11aef4ca1fb",
+ "support"
+ ],
"workers/constructors/SharedWorker/no-arguments-ctor.html": [
"eaee870db0e14c0c68533f98ee63b7c3a580eeeb",
"testharness"
@@ -691754,15 +692834,19 @@
"testharness"
],
"workers/constructors/SharedWorker/port-onmessage.html": [
- "a2f4df0bfddd6be28a8770834a9166e72699945f",
+ "12784e9ba4021bf947cb62d64468f96c14c16e7b",
"testharness"
],
+ "workers/constructors/SharedWorker/port-onmessage.js": [
+ "83d4579287aaafe9979b2e687ed6517d8aee584f",
+ "support"
+ ],
"workers/constructors/SharedWorker/port-properties.html": [
- "f8a676dd24875e2bba96a6865782aea9d0ef6b6e",
+ "8f6f58a28104f98434f4f7643b4bc64f883e0c83",
"testharness"
],
"workers/constructors/SharedWorker/port-readonly.html": [
- "f087ab0f623de974847556c0a224ee159312856f",
+ "181b3116f997affad3fd019a350961f18f13438b",
"testharness"
],
"workers/constructors/SharedWorker/same-origin.html": [
@@ -691786,9 +692870,13 @@
"testharness"
],
"workers/constructors/SharedWorker/unexpected-global-properties.html": [
- "39739022d7ef4039608e8f83457e5204d82c8778",
+ "77a4f6304165eb929dbf72103a16ff5612ee168e",
"testharness"
],
+ "workers/constructors/SharedWorker/unexpected-global-properties.js": [
+ "d2cd94b4d90cec9f4eb17fe893ab44f3438a74ef",
+ "support"
+ ],
"workers/constructors/SharedWorker/unresolvable-url.html": [
"2ca3d93d3e8fa2a16a557370fe85bca3952e1713",
"testharness"
@@ -691798,9 +692886,13 @@
"support"
],
"workers/constructors/Worker/AbstractWorker.onerror.html": [
- "c40424d656d730a8a7b1236d9e618b9d43cd031d",
+ "b27f278bff8ea47c2c03e9f559eaf14f6e0e413f",
"testharness"
],
+ "workers/constructors/Worker/AbstractWorker.onerror.js": [
+ "e0bc5076371ed98a5cf252b67cd7cd6bc9cb4f59",
+ "support"
+ ],
"workers/constructors/Worker/Blob-url.html": [
"168fc91ae1d07e607904b8cbd3f9a6df8785c2bd",
"testharness"
@@ -691842,9 +692934,13 @@
"support"
],
"workers/constructors/Worker/terminate.html": [
- "52f9707dfede606e1ecf6d461467d61fa0eb6fce",
+ "b9af76e2fb1b526c3327c3683b37b3ae6bdfebfe",
"testharness"
],
+ "workers/constructors/Worker/terminate.js": [
+ "e6349c3320eea9612b33f012cc855f2e51a3d4a1",
+ "support"
+ ],
"workers/constructors/Worker/undefined": [
"bc7f482e94adee5403e3081434a09f702806c043",
"support"
@@ -691910,13 +693006,21 @@
"testharness"
],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html": [
- "7ae4b07047442a338f46491a7b9d031994842134",
+ "be89478786b607c34b726eda699d5ea8fe384f68",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js": [
+ "c5cc9f8d9f580b43418045965b97bf4fd2ed371a",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html": [
- "204130154183e396e1deeeeef4d8ea18ff0892d7",
+ "7c019a999348053be822e1930a30527e1690e952",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js": [
+ "76eaee366c7834e1e89c77dce1bc4194d4ef7368",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html": [
"91ec632685f304d379f2bb584b47ad7ea5af2211",
"testharness"
@@ -691930,69 +693034,129 @@
"testharness"
],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html": [
- "e086dc13db658ef7e87a3046a89c5d85bd25cca7",
+ "1749644908f20bb4704c80325f28604e9b2a32b7",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js": [
+ "0cb80f8faeb1b4a496ed6cfd29a9ecf531f662d3",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html": [
- "df4c9f83e6f4b633e32c9d01c2f02d0de8da8f62",
+ "8db06b411642b4a2d181841ca5518a25bf7c18d1",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js": [
+ "95a094234b7f4876ca8793858cb12c3eff7bd8e3",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html": [
- "4a03c830a29fb2937bc07cc50ed167201bd8486f",
+ "68d9caabc50e405c20ac1cf54de6308b5a33f7d0",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js": [
+ "6f6f9e799ff176630b29302ab3d03d28ac9349ac",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html": [
- "7d01eba7aff85216cb5e36cdb87e230ec84714d0",
+ "c7dcb3c5c0f35098807790c3213a09cb7ca171c1",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js": [
+ "6f11443c4a8883d2fbff7cd4e02fd195156f18b7",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html": [
- "d1a3f0f5c70a6f85a3a016f88b551fbc4d5f64bd",
+ "5b3e014e1e08c49bd631a912a9d8c4dfa7b42859",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js": [
+ "5426ebde0d4c09be39fab6d4bc9ffd270db16291",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html": [
- "c0ded6a280510c6db6b60ff513aa7318ab77d5bd",
+ "c7fbb0f9560d1955b3080c734f04d13e2bd36724",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js": [
+ "04cd7eea5ba88a6d42824c7c5202ba0d0182ed6f",
+ "support"
+ ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html": [
- "ba357421f99e3768e8977e14add69dd2de87e120",
+ "edf4fb7e0e5c7327e8052fff903ea8c1cf84e6db",
"testharness"
],
+ "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js": [
+ "db456e1fbaecac52b998db7572dc868ef66ff1ce",
+ "support"
+ ],
"workers/interfaces/SharedWorkerGlobalScope/name/getting.html": [
- "bfe81a8a9c094d38ebc41807dfe59ac8a048a619",
+ "c3a52d12e8a3a1705036ddd2c93479e03f53eb82",
"testharness"
],
+ "workers/interfaces/SharedWorkerGlobalScope/name/getting.js": [
+ "acf89ca6f678bf0b1d7b9d92605ee8554bf65674",
+ "support"
+ ],
"workers/interfaces/SharedWorkerGlobalScope/name/setting.html": [
- "a3511263d5e86df633fd341013934c566b8e4678",
+ "ddd8569710199eb433027d54d16cdc5a293b794f",
"testharness"
],
+ "workers/interfaces/SharedWorkerGlobalScope/name/setting.js": [
+ "c705e9c40a6dd6d4e733bf60c017e91b07d56e6e",
+ "support"
+ ],
"workers/interfaces/SharedWorkerGlobalScope/onconnect.html": [
- "2ad155bf7a933c14241bdc4c112ebcae42898eff",
+ "8a0f103d40e1e20a118bad300e67f0f24db35f19",
"testharness"
],
+ "workers/interfaces/SharedWorkerGlobalScope/onconnect.js": [
+ "34a2be51fc4798e2a0cf0ec572656435a09ba8f8",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/close/incoming-message.html": [
- "d65695632bc127e365cb8410d82a477e56f55b18",
+ "eb8e69c2b05639ded04f9dc5ded0ffee54f2031d",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/close/incoming-message.js": [
+ "b4f7e7fc05552fcdccb3f846e117eec83e8e9f92",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/close/sending-messages.html": [
- "983c422cc559b0bec9f34c68942cd59864579108",
+ "da7da66d25b848e872aecc9cd99e11b7722e4289",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/close/sending-messages.js": [
+ "2e0a89828880ac462103ae7188d3a0abcd79c5b0",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/close/setInterval.html": [
- "1d7d178d22ec62ff93def5b97997a51ccef0d02d",
+ "690f067cffcb88447bb360bef62b44a27f2de5cd",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/close/setInterval.js": [
+ "d165d20eab47e6ad6c7618043d3e253c13c9d45a",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/close/setTimeout.html": [
- "c2fa10dfc978028c107c33d35683eed66311d87d",
+ "777a03c013de04b981991300f608c7f140047074",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/close/setTimeout.js": [
+ "55eecb05570fa575f204c9a5c8c3e124f2d8b316",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/location/helper-redirect.py": [
"eb1599a577fb6f8c69ae1955294fc2bc493dd4e2",
"support"
],
"workers/interfaces/WorkerGlobalScope/location/members.html": [
- "31ddf37a1b0f342cf7f238dbb0c80140081944d1",
+ "3da6b7484d892836bad238a14b4f1041f6609ed2",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/location/members.js": [
+ "37235eac83196f05019c0f9dfab1e7ad639ef3a5",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/location/post-location-members.js": [
"e850b76b6e5f52389af3d213756ff7fc0e7a1c2d",
"support"
@@ -692014,57 +693178,105 @@
"support"
],
"workers/interfaces/WorkerGlobalScope/location/returns-same-object.html": [
- "40559c1660c4958c5a512b662002788bd7227e5c",
+ "b69ea3aa05828c398cc1bc63f677930f9ee70ce0",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/location/returns-same-object.js": [
+ "c004d8f7e564e2c43860d6f7da6d1cedffc5a9df",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/location/setting-members.html": [
- "d2f470ffcb494f3afad69f1a82eee0979aacb979",
+ "7ea79b689704c0712804901e8db6a26925a3f660",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/location/setting-members.js": [
+ "4c5c8a35ae88ce2d65b1426fdf37230fa261039c",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/location/worker-separate-file.html": [
"ac8e64dcc8860f6e6fb390875ea41a78aae59954",
"testharness"
],
"workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html": [
- "4b5af71d516b0f6e0fda3f8e2253cb6720701a79",
+ "840433d3d894b1a298bbd5bbe2ea14f9fdd81ef4",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js": [
+ "2bf4124cb74b5fa34302ffddce7e44b953d0d472",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/onerror/handled.html": [
- "56fee8e0635291c3e27bb1fb3fc9e63d95cbc01c",
+ "7d4b03c6cd35d1669ce97f337437c2ffafe85483",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/onerror/handled.js": [
+ "e58fa4a51521ba19ff9ab87bc185984c99018833",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/onerror/not-handled.html": [
- "f6107ada433fe2c912c873278d78380c9d3d13ff",
+ "96fdb4a6f119ad63a9f29a1592c846454293794c",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/onerror/not-handled.js": [
+ "c3254b0ba7e1709e18d24816fffe94d5983237dd",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html": [
- "b6a61e2355c0a637d560b85621ddd8172f68d824",
+ "b3be7726797136845cbf5454aa2ab3e2dfdd066c",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js": [
+ "0daf488d6f522b80c3884fb75d21df996294a18a",
+ "support"
+ ],
"workers/interfaces/WorkerGlobalScope/self.html": [
- "39c2c36c00d1326660bcc5f6c560998f349282cb",
+ "41522dfdd53e0a48308ddf5ab4a10581627bb20d",
"testharness"
],
+ "workers/interfaces/WorkerGlobalScope/self.js": [
+ "5d3c560d49b2f010c423c4428dcea9e7d2b810d7",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/WindowTimers/001.html": [
- "a80897518a1470ac2bf757a4726f739807f770d9",
+ "9fe5e2b1bc7b5e174083d569080a1c382b389410",
"testharness"
],
+ "workers/interfaces/WorkerUtils/WindowTimers/001.js": [
+ "bd5b7c4071c2a118117073630fcbf888a1464b1b",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/WindowTimers/002.html": [
- "06685a9056a0748782d97b24cc2d897dbe64d61f",
+ "1a10b3d0bb8ddad4b7c7dd281f1a9acb980a28a4",
"testharness"
],
+ "workers/interfaces/WorkerUtils/WindowTimers/002.js": [
+ "a96c08844202e430201d9b9e32f6fef6b36f46ac",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/WindowTimers/003.html": [
- "942f139fa521e906fe77316638b3abbaeff70ef5",
+ "119d109b5fd2edc50f2598302d7d9cfc885ca27f",
"testharness"
],
+ "workers/interfaces/WorkerUtils/WindowTimers/003.js": [
+ "e64e4e2179f0fb51347eea052f889b025af8e70a",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/WindowTimers/004.html": [
- "5548eec4ab475cf52b0b488ab8f821c3b0f19df2",
+ "83d7bf915fb62ec89f27b60e0b51ff0089219deb",
"testharness"
],
+ "workers/interfaces/WorkerUtils/WindowTimers/004.js": [
+ "e80d79a8e51bf94682a38f406c653d59c7d8e726",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/WindowTimers/005.html": [
- "b86eff1fbddb601667f7b69c9ed4955998735dde",
+ "2a181d55d0d924e020cf774bb795280241706199",
"testharness"
],
+ "workers/interfaces/WorkerUtils/WindowTimers/005.js": [
+ "125c224e7bcf1ddc78c3e2b041b23b70a151453f",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/001.worker.js": [
"aa86c8ef17791ae39be9361d8e6bab57e567a795",
"testharness"
@@ -692074,45 +693286,85 @@
"testharness"
],
"workers/interfaces/WorkerUtils/importScripts/003.html": [
- "7ff30ae2a618b553ca6bda51ca7540ac72b1b44d",
+ "5dcd08aa154660261fbdc80c7beb471883637c43",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/003.js": [
+ "6e378ef20fff1485d9e374b8bb5747d3dd12f965",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/004.html": [
- "2d39d3ce72eb2ed55a82fe93c1eb9582d372cd31",
+ "62537e088814f593fd7776dd85170220586ee03f",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/004.js": [
+ "98040d0d48df9e6277262964e094135778f0cee4",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/005.html": [
- "f8abe14c23e033d0417148b38f85fd83e3cf8b2d",
+ "7ebbc1be55945a5ac9901c447955b8a1ae35db60",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/005.js": [
+ "18c534efa9c953cc56ebb24aca625cb27ed202d6",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/006.html": [
- "f311ccfb0d81a74532ea3a4b5e5dd92ddddb572a",
+ "aec2fb1483306ac9caef28fbaa115190c5124dbd",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/006.js": [
+ "fc170f790c74aa383e079b5396df1f889720dd31",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/007.html": [
- "128fb1b64f71de1fa4f69110495c1fda80255875",
+ "37e888365f7019a1770ff43e6992ca809037f288",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/007.js": [
+ "dc85216f3df788f16fb3734e9e614c8f46da3109",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/008.html": [
- "07b800ebb89fd900e67a7bbdf37d615b188b0a50",
+ "f72b79939c07786eb0f80d229c78ccafcae29af5",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/008.js": [
+ "c957fcd63538e7bc58ee75a696abd520c547cee9",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/009.html": [
- "95d3839dc23d7842d636aaaa72aed09d9ed0baf3",
+ "e0eb5488c2e7f1693312977acd5473ce4da05787",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/009.js": [
+ "4b86f8c303087e9ac2c1b15d941523df5dbdcc3e",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/010.html": [
- "9c76e7d4daaa6b4c7a244d6873640034a57fbb67",
+ "a6db49c4be947528c804127018501f9b296aa124",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/010.js": [
+ "4ec4a3b8c7538b96735fa6f4fc3087ed81b50864",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/011.html": [
- "46499318fb3de86175e73d944a37c2e119ffd08d",
+ "1bfb23349756eb4b2a90a01c9f737060b1c67a92",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/011.js": [
+ "bd6fed5c0a371070898762306c8881681267bbb9",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/012.html": [
- "f7622bdc9df2eacd85a09e326e09da970d9d77a9",
+ "ab0778d0c71fdfbae5d89babcea2dd281246d33e",
"testharness"
],
+ "workers/interfaces/WorkerUtils/importScripts/012.js": [
+ "f4c887f7df4a4f32bb1da9896548205ed2cb66a0",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/importScripts/1": [
"18cea4ff0f4b69e8afa0c77afd04e9678bcd38d5",
"support"
@@ -692138,33 +693390,61 @@
"support"
],
"workers/interfaces/WorkerUtils/navigator/002.html": [
- "d3aa2ec658ddb7fb0b0b5e59ecceb43b39c77a51",
+ "4c76e2b69908c4ecb70fe2b8eb6ddd102d7bfd83",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/002.js": [
+ "a5af348ef1077c3cd3bfea8d746b2232af315a9b",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/003.html": [
- "a2e5c948791bec1c58a76b5168cc3cb00fb98df9",
+ "86ab5aee489642486ed4bbaf39f54c12ef2b1ac1",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/003.js": [
+ "ff92f8aadb8d2036393a7743788a7f0da814e61b",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/004.html": [
- "2231c4ab8215cf0b3e52d755222dc55dc6be6ba2",
+ "93eee00957122805b07921e5e934d87c50a3ecc4",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/004.js": [
+ "c1b575e43c99b1ae550a36c3d67f919e3c439638",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/005.html": [
- "b3d99588f75f7b613bbf26112584c6a7b922f0ce",
+ "ad2899e62eada143adabf65f33c9d5edf38427a3",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/005.js": [
+ "d62252d39b216eefa9ca241b55e50eb16d7a4fdc",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/006.html": [
- "c027d630d4ca38da0a7d1244f5ed49e21c36f51e",
+ "e0f7386af31c70c24ce0f223e49b4c69a8838d03",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/006.js": [
+ "325fd0fbdec36b817c420aedcabf5799ed6de886",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/007.html": [
- "a6afc563710ff0a329be52a4caded6355afab211",
+ "8f9d38dd857a092f82bfad24202124c897016b80",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/007.js": [
+ "d0879da90889d0faa7901b1eb48c31ea04b1238a",
+ "support"
+ ],
"workers/interfaces/WorkerUtils/navigator/language.html": [
- "f1aa446cb9ab734a592b6f8dcc719b20c2c13fb7",
+ "535ab3a7cb98e6afa27db8b43e669b161315b6aa",
"testharness"
],
+ "workers/interfaces/WorkerUtils/navigator/language.js": [
+ "e94ba4dfcf16bf673690e03e853d1d67f50ceac8",
+ "support"
+ ],
"workers/modules/dedicated-worker-import-blob-url.any.js": [
"f51a821d1813df81187e8c78d6251f9f29cf45eb",
"testharness"
@@ -692402,7 +693682,11 @@
"support"
],
"workers/non-automated/navigator-onLine.html": [
- "d71aeaf0a88ee5ec2456a7db0870f57c84f03623",
+ "5f2746b54633905e1277ba14b71f402ff30b1ed9",
+ "support"
+ ],
+ "workers/non-automated/navigator-onLine.js": [
+ "592b286bb35261c75f79cd395012e7e894053719",
"support"
],
"workers/non-automated/post-a-1.js": [
@@ -692438,19 +693722,27 @@
"testharness"
],
"workers/semantics/encodings/001.html": [
- "0ebec0b0338943688e011d9694cd0d268e9c4e7c",
+ "05ee5e006b45f94e4b2da1eea0093429ff5c51fb",
"testharness"
],
- "workers/semantics/encodings/001.html.headers": [
- "2340a89c93ce4515026a5462cb9382dc2501bfdb",
+ "workers/semantics/encodings/001.js": [
+ "03bc557c33c4fbc60bf6fe09d00f7e7d4162dc47",
+ "support"
+ ],
+ "workers/semantics/encodings/001.js.headers": [
+ "5614aaa7f0f56cf0de92da3dc6b53754c4bb6487",
"support"
],
"workers/semantics/encodings/002.html": [
- "fdcc4f0a21c0685b84e968a1e0f4bec243200caa",
+ "fecbffc18da750560326d48c650baf42097bd4f3",
"testharness"
],
- "workers/semantics/encodings/002.html.headers": [
- "2340a89c93ce4515026a5462cb9382dc2501bfdb",
+ "workers/semantics/encodings/002.js": [
+ "9dde7bbda921332a04b82658b2fe42f68c2e88f1",
+ "support"
+ ],
+ "workers/semantics/encodings/002.js.headers": [
+ "5614aaa7f0f56cf0de92da3dc6b53754c4bb6487",
"support"
],
"workers/semantics/encodings/003-1.py": [
@@ -692458,13 +693750,21 @@
"support"
],
"workers/semantics/encodings/003.html": [
- "a0f964c3c4dc0a12945439d05ca3b7d08438a8a4",
+ "095320e4d1477d5a491b7a9cac968154ef8db2f5",
"testharness"
],
+ "workers/semantics/encodings/003.js": [
+ "35bda8bba88bb5b94e6d342224d16a8973d2e414",
+ "support"
+ ],
"workers/semantics/encodings/004.html": [
- "bb1442633107f0f0d818a60453ff1551c6daac7f",
+ "cd556b8190e7ac878db26119137db9cb9894d659",
"testharness"
],
+ "workers/semantics/encodings/004.js": [
+ "5146929a73b5bd711933d1f5170875c4f83b09ae",
+ "support"
+ ],
"workers/semantics/encodings/004.worker.js": [
"28489a572be1ccb7f500daf04184e6cf73e8353f",
"testharness"
@@ -692478,25 +693778,45 @@
"testharness"
],
"workers/semantics/interface-objects/003.html": [
- "1ed257ff880c5cfdd080537bd3290b1b4b8f088b",
+ "99e8b3a0f3dd426eb4b1a5f22a2fd0fcab01d98d",
"testharness"
],
+ "workers/semantics/interface-objects/003.js": [
+ "a91e7c38759f23e9ca50602a853d67a26830adad",
+ "support"
+ ],
"workers/semantics/interface-objects/004.html": [
- "0c3a3d824c93da03aa28ab54781e8bb78f43dabe",
+ "b4a09c50e4e50983f814fb08fc0d797a661b2ff5",
"testharness"
],
+ "workers/semantics/interface-objects/004.js": [
+ "00e50d19cae409d6b69688e22ed926ac9893e2d9",
+ "support"
+ ],
"workers/semantics/multiple-workers/001.html": [
- "65e7917ad7aa1ef764cd9a5fbc829ef7912c962c",
+ "f9e2bbeabab16766d162a030f2318894c5537b1f",
"testharness"
],
+ "workers/semantics/multiple-workers/001.js": [
+ "6d51169dea0ead95a4461571e351b41e2620eff5",
+ "support"
+ ],
"workers/semantics/multiple-workers/002.html": [
- "9ab1f54f4c5a646eece224ae73bceb6a013312f9",
+ "aa01e361d80626befc6d47f6e8c8364a50976b05",
"testharness"
],
+ "workers/semantics/multiple-workers/002.js": [
+ "2318c2e267db16020cc065ef828a9025d61be912",
+ "support"
+ ],
"workers/semantics/multiple-workers/003.html": [
- "3e094ad6a301bfdb3bac44b2b92c03a5a4195f5d",
+ "f6e03c75f782635030c3387c76d46d32b89602b1",
"testharness"
],
+ "workers/semantics/multiple-workers/003.js": [
+ "14a5a614b3d83bbfa225871d7dfc13cb70ba3192",
+ "support"
+ ],
"workers/semantics/multiple-workers/004-1.html": [
"eac038c5beef33ac5f55014eebef68c32d406613",
"support"
@@ -692526,15 +693846,23 @@
"testharness"
],
"workers/semantics/multiple-workers/008-1.html": [
- "82a8a3835071bf1154783c4845315ca0b452560b",
+ "d19d7fa3369a5f2449cd0cdfe3585b34741cace4",
"support"
],
"workers/semantics/multiple-workers/008.html": [
- "e8554a438a5ce09ae90ca654c99865a2f633d2f2",
+ "ee38d80866e8bb4deb6322dd251dfb3da78bc492",
"testharness"
],
+ "workers/semantics/multiple-workers/008.js": [
+ "92593ebb865f8f376903cc282cffa2d3a31a013f",
+ "support"
+ ],
"workers/semantics/navigation/001-1.html": [
- "8f619484f4d9e485ab8f35458bd80bd71521f32e",
+ "c259c2c839f8b82f986301174daf1b3c8182f728",
+ "support"
+ ],
+ "workers/semantics/navigation/001-1.js": [
+ "f62c365e3221506c3d2231f1f76cf9e3dc919daf",
"support"
],
"workers/semantics/navigation/001.html": [
@@ -692546,33 +693874,57 @@
"testharness"
],
"workers/semantics/reporting-errors/001.html": [
- "adba81f6353e6ff1db650eb2e8d81e08d073fc2c",
+ "d8b17289fe24d33e0687a306332834c907ab39b7",
"testharness"
],
+ "workers/semantics/reporting-errors/001.js": [
+ "5736666cc3b623cb47af4fc04161c6c5345198c6",
+ "support"
+ ],
"workers/semantics/reporting-errors/002.html": [
- "c2cd377b435d8bb39dc6381301d180d84d1da4da",
+ "4b322a5f07d10555ef3fee5ec3cab8fbc9d8221a",
"testharness"
],
+ "workers/semantics/reporting-errors/002.js": [
+ "ff96922634ffbabc49ea94600b44063d75b25312",
+ "support"
+ ],
"workers/semantics/reporting-errors/003.html": [
- "1b01c7cafc037c640c4473052540d8559faa3aea",
+ "8ea59b810616f63622e470d3d57b7621a773c0f7",
"testharness"
],
+ "workers/semantics/reporting-errors/003.js": [
+ "8a3390bb249020f045114352403dcceafa0e83b0",
+ "support"
+ ],
"workers/semantics/reporting-errors/004-1.html": [
- "676c21e606839bab840c568bc3cd9353f52a862e",
+ "326e1399ec5f86c0e98567e56d936093394a6c50",
"support"
],
"workers/semantics/reporting-errors/004.html": [
- "1dd1eb3b52a124dfa811e25dc9eba18f4a6136d7",
+ "8516e52c6fe2dbab80e7604d1eb3bc2eece61d80",
"testharness"
],
+ "workers/semantics/reporting-errors/004.js": [
+ "a68d2ab01defba6e0ad86999479d2a58e517265c",
+ "support"
+ ],
"workers/semantics/run-a-worker/001.html": [
- "aa0fc67efc7cb8377f137ca4273aa9386fadeb24",
+ "71e48c277114440c988a125b98a23ac30d735e73",
"testharness"
],
+ "workers/semantics/run-a-worker/001.js": [
+ "33ed47f1b442a20b5fae4f6eca626c4707659d6c",
+ "support"
+ ],
"workers/semantics/run-a-worker/002.html": [
- "3617ad7272afe46249d0a7ad57128819fd0b2528",
+ "9487d886a67dac074f3214c3b462c40f1d91c5f4",
"testharness"
],
+ "workers/semantics/run-a-worker/002.js": [
+ "627272aaefa3457f90417ed0f19e967a2c036273",
+ "support"
+ ],
"workers/semantics/run-a-worker/003.html": [
"e96c176f20ab6aa6f01dc25184778abe9e861fd1",
"testharness"
@@ -692590,21 +693942,37 @@
"support"
],
"workers/semantics/xhr/001.html": [
- "e26e21c62f8544f3b58d8beeb6b68aff14390788",
+ "da59f5ac2d16a29befa124194cc03bb3cf3fc45a",
"testharness"
],
+ "workers/semantics/xhr/001.js": [
+ "1cbe98ba470bbc60c55b2098584b89505af941ba",
+ "support"
+ ],
"workers/semantics/xhr/002.html": [
- "0d3386e982fc8409eaed700b6ca0e3de8088ea34",
+ "60c0e161cc8eb97852f99ca32222bbf7b2abed0f",
"testharness"
],
+ "workers/semantics/xhr/002.js": [
+ "68d7e91d451e6143ef5a68c2686b785ba178e1f0",
+ "support"
+ ],
"workers/semantics/xhr/003.html": [
- "70edaf41702f97498dcc85c07f89db138a4399de",
+ "e3ce36b82cfc6cf9593768c39585c3153dc9b664",
"testharness"
],
+ "workers/semantics/xhr/003.js": [
+ "1a9c5a7ee816a95c8bbd8510ea234c917d8df2f0",
+ "support"
+ ],
"workers/semantics/xhr/004.html": [
- "d0d82f2e82e2159f83573db31c4de3f08c6367d8",
+ "d11e3dbc1b9254e02ea02aceb03e8c460e6fb95f",
"testharness"
],
+ "workers/semantics/xhr/004.js": [
+ "1741c8d36a0e543356a6791eea50681c6bc2765e",
+ "support"
+ ],
"workers/semantics/xhr/005.html": [
"84abdb0c4264254eabe0ab4d9b0b141164e52076",
"testharness"
diff --git a/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini b/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
new file mode 100644
index 00000000000..5496474410b
--- /dev/null
+++ b/tests/wpt/metadata/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
@@ -0,0 +1,2 @@
+[mix-blend-mode-animation.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-fonts/inheritance.html.ini b/tests/wpt/metadata/css/css-fonts/inheritance.html.ini
index d89d8b50254..ec98ebf50f7 100644
--- a/tests/wpt/metadata/css/css-fonts/inheritance.html.ini
+++ b/tests/wpt/metadata/css/css-fonts/inheritance.html.ini
@@ -53,3 +53,9 @@
[Property font-kerning inherits]
expected: FAIL
+ [Property font-variation-settings inherits]
+ expected: FAIL
+
+ [Property font-variation-settings has initial value normal]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini
new file mode 100644
index 00000000000..b75e941bdc6
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini
@@ -0,0 +1,13 @@
+[font-variation-settings-computed.html]
+ [Property font-variation-settings value 'normal' computes to 'normal']
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" 700' computes to '"wght" 700']
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" 700, "XHGT" 0.7' computes to '"wght" 700, "XHGT" 0.7']
+ expected: FAIL
+
+ [Property font-variation-settings value '"XHGT" calc(0.4 + 0.3)' computes to '"XHGT" 0.7']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini
new file mode 100644
index 00000000000..5f9f7973d1d
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini
@@ -0,0 +1,16 @@
+[font-variation-settings-valid.html]
+ [e.style['font-variation-settings'\] = "\\"wght\\" 700" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"a cd\\" 0.5" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"ab@d\\" 0.5" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "normal" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"wght\\" 700, \\"XHGT\\" 0.7" should set the property value]
+ 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..727eb39010f 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,15 @@
[border-left-width length(pt) / values]
expected: FAIL
+ [padding-bottom length(mm) / values]
+ expected: FAIL
+
+ [margin-top length(px) / values]
+ expected: FAIL
+
+ [padding-left length(pt) / values]
+ expected: FAIL
+
+ [padding-left length(pc) / values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-computed.html.ini b/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-computed.html.ini
new file mode 100644
index 00000000000..d5bad2f6490
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-computed.html.ini
@@ -0,0 +1,7 @@
+[scroll-behavior-computed.html]
+ [Property scroll-behavior value 'smooth' computes to 'smooth']
+ expected: FAIL
+
+ [Property scroll-behavior value 'auto' computes to 'auto']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-valid.html.ini b/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-valid.html.ini
new file mode 100644
index 00000000000..a5ec18536c7
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/parsing/scroll-behavior-valid.html.ini
@@ -0,0 +1,7 @@
+[scroll-behavior-valid.html]
+ [e.style['scroll-behavior'\] = "auto" should set the property value]
+ expected: FAIL
+
+ [e.style['scroll-behavior'\] = "smooth" should set the property value]
+ 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 9eb9e95addf..ab04b55f609 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -315,24 +315,24 @@
[<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/plain */*;charset=gbk]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
+ [<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*]
+ [<iframe>: combined response Content-Type: text/html;" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html;x=" text/plain]
+ [<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ [<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
+ [<iframe>: separate response Content-Type: text/plain */*]
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 a5b9b3752be..78823fdbbec 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -56,3 +56,6 @@
[separate text/javascript;charset=windows-1252 text/javascript]
expected: FAIL
+ [separate text/javascript x/x]
+ 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 87c807a49ff..2023a855086 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%0C]
expected: FAIL
+ [X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
deleted file mode 100644
index 385376c7321..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_4.html]
- [Multiple history traversals, last would be aborted]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
deleted file mode 100644
index 16fa2c5cfc1..00000000000
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[creating_browsing_context_test_01.html]
- [first argument: absolute url]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
index bf50d59df41..e02f179ec25 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-innerwidth-innerheight.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `innerwidth`, `innerheight`]
expected: FAIL
+ [features "innerheight=-404.5" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=-404.5" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=-404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=-404e1" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=-404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=-404e1" should NOT set "width=404"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
index e150c9d848f..23eefb8eaf9 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-screenx-screeny.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `screenx`, `screeny`]
expected: FAIL
+ [features "screenx=-204" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-204" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-204.5" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screeny=-0" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "screenx=-0" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "screenx=-204.5" should NOT set "left=204"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
index ad8840fbb68..940516ddd33 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-top-left.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for `top`, `left`]
expected: FAIL
+ [features "top=-204" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "top=-204.5" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "left=-204" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "top=-0" should NOT set "top=204"]
+ expected: TIMEOUT
+
+ [features "left=-204.5" should NOT set "left=204"]
+ expected: TIMEOUT
+
+ [features "left=-0" should NOT set "left=204"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
index d1ed9088b2b..9027336b453 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
@@ -1,5 +1,24 @@
[open-features-negative-width-height.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: negative values for `width`, `height`]
expected: FAIL
+ [features "height=-404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=-404e1" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=-404.5" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "width=-404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=-404e1" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=-404.5" should NOT set "width=404"]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
index a70e9dbad4d..4e44584b123 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
@@ -1,32 +1,48 @@
[open-features-non-integer-height.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `height`]
expected: FAIL
[features "height=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "height=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "height=/404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"]
+ expected: TIMEOUT
+
+ [top=0,left=0: absence of feature "height" should be treated same as "height=0"]
+ expected: TIMEOUT
+
+ [features "height=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "height=L404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
index 779531b4a98..fcaeae5336d 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-innerheight.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerheight`]
expected: FAIL
[features "innerheight=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerheight=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "innerheight=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=L404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "innerheight=/404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
index 7a1b258d52e..42327fedd27 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-innerwidth.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerwidth`]
expected: FAIL
[features "innerwidth=405e-1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405*3" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405.5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405e1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405.32" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405 " should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405LLl" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405/5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "innerwidth=405^4" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "innerwidth=/404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=_404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "innerwidth=L404" should NOT set "width=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
index caba4124f0b..a8e4fe06618 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-left.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `left`]
expected: FAIL
[features "left=105e1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105 " should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105/5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105e-1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105^4" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105LLl" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105.32" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105*3" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "left=105.5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "left=L104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "left=/104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "left=_104" should NOT set "left=104"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
index 9ace8a4cbdb..64a08faf0e6 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-screenx.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screenx`]
expected: FAIL
[features "screenx=105.5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105e1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105 " should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105*3" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105e-1" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105^4" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105LLl" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105/5" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
[features "screenx=105.32" should set "left=105"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "screenx=_104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "screenx=L104" should NOT set "left=104"]
+ expected: TIMEOUT
+
+ [features "screenx=/104" should NOT set "left=104"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
index a82bd0f981a..4f22ef4ef29 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
@@ -1,32 +1,42 @@
[open-features-non-integer-screeny.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screeny`]
expected: FAIL
[features "screeny=405^4" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405e-1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405LLl" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405e1" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405 " should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405/5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405*3" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405.32" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "screeny=405.5" should set "height=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [features "screeny=_404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "screeny=L404" should NOT set "height=404"]
+ expected: TIMEOUT
+
+ [features "screeny=/404" should NOT set "height=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
index 28f93ee71b5..9d841e61bc0 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
@@ -1,32 +1,48 @@
[open-features-non-integer-width.html]
type: testharness
+ expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `width`]
expected: FAIL
[features "width=405^4" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405.5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405e1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405 " should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405.32" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405LLl" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405*3" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405e-1" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
[features "width=405/5" should set "width=405"]
- expected: FAIL
+ expected: TIMEOUT
+
+ [top=0,left=0: absence of feature "width" should be treated same as "width=0"]
+ expected: TIMEOUT
+
+ [features "width=_404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"]
+ expected: TIMEOUT
+
+ [features "width=/404" should NOT set "width=404"]
+ expected: TIMEOUT
+
+ [features "width=L404" should NOT set "width=404"]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html.ini b/tests/wpt/metadata/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html.ini
new file mode 100644
index 00000000000..351e158ca06
--- /dev/null
+++ b/tests/wpt/metadata/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html.ini
@@ -0,0 +1,28 @@
+[align.html]
+ [align=middle on replaced elements]
+ expected: FAIL
+
+ [align=absmiddle on replaced elements]
+ expected: FAIL
+
+ [align=top on replaced elements]
+ expected: FAIL
+
+ [align=texttop on replaced elements]
+ expected: FAIL
+
+ [align=left on replaced elements]
+ expected: FAIL
+
+ [align=center on replaced elements]
+ expected: FAIL
+
+ [align=absbottom on replaced elements]
+ expected: FAIL
+
+ [align=abscenter on replaced elements]
+ expected: FAIL
+
+ [align=right on replaced elements]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
index 127392316de..702af61a3c4 100644
--- a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini
@@ -1,7 +1,11 @@
[form-submission-algorithm.html]
+ expected: TIMEOUT
[If form's firing submission events is true, then return; 'submit' event]
expected: FAIL
[If form's firing submission events is true, then return; 'invalid' event]
expected: FAIL
+ [Cannot navigate (after constructing the entry list)]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
deleted file mode 100644
index 9e522297c94..00000000000
--- a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[toggleEvent.html]
- [Calling open twice on 'details' fires only one toggle event]
- expected: FAIL
-
- [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-data.html.ini b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-data.html.ini
new file mode 100644
index 00000000000..a89ac7f260c
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-data.html.ini
@@ -0,0 +1,4 @@
+[iframe-inheritance-data.html]
+ [iframes with data url uses no referrer]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html.ini b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html.ini
new file mode 100644
index 00000000000..13009ac5d38
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html.ini
@@ -0,0 +1,5 @@
+[iframe-inheritance-srcdoc-child.html]
+ expected: TIMEOUT
+ [iframes srcdoc child correctly inherit the ancestor's referrer policy]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html.ini b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html.ini
new file mode 100644
index 00000000000..00076bbd03a
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html.ini
@@ -0,0 +1,5 @@
+[iframe-inheritance-srcdoc.html]
+ expected: TIMEOUT
+ [iframes srcdoc correctly inherit the ancestor's referrer policy]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index 66bd350083b..a56bad443a2 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html]
+ expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
index b0910df98ad..ecfe4181317 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
@@ -152,3 +152,9 @@
[X SNR (-379.8758083905784 dB) is not greater than or equal to 65.737. Got -379.8758083905784.]
expected: FAIL
+ [X SNR (-36.33203143920875 dB) is not greater than or equal to 65.737. Got -36.33203143920875.]
+ expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31037 more errors.\n\tMax AbsError of 9.7228890145421028e+3 at index of 39267.\n\t[39267\]\t9.7219062500000000e+3\t-9.8276454210281372e-1\t9.7228890145421028e+3\t9.8934064040793655e+3\t3.8985999999999999e-3\n\tMax RelError of 9.8934064040793655e+3 at index of 39267.\n\t[39267\]\t9.7219062500000000e+3\t-9.8276454210281372e-1\t9.7228890145421028e+3\t9.8934064040793655e+3\t3.8985999999999999e-3\n]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webdriver/tests/execute_script/execute.py.ini b/tests/wpt/metadata/webdriver/tests/execute_script/execute.py.ini
index 84ba421e8aa..5601b28f636 100644
--- a/tests/wpt/metadata/webdriver/tests/execute_script/execute.py.ini
+++ b/tests/wpt/metadata/webdriver/tests/execute_script/execute.py.ini
@@ -23,3 +23,6 @@
[test_abort_by_user_prompt_twice[alert\]]
expected: FAIL
+ [test_override_listeners]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini
new file mode 100644
index 00000000000..3e2806dfae7
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_profiles.https.html]
+ [WebXR InputSource's profiles list can be set]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrWebGLLayer_constructor.https.html.ini b/tests/wpt/metadata/webxr/xrWebGLLayer_constructor.https.html.ini
index 08a51f5b1bc..f9f55152f51 100644
--- a/tests/wpt/metadata/webxr/xrWebGLLayer_constructor.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrWebGLLayer_constructor.https.html.ini
@@ -1,5 +1,4 @@
[xrWebGLLayer_constructor.https.html]
- expected: ERROR
[Ensure that XRWebGLLayer's constructor throws appropriate errors]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/web-platform-tests/.github/main.workflow b/tests/wpt/web-platform-tests/.github/main.workflow
index 4f4447fdf0f..20a0f33256d 100644
--- a/tests/wpt/web-platform-tests/.github/main.workflow
+++ b/tests/wpt/web-platform-tests/.github/main.workflow
@@ -19,3 +19,14 @@ action "website-build-and-publish" {
runs = ["/bin/bash", "tools/ci/website_build.sh"]
secrets = ["DEPLOY_TOKEN"]
}
+
+workflow "Synchronize the Pull Request Preview" {
+ on = "pull_request"
+ resolves = "update-pr-preview"
+}
+
+action "update-pr-preview" {
+ uses = "./tools/docker/github"
+ runs = ["python", "tools/ci/update_pr_preview.py", "https://api.github.com"]
+ secrets = ["GITHUB_TOKEN"]
+}
diff --git a/tests/wpt/web-platform-tests/common/security-features/tools/generate.py b/tests/wpt/web-platform-tests/common/security-features/tools/generate.py
index fc10e635dbd..0b18a391a62 100644
--- a/tests/wpt/web-platform-tests/common/security-features/tools/generate.py
+++ b/tests/wpt/web-platform-tests/common/security-features/tools/generate.py
@@ -57,6 +57,57 @@ def dump_test_parameters(selection):
selection, indent=2, separators=(',', ': '), sort_keys=True)
+def get_test_filename(config, selection):
+ '''Returns the filname for the main test HTML file'''
+
+ selection_for_filename = copy.deepcopy(selection)
+ # Use 'unset' rather than 'None' in test filenames.
+ if selection_for_filename['delivery_value'] is None:
+ selection_for_filename['delivery_value'] = 'unset'
+
+ return os.path.join(config.spec_directory,
+ config.test_file_path_pattern % selection_for_filename)
+
+
+def handle_deliveries(policy_deliveries):
+ '''
+ Generate <meta> elements and HTTP headers for the given list of
+ PolicyDelivery.
+ TODO(hiroshige): Merge duplicated code here, scope/document.py, etc.
+ '''
+
+ meta = ''
+ headers = {}
+
+ for delivery in policy_deliveries:
+ if delivery.value is None:
+ continue
+ if delivery.key == 'referrerPolicy':
+ if delivery.delivery_type == 'meta':
+ meta += \
+ '<meta name="referrer" content="%s">' % delivery.value
+ elif delivery.delivery_type == 'http-rp':
+ headers['Referrer-Policy'] = delivery.value
+ # TODO(kristijanburnik): Limit to WPT origins.
+ headers['Access-Control-Allow-Origin'] = '*'
+ else:
+ raise Exception(
+ 'Invalid delivery_type: %s' % delivery.delivery_type)
+ elif delivery.key == 'mixedContent':
+ assert (delivery.value == 'opt-in')
+ if delivery.delivery_type == 'meta':
+ meta += '<meta http-equiv="Content-Security-Policy" ' + \
+ 'content="block-all-mixed-content">'
+ elif delivery.delivery_type == 'http-rp':
+ headers['Content-Security-Policy'] = 'block-all-mixed-content'
+ else:
+ raise Exception(
+ 'Invalid delivery_type: %s' % delivery.delivery_type)
+ else:
+ raise Exception('Invalid delivery_key: %s' % delivery.key)
+ return {"meta": meta, "headers": headers}
+
+
def generate_selection(config, selection, spec, test_html_template_basename):
test_parameters = dump_test_parameters(selection)
# Adjust the template for the test invoking JS. Indent it to look nice.
@@ -80,8 +131,7 @@ def generate_selection(config, selection, spec, test_html_template_basename):
selection['sanity_checker_js'] = config.sanity_checker_js
selection['spec_json_js'] = config.spec_json_js
- test_filename = os.path.join(config.spec_directory,
- config.test_file_path_pattern % selection)
+ test_filename = get_test_filename(config, selection)
test_headers_filename = test_filename + ".headers"
test_directory = os.path.dirname(test_filename)
@@ -109,13 +159,16 @@ def generate_selection(config, selection, spec, test_html_template_basename):
except:
pass
- delivery = config.handleDelivery(selection, spec)
+ delivery = handle_deliveries([
+ util.PolicyDelivery(selection['delivery_type'],
+ selection['delivery_key'],
+ selection['delivery_value'])
+ ])
if len(delivery['headers']) > 0:
with open(test_headers_filename, "w") as f:
for header in delivery['headers']:
- f.write(header)
- f.write('\n')
+ f.write('%s: %s\n' % (header, delivery['headers'][header]))
selection['meta_delivery_method'] = delivery['meta']
# Obey the lint and pretty format.
diff --git a/tests/wpt/web-platform-tests/common/security-features/tools/util.py b/tests/wpt/web-platform-tests/common/security-features/tools/util.py
index 1f6c86e6efc..fc8d3b30ef7 100644
--- a/tests/wpt/web-platform-tests/common/security-features/tools/util.py
+++ b/tests/wpt/web-platform-tests/common/security-features/tools/util.py
@@ -39,3 +39,14 @@ def load_spec_json(path_to_spec):
print(read_nth_line(f, line_number).rstrip())
print(" " * (column - 1) + "^")
sys.exit(1)
+
+
+class PolicyDelivery(object):
+ '''
+ See `@typedef PolicyDelivery` comments in `resources/common.js`.
+ '''
+
+ def __init__(self, delivery_type, key, value):
+ self.delivery_type = delivery_type
+ self.key = key
+ self.value = value
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-basic-blocked-error-event.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-basic-blocked-error-event.html
new file mode 100644
index 00000000000..62b869335f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-basic-blocked-error-event.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<head>
+ <title>CSP script-hash block causes error event</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-deadbeef'"></meta>
+</head>
+<body>
+ <script src="support/inline-script-should-be-blocked.js"></script>
+</body>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-1.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-1.html
new file mode 100644
index 00000000000..9da41dd1ef3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-1.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<head>
+ <title>CSP inline script check is done at #prepare-a-script (hash)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <!--
+ 'log1 += 'scr1 at #prepare-a-script';' => 'sha256-sI+xsvqqUw0LQQGgsgkYoXKWhlGgaCqsqVbPx0Z2A4s=' (allowed)
+ 'log1 += 'scr1 at #execute-the-script-block';' => 'sha256-Vtap5AhPN9kbQAbWqObJexCvNDexqoIwo4XsABQBqcg=' (blocked)
+ -->
+ <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-abc' 'sha256-sI+xsvqqUw0LQQGgsgkYoXKWhlGgaCqsqVbPx0Z2A4s='"></meta>
+</head>
+<!--
+ "Should element's inline behavior be blocked by Content Security Policy?"
+ is executed at the time of https://html.spec.whatwg.org/C/#prepare-a-script,
+ not at https://html.spec.whatwg.org/C/#execute-the-script-block.
+ So when innerText is modified after #prepare-a-script, the text BEFORE
+ the modification is used for hash check.
+-->
+<script nonce="abc">
+let log1 = '';
+</script>
+
+<!-- Execution order:
+ async script is executed
+ -> stylesheet is loaded
+ -> inline script is executed. -->
+<link rel="stylesheet" href="support/empty.css?dummy=1&pipe=trickle(d2)" type="text/css">
+<script src="support/change-scripthash-before-execute.js?dummy=1&pipe=trickle(d1)" async></script>
+<script id="scr1">log1 += 'scr1 at #prepare-a-script';</script>
+
+<script nonce="abc">
+test(() => {
+ assert_equals(log1, 'scr1 at #prepare-a-script');
+}, 'scr1.innerText before modification should not be blocked');
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-2.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-2.html
new file mode 100644
index 00000000000..927d60a8d78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/scripthash-changed-2.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<head>
+ <title>CSP inline script check is done at #prepare-a-script (hash)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <!--
+ 'log2 += 'scr2 at #prepare-a-script';' => 'sha256-9vE5NuHfEDoLvk3nPZPDX2/mnG+ZwKhpPuwQZwCDGc4=' (blocked)
+ 'log2 += 'scr2 at #execute-the-script-block';' => 'sha256-3AdhWTFuyxSUPxmqpTJaFRx3R5WNcyGw57lFoj1rTXw=' (allowed)
+ -->
+ <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-abc' 'sha256-3AdhWTFuyxSUPxmqpTJaFRx3R5WNcyGw57lFoj1rTXw='"></meta>
+</head>
+<!--
+ "Should element's inline behavior be blocked by Content Security Policy?"
+ is executed at the time of https://html.spec.whatwg.org/C/#prepare-a-script,
+ not at https://html.spec.whatwg.org/C/#execute-the-script-block.
+ So when innerText is modified after #prepare-a-script, the text BEFORE
+ the modification is used for hash check.
+-->
+<script nonce="abc">
+let log2 = '';
+</script>
+
+<!-- Execution order:
+ async script is executed
+ -> stylesheet is loaded
+ -> inline script is executed. -->
+<link rel="stylesheet" href="support/empty.css?dummy=2&pipe=trickle(d2)" type="text/css">
+<script src="support/change-scripthash-before-execute.js?dummy=2&pipe=trickle(d1)" async></script>
+<script id="scr2">log2 += 'scr2 at #prepare-a-script';</script>
+
+<script nonce="abc">
+test(() => {
+ assert_equals(log2, '');
+}, 'scr2.innerText before modification should be blocked');
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-1.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-1.html
new file mode 100644
index 00000000000..75f92f354ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<head>
+ <title>CSP inline script check is done at #prepare-a-script (nonce)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-abc' 'sha256-deadbeef'"></meta>
+</head>
+<!--
+ "Should element's inline behavior be blocked by Content Security Policy?"
+ is executed at the time of https://html.spec.whatwg.org/C/#prepare-a-script,
+ not at https://html.spec.whatwg.org/C/#execute-the-script-block.
+ So when nonce is modified after #prepare-a-script, the nonce BEFORE
+ the modification is used for hash check.
+-->
+<script nonce="abc">
+let log1 = '';
+</script>
+
+<!-- Execution order:
+ async script is executed
+ -> stylesheet is loaded
+ -> inline script is executed. -->
+<link rel="stylesheet" href="support/empty.css?dummy=3&pipe=trickle(d2)" type="text/css">
+<script src="support/change-scriptnonce-before-execute.js?dummy=3&pipe=trickle(d1)" async></script>
+<script id="scr1" nonce="abc">log1 += 'scr1 executed';</script>
+
+<script nonce="abc">
+test(() => {
+ assert_equals(log1, 'scr1 executed');
+}, 'scr1 nonce before modification should not be blocked');
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-2.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-2.html
new file mode 100644
index 00000000000..f2321dd656e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/scriptnonce-changed-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<head>
+ <title>CSP inline script check is done at #prepare-a-script (nonce)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-abc' 'sha256-deadbeef'"></meta>
+</head>
+<!--
+ "Should element's inline behavior be blocked by Content Security Policy?"
+ is executed at the time of https://html.spec.whatwg.org/C/#prepare-a-script,
+ not at https://html.spec.whatwg.org/C/#execute-the-script-block.
+ So when nonce is modified after #prepare-a-script, the nonce BEFORE
+ the modification is used for hash check.
+-->
+<script nonce="abc">
+let log2 = '';
+</script>
+
+<!-- Execution order:
+ async script is executed
+ -> stylesheet is loaded
+ -> inline script is executed. -->
+<link rel="stylesheet" href="support/empty.css?dummy=4&pipe=trickle(d2)" type="text/css">
+<script src="support/change-scriptnonce-before-execute.js?dummy=4&pipe=trickle(d1)" async></script>
+<script id="scr2" nonce="wrong">log2 += 'scr2 executed';</script>
+
+<script nonce="abc">
+test(() => {
+ assert_equals(log2, '');
+}, 'scr2 nonce before modification should be blocked');
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scripthash-before-execute.js b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scripthash-before-execute.js
new file mode 100644
index 00000000000..a04e8575b25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scripthash-before-execute.js
@@ -0,0 +1,10 @@
+// This script is executed after |scr1| and |scr2| are inserted into DOM
+// before their execution (if not blocked by CSP).
+if (document.getElementById("scr1")) {
+ document.getElementById("scr1").innerText =
+ "log1 += 'scr1 at #execute-the-script-block';";
+}
+if (document.getElementById("scr2")) {
+ document.getElementById("scr2").innerText =
+ "log2 += 'scr2 at #execute-the-script-block';";
+}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scriptnonce-before-execute.js b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scriptnonce-before-execute.js
new file mode 100644
index 00000000000..2676b34728f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/change-scriptnonce-before-execute.js
@@ -0,0 +1,8 @@
+// This script is executed after |scr1| and |scr2| are inserted into DOM
+// before their execution (if not blocked by CSP).
+if (document.getElementById('scr1')) {
+ document.getElementById('scr1').setAttribute('nonce', 'wrong');
+}
+if (document.getElementById('scr2')) {
+ document.getElementById('scr2').setAttribute('nonce', 'abc');
+}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/support/empty.css b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/empty.css
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/empty.css
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/support/inline-script-should-be-blocked.js b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/inline-script-should-be-blocked.js
new file mode 100644
index 00000000000..f32d25074bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/support/inline-script-should-be-blocked.js
@@ -0,0 +1,14 @@
+var t;
+async_test(t => {
+ self.t = t;
+ const s = document.createElement('script');
+ s.onerror = t.step_func(function() {
+ assert_unreached('Script error event should not be fired.');
+ });
+ s.onload = t.step_func(function() {
+ assert_unreached('Script load event should not be fired.');
+ });
+ s.innerText = 'self.t.assert_unreached("Script should not run.");'
+ document.body.appendChild(s);
+ setTimeout(() => t.done(), 2000);
+});
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/inheritance.html b/tests/wpt/web-platform-tests/css/css-fonts/inheritance.html
index f0c46bec508..6192e50638c 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/inheritance.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/inheritance.html
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<title>Inheritance of CSS Fonts Level 3 properties</title>
<link rel="help" href="https://www.w3.org/TR/css-fonts-3/#property-index">
-<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-stretch-prop">
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#property-index">
<meta name="assert" content="Properties inherit according to the spec.">
<meta name="assert" content="Properties have initial values according to the spec.">
<script src="/resources/testharness.js"></script>
@@ -40,6 +40,7 @@ assert_inherited('font-variant-east-asian', 'normal', 'ruby');
assert_inherited('font-variant-ligatures', 'normal', 'none');
assert_inherited('font-variant-numeric', 'normal', 'ordinal');
assert_inherited('font-variant-position', 'normal', 'super');
+assert_inherited('font-variation-settings', 'normal', '"wght" 700');
assert_inherited('font-weight', '400' /* normal */, '900');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html
new file mode 100644
index 00000000000..0b01320a7f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 3: getComputedStyle().fontVariationSettings</title>
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#propdef-font-variation-settings">
+<meta name="assert" content="font-variation-settings computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value('font-variation-settings', 'normal');
+
+test_computed_value('font-variation-settings', '"wght" 700');
+test_computed_value('font-variation-settings', '"wght" 700, "XHGT" 0.7');
+
+test_computed_value('font-variation-settings', '"XHGT" calc(0.4 + 0.3)', '"XHGT" 0.7');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html
new file mode 100644
index 00000000000..b957c310092
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 4: parsing font-variation-settings with invalid values</title>
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#propdef-font-variation-settings">
+<meta name="assert" content="font-variation-settings supports only the grammar 'normal | [ <string> <number>] #'.">
+<meta name="assert" content="font-variation-settings strings must have 4 characters.">
+ <script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value('font-variation-settings', '700');
+test_invalid_value('font-variation-settings', '"XHGT"');
+test_invalid_value('font-variation-settings', 'wght 700');
+test_invalid_value('font-variation-settings', 'normal, "wght" 700');
+
+test_invalid_value('font-variation-settings', '"wgt" 700');
+test_invalid_value('font-variation-settings', '"XHGTX" 0.7');
+test_invalid_value('font-variation-settings', '"abc\1F" 0.5');
+test_invalid_value('font-variation-settings', '"abc\7F" 0.5');
+test_invalid_value('font-variation-settings', '"abc\A9" 0.5');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html
new file mode 100644
index 00000000000..fe7f6bf7806
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 4: parsing font-variation-settings with valid values</title>
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#propdef-font-variation-settings">
+<meta name="assert" content="font-variation-settings supports the full grammar 'normal | [ <string> <number>] #'.">
+<meta name="assert" content="font-variation-settings strings are case sensitive.">
+ <script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value('font-variation-settings', 'normal');
+
+test_valid_value('font-variation-settings', '"wght" 700');
+test_valid_value('font-variation-settings', '"wght" 700, "XHGT" 0.7');
+
+test_valid_value('font-variation-settings', '"a cd" 0.5');
+test_valid_value('font-variation-settings', '"ab@d" 0.5');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-computed.html b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-computed.html
new file mode 100644
index 00000000000..e844dd71f84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-computed.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: getComputedStyle().dominantBaseline</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("dominant-baseline", "auto");
+test_computed_value("dominant-baseline", "text-bottom");
+test_computed_value("dominant-baseline", "alphabetic");
+test_computed_value("dominant-baseline", "ideographic");
+test_computed_value("dominant-baseline", "middle");
+test_computed_value("dominant-baseline", "central");
+test_computed_value("dominant-baseline", "mathematical");
+test_computed_value("dominant-baseline", "hanging");
+test_computed_value("dominant-baseline", "text-top");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-invalid.html b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-invalid.html
new file mode 100644
index 00000000000..2c4b76e0269
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-invalid.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: parsing dominant-baseline with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline supports only the grammar 'auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("dominant-baseline", "normal");
+test_invalid_value("dominant-baseline", "none");
+test_invalid_value("dominant-baseline", "alphabetic, ideographic");
+test_invalid_value("dominant-baseline", "middle central");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-valid.html b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-valid.html
new file mode 100644
index 00000000000..1a6c7a400cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-inline/parsing/dominant-baseline-valid.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: parsing dominant-baseline with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline supports the full grammar 'auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("dominant-baseline", "auto");
+test_valid_value("dominant-baseline", "text-bottom");
+test_valid_value("dominant-baseline", "alphabetic");
+test_valid_value("dominant-baseline", "ideographic");
+test_valid_value("dominant-baseline", "middle");
+test_valid_value("dominant-baseline", "central");
+test_valid_value("dominant-baseline", "mathematical");
+test_valid_value("dominant-baseline", "hanging");
+test_valid_value("dominant-baseline", "text-top");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000-ref.html
index 3d496cd391a..916f7161de6 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000-ref.html
@@ -52,7 +52,7 @@
<div class="outer">
<div class="blueborders"></div>
<div class="innerbg" style="left: 0"></div>
- <div class="inner lefthalf" style="left: 0; height: 60px">
+ <div class="inner lefthalf" style="left: 0">
AAAAA<br>
BBBBB<br>
CCCCC
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000.html
index 391985d6a89..98f808164e7 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-000.html
@@ -5,6 +5,7 @@
<link rel="author" title="Mozilla" href="https://mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
<link rel="match" href="multicol-breaking-000-ref.html">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001-ref.html
index 46357f940d2..db2b45c4dd6 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001-ref.html
@@ -67,7 +67,7 @@
JJJJJ
</div>
<div class="innerbg" style="left: 204px"></div>
- <div class="inner lefthalf" style="left: 204px; height: 80px">
+ <div class="inner lefthalf" style="left: 204px">
KKKKK<br>
LLLLL<br>
MMMMM<br>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001.html
index 69c9049266d..e1ba9669233 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-001.html
@@ -5,6 +5,7 @@
<link rel="author" title="Mozilla" href="https://mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
<link rel="match" href="multicol-breaking-001-ref.html">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004-ref.html
index 016885a9e64..f48ebb2108e 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004-ref.html
@@ -77,7 +77,7 @@
</div>
<div class="border-bottom" style="left: 0"></div>
<div class="innerbg" style="left: 204px"></div>
- <div class="inner lefthalf" style="left: 204px; height: 80px">
+ <div class="inner lefthalf" style="left: 204px">
KKKKK<br>
LLLLL<br>
MMMMM<br>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004.html
index 34b9f59137e..82931ac8516 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-004.html
@@ -6,6 +6,7 @@
<link rel="author" title="Mozilla" href="https://mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
<link rel="help" href="https://drafts.csswg.org/css-break/#break-decoration">
<link rel="match" href="multicol-breaking-004-ref.html">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000-ref.html
index e7ebcff4a08..7a99354061c 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000-ref.html
@@ -32,7 +32,7 @@
</style>
<div class="outer">
- <div class="inner lefthalf" style="left: 0; height: 60px">
+ <div class="inner lefthalf" style="left: 0">
AAAAA<br>
BBBBB<br>
CCCCC
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000.html
index a66a58fc746..768ec63298f 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-000.html
@@ -5,6 +5,7 @@
<link rel="author" title="Mozilla" href="https://mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
<link rel="match" href="multicol-breaking-nobackground-000-ref.html">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001-ref.html
index 006ec1d2221..ecba5cd0d9a 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001-ref.html
@@ -46,7 +46,7 @@
IIIII<br>
JJJJJ
</div>
- <div class="inner lefthalf" style="left: 204px; height: 80px">
+ <div class="inner lefthalf" style="left: 204px">
KKKKK<br>
LLLLL<br>
MMMMM<br>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001.html
index d47fcd31a0a..78eda2331f0 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001.html
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-breaking-nobackground-001.html
@@ -5,6 +5,7 @@
<link rel="author" title="Mozilla" href="https://mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#column-gaps-and-rules">
<link rel="help" href="https://drafts.csswg.org/css-multicol/#cf">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
<link rel="match" href="multicol-breaking-nobackground-001-ref.html">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001-ref.html
new file mode 100644
index 00000000000..29acc05a222
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001-ref.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the column rules' block-size with nested balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ .outer {
+ column-count: 2;
+ column-rule: 6px solid black;
+ column-fill: auto;
+ width: 400px;
+ height: 250px;
+ }
+ .inner {
+ column-count: 2;
+ column-rule: 3px solid gray;
+ column-fill: auto;
+ height: 200px;
+ }
+ .outer-block {
+ background-color: lightgreen;
+ height: 200px;
+ }
+ .inner-block {
+ background-color: lightblue;
+ height: 150px;
+ }
+ .space {
+ height: 50px;
+ }
+ </style>
+
+ <article class="outer">
+ <div class="outer-block"></div>
+ <div class="space"></div>
+ <article class="inner">
+ <div class="inner-block"></div><div class="space"></div>
+ <div class="inner-block"></div><div class="space"></div>
+ </article>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001.html
new file mode 100644
index 00000000000..0491bd37f1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-001.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the column rules' block-size with nested balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#cf">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-gaps-and-rules">
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
+ <link rel="match" href="multicol-rule-nested-balancing-001-ref.html">
+ <meta name="assert" content="This test verifies that the column-rules are extended to the content block-end edges of their corresponding inner and outer multicol container.">
+
+ <style>
+ .outer {
+ column-count: 2;
+ column-rule: 6px solid black;
+ width: 400px;
+ height: 250px;
+ }
+ .inner {
+ column-count: 2;
+ column-rule: 3px solid gray;
+ height: 200px;
+ }
+ .outer-block {
+ background-color: lightgreen;
+ height: 200px;
+ }
+ .inner-block {
+ background-color: lightblue;
+ height: 300px;
+ }
+ </style>
+
+ <article class="outer">
+ <div class="outer-block"></div>
+ <article class="inner">
+ <div class="inner-block"></div>
+ </article>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002-ref.html
new file mode 100644
index 00000000000..f5579661788
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002-ref.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the column rules' block-size with nested balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ .outer {
+ column-count: 2;
+ column-rule: 6px solid black;
+ column-fill: auto;
+ width: 400px;
+ height: 250px;
+ }
+ .inner {
+ column-count: 2;
+ column-rule: 3px solid gray;
+ column-fill: auto;
+ height: 200px;
+ }
+ .outer-block {
+ background-color: lightgreen;
+ height: 200px;
+ }
+ .inner-block {
+ background-color: lightblue;
+ height: 200px;
+ }
+ .space {
+ height: 50px;
+ }
+ </style>
+
+ <article class="outer">
+ <div class="outer-block"></div>
+ <div class="space"></div>
+ <article class="inner">
+ <div class="inner-block"></div>
+ <div class="inner-block"></div>
+ </article>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002.html
new file mode 100644
index 00000000000..b38f90947a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-rule-nested-balancing-002.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the column rules' block-size with nested balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#cf">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-gaps-and-rules">
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
+ <link rel="match" href="multicol-rule-nested-balancing-002-ref.html">
+ <meta name="assert" content="This test verifies that the column-rules are extended to the content block-end edges of their corresponding inner and outer multicol container, where the inner container has height: auto.">
+
+ <style>
+ .outer {
+ column-count: 2;
+ column-rule: 6px solid black;
+ width: 400px;
+ height: 250px;
+ }
+ .inner {
+ column-count: 2;
+ column-rule: 3px solid gray;
+ height: auto;
+ }
+ .outer-block {
+ background-color: lightgreen;
+ height: 200px;
+ }
+ .inner-block {
+ background-color: lightblue;
+ height: 400px;
+ }
+ </style>
+
+ <article class="outer">
+ <div class="outer-block"></div>
+ <article class="inner">
+ <div class="inner-block"></div>
+ </article>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a-ref.html
new file mode 100644
index 00000000000..0d6d44cc076
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the block-size distribution across column-span split in a balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 200px;
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ width: 400px;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="container">
+ <div class="block">block1</div>
+ </div>
+ </article>
+ <div class="column-span">column-span1</div>
+ <article>
+ <div class="container">
+ <div class="block">block2</div>
+ </div>
+ </article>
+ <div class="column-span">column-span2</div>
+ <article>
+ <div class="container" style="height: 50px;">
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a.html
new file mode 100644
index 00000000000..366ca33d078
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004a.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the block-size distribution across column-span split in a balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span">
+ <link rel="match" href="multicol-span-all-children-height-004a-ref.html">
+ <meta name="assert" content="This test verifies that a block container with a fixed block-size, split by column-span, distributes just enough block-size to hold its children.">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 450px;
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <!-- The container is split by the column-spans.
+ a) Before column-span1, it distributes 200px height into two columns,
+ and each column takes 100px height.
+ b) In between column-span1 and column-span2, same distribution as a).
+ c) After column-span2, it has 50px height left, which goes to the first
+ column.
+ -->
+ <div class="container">
+ <!-- Each block spreads its height evenly into two columns, and
+ each column contains 100px height. -->
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ <div class="column-span">column-span2</div>
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b-ref.html
new file mode 100644
index 00000000000..c6412ceaf3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the block-size distribution across column-span split in a balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 200px;
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ width: 400px;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="container">
+ <div class="block">block1</div>
+ </div>
+ </article>
+ <div class="column-span">column-span1</div>
+ <article>
+ <div class="container" style="height: 150px;">
+ <div class="block">block2</div>
+ </div>
+ </article>
+ <div class="column-span">column-span2</div>
+ <article>
+ <div class="container" style="height: 0;">
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b.html
new file mode 100644
index 00000000000..19202323047
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-004b.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the block-size distribution across column-span split in a balancing multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span">
+ <link rel="match" href="multicol-span-all-children-height-004b-ref.html">
+ <meta name="assert" content="This test verifies that a block container with a fixed block-size, split by column-span, distributes just enough block-size to hold its children.">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 350px;
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <!-- The container is split by the column-spans.
+ a) Before column-span1, it distributes 200px height into two columns,
+ and each column takes 100px height.
+ b) In between column-span1 and column-span2, it has 150px left. The first
+ column takes 100px, and the second column takes 50px.
+ -->
+ <div class="container">
+ <!-- Each block spreads its height evenly into two columns, and
+ each column contains 100px height. -->
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ <div class="column-span">column-span2</div>
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005-ref.html
new file mode 100644
index 00000000000..d5102e1f420
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the block-size distribution across column-span split in a column-fill:auto multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ article {
+ column-count: 1;
+ width: 200px;
+ background-color: lightgreen;
+ }
+ div.container {
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 100px;
+ background-color: yellow;
+ }
+ div.column-span {
+ width: 200px;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="container">
+ <div class="block">block1</div>
+ </div>
+ </article>
+ <div class="column-span">column-span1</div>
+ <article>
+ <div class="container">
+ <div class="block">block2</div>
+ </div>
+ </article>
+ <div class="column-span">column-span2</div>
+ <article>
+ <div class="container" style="height: 50px;">
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005.html
new file mode 100644
index 00000000000..33a820d32c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-005.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the block-size distribution across column-span split in a column-fill:auto multicol container</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span">
+ <link rel="match" href="multicol-span-all-children-height-005-ref.html">
+ <meta name="assert" content="This test verifies that a block container with a fixed block-size, split by column-span, distributes just enough block-size to hold its children.">
+
+ <style>
+ article {
+ column-count: 1;
+ column-fill: auto;
+ width: 200px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 250px;
+ background-color: pink;
+ }
+ div.block {
+ width: 100px;
+ height: 100px;
+ background-color: yellow;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <!-- The container is split by the column-spans.
+ a) Before column-span1, it distributes 100px height into the sole column.
+ b) In between column-span1 and column-span2, same distribution as a).
+ c) After column-span2, it has 50px height left.
+ -->
+ <div class="container">
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ <div class="column-span">column-span2</div>
+ <div class="block">block3</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html
new file mode 100644
index 00000000000..e34036b008b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test Reference: Test the borders drawing for a block split by column-span</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ background-color: pink;
+ border: 20px solid purple;
+ }
+ div.block {
+ /* This block spreads evenly into two columns, each has 100px height. */
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ width: 400px;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="container" style="border-bottom: none; height: 200px;">
+ <div class="block">block1</div>
+ </div>
+ </article>
+ <div class="column-span">column-span1</div>
+ <article>
+ <div class="container" style="border-top: none; height: 50px;">
+ <div class="block">block2</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html
new file mode 100644
index 00000000000..dd63cd8716f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-children-height-006.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the borders drawing for a block split by column-span</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span">
+ <link rel="match" href="multicol-span-all-children-height-006-ref.html">
+ <meta name="assert" content="This test verifies that the borders of block container with a fixed block-size, split by column-span, are skipped on the sides adjacent to column-span.">
+
+ <style>
+ article {
+ column-count: 2;
+ width: 400px;
+ background-color: lightgreen;
+ }
+ div.container {
+ height: 250px;
+ background-color: pink;
+ border: 20px solid purple;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ background-color: yellow;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="container">
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ </div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001-ref.html
new file mode 100644
index 00000000000..0ab9ac55345
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001-ref.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the column-rule's block-size</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+ <style>
+ article {
+ column-count: 2;
+ column-rule: 6px solid;
+ width: 400px;
+ height: 500px;
+ background-color: lightgreen;
+ border: 2em solid purple;
+ padding: 2em;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ <div class="column-span">column-span2</div>
+ <div class="block" style="height: 400px;">block3</div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001.html
new file mode 100644
index 00000000000..215aa567409
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-rule-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Multi-column Layout Test: Test the column rule's block-size</title>
+ <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span">
+ <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-gaps-and-rules">
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2309">
+ <link rel="match" href="multicol-span-all-rule-001-ref.html">
+ <meta name="assert" content="This test verifies that the column-rule after the last column-span is extended to the content block-end edge of the multicol container.">
+
+ <style>
+ article {
+ column-count: 2;
+ column-rule: 6px solid;
+ width: 400px;
+ height: 500px;
+ background-color: lightgreen;
+ border: 2em solid purple;
+ padding: 2em;
+ }
+ div.block {
+ width: 100px;
+ height: 200px;
+ }
+ div.column-span {
+ column-span: all;
+ height: 50px;
+ background-color: lightblue;
+ }
+ </style>
+
+ <article>
+ <!-- Each block spreads its height evenly into two columns, and
+ each column contains 100px height. -->
+ <div class="block">block1</div>
+ <div class="column-span">column-span1</div>
+ <div class="block">block2</div>
+ <div class="column-span">column-span2</div>
+ <!-- The column rule after column-span2 should extend to the content edge
+ of the multicol container as if block3 has "height: 400px;" -->
+ <div class="block">block3</div>
+ </article>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.tentative.html b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.html
index 0998fe68e00..0998fe68e00 100644
--- a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-001.html
diff --git a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.tentative.html b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.html
index 5991dd52e8b..5991dd52e8b 100644
--- a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-002.html
diff --git a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.tentative.html b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.html
index a329a8dfe3e..a329a8dfe3e 100644
--- a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-003.html
diff --git a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.tentative.html b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.html
index 2ed8d2687a3..2ed8d2687a3 100644
--- a/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-overflow/overflow-body-propagation-004.html
diff --git a/tests/wpt/web-platform-tests/css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html b/tests/wpt/web-platform-tests/css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html
new file mode 100644
index 00000000000..c0f0214ee18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=919415">
+<div id="target" style="position:absolute; overflow:auto; height:100px; top:100px;"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(()=> {
+ document.body.offsetTop;
+ target.style.top = "50px";
+ }, "no crash");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-overscroll-behavior/inheritance.html b/tests/wpt/web-platform-tests/css/css-overscroll-behavior/inheritance.html
index e49fa49bc4e..823d6239471 100644
--- a/tests/wpt/web-platform-tests/css/css-overscroll-behavior/inheritance.html
+++ b/tests/wpt/web-platform-tests/css/css-overscroll-behavior/inheritance.html
@@ -15,6 +15,8 @@
<div id="target"></div>
</div>
<script>
+assert_not_inherited('overscroll-behavior-block', 'auto', 'contain');
+assert_not_inherited('overscroll-behavior-inline', 'auto', 'contain');
assert_not_inherited('overscroll-behavior-x', 'auto', 'contain');
assert_not_inherited('overscroll-behavior-y', 'auto', 'contain');
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/before-dynamic-display-none.html b/tests/wpt/web-platform-tests/css/css-pseudo/before-dynamic-display-none.html
new file mode 100644
index 00000000000..d8844f9c961
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/before-dynamic-display-none.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>CSS Test: ::before box removed when display set to 'none'.</title>
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#generated-content">
+<link rel="match" href="../reference/pass_if_pass_below.html">
+<style>
+ #id::before {
+ content: "FAIL";
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background-color: red;
+ }
+ #id.none::before {
+ display: none;
+ }
+</style>
+<p>Test passes if there is the word "PASS" below.</p>
+<div id="id" class="open">PASS</div>
+<script>
+ id.offsetTop;
+ id.className = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-001.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-001.html
index a031765b324..6ae60eadb9e 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-001.html
@@ -16,7 +16,7 @@
background: green;
font-family: monospace;
width: 1ch;
- height: 20em;
+ height: 19em;
}
#test {
width: 1ch;
@@ -25,9 +25,12 @@
font-family: monospace;
line-break: anywhere;
}
+span {
+ background: red;
+}
</style>
<p>Test passes if there is a green rectangle below and no red.</p>
<div id=green></div>
<!-- with line breaks everywhere, none of the following characters should stick out from under the green div -->
-<div id=test>aa-a.a)a,a)a&nbsp;a&#xfeff;a&#x2060;a&#x200d;a・a</div>
+<div id=test>aa-a.a)a,a)a<span>&nbsp;</span>a&#xfeff;a&#x2060;a&#x200d;a・a</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/reference/line-break-anywhere-001-ref.html b/tests/wpt/web-platform-tests/css/css-text/line-break/reference/line-break-anywhere-001-ref.html
index ff74b3bce2d..daf17c9c0aa 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/reference/line-break-anywhere-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/reference/line-break-anywhere-001-ref.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!DOCTYPE html>
<html lang=en>
<meta charset="utf-8">
<title>CSS Text Test Reference</title>
@@ -9,7 +9,7 @@
background: green;
font-family: monospace;
width: 1ch;
- height: 20em;
+ height: 19em;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html
new file mode 100644
index 00000000000..c7e1855f979
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Text Test: Chrome pre-line crash test</title>
+<link rel="help" href="https://crbug.com/989827">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ br { white-space: pre-line }
+</style>
+<script>
+ test(() => {
+ document.documentElement.remove();
+ const br = document.createElement("br");
+ br.appendChild(document.createTextNode(""));
+ document.appendChild(br);
+ br.offsetTop;
+ br.firstChild.data = " ";
+ }, "Modifying data of a text child of a root br element with pre-line should not crash.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-computed.html b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-computed.html
new file mode 100644
index 00000000000..ffea289ea0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-computed.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSSOM View: getComputedStyle().scrollBehavior</title>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
+<meta name="assert" content="scroll-behavior computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("scroll-behavior", 'auto');
+test_computed_value("scroll-behavior", 'smooth');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-invalid.html b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-invalid.html
new file mode 100644
index 00000000000..6dfe36e2110
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-invalid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSSOM View: parsing scroll-behavior with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
+<meta name="assert" content="scroll-behavior supports only the grammar 'auto | smooth'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("scroll-behavior", 'normal');
+test_invalid_value("scroll-behavior", 'auto smooth');
+test_invalid_value("scroll-behavior", 'auto, smooth');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-valid.html b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-valid.html
new file mode 100644
index 00000000000..6e708b9d81c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/parsing/scroll-behavior-valid.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSSOM View: parsing scroll-behavior with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
+<meta name="assert" content="scroll-behavior supports the full grammar 'auto | smooth'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("scroll-behavior", 'auto');
+test_valid_value("scroll-behavior", 'smooth');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-interpolation.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-interpolation.html
index 7ad9482a2b4..75f855a2c8a 100644
--- a/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-interpolation.html
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-interpolation.html
@@ -42,7 +42,7 @@
to: 'right -140% bottom -60%',
}, [
{at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'},
- {at: 0, expect: 'left 480px top 400px'},
+ {at: 0, expect: 'left calc(0% + 480px) top calc(0% + 400px)'},
{at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'},
{at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'},
{at: 1, expect: 'right -140% bottom -60%'},
@@ -54,12 +54,12 @@
from: 'left top',
to: 'left 8px bottom 20%',
}, [
- {at: -1, expect: '-8px -80%'},
+ {at: -1, expect: 'calc(0% - 8px) -80%'},
{at: 0, expect: 'left top'},
- {at: 0.125, expect: '1px 10%'},
- {at: 0.875, expect: '7px 70%'},
- {at: 1, expect: 'left 8px bottom 20%'},
- {at: 2, expect: '16px 160%'}
+ {at: 0.125, expect: 'calc(0% + 1px) 10%'},
+ {at: 0.875, expect: 'calc(0% + 7px) 70%'},
+ {at: 1, expect: 'left calc(0% + 8px) bottom 20%'},
+ {at: 2, expect: 'calc(0% + 16px) 160%'}
]);
test_no_interpolation({
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-001.html b/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-001.html
new file mode 100644
index 00000000000..c5542640327
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-001.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <head>
+ <title>CSS Motion Path: Combined transformation matrix interpolation</title>
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
+ <link rel="match" href="offset-path-with-transforms-ref.html">
+ <meta name="assert" content="This tests animating combined transformation matrix.">
+ <style>
+ @keyframes anim {
+ to {
+ translate: 0px 100px;
+ offset-distance: 100%;
+ transform: translateX(-100px);
+ }
+ }
+ #target {
+ position: absolute;
+ width: 100px;
+ height: 50px;
+ background-color: lime;
+ offset-path: path("M25 0v100");
+ animation: anim 10s -5s paused linear;
+ }
+ </style>
+ </head>
+ <body onload="load()">
+ <div id="target"></div>
+ <div style='width: 50px; height: 100px; background-color: red;'></div>
+ </body>
+ <script>
+ requestAnimationFrame(() => {
+ document.documentElement.classList.remove('reftest-wait');
+ });
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-ref.html b/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-ref.html
new file mode 100644
index 00000000000..413369e0eff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/reftests/offset-path-with-transforms-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSS Motion Path: Combined transformation matrix interpolation reference</title>
+ <style>
+ #target {
+ width: 50px;
+ height: 100px;
+ background-color: lime;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="target"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion/offset-supports-calc.html b/tests/wpt/web-platform-tests/css/motion/offset-supports-calc.html
index 9ec737e6a87..907694f7fc3 100644
--- a/tests/wpt/web-platform-tests/css/motion/offset-supports-calc.html
+++ b/tests/wpt/web-platform-tests/css/motion/offset-supports-calc.html
@@ -22,7 +22,7 @@
test(function(){
target.style = 'offset-position: calc(30px + 20%) calc(-200px + 8em + 100%);';
- assert_equals(getComputedStyle(target).offsetPosition, 'calc(20% + 30px) calc(100% + -40px)');
+ assert_equals(getComputedStyle(target).offsetPosition, 'calc(20% + 30px) calc(100% - 40px)');
}, 'offset-position supports calc');
test(function(){
@@ -32,7 +32,7 @@ test(function(){
test(function(){
target.style = 'offset-distance: calc(-100px + 50%);';
- assert_equals(getComputedStyle(target).offsetDistance, 'calc(50% + -100px)');
+ assert_equals(getComputedStyle(target).offsetDistance, 'calc(50% - 100px)');
}, 'offset-distance supports calc');
test(function(){
@@ -42,7 +42,7 @@ test(function(){
test(function(){
target.style = 'offset-anchor: calc(30px + 20%) calc(-200px + 8em + 100%);';
- assert_equals(getComputedStyle(target).offsetAnchor, 'calc(20% + 30px) calc(100% + -40px)');
+ assert_equals(getComputedStyle(target).offsetAnchor, 'calc(20% + 30px) calc(100% - 40px)');
}, 'offset-anchor supports calc');
</script>
diff --git a/tests/wpt/web-platform-tests/css/motion/parsing/offset-anchor-parsing-valid.html b/tests/wpt/web-platform-tests/css/motion/parsing/offset-anchor-parsing-valid.html
index a69a5ce9f81..6cb4d44117f 100644
--- a/tests/wpt/web-platform-tests/css/motion/parsing/offset-anchor-parsing-valid.html
+++ b/tests/wpt/web-platform-tests/css/motion/parsing/offset-anchor-parsing-valid.html
@@ -19,7 +19,7 @@ test_valid_value("offset-anchor", "center center");
test_valid_value("offset-anchor", "right center");
test_valid_value("offset-anchor", "center top");
test_valid_value("offset-anchor", "center bottom");
-test_valid_value("offset-anchor", "calc(10px + 20%) center");
+test_valid_value("offset-anchor", "calc(20% + 10px) center");
test_valid_value("offset-anchor", "right 30em");
test_valid_value("offset-anchor", "10px 20%");
test_valid_value("offset-anchor", "left -10px top -20%");
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLInputElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLInputElement.html
index 65e33e8411f..13d1591b01f 100644
--- a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLInputElement.html
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLInputElement.html
@@ -20,7 +20,7 @@ if ('capture' in HTMLInputElement.prototype) {
instance['capture'] = 'user';
const logEntries = element.takeLog();
assert_array_equals(logEntries.types(), ['attributeChanged']);
- assert_attribute_log_entry(logEntries.last(), {name: 'capture', oldValue: '', newValue: 'user', namespace: null});
+ assert_attribute_log_entry(logEntries.last(), {name: 'capture', oldValue: null, newValue: 'user', namespace: null});
}, 'capture on HTMLInputElement must enqueue an attributeChanged reaction when adding new attribute');
test(() => {
@@ -43,7 +43,7 @@ if ('capture' in HTMLInputElement.prototype) {
instance['capture'] = 'asdf';
const logEntries = element.takeLog();
assert_array_equals(logEntries.types(), ['attributeChanged']);
- assert_attribute_log_entry(logEntries.last(), {name: 'capture', oldValue: '', newValue: 'asdf', namespace: null});
+ assert_attribute_log_entry(logEntries.last(), {name: 'capture', oldValue: null, newValue: 'asdf', namespace: null});
}, 'capture on HTMLInputElement must enqueue an attributeChanged reaction when adding invalid value default');
test(() => {
diff --git a/tests/wpt/web-platform-tests/docs/assets/reftest-tutorial-test-screenshot.png b/tests/wpt/web-platform-tests/docs/assets/reftest-tutorial-test-screenshot.png
new file mode 100644
index 00000000000..611fffbd220
--- /dev/null
+++ b/tests/wpt/web-platform-tests/docs/assets/reftest-tutorial-test-screenshot.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/docs/running-tests/chrome.md b/tests/wpt/web-platform-tests/docs/running-tests/chrome.md
index 3d68506f2c8..c56d3c56f84 100644
--- a/tests/wpt/web-platform-tests/docs/running-tests/chrome.md
+++ b/tests/wpt/web-platform-tests/docs/running-tests/chrome.md
@@ -3,12 +3,16 @@
When running Chrome, there are some useful command line arguments.
You can inform `wpt` of the release channel of Chrome using `--channel`.
-However, `wpt` currently does not support installing Chrome or finding the
-Chrome binary of a specific channel, so you would also need to specify the path
-to the Chrome binary with `--binary`. For example, to run Chrome Dev on Linux:
+`wpt` is able to find the correct binary in the following cases:
+* On Linux for stable, beta and dev channels if
+ `google-chrome-{stable,beta,unstable}` are in `PATH`;
+* On Mac for stable and canary channels if the official DMGs are installed.
-```
-./wpt run --channel dev --binary `which google-chrome-unstable` chrome
+In other cases, you will need to specify the path to the Chrome binary with
+`--binary`. For example:
+
+```bash
+./wpt run --channel dev --binary /path/to/non-default/google-chrome chrome
```
Note: when the channel is "dev", `wpt` will *automatically* enable all
@@ -19,7 +23,7 @@ Note: when the channel is "dev", `wpt` will *automatically* enable all
If you want to enable a specific [runtime enabled feature][1], use
`--binary-arg` to specify the flag(s) that you want to pass to Chrome:
-```
+```bash
./wpt run --binary-arg=--enable-blink-features=AsyncClipboard chrome clipboard-apis/
```
diff --git a/tests/wpt/web-platform-tests/docs/running-tests/chrome_android.md b/tests/wpt/web-platform-tests/docs/running-tests/chrome_android.md
index 5851cd55722..a216a8a68b8 100644
--- a/tests/wpt/web-platform-tests/docs/running-tests/chrome_android.md
+++ b/tests/wpt/web-platform-tests/docs/running-tests/chrome_android.md
@@ -2,35 +2,21 @@
To run WPT on Chrome on an Android device, some additional set up is required.
-First of all, as usual Android development, we need to have `adb` and be able to
-connect to the device.
+As with usual Android development, you need to have `adb` and be able to
+connect to the device. Run `adb devices` to verify.
-## Hosts
+Currently, Android support is a prototype with some known issues:
-Until we find a better way, we need to root the Android device and update the
-/etc/hosts file to include the entries printed by `./wpt make-hosts-file`.
+* If you have previously run `./wpt run` against Chrome, you might need to
+ remove `_venv/bin/chromedriver` so that we can install the correct
+ ChromeDriver corresponding to your Chrome for Android version.
+* We do not support reftests at the moment.
+* You will need to manually kill Chrome (all channels) before running tests.
-## CA certificate
+Note: rooting the device or installing a root CA is no longer required.
-In order to run HTTPS tests, we need to add
-[WPT's CA](https://github.com/web-platform-tests/wpt/blob/master/tools/certs/cacert.pem)
-to the phone. First, convert the certificate from PEM to CRT:
+Example (assuming you have Chrome Canary installed on your phone):
-```
-openssl x509 -outform der -in tools/certs/cacert.pem -out cacert.crt
-```
-
-Then copy `cacert.crt` to your phone's external storage (preferably to
-Downloads/ as it'll be easier to find). Open Settings -> Security & location ->
-Encryption & credentials -> Install from storage. Find and install `cacert.crt`.
-(The setting entries might be slightly different based your Android version.)
-
-Note that having this CA installed on your device outside of a test
-environment represents a security risk.
-
-
-Finally, we may run wpt with the `chrome_android` product
-
-```
-./wpt run chrome_android [test_list]
+```bash
+./wpt run --test-type=testharness --channel=canary chrome_android TESTS
```
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/index.md b/tests/wpt/web-platform-tests/docs/writing-tests/index.md
index 08a90ff5763..8af5aef5fed 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/index.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/index.md
@@ -18,6 +18,7 @@ There's also a load of [general guidelines](general-guidelines) that apply to al
h2tests
lint-tool
manual
+ reftest-tutorial
reftests
rendering
server-features
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/reftest-tutorial.md b/tests/wpt/web-platform-tests/docs/writing-tests/reftest-tutorial.md
new file mode 100644
index 00000000000..5eabb070894
--- /dev/null
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/reftest-tutorial.md
@@ -0,0 +1,276 @@
+# Writing a reftest
+
+<!--
+Note to maintainers:
+
+This tutorial is designed to be an authentic depiction of the WPT contribution
+experience. It is not intended to be comprehensive; its scope is intentionally
+limited in order to demonstrate authoring a complete test without overwhelming
+the reader with features. Because typical WPT usage patterns change over time,
+this should be updated periodically; please weigh extensions against the
+demotivating effect that a lengthy guide can have on new contributors.
+-->
+
+Let's say you've discovered that WPT doesn't have any tests for the `dir`
+attribute of [the `<bdo>`
+element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo). This
+tutorial will guide you through the process of writing and submitting a test.
+You'll need to [configure your system to use WPT's
+tools](../running-tests/from-local-system), but you won't need them until
+towards the end of this tutorial. Although it includes some very brief
+instructions on using git, you can find more guidance in [the tutorial for git
+and GitHub](../appendix/github-intro).
+
+WPT's reftests are great for testing web-platform features that have some
+visual effect. [The reftests reference page](reftests) describes them in the
+abstract, but for the purposes of this guide, we'll only consider the features
+we need to test the `<bdo>` element.
+
+```eval_rst
+.. contents::
+ :local:
+```
+
+## Setting up your workspace
+
+To make sure you have the latest code, first type the following into a terminal
+located in the root of the WPT git repository:
+
+ $ git fetch git@github.com:web-platform-tests/wpt.git
+
+Next, we need a place to store the change set we're about to author. Here's how
+to create a new git branch named `reftest-for-bdo` from the revision of WPT we
+just downloaded:
+
+ $ git checkout -b reftest-for-bdo FETCH_HEAD
+
+Now you're ready to create your patch.
+
+## Writing the test file
+
+First, we'll create a file that demonstrates the "feature under test." That is:
+we'll write an HTML document that displays some text using a `<bdo>` element.
+
+WPT has thousands of tests, so it can be daunting to decide where to put a new
+one. Generally speaking, [test files should be placed in directories
+corresponding to the specification text they are
+verifying](../test-suite-design). `<bdo>` is defined in [the "text-level
+semantics" chapter of the HTML
+specification](https://html.spec.whatwg.org/multipage/text-level-semantics.html),
+so we'll want to create our new test in the directory
+`html/semantics/text-level-semantics/the-bdo-element/`. Create a file named
+`rtl.html` and open it in your text editor.
+
+Here's one way to demonstrate the feature:
+
+```html
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>BDO element dir=rtl</title>
+<link rel="help" href="https://html.spec.whatwg.org/#the-bdo-element">
+<meta name="assert" content="BDO element's DIR content attribute renders corrently given value of 'rtl'.">
+
+<p>Test passes if WAS is displayed below.</p>
+<bdo dir="rtl">SAW</bdo>
+```
+
+That's pretty dense! Let's break it down:
+
+- ```html
+ <!DOCTYPE html>
+ <meta charset="utf-8">
+ ```
+
+ We explicitly set the DOCTYPE and character set to be sure that browsers
+ don't infer them to be something we aren't expecting. We're omitting the
+ `<html>` and `<head>` tags. That's a common practice in WPT, preferred
+ because it makes tests more concise.
+
+- ```html
+ <title>BDO element dir=rtl</title>
+ ```
+ The document's title should succinctly describe the feature under test.
+
+- ```html
+ <link rel="help" href="https://html.spec.whatwg.org/#the-bdo-element">
+ ```
+
+ The "help" metadata should reference the specification under test so that
+ everyone understands the motivation. This is so helpful that [the CSS Working
+ Group requires it for CSS tests](css-metadata)! If you're writing a reftest
+ for a feature outside of CSS, feel free to omit this tag.
+
+- ```html
+ <meta name="assert" content="BDO element's DIR content attribute renders corrently given value of 'rtl'.">
+ ```
+
+ The "assert" metadata is a structured way for you to describe exactly what
+ you want your reftest to verify. For a direct test like the one we're writing
+ here, it might seem a little superfluous. It's much more helpful for
+ more-involved tests where reviewers might need some help understanding your
+ intentions.
+
+ This tag is optional, so you can skip it if you think it's unnecessary. We
+ recommend using it for your first few tests since it may let reviewers give
+ you more helpful feedback. As you get more familiar with WPT and the
+ specifications, you'll get a sense for when and where it's better to leave it
+ out.
+
+- ```html
+ <p>Test passes if WAS is displayed below.</p>
+ ```
+
+ We're communicating the "pass" condition in plain English to make the test
+ self-describing.
+
+- ```html
+ <bdo dir="rtl">SAW</bdo>
+ ```
+
+ This is the real focus of the test. We're including some text inside a
+ `<bdo>` element in order to demonstrate the feature under test.
+
+Since this page doesn't rely on any [special WPT server
+features](server-features), we can view it by loading the HTML file directly.
+There are a bunch of ways to do this; one is to navigate to the
+`html/semantics/text-level-semantics/the-bdo-element/` directory in a file
+browser and drag the new `rtl.html` file into an open web browser window.
+
+![](/assets/reftest-tutorial-test-screenshot.png "screen shot of the new test")
+
+Sighted people can open that document and verify whether or not the stated
+expectation is satisfied. If we were writing a [manual test](manual), we'd be
+done. However, it's time-consuming for a human to run tests, so we should
+prefer making tests automatic whenever possible. Remember that we set out to
+write a "reference test." Now it's time to write the reference file.
+
+## Writing a "match" reference
+
+The "match" reference file describes what the test file is supposed to look
+like. Critically, it *must not* use the technology that we are testing. The
+reference file is what allows the test to be run by a computer--the computer
+can verify that each pixel in the test document exactly matches the
+corresponding pixel in the reference document.
+
+Make a new file in the same
+`html/semantics/text-level-semantics/the-bdo-element/` directory named
+`rtl-ref.html`, and save the following markup into it:
+
+```html
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>BDO element dir=rtl reference</title>
+
+<p>Test passes if WAS is displayed below.</p>
+<p>WAS</p>
+```
+
+This is like a stripped-down version of the test file. In order to produce a
+visual rendering which is the same as the expected rendering, it uses a `<p>`
+element whose contents is the characters in right-to-left order. That way, if
+the browser doesn't support the `<bdo>` element, this file will still show text
+in the correct sequence.
+
+This file is also completely functional without the WPT server, so you can open
+it in a browser directly from your hard drive.
+
+Currently, there's no way for a human operator or an automated script to know
+that the two files we've created are supposed to match visually. We'll need to
+add one more piece of metadata to the test file we created earlier. Open
+`html/semantics/text-level-semantics/the-bdo-element/rtl.html` in your text
+editor and add another `<link>` tag as described by the following change
+summary:
+
+```diff
+ <!DOCTYPE html>
+ <meta charset="utf-8">
+ <title>BDO element dir=rtl</title>
+ <link rel="author" title="Sam Smith" href="mailto:sam@example.com">
+ <link rel="help" href="https://html.spec.whatwg.org/#the-bdo-element">
++<link rel="match" href="rtl-ref.html">
+ <meta name="assert" content="BDO element's DIR content attribute renders corrently given value of 'rtl'.">
+
+ <p>Test passes if WAS is displayed below.</p>
+ <bdo dir="rtl">SAW</bdo>
+```
+
+Now, anyone (human or computer) reviewing the test file will know where to find
+the associated reference file.
+
+## Verifying our work
+
+We're done writing the test, but we should make sure it fits in with the rest
+of WPT before we submit it. This involves using some of the project's tools, so
+this is the point you'll need to [configure your system to run
+WPT](../running-tests/from-local-system).
+
+[The lint tool](lint-tool) can detect some of the common mistakes people make
+when contributing to WPT. To run it, open a command-line terminal, navigate to
+the root of the WPT repository, and enter the following command:
+
+ python ./wpt lint html/semantics/text-level-semantics/the-bdo-element
+
+If this recognizes any of those common mistakes in the new files, it will tell
+you where they are and how to fix them. If you do have changes to make, you can
+run the command again to make sure you got them right.
+
+Now, we'll run the test using the automated pixel-by-pixel comparison approach
+mentioned earlier. This is important for reftests because the test and the
+reference may differ in very subtle ways that are hard to catch with the naked
+eye. That's not to say your test has to pass in all browsers (or even in *any*
+browser). But if we expect the test to pass, then running it this way will help
+us catch other kinds of mistakes.
+
+The tools support running the tests in many different browsers. We'll use
+Firefox this time:
+
+ python ./wpt run firefox html/semantics/text-level-semantics/the-bdo-element/rtl.html
+
+We expect this test to pass, so if it does, we're ready to submit it. If we
+were testing a web platform feature that Firefox didn't support, we would
+expect the test to fail instead.
+
+There are a few problems to look out for in addition to passing/failing status.
+The report will describe fewer tests than we expect if the test isn't run at
+all. That's usually a sign of a formatting mistake, so you'll want to make sure
+you've used the right file names and metadata. Separately, the web browser
+might crash. That's often a sign of a browser bug, so you should consider
+[reporting it to the browser's
+maintainers](https://rachelandrew.co.uk/archives/2017/01/30/reporting-browser-bugs/)!
+
+## Submitting the test
+
+First, let's stage the new files for committing:
+
+ $ git add html/semantics/text-level-semantics/the-bdo-element/rtl.html
+ $ git add html/semantics/text-level-semantics/the-bdo-element/rtl-ref.html
+
+We can make sure the commit has everything we want to submit (and nothing we
+don't) by using `git diff`:
+
+ $ git diff --staged
+
+On most systems, you can use the arrow keys to navigate through the changes,
+and you can press the `q` key when you're done reviewing.
+
+Next, we'll create a commit with the staged changes:
+
+ $ git commit -m '[html] Add test for the `<bdo>` element'
+
+And now we can push the commit to our fork of WPT:
+
+ $ git push origin reftest-for-bdo
+
+The last step is to submit the test for review. WPT doesn't actually need the
+test we wrote in this tutorial, but if we wanted to submit it for inclusion in
+the repository, we would create a pull request on GitHub. [The guide on git and
+GitHub](../appendix/github-intro) has all the details on how to do that.
+
+## More practice
+
+Here are some ways you can keep experimenting with WPT using this test:
+
+- Improve coverage by adding more tests for related behaviors (e.g. nested
+ `<bdo>` elements)
+- Add another reference document which describes what the test should *not*
+ look like using [`rel=mismatch`](reftests)
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md b/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md
index c28a5d56566..845d6f8dc4f 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md
@@ -3,7 +3,9 @@
Reftests are one of the primary tools for testing things relating to
rendering; they are made up of the test and one or more other pages
("references") with assertions as to whether they render identically
-or not.
+or not. This page describes their aspects exhaustively; [the tutorial
+on writing a reftest](reftest-tutorial) offers a more limited but
+grounded guide to the process.
## How to Run Reftests
@@ -180,46 +182,5 @@ element works, it's possible to construct a reftest for underlining
a block element, by constructing a reference using underlines on a
```<span>``` that wraps all the content inside the block.
-## Example Reftests
-
-This example follows the recommended approach in being a
-self-describing test as it has a simple statement on the page
-describing how it should render to pass the tests.
-
-### Test File
-
-This test verifies that a right-to-left rendering of **SAW** within a
-```<bdo>``` element displays as **WAS**.
-
-```html
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>BDO element dir=rtl</title>
-<link rel="help" href="https://html.spec.whatwg.org/#the-bdo-element">
-<meta name="assert" content="BDO element's DIR content attribute renders corrently given value of 'rtl'.">
-<link rel="match" href="test-bdo-001.html">
-<p>Pass if you see WAS displayed below.</p>
-<bdo dir="rtl">SAW</bdo>
-```
-
-### Reference File
-
-The reference file must look exactly like the test file,
-except that the code behind it is different.
-
-* All metadata is removed.
-* The ```title``` need not match.
-* The markup that created the actual test data is
- different: here, the same effect is created with
- very mundane, dependable technology.
-
-```html
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>HTML Reference File</title>
-<p>Pass if you see WAS displayed below.</p>
-<p>WAS</p>
-```
-
[general guidelines]: general-guidelines
[rendering]: rendering
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md b/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
index d6ddce5a765..a970f47cf1d 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
@@ -38,6 +38,27 @@ Hop on to the [mailing list][public-test-infra] or [IRC][]
no need to announce your review request, as soon as you make a Pull Request
GitHub will inform interested parties.
+## Previews
+
+The website [wpt-submissions.live](http://wpt-submissions.live) exists to help
+contributors demonstrate their proposed changes to others. If your pull request
+is open and has the GitHub label `pull-request-has-preview`, then it will be
+available at `http://wpt-submissions.live/{{pull request ID}}`, where "pull
+request ID" is the numeric identifier for the pull request.
+
+For example, a pull request at https://github.com/web-platform-tests/wpt/pull/3
+has a pull request ID `3`. Once that has been assigned the
+`pull-request-has-preview` label, then its contents can be viewed at
+http://wpt-submissions.live/3.
+
+If you are [a GitHub
+collaborator](https://help.github.com/en/articles/permission-levels-for-a-user-account-repository)
+on WPT, the label and the preview will be created automatically. Because the
+WPT server will execute Python code in the mirrored submissions, previews are
+not created automatically for non-collaborators. Collaborators are encouraged
+to enable the preview by adding the label, provided they trust the authors not
+to submit malicious code.
+
[repo]: https://github.com/web-platform-tests/wpt/
[github flow]: https://guides.github.com/introduction/flow/
[public-test-infra]: https://lists.w3.org/Archives/Public/public-test-infra/
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
index 17fc37dcc61..329359caad6 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
@@ -158,7 +158,7 @@ promise_test(test_function, name, properties)
```
`test_function` is a function that receives a test as an argument. It must
-return a promise. The test completes when the returned promise resolves. The
+return a promise. The test completes when the returned promise settles. The
test fails if the returned promise rejects.
E.g.:
@@ -184,7 +184,12 @@ Note that in the promise chain constructed in `test_function` assertions don't
need to be wrapped in `step` or `step_func` calls.
Unlike Asynchronous Tests, Promise Tests don't start running until after the
-previous Promise Test finishes.
+previous Promise Test finishes. [Under rare
+circumstances](https://github.com/web-platform-tests/wpt/pull/17924), the next
+test may begin to execute before the returned promise has settled. Use
+[add_cleanup](#cleanup) to register any necessary cleanup actions such as
+resetting global state that need to happen consistently before the next test
+starts.
`promise_rejects` can be used to test Promises that need to reject:
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.htm
index 42ebb1da875..f26aaaa4a90 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.htm
@@ -1,15 +1,4 @@
-<!--
-try {
- var source = new EventSource("../resources/message.py")
- source.onopen = function(e) {
- this.close()
- postMessage([true, this.readyState])
- }
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>dedicated worker - EventSource: close()</title>
@@ -21,7 +10,7 @@ try {
<script>
var test = async_test();
test.step(function() {
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-close.js')
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -32,5 +21,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.js
new file mode 100644
index 00000000000..875c9098bac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close.js
@@ -0,0 +1,9 @@
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ this.close()
+ postMessage([true, this.readyState])
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.htm
index b1b74e88b82..34e07a2694e 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.htm
@@ -1,9 +1,4 @@
-<!--
-self.close()
-var source = new EventSource("../resources/message.py")
-postMessage(source.readyState)
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>dedicated worker - EventSource created after: worker.close()</title>
@@ -15,7 +10,7 @@ postMessage(source.readyState)
<script>
var test = async_test();
test.step(function() {
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-close2.js')
worker.onmessage = function(e) {
test.step(function() {
assert_equals(e.data, EventSource.CONNECTING, 'this.readyState')
@@ -25,5 +20,4 @@ postMessage(source.readyState)
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.js
new file mode 100644
index 00000000000..4a9cbd20b8a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-close2.js
@@ -0,0 +1,3 @@
+self.close()
+var source = new EventSource("../resources/message.py")
+postMessage(source.readyState) \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
index a90bbeb0bdc..b49d7ed609d 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
@@ -1,15 +1,3 @@
-<!--
-try {
- var url = decodeURIComponent(location.hash.substr(1))
- var source = new EventSource(url)
- source.onerror = function(e) {
- postMessage([true, this.readyState, 'data' in e])
- this.close();
- }
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
<!DOCTYPE html>
<html>
<head>
@@ -24,7 +12,7 @@ try {
function fetchFail(url) {
var test = async_test(document.title + " (" + url + ")")
test.step(function() {
- var worker = new Worker('#'+encodeURIComponent(url))
+ var worker = new Worker('eventsource-constructor-non-same-origin.js#'+encodeURIComponent(url))
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -44,4 +32,3 @@ try {
event is dispatched and not a MessageEvent -->
</body>
</html>
-<!--*/ //-->
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js
new file mode 100644
index 00000000000..5ec25a0678c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.js
@@ -0,0 +1,10 @@
+try {
+ var url = decodeURIComponent(location.hash.substr(1))
+ var source = new EventSource(url)
+ source.onerror = function(e) {
+ postMessage([true, this.readyState, 'data' in e])
+ this.close();
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.js
new file mode 100644
index 00000000000..2a450a34631
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-url-bogus.js
@@ -0,0 +1,7 @@
+try {
+ var source = new EventSource("http://this is invalid/")
+ postMessage([false, 'no exception thrown'])
+ source.close()
+} catch(e) {
+ postMessage([true, e.code])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmesage.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmesage.js
new file mode 100644
index 00000000000..9629f5e7936
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmesage.js
@@ -0,0 +1,9 @@
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onmessage = function(e) {
+ postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmessage.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmessage.htm
index 2de142ca5af..c61855f5249 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmessage.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onmessage.htm
@@ -1,15 +1,4 @@
-<!--
-try {
- var source = new EventSource("../resources/message.py")
- source.onmessage = function(e) {
- postMessage([true, e.data])
- this.close()
- }
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>dedicated worker - EventSource: onmessage</title>
@@ -21,7 +10,7 @@ try {
<script>
var test = async_test()
test.step(function() {
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-onmesage.js')
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -32,5 +21,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.htm
index e753b42f7b5..010b0c66a8c 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.htm
@@ -1,15 +1,4 @@
-<!--
-try {
- var source = new EventSource("../resources/message.py")
- source.onopen = function(e) {
- postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
- this.close()
- }
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>dedicated worker - EventSource: onopen (announcing the connection)</title>
@@ -21,7 +10,7 @@ try {
<script>
var test = async_test()
test.step(function() {
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-onopen.js')
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -35,5 +24,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.js
new file mode 100644
index 00000000000..72a10532630
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-onopen.js
@@ -0,0 +1,9 @@
+try {
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
+ this.close()
+ }
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.htm
index b16e24c8617..5a5ac4ec2a7 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.htm
@@ -1,14 +1,4 @@
-<!--
-try {
- EventSource.prototype.ReturnTrue = function() { return true }
- var source = new EventSource("../resources/message.py")
- postMessage([true, source.ReturnTrue(), 'EventSource' in self])
- source.close()
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
-<!DoCtYpE hTMl>
+<!doctype html>
<html>
<heAd>
<title>dedicated worker - EventSource: prototype et al</tiTle>
@@ -20,7 +10,7 @@ try {
<sCript>
var test = async_test();
test.step(function() {
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-prototype.js')
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -32,5 +22,4 @@ try {
})
</scrIpt>
</bOdy>
-</htMl>
-<!--*/ //-->
+</htMl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.js
new file mode 100644
index 00000000000..26993cb4efd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-prototype.js
@@ -0,0 +1,8 @@
+try {
+ EventSource.prototype.ReturnTrue = function() { return true }
+ var source = new EventSource("../resources/message.py")
+ postMessage([true, source.ReturnTrue(), 'EventSource' in self])
+ source.close()
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.htm
index c1ed0782713..59e77cba57c 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.htm
@@ -1,13 +1,4 @@
-<!--
-try {
- var source = new EventSource("../resources/message.py")
- postMessage([true, source.url])
- source.close()
-} catch(e) {
- postMessage([false, String(e)])
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>dedicated worker - EventSource: url</title>
@@ -20,7 +11,7 @@ try {
var test = async_test();
test.step(function() {
var url = "resources/message.py"
- var worker = new Worker('#')
+ var worker = new Worker('eventsource-url.js')
worker.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1]);
@@ -31,5 +22,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.js b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.js
new file mode 100644
index 00000000000..7a3c8030d27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-url.js
@@ -0,0 +1,7 @@
+try {
+ var source = new EventSource("../resources/message.py")
+ postMessage([true, source.url])
+ source.close()
+} catch(e) {
+ postMessage([false, String(e)])
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.htm
index 0a0bdc7b866..30fbc309ab6 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.htm
@@ -1,18 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var source = new EventSource("../resources/message.py")
- source.onopen = function(e) {
- this.close()
- port.postMessage([true, this.readyState])
- }
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>shared worker - EventSource: close()</title>
@@ -24,7 +10,7 @@ try {
<script>
var test = async_test();
test.step(function() {
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-close.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -35,5 +21,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.js
new file mode 100644
index 00000000000..8d160b605f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-close.js
@@ -0,0 +1,12 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ this.close()
+ port.postMessage([true, this.readyState])
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
index 1cf4a15ee66..690cde36002 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
@@ -1,18 +1,3 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var url = decodeURIComponent(location.hash.substr(1))
- var source = new EventSource(url)
- source.onerror = function(e) {
- port.postMessage([true, this.readyState, 'data' in e])
- this.close();
- }
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
<!DOCTYPE html>
<html>
<head>
@@ -27,7 +12,7 @@ try {
function fetchFail(url) {
var test = async_test(document.title + " (" + url + ")")
test.step(function() {
- var worker = new SharedWorker('#'+encodeURIComponent(url))
+ var worker = new SharedWorker('eventsource-constructor-non-same-origin.js#'+encodeURIComponent(url))
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -47,4 +32,3 @@ try {
event is dispatched and not a MessageEvent -->
</body>
</html>
-<!--*/ //-->
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.js
new file mode 100644
index 00000000000..a68dc5b0b7d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.js
@@ -0,0 +1,13 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var url = decodeURIComponent(location.hash.substr(1))
+ var source = new EventSource(url)
+ source.onerror = function(e) {
+ port.postMessage([true, this.readyState, 'data' in e])
+ this.close();
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-url-bogus.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-url-bogus.js
new file mode 100644
index 00000000000..80847357b55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-url-bogus.js
@@ -0,0 +1,10 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("http://this is invalid/")
+ port.postMessage([false, 'no exception thrown'])
+ source.close()
+} catch(e) {
+ port.postMessage([true, e.code])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.htm
index f5f9439d127..f25509dfd4a 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.htm
@@ -1,19 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var source = new EventSource("../resources/message.py")
- source.addEventListener("message", listener, false)
- function listener(e) {
- port.postMessage([true, e.data])
- this.close()
- }
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>shared worker - EventSource: addEventListener()</title>
@@ -25,7 +10,7 @@ try {
<script>
var test = async_test()
test.step(function() {
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-eventtarget.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -36,5 +21,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.js
new file mode 100644
index 00000000000..761165118ac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-eventtarget.js
@@ -0,0 +1,13 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.addEventListener("message", listener, false)
+ function listener(e) {
+ port.postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmesage.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmesage.js
new file mode 100644
index 00000000000..f5e2c898df0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmesage.js
@@ -0,0 +1,12 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onmessage = function(e) {
+ port.postMessage([true, e.data])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmessage.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmessage.htm
index 82c3ce7f238..bcd6093454d 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmessage.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onmessage.htm
@@ -1,18 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var source = new EventSource("../resources/message.py")
- source.onmessage = function(e) {
- port.postMessage([true, e.data])
- this.close()
- }
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>shared worker - EventSource: onmessage</title>
@@ -24,7 +10,7 @@ try {
<script>
var test = async_test()
test.step(function() {
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-onmesage.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -35,5 +21,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.htm
index 25467817ff9..752a6e449f9 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.htm
@@ -1,18 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var source = new EventSource("../resources/message.py")
- source.onopen = function(e) {
- port.postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
- this.close()
- }
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>shared worker - EventSource: onopen (announcing the connection)</title>
@@ -24,7 +10,7 @@ try {
<script>
var test = async_test()
test.step(function() {
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-onopen.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -38,5 +24,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.js
new file mode 100644
index 00000000000..6dc9424a213
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-onopen.js
@@ -0,0 +1,12 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ source.onopen = function(e) {
+ port.postMessage([true, source.readyState, 'data' in e, e.bubbles, e.cancelable])
+ this.close()
+ }
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.htm
index 27d51a8587b..16c932a3384 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.htm
@@ -1,17 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- EventSource.prototype.ReturnTrue = function() { return true }
- var source = new EventSource("../resources/message.py")
- port.postMessage([true, source.ReturnTrue(), 'EventSource' in self])
- source.close()
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DoCtYpE hTMl>
+<!doctype html>
<html>
<heAd>
<title>shared worker - EventSource: prototype et al</tiTle>
@@ -23,7 +10,7 @@ try {
<sCript>
var test = async_test();
test.step(function() {
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-prototype.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1])
@@ -35,5 +22,4 @@ try {
})
</scrIpt>
</bOdy>
-</htMl>
-<!--*/ //-->
+</htMl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.js
new file mode 100644
index 00000000000..f4c809a9b3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-prototype.js
@@ -0,0 +1,11 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ EventSource.prototype.ReturnTrue = function() { return true }
+ var source = new EventSource("../resources/message.py")
+ port.postMessage([true, source.ReturnTrue(), 'EventSource' in self])
+ source.close()
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.htm
index 0491085e9e3..a1c9ca8455f 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.htm
@@ -1,16 +1,4 @@
-<!--
-onconnect = function(e) {
-try {
- var port = e.ports[0]
- var source = new EventSource("../resources/message.py")
- port.postMessage([true, source.url])
- source.close()
-} catch(e) {
- port.postMessage([false, String(e)])
-}
-}
-/*-->
-<!DOCTYPE html>
+<!doctype html>
<html>
<head>
<title>shared worker - EventSource: url</title>
@@ -23,7 +11,7 @@ try {
var test = async_test();
test.step(function() {
var url = "resources/message.py"
- var worker = new SharedWorker('#')
+ var worker = new SharedWorker('eventsource-url.js')
worker.port.onmessage = function(e) {
test.step(function() {
assert_true(e.data[0], e.data[1]);
@@ -34,5 +22,4 @@ try {
})
</script>
</body>
-</html>
-<!--*/ //-->
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.js b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.js
new file mode 100644
index 00000000000..491dbac3332
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-url.js
@@ -0,0 +1,10 @@
+onconnect = function(e) {
+try {
+ var port = e.ports[0]
+ var source = new EventSource("../resources/message.py")
+ port.postMessage([true, source.url])
+ source.close()
+} catch(e) {
+ port.postMessage([false, String(e)])
+}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html-media-capture/capture_reflect.html b/tests/wpt/web-platform-tests/html-media-capture/capture_reflect.html
index 39f391eb674..f593236b532 100644
--- a/tests/wpt/web-platform-tests/html-media-capture/capture_reflect.html
+++ b/tests/wpt/web-platform-tests/html-media-capture/capture_reflect.html
@@ -53,8 +53,8 @@
}, 'input.capture is "user" when the capture attribute is user');
test(function() {
- assert_equals(document.querySelector('#present-invalid').capture, "invalid");
- }, 'input.capture is "invalid" when the capture attribute is invalid value default');
+ assert_equals(document.querySelector('#present-invalid').capture, "");
+ }, 'input.capture is "" when the capture attribute is invalid value default');
test(function() {
assert_equals(document.querySelector('#present-environment').capture, "environment");
diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html
new file mode 100644
index 00000000000..b5f3ec1aa62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/align.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<title>align attribute mapping on replaced elements</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<img id="replaced" src="/images/green.png">
+<something id="non-replaced"></something>
+<script>
+const kMapping = {
+ "left": ["float", "left"],
+ "right": ["float", "right"],
+
+ "top": ["vertical-align", "top"],
+
+ // This one requires a magic value (`-moz-middle-with-baseline` on Gecko,
+ // `-webkit-baseline-middle` on WebKit-based browsers).
+ "middle": ["vertical-align", undefined],
+ // These are inconsistent across browsers. WebKit maps it to "middle", Gecko
+ // to the aforementioned value.
+ "center": ["vertical-align", undefined],
+
+ "baseline": ["vertical-align", "baseline"],
+ "bottom": ["vertical-align", "baseline"], // *shrug*
+
+ "texttop": ["vertical-align", "text-top"],
+ "absmiddle": ["vertical-align", "middle"],
+ "abscenter": ["vertical-align", "middle"],
+ "absbottom": ["vertical-align", "bottom"],
+};
+
+const kInitialValues = {
+ "vertical-align": "baseline",
+ "float": "none",
+};
+
+let replaced = document.getElementById("replaced");
+let nonReplaced = document.getElementById("non-replaced");
+let t = async_test("align attribute mapping");
+onload = t.step_func_done(function() {
+ for (const attributeValue in kMapping) {
+ for (const element of [replaced, nonReplaced]) {
+ test(function() {
+ element.setAttribute("align", attributeValue);
+ let [property, expected] = kMapping[attributeValue];
+ let actual = getComputedStyle(element).getPropertyValue(property);
+ if (element == nonReplaced) {
+ assert_equals(actual, kInitialValues[property], "align shouldn't map to non-replaced elements")
+ } else {
+ if (expected) {
+ assert_equals(actual, expected, `align=${attributeValue} should map to ${property}: ${expected}`);
+ } else {
+ assert_equals(property, "vertical-align");
+ assert_not_equals(actual, "baseline", `align=${attributeValue} should map a vertical-align value`);
+ }
+ }
+ }, `align=${attributeValue} on ${element == replaced ? "replaced" : "non-replaced"} elements`);
+ }
+ }
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl b/tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl
index ee444ebb29d..d8f54b1e15b 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl
@@ -14,10 +14,6 @@ partial namespace CSS {
void registerProperty(PropertyDefinition definition);
};
-partial interface CSSRule {
- const unsigned short PROPERTY_RULE = 18;
-};
-
[Exposed=Window]
interface CSSPropertyRule : CSSRule {
readonly attribute CSSOMString name;
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl
index 798adc19f2a..dc9b78fda61 100644
--- a/tests/wpt/web-platform-tests/interfaces/cssom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl
@@ -69,18 +69,20 @@ interface CSSRuleList {
[Exposed=Window]
interface CSSRule {
+ attribute CSSOMString cssText;
+ readonly attribute CSSRule? parentRule;
+ readonly attribute CSSStyleSheet? parentStyleSheet;
+
+ // the following attribute and constants are historial
+ readonly attribute unsigned short type;
const unsigned short STYLE_RULE = 1;
- const unsigned short CHARSET_RULE = 2; // historical
+ const unsigned short CHARSET_RULE = 2;
const unsigned short IMPORT_RULE = 3;
const unsigned short MEDIA_RULE = 4;
const unsigned short FONT_FACE_RULE = 5;
const unsigned short PAGE_RULE = 6;
const unsigned short MARGIN_RULE = 9;
const unsigned short NAMESPACE_RULE = 10;
- readonly attribute unsigned short type;
- attribute CSSOMString cssText;
- readonly attribute CSSRule? parentRule;
- readonly attribute CSSStyleSheet? parentStyleSheet;
};
[Exposed=Window]
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index 5ae46f74292..47abcda810a 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -1359,12 +1359,9 @@ interface mixin CanvasPath {
void quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
void bezierCurveTo(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y);
void arcTo(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius);
-
void rect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
void arc(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
-
void ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
-
};
[Exposed=(Window,Worker)]
@@ -1582,7 +1579,6 @@ interface Window : EventTarget {
[Replaceable] readonly attribute WindowProxy self;
[Unforgeable] readonly attribute Document document;
attribute DOMString name;
-
[PutForwards=href, Unforgeable] readonly attribute Location location;
readonly attribute History history;
readonly attribute CustomElementRegistry customElements;
@@ -1614,7 +1610,6 @@ interface Window : EventTarget {
// the user agent
readonly attribute Navigator navigator;
-
[SecureContext] readonly attribute ApplicationCache applicationCache;
// user prompts
@@ -2375,7 +2370,6 @@ interface HTMLFontElement : HTMLElement {
[CEReactions] attribute [TreatNullAs=EmptyString] DOMString color;
[CEReactions] attribute DOMString face;
[CEReactions] attribute DOMString size;
-
};
partial interface HTMLHeadingElement {
diff --git a/tests/wpt/web-platform-tests/interfaces/layout-instability.idl b/tests/wpt/web-platform-tests/interfaces/layout-instability.idl
new file mode 100644
index 00000000000..1bacea77bce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/layout-instability.idl
@@ -0,0 +1,10 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: Layout Instability API (https://wicg.github.io/layout-instability/)
+
+interface LayoutShift : PerformanceEntry {
+ readonly attribute long value;
+ readonly attribute boolean hadRecentInput;
+ readonly attribute DOMHighResTimeStamp lastInputTime;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
index 365b38ff191..13afc27663d 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl
@@ -14,7 +14,7 @@ dictionary NDEFMessageInit {
sequence<NDEFRecordInit> records;
};
-typedef (DOMString or unrestricted double or ArrayBuffer or Dictionary) NDEFRecordData;
+typedef (DOMString or unrestricted double or ArrayBuffer or object) NDEFRecordData;
[Constructor(NDEFRecordInit recordInit), Exposed=Window]
interface NDEFRecord {
diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
index bf57b8bccf4..67fd504a54e 100644
--- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
@@ -162,6 +162,10 @@ partial dictionary AuthenticationExtensionsClientOutputs {
};
partial dictionary AuthenticationExtensionsClientInputs {
+ USVString appidExclude;
+};
+
+partial dictionary AuthenticationExtensionsClientInputs {
USVString txAuthSimple;
};
diff --git a/tests/wpt/web-platform-tests/layout-instability/idlharness.window.js b/tests/wpt/web-platform-tests/layout-instability/idlharness.window.js
new file mode 100644
index 00000000000..7d97446a578
--- /dev/null
+++ b/tests/wpt/web-platform-tests/layout-instability/idlharness.window.js
@@ -0,0 +1,16 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+// https://wicg.github.io/layout-instability/
+
+'use strict';
+
+idl_test(
+ ['layout-instability'],
+ ['performance-timeline'],
+ idl_array => {
+ idl_array.add_objects({
+ // LayoutShift: [ TODO ]
+ });
+ }
+);
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html
index c59e690f162..73e5020e74c 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html
@@ -19,6 +19,7 @@
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/attribute-values.js"></script>
<script>
setup({ explicit_done: true });
var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
@@ -36,60 +37,67 @@
});
function runTests() {
- test(function() {
- verify_displaystyle("math_default", false, "default");
- verify_displaystyle("math_inline", false, "explicit display inline");
- verify_displaystyle("math_block", true, "explicit display block");
- verify_displaystyle("math_false", false, "explicit displaystyle false");
- verify_displaystyle("math_true", true, "explicit displaystyle true");
- verify_displaystyle("math_block_false", false, "explicit display block and displaystyle false");
- verify_displaystyle("math_block_true", true, "explicit display block and displaystyle true");
- }, "math element");
- test(function() {
- verify_displaystyle("mstyle_false", false, "explicit displaystyle false");
- verify_displaystyle("mstyle_true", true, "explicit displaystyle true");
- }, "mstyle element");
- test(function() {
- verify_displaystyle("mtable_default", false, "default");
- verify_displaystyle("mtable_false", false, "explicit displaystyle false");
- verify_displaystyle("mtable_true", true, "explicit displaystyle true");
- }, "mtable element");
- test(function() {
- verify_displaystyle("mfrac_sibling", true, "sibling");
- verify_displaystyle("mfrac_numerator", false, "numerator");
- verify_displaystyle("mfrac_denominator", false, "denominator");
- }, "mfrac element");
- test(function() {
- verify_displaystyle("mroot_base", true, "base");
- verify_displaystyle("mroot_index", false, "index");
- }, "mroot element");
- test(function() {
- verify_displaystyle("msub_base", true, "base");
- verify_displaystyle("msub_subscript", false, "subscript");
- }, "msub element");
- test(function() {
- verify_displaystyle("msup_base", true, "base");
- verify_displaystyle("msup_supscript", false, "supscript");
- }, "msup element");
- test(function() {
- verify_displaystyle("msubsup_base", true, "base");
- verify_displaystyle("msubsup_subscript", false, "subscript");
- verify_displaystyle("msubsup_supscript", false, "supscript");
- }, "msubsup element");
- test(function() {
- verify_displaystyle("munder_base", true, "base");
- verify_displaystyle("munder_underscript", false, "underscript");
- }, "munder element");
- test(function() {
- verify_displaystyle("mover_base", true, "base");
- verify_displaystyle("mover_overscript", false, "overscript");
- }, "mover element");
- test(function() {
- verify_displaystyle("munderover_base", true, "base");
- verify_displaystyle("munderover_underscript", false, "underscript");
- verify_displaystyle("munderover_overscript", false, "overscript");
- }, "munderover element");
- done();
+ for (transform in AttributeValueTransforms) {
+ TransformAttributeValues(transform, ["display", "displaystyle"]);
+ test(function() {
+ verify_displaystyle("math_default", false, "default");
+ verify_displaystyle("math_false", false, "explicit displaystyle false");
+ verify_displaystyle("math_true", true, "explicit displaystyle true");
+ }, `math element (${transform})`);
+ test(function() {
+ verify_displaystyle("math_inline", false, "explicit display inline");
+ verify_displaystyle("math_block", true, "explicit display block");
+ verify_displaystyle("math_block_false", false, "explicit display block and displaystyle false");
+ verify_displaystyle("math_block_true", true, "explicit display block and displaystyle true");
+ verify_displaystyle("math_inline_false", false, "explicit display inline and displaystyle false");
+ verify_displaystyle("math_inline_true", true, "explicit display inline and displaystyle true");
+ }, `math element (explicit display, ${transform})`);
+ test(function() {
+ verify_displaystyle("mstyle_false", false, "explicit displaystyle false");
+ verify_displaystyle("mstyle_true", true, "explicit displaystyle true");
+ }, `mstyle element (${transform})`);
+ test(function() {
+ verify_displaystyle("mtable_default", false, "default");
+ verify_displaystyle("mtable_false", false, "explicit displaystyle false");
+ verify_displaystyle("mtable_true", true, "explicit displaystyle true");
+ }, `mtable element (${transform})`);
+ test(function() {
+ verify_displaystyle("mfrac_sibling", true, "sibling");
+ verify_displaystyle("mfrac_numerator", false, "numerator");
+ verify_displaystyle("mfrac_denominator", false, "denominator");
+ }, `mfrac element (${transform})`);
+ test(function() {
+ verify_displaystyle("mroot_base", true, "base");
+ verify_displaystyle("mroot_index", false, "index");
+ }, `mroot element (${transform})`);
+ test(function() {
+ verify_displaystyle("msub_base", true, "base");
+ verify_displaystyle("msub_subscript", false, "subscript");
+ }, `msub element (${transform})`);
+ test(function() {
+ verify_displaystyle("msup_base", true, "base");
+ verify_displaystyle("msup_supscript", false, "supscript");
+ }, `msup element (${transform})`);
+ test(function() {
+ verify_displaystyle("msubsup_base", true, "base");
+ verify_displaystyle("msubsup_subscript", false, "subscript");
+ verify_displaystyle("msubsup_supscript", false, "supscript");
+ }, `msubsup element (${transform})`);
+ test(function() {
+ verify_displaystyle("munder_base", true, "base");
+ verify_displaystyle("munder_underscript", false, "underscript");
+ }, `munder element (${transform})`);
+ test(function() {
+ verify_displaystyle("mover_base", true, "base");
+ verify_displaystyle("mover_overscript", false, "overscript");
+ }, `mover element (${transform})`);
+ test(function() {
+ verify_displaystyle("munderover_base", true, "base");
+ verify_displaystyle("munderover_underscript", false, "underscript");
+ verify_displaystyle("munderover_overscript", false, "overscript");
+ }, `munderover element (${transform})`);
+ }
+ done();
}
</script>
</head>
@@ -106,6 +114,12 @@
<math display="block" displaystyle="true">
<mo id="math_block_true">&#x2AFF;</mo>
</math>
+ <math display="inline" displaystyle="false">
+ <mo id="math_inline_false">&#x2AFF;</mo>
+ </math>
+ <math display="inline" displaystyle="true">
+ <mo id="math_inline_true">&#x2AFF;</mo>
+ </math>
<math><mstyle displaystyle="false"><mo id="mstyle_false">&#x2AFF;</mo></mstyle></math>
<math><mstyle displaystyle="true"><mo id="mstyle_true">&#x2AFF;</mo></mstyle></math>
<math displaystyle="true"><mtable><mtr><mtd><mo id="mtable_default">&#x2AFF;</mo></mtd></mtr></mtable></math>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-2.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-2.html
index f89ade019b5..fc1bd7a432d 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-2.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-2.html
@@ -19,6 +19,7 @@
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/attribute-values.js"></script>
<script>
setup({ explicit_done: true });
var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
@@ -36,45 +37,48 @@
});
function runTests() {
- test(function() {
- verify_displaystyle("cell_false", false, "cell with displaystyle false");
- verify_displaystyle("cell_true", true, "cell with displaystyle true");
- }, "mtable element");
- test(function() {
- verify_displaystyle("mfrac_numerator", true, "numerator");
- verify_displaystyle("mfrac_denominator", true, "denominator");
- }, "mfrac element");
- test(function() {
- verify_displaystyle("mroot_base", false, "base");
- verify_displaystyle("mroot_index", true, "index");
- }, "mroot element");
- test(function() {
- verify_displaystyle("msub_base", false, "base");
- verify_displaystyle("msub_subscript", true, "subscript");
- }, "msub element");
- test(function() {
- verify_displaystyle("msup_base", false, "base");
- verify_displaystyle("msup_superscript", true, "superscript");
- }, "msup element");
- test(function() {
- verify_displaystyle("msubsup_base", false, "base");
- verify_displaystyle("msubsup_subscript", true, "subscript");
- verify_displaystyle("msubsup_superscript", true, "superscript");
- }, "msubsup element");
- test(function() {
- verify_displaystyle("munder_base", false, "base");
- verify_displaystyle("munder_underscript", true, "underscript");
- }, "munder element");
- test(function() {
- verify_displaystyle("mover_base", false, "base");
- verify_displaystyle("mover_overscript", true, "overscript");
- }, "mover element");
- test(function() {
- verify_displaystyle("munderover_base", false, "base");
- verify_displaystyle("munderover_underscript", true, "underscript");
- verify_displaystyle("munderover_overscript", true, "overscript");
- }, "munderover element");
- done();
+ for (transform in AttributeValueTransforms) {
+ TransformAttributeValues(transform, ["display", "displaystyle"]);
+ test(function() {
+ verify_displaystyle("cell_false", false, "cell with displaystyle false");
+ verify_displaystyle("cell_true", true, "cell with displaystyle true");
+ }, `mtable element (${transform})`);
+ test(function() {
+ verify_displaystyle("mfrac_numerator", true, "numerator");
+ verify_displaystyle("mfrac_denominator", true, "denominator");
+ }, `mfrac element (${transform})`);
+ test(function() {
+ verify_displaystyle("mroot_base", false, "base");
+ verify_displaystyle("mroot_index", true, "index");
+ }, `mroot element (${transform})`);
+ test(function() {
+ verify_displaystyle("msub_base", false, "base");
+ verify_displaystyle("msub_subscript", true, "subscript");
+ }, `msub element (${transform})`);
+ test(function() {
+ verify_displaystyle("msup_base", false, "base");
+ verify_displaystyle("msup_superscript", true, "superscript");
+ }, `msup element (${transform})`);
+ test(function() {
+ verify_displaystyle("msubsup_base", false, "base");
+ verify_displaystyle("msubsup_subscript", true, "subscript");
+ verify_displaystyle("msubsup_superscript", true, "superscript");
+ }, `msubsup element (${transform})`);
+ test(function() {
+ verify_displaystyle("munder_base", false, "base");
+ verify_displaystyle("munder_underscript", true, "underscript");
+ }, `munder element (${transform})`);
+ test(function() {
+ verify_displaystyle("mover_base", false, "base");
+ verify_displaystyle("mover_overscript", true, "overscript");
+ }, `mover element (${transform})`);
+ test(function() {
+ verify_displaystyle("munderover_base", false, "base");
+ verify_displaystyle("munderover_underscript", true, "underscript");
+ verify_displaystyle("munderover_overscript", true, "overscript");
+ }, `munderover element (${transform})`);
+ }
+ done();
}
</script>
</head>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html
index 85a3dc2e2ac..f78bc588c04 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html
@@ -22,7 +22,6 @@
continue;
var style = "border-left: 30px solid; border-right: 40px solid; border-top: 50px solid; border-bottom: 60px solid;";
- var styleRTL = `direction: rtl; ${style}`;
if (FragmentHelper.isEmpty(tag)) {
test(function() {
@@ -44,7 +43,7 @@
}, `Border properties on ${tag}`);
test(function() {
- var s = compareSpaceWithAndWithoutStyle(tag, styleRTL);
+ var s = compareSpaceWithAndWithoutStyle(tag, style, null, "rtl");
assert_approx_equals(s.left_delta, 30, epsilon, "left border");
assert_approx_equals(s.right_delta, 40, epsilon, "right border");
assert_approx_equals(s.top_delta, 50, epsilon, "top border");
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-001.html
index 67146882319..e7e2584cc45 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-001.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-001.html
@@ -73,8 +73,8 @@
assert_true(MathMLFeatureDetection.has_mspace());
assert_true(MathMLFeatureDetection.has_dir());
var s = measureSpaceAround("mrow-margin-logical-rtl")
- assert_approx_equals(s.left, 20, epsilon, "left margin");
- assert_approx_equals(s.right, 30, epsilon, "right margin");
+ assert_approx_equals(s.left, 30, epsilon, "left margin");
+ assert_approx_equals(s.right, 20, epsilon, "right margin");
assert_approx_equals(s.top, 40, epsilon, "top margin");
assert_approx_equals(s.bottom, 50, epsilon, "bottom margin");
var b = document.getElementById("mrow-margin-logical-rtl").
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-002.html
index 87583b584a3..69e1fd6b033 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-002.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/margin-002.html
@@ -22,7 +22,6 @@
continue;
var style = "margin-left: 30px; margin-right: 40px; margin-top: 50px; margin-bottom: 60px;";
- var styleRTL = `direction: rtl; ${style}`;
if (FragmentHelper.isEmpty(tag)) {
test(function() {
@@ -46,7 +45,7 @@
}, `Margin properties on ${tag}`);
test(function() {
- var s = compareSpaceWithAndWithoutStyle(tag, styleRTL);
+ var s = compareSpaceWithAndWithoutStyle(tag, style, null, "rtl");
assert_approx_equals(s.left_delta, 30, epsilon, "left margin");
assert_approx_equals(s.right_delta, 40, epsilon, "right margin");
assert_approx_equals(s.top_delta, 50, epsilon, "top margin");
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002.html
index c634e4076e0..a2f167a3404 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002.html
@@ -22,7 +22,6 @@
continue;
var style = "padding-left: 30px; padding-right: 40px; padding-top: 50px; padding-bottom: 60px;";
- var styleRTL = `direction: rtl; ${style}`;
if (FragmentHelper.isEmpty(tag)) {
test(function() {
@@ -44,7 +43,7 @@
}, `Padding properties on ${tag}`);
test(function() {
- var s = compareSpaceWithAndWithoutStyle(tag, styleRTL);
+ var s = compareSpaceWithAndWithoutStyle(tag, style, "rtl");
assert_approx_equals(s.left_delta, 30, epsilon, "left padding");
assert_approx_equals(s.right_delta, 40, epsilon, "right padding");
assert_approx_equals(s.top_delta, 50, epsilon, "top padding");
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.html
index 01a93eb15f0..cbc8ce7da21 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.html
@@ -18,11 +18,7 @@
function runTests() {
var reference = document.getElementById("horizontal-tb_ltr");
- ["horizontal-tb_rtl",
- "vertical-lr_ltr",
- "vertical-lr_rtl",
- "vertical-rl_ltr",
- "vertical-rl_rtl"].forEach(id => {
+ ["horizontal-tb_rtl"].forEach(id => {
var element = document.getElementById(id);
test(function() {
@@ -69,53 +65,5 @@
</mrow>
</math>
</p>
- <p>
- <math style="writing-mode: vertical-lr;">
- <mrow id="vertical-lr_ltr">
- <mspace style="background: blue"
- width="20px" height="30px" depth="40px"></mspace>
- <mspace style="background: black"
- width="50px" depth="60px"></mspace>
- <mspace style="background: yellow"
- width="70px" height="80px"></mspace>
- </mrow>
- </math>
- </p>
- <p>
- <math style="writing-mode: vertical-lr; direction: rtl;">
- <mrow id="vertical-lr_rtl">
- <mspace style="background: blue"
- width="20px" height="30px" depth="40px"></mspace>
- <mspace style="background: black"
- width="50px" depth="60px"></mspace>
- <mspace style="background: yellow"
- width="70px" height="80px"></mspace>
- </mrow>
- </math>
- </p>
- <p>
- <math style="writing-mode: vertical-rl;">
- <mrow id="vertical-rl_ltr">
- <mspace style="background: blue"
- width="20px" height="30px" depth="40px"></mspace>
- <mspace style="background: black"
- width="50px" depth="60px"></mspace>
- <mspace style="background: yellow"
- width="70px" height="80px"></mspace>
- </mrow>
- </math>
- </p>
- <p>
- <math style="writing-mode: vertical-rl; direction: rtl;">
- <mrow id="vertical-rl_rtl">
- <mspace style="background: blue"
- width="20px" height="30px" depth="40px"></mspace>
- <mspace style="background: black"
- width="50px" depth="60px"></mspace>
- <mspace style="background: yellow"
- width="70px" height="80px"></mspace>
- </mrow>
- </math>
- </p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html
new file mode 100644
index 00000000000..642ee669651
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-001.tentative.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>writing mode</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#layout-algorithms">
+<meta name="assert" content="Verify CSS writing mode (writing-mode and directionproperties) for mrow.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/feature-detection.js"></script>
+<script src="/mathml/support/layout-comparison.js"></script>
+<script>
+ var epsilon = 1;
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ var reference = document.getElementById("horizontal-tb_ltr");
+
+ // These tests are kept in a separate tentative.html file until it is
+ // clear how to handle vertical math layout.
+ // See https://github.com/mathml-refresh/mathml/issues/18
+ ["vertical-lr_ltr",
+ "vertical-lr_rtl",
+ "vertical-rl_ltr",
+ "vertical-rl_rtl"].forEach(id => {
+ var element = document.getElementById(id);
+
+ test(function() {
+ var style = window.getComputedStyle(element);
+ var writingMode = id.split("_");
+ assert_equals(style.getPropertyValue("writing-mode"),
+ writingMode[0], "writing-mode");
+ assert_equals(style.getPropertyValue("direction"),
+ writingMode[1], "direction");
+ }, `Inheritance of CSS writing-mode and direction (id='${id}')`);
+
+ test(function() {
+ assert_true(MathMLFeatureDetection.has_mspace());
+ compareLayout(element, reference, epsilon);
+ }, `Layout of mrow (id='${id}')`);
+ });
+ done();
+ }
+</script>
+</head>
+<body>
+ <div id="log"></div>
+ <p>
+ <math>
+ <mrow id="horizontal-tb_ltr">
+ <mspace style="background: blue"
+ width="20px" height="30px" depth="40px"></mspace>
+ <mspace style="background: black"
+ width="50px" depth="60px"></mspace>
+ <mspace style="background: yellow"
+ width="70px" height="80px"></mspace>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math style="writing-mode: vertical-lr;">
+ <mrow id="vertical-lr_ltr">
+ <mspace style="background: blue"
+ width="20px" height="30px" depth="40px"></mspace>
+ <mspace style="background: black"
+ width="50px" depth="60px"></mspace>
+ <mspace style="background: yellow"
+ width="70px" height="80px"></mspace>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math style="writing-mode: vertical-lr; direction: rtl;">
+ <mrow id="vertical-lr_rtl">
+ <mspace style="background: blue"
+ width="20px" height="30px" depth="40px"></mspace>
+ <mspace style="background: black"
+ width="50px" depth="60px"></mspace>
+ <mspace style="background: yellow"
+ width="70px" height="80px"></mspace>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math style="writing-mode: vertical-rl;">
+ <mrow id="vertical-rl_ltr">
+ <mspace style="background: blue"
+ width="20px" height="30px" depth="40px"></mspace>
+ <mspace style="background: black"
+ width="50px" depth="60px"></mspace>
+ <mspace style="background: yellow"
+ width="70px" height="80px"></mspace>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math style="writing-mode: vertical-rl; direction: rtl;">
+ <mrow id="vertical-rl_rtl">
+ <mspace style="background: blue"
+ width="20px" height="30px" depth="40px"></mspace>
+ <mspace style="background: black"
+ width="50px" depth="60px"></mspace>
+ <mspace style="background: yellow"
+ width="70px" height="80px"></mspace>
+ </mrow>
+ </math>
+ </p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.html
index 97be6292eb0..85c869eba3b 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.html
@@ -21,11 +21,7 @@
if (tag == "annotation" || tag == "annotation-xml")
continue; // These tags have display: none.
- ["horizontal-tb_rtl",
- "vertical-lr_ltr",
- "vertical-lr_rtl",
- "vertical-rl_ltr",
- "vertical-rl_rtl"].forEach(id => {
+ ["horizontal-tb_rtl"].forEach(id => {
var writingMode = id.split("_");
var writingModeString = `writing-mode: ${writingMode[0]}; direction: ${writingMode[1]};`;
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html
new file mode 100644
index 00000000000..e86f03a4f02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/writing-mode/writing-mode-002.tentative.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>writing mode</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#layout-algorithms">
+<meta name="assert" content="Verify CSS writing mode (writing-mode and direction properties) for mrow.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/feature-detection.js"></script>
+<script src="/mathml/support/layout-comparison.js"></script>
+<script src="/mathml/support/mathml-fragments.js"></script>
+<script>
+ var epsilon = 1;
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ for (tag in MathMLFragments) {
+ if (tag == "annotation" || tag == "annotation-xml")
+ continue; // These tags have display: none.
+
+ // These tests are kept in a separate tentative.html file until it is
+ // clear how to handle vertical math layout.
+ // See https://github.com/mathml-refresh/mathml/issues/18
+ ["vertical-lr_ltr",
+ "vertical-lr_rtl",
+ "vertical-rl_ltr",
+ "vertical-rl_rtl"].forEach(id => {
+ var writingMode = id.split("_");
+ var writingModeString = `writing-mode: ${writingMode[0]}; direction: ${writingMode[1]};`;
+
+ document.body.insertAdjacentHTML("beforeend", `<div>\
+<math>${MathMLFragments[tag]}</math>\
+<math>${MathMLFragments[tag]}</math>\
+</div>`);
+ var div = document.body.lastElementChild;
+
+ var styleMath = div.firstElementChild;
+ styleMath.setAttribute("style", writingModeString);
+ var styleElement = FragmentHelper.element(styleMath);
+
+ var referenceMath = div.lastElementChild;
+ var referenceElement = FragmentHelper.element(referenceMath);
+
+ [styleMath, referenceMath].forEach(math => {
+ Array.from(math.getElementsByClassName("mathml-container")).forEach(container => {
+ container.insertAdjacentHTML("beforeend", "\
+<mspace style='background: blue'\
+ width='20px' height='30px' depth='40px'></mspace>\
+<mspace style='background: black'\
+ width='50px' depth='60px'></mspace>\
+<mspace style='background: yellow'\
+ width='70px' height='80px'></mspace>");
+ });
+ Array.from(math.getElementsByClassName("foreign-container")).forEach(container => {
+ container.insertAdjacentHTML("beforeend", "\
+<span style='display: inline-block; background: lightblue;\
+ inline-size: 20px; block-size: 30px;\
+ vertical-align: bottom;'></span>\
+<span style='display: inline-block; background: pink;\
+ inline-size: 40px; block-size: 50px;\
+ vertical-align: bottom;'></span>");
+ });
+ });
+
+ test(function() {
+ assert_true(MathMLFeatureDetection.has_mspace());
+ var style = window.getComputedStyle(styleElement);
+ assert_equals(style.getPropertyValue("writing-mode"),
+ writingMode[0], "writing-mode");
+ assert_equals(style.getPropertyValue("direction"),
+ writingMode[1], "direction");
+ compareLayout(styleElement, referenceElement, epsilon);
+ }, `Layout of ${tag} (${writingModeString})`);
+
+ div.style = "display: none;"; // Hide the div after testing.
+ });
+ }
+ done();
+ }
+</script>
+</head>
+<body>
+ <div id="log"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html
index 6747413e477..9ecd45f9a40 100644
--- a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html
@@ -9,52 +9,55 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/mathml/support/feature-detection.js"></script>
+<script src="/mathml/support/attribute-values.js"></script>
<script>
function getBox(aId) {
return document.getElementById(aId).getBoundingClientRect();
}
window.addEventListener("DOMContentLoaded", function() {
- var content = getBox("content");
+ for (transform in AttributeValueTransforms) {
+ TransformAttributeValues(transform, ["display", "displaystyle"]);
+ var content = getBox("content");
- var before_block = getBox("before_block");
- var mspace_block = getBox("mspace_block");
- var after_block = getBox("after_block");
- test(function() {
- assert_true(MathMLFeatureDetection.has_mspace());
- assert_approx_equals(before_block.left, content.left, 1,
- "content before must be left aligned");
- assert_approx_equals((mspace_block.left + mspace_block.right) / 2,
- (content.left + content.right) / 2,
- 1,
- "math must be centered.");
- assert_approx_equals(after_block.left, content.left, 1,
- "content before must be left aligned");
- assert_less_than_equal(before_block.bottom, mspace_block.top,
- "new line before math");
- assert_less_than_equal(mspace_block.bottom, after_block.top,
- "new line after math");
- }, "Test display math");
+ var before_block = getBox("before_block");
+ var mspace_block = getBox("mspace_block");
+ var after_block = getBox("after_block");
+ test(function() {
+ assert_true(MathMLFeatureDetection.has_mspace());
+ assert_approx_equals(before_block.left, content.left, 1,
+ "content before must be left aligned");
+ assert_approx_equals((mspace_block.left + mspace_block.right) / 2,
+ (content.left + content.right) / 2,
+ 1,
+ "math must be centered.");
+ assert_approx_equals(after_block.left, content.left, 1,
+ "content before must be left aligned");
+ assert_less_than_equal(before_block.bottom, mspace_block.top,
+ "new line before math");
+ assert_less_than_equal(mspace_block.bottom, after_block.top,
+ "new line after math");
+ }, `Test display math ${transform}`);
- var before_inline = getBox("before_inline");
- var mspace_inline = getBox("mspace_inline");
- var after_inline = getBox("after_inline");
- test(function() {
- assert_true(MathMLFeatureDetection.has_mspace());
- assert_approx_equals((before_inline.top + before_inline.bottom) / 2,
- (mspace_inline.top + mspace_inline.bottom) / 2,
- 1,
- "content before must be horizontally aligned with math");
- assert_approx_equals((after_inline.top + after_inline.bottom) / 2,
- (mspace_inline.top + mspace_inline.bottom) / 2,
- 1,
- "content after must be horizontally aligned with math");
- assert_less_than_equal(before_inline.right, mspace_inline.left,
- "content before must be on the left of math");
- assert_less_than_equal(mspace_inline.right, after_inline.left,
- "content after must be on the right of math");
- }, "Test inline math");
-
- done();
+ var before_inline = getBox("before_inline");
+ var mspace_inline = getBox("mspace_inline");
+ var after_inline = getBox("after_inline");
+ test(function() {
+ assert_true(MathMLFeatureDetection.has_mspace());
+ assert_approx_equals((before_inline.top + before_inline.bottom) / 2,
+ (mspace_inline.top + mspace_inline.bottom) / 2,
+ 1,
+ "content before must be horizontally aligned with math");
+ assert_approx_equals((after_inline.top + after_inline.bottom) / 2,
+ (mspace_inline.top + mspace_inline.bottom) / 2,
+ 1,
+ "content after must be horizontally aligned with math");
+ assert_less_than_equal(before_inline.right, mspace_inline.left,
+ "content before must be on the left of math");
+ assert_less_than_equal(mspace_inline.right, after_inline.left,
+ "content after must be on the right of math");
+ }, `Test inline math ${transform}`);
+ }
+ done();
});
</script>
<style>
@@ -69,7 +72,7 @@
background: black;
}
mspace {
- background: black;
+ background: blue;
}
</style>
</head>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-4.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-4.html
new file mode 100644
index 00000000000..7121db645b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-4.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML inside foreignObject</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#html-and-svg">
+<meta name="assert" content="Verify that MathML can be used inside a foreignObject element.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/feature-detection.js"></script>
+<script>
+ setup({ explicit_done: true });
+ window.addEventListener("DOMContentLoaded", function() {
+ var scale = 2;
+ var epsilon = 1;
+ var mfrac = document.getElementById("mfrac");
+ var num = mfrac.firstElementChild.getBoundingClientRect();
+ var denom = mfrac.lastElementChild.getBoundingClientRect();
+ test(function() {
+ assert_true(MathMLFeatureDetection.has_mspace());
+ // The values of width and height are inverted (because of the
+ // rotation) and multiplied by the scale factor.
+ assert_approx_equals(num.height, 30 * scale, epsilon, "numerator width");
+ assert_approx_equals(num.width, 40 * scale, epsilon, "numerator height");
+ assert_approx_equals(denom.height, 50 * scale, epsilon, "numerator width");
+ assert_approx_equals(denom.width, 60 * scale, epsilon, "numerator height");
+ }, "mspace layout in SVG foreignObject");
+ test(function() {
+ // The horizontal/vertical metrics are inverted (because of the
+ // rotation) and multiplied by the scale factor.
+ assert_true(MathMLFeatureDetection.has_mfrac());
+ assert_greater_than_equal(num.right - denom.left,
+ (40 + 60) * scale,
+ "numerator is on the right of denominator");
+ assert_approx_equals((num.top + num.bottom) / 2,
+ (denom.top + denom.bottom) / 2,
+ epsilon, "numerator and denominator are vertically aligned");
+ }, "mfrac layout in SVG foreignObject");
+ done();
+ });
+</script>
+</head>
+<body>
+ <div id="log"></div>
+ <svg width="400px" height="400px">
+ <g transform="rotate(90, 200, 200) scale(2)">
+ <foreignObject width="400px" height="400px"
+ requiredExtensions="http://www.w3.org/1998/Math/MathML">
+ <math>
+ <mfrac id="mfrac">
+ <mspace width="30px" height="40px" style="background: cyan"></mspace>
+ <mspace width="50px" height="60px" style="background: yellow"></mspace>
+ </mfrac>
+ </math>
+ </foreignObject>
+ </g>
+ </svg>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/support/attribute-values.js b/tests/wpt/web-platform-tests/mathml/support/attribute-values.js
new file mode 100644
index 00000000000..8408124f49a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/support/attribute-values.js
@@ -0,0 +1,31 @@
+AttributeValueTransforms = {
+ lowercase: function(value) { return value.toLowerCase(); },
+ uppercase: function(value) { return value.toUpperCase(); },
+ alternate_case: function(value) {
+ var transformedValue = "";
+ for (var i = 0; i < value.length; i++) {
+ transformedValue += i % 2 ?
+ value.charAt(i).toLowerCase() :
+ value.charAt(i).toUpperCase();
+ }
+ return transformedValue;
+ },
+ // TODO: Should we perform this transform too?
+ // https://github.com/mathml-refresh/mathml/issues/122
+ // add_leading_and_trimming_whitespace: function(value) {
+ // var space = "\0020\0009\000A\000D";
+ // return `${space}${space}${value}${space}${space}`;
+ // },
+};
+
+function TransformAttributeValues(transform, attributeNames) {
+ if (typeof attributeNames === "string")
+ attributeNames = [attributeNames];
+ attributeNames.forEach(name => {
+ Array.from(document.querySelectorAll(`[${name}]`)).forEach(element => {
+ var value = element.getAttribute(name);
+ var transformedValue = AttributeValueTransforms[transform](value);
+ element.setAttribute(name, transformedValue);
+ });
+ });
+}
diff --git a/tests/wpt/web-platform-tests/mathml/support/box-comparison.js b/tests/wpt/web-platform-tests/mathml/support/box-comparison.js
index b1e91cdd99a..77d145b3632 100644
--- a/tests/wpt/web-platform-tests/mathml/support/box-comparison.js
+++ b/tests/wpt/web-platform-tests/mathml/support/box-comparison.js
@@ -15,14 +15,16 @@ function measureSpaceAround(id) {
return spaceBetween(childBox, parentBox);
}
-function compareSpaceWithAndWithoutStyle(tag, style, parentStyle) {
+function compareSpaceWithAndWithoutStyle(tag, style, parentStyle, direction) {
if (!FragmentHelper.isValidChildOfMrow(tag) ||
FragmentHelper.isEmpty(tag))
throw `Invalid argument: ${tag}`;
+ if (!direction)
+ direction = "ltr";
document.body.insertAdjacentHTML("beforeend", `<div>\
-<math><mrow>${MathMLFragments[tag]}</mrow></math>\
-<math><mrow>${MathMLFragments[tag]}</mrow></math>\
+<math><mrow dir="${direction}">${MathMLFragments[tag]}</mrow></math>\
+<math><mrow dir="${direction}">${MathMLFragments[tag]}</mrow></math>\
</div>`);
var div = document.body.lastElementChild;
diff --git a/tests/wpt/web-platform-tests/mathml/support/mathml-fragments.js b/tests/wpt/web-platform-tests/mathml/support/mathml-fragments.js
index 097ca8690b4..013171cf8c2 100644
--- a/tests/wpt/web-platform-tests/mathml/support/mathml-fragments.js
+++ b/tests/wpt/web-platform-tests/mathml/support/mathml-fragments.js
@@ -144,8 +144,11 @@ var FragmentHelper = {
return element.firstElementChild;
if (element.classList.contains("mathml-container"))
return element.appendChild(this.createElement("mrow"));
- if (element.classList.contains("foreign-container"))
- return element.appendChild(document.createElement("span"));
+ if (element.classList.contains("foreign-container")) {
+ var el = document.createElement("span");
+ el.textContent = "a";
+ return element.appendChild(el);
+ }
throw "Cannot make the element nonempty";
}
}
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getUserMedia.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getUserMedia.https.html
index 70fe67b30f5..693f3bd11cf 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getUserMedia.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getUserMedia.https.html
@@ -49,6 +49,7 @@ promise_test(async t => {
assert_not_equals(found_device, undefined);
assert_equals(found_device.kind, "videoinput");
assert_equals(found_device.groupId, device.groupId);
+ stream.getTracks().forEach(t => t.stop());
}, error => {
assert_equals(error.name, "OverconstrainedError");
assert_equals(error.constraint, "groupId");
@@ -71,6 +72,7 @@ promise_test(async t => {
assert_not_equals(found_device, undefined);
assert_equals(found_device.kind, "audioinput");
assert_equals(found_device.groupId, device.groupId);
+ stream.getTracks().forEach(t => t.stop());
}, error => {
assert_equals(error.name, "OverconstrainedError");
assert_equals(error.constraint, "groupId");
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
index 4d51f9dc831..1bc1f9b5740 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
@@ -9,158 +9,148 @@
// https://w3c.github.io/mediacapture-main/archives/20170605/getusermedia.html
- promise_test(t => {
- const constraints = {
+ async function createTrackAndGetSettings(t, kind) {
+ const constraints = {};
+ constraints[kind] = true;
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
+ assert_equals(stream.getTracks().length, 1);
+ t.add_cleanup(() => stream.getTracks()[0].stop());
+ return stream.getTracks()[0].getSettings();
+ }
+
+ promise_test(async t => {
+ const mediaStream1 = await navigator.mediaDevices.getUserMedia({
video: true,
+ audio: false,
+ });
+ t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
+ const settings1 = mediaStream1.getVideoTracks()[0].getSettings();
+
+ const mediaStream2 = await navigator.mediaDevices.getUserMedia({
+ video: {
+ deviceId: {exact: settings1.deviceId},
+ },
audio: false
- };
-
- return navigator.mediaDevices.getUserMedia(constraints)
- .then(mediaStream => {
- const settings1 = mediaStream.getVideoTracks()[0].getSettings();
- const videoConstraints = {
- deviceId: settings1.deviceId
- };
-
- return navigator.mediaDevices.getUserMedia({
- video: videoConstraints,
- audio: false
- }).then(mediaStream => {
- const settings2 = mediaStream.getVideoTracks()[0].getSettings();
- assert_equals(settings1.deviceId, settings2.deviceId);
- });
});
+ t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
+ const settings2 = mediaStream2.getVideoTracks()[0].getSettings();
+
+ assert_equals(settings1.deviceId, settings2.deviceId);
}, 'A device can be opened twice and have the same device ID');
- promise_test(t => {
- const constraints = {
+ promise_test(async t => {
+ const mediaStream1 = await navigator.mediaDevices.getUserMedia({
video: true,
- audio: false
- };
+ audio: false,
+ });
+ t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
+ const settings1 = mediaStream1.getVideoTracks()[0].getSettings();
- return navigator.mediaDevices.getUserMedia(constraints)
- .then(mediaStream => {
- const settings1 = mediaStream.getVideoTracks()[0].getSettings();
- const videoConstraints = {
- deviceId: settings1.deviceId,
+ const mediaStream2 = await navigator.mediaDevices.getUserMedia({
+ video: {
+ deviceId: {exact: settings1.deviceId},
width: {
- exact: settings1.width / 2
- }
- };
-
- return navigator.mediaDevices.getUserMedia({
- video: videoConstraints,
- audio: false
- }).then(mediaStream => {
- const settings2 = mediaStream.getVideoTracks()[0].getSettings();
- assert_equals(settings1.deviceId, settings2.deviceId);
- assert_equals(settings1.width / 2, settings2.width);
- });
- });
- }, 'A device can be opened twice with different resolutions');
-
- promise_test(t => {
- return navigator.mediaDevices.enumerateDevices().then(async devices => {
- for (var device of devices) {
- if (device.kind == "audiooutput")
- continue;
- var device_id_constraint = {deviceId: {exact: device.deviceId}};
- var constraints = device.kind == "audioinput"
- ? {audio: device_id_constraint}
- : {video: device_id_constraint};
-
- var stream = await navigator.mediaDevices.getUserMedia(constraints);
- assert_equals(stream.getTracks()[0].getSettings().groupId,
- device.groupId);
- assert_greater_than(device.groupId.length, 0);
- }
+ ideal: settings1.width / 2,
+ },
+ },
+ audio: false
});
- }, 'groupId is correctly reported by getSettings() for all devices');
-
- async function createAudioStreamAndGetSettings(t) {
- const stream = await navigator.mediaDevices.getUserMedia({audio: true});
- t.add_cleanup(() => stream.getAudioTracks()[0].stop());
- return stream.getAudioTracks()[0].getSettings();
- }
+ t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
+ const settings2 = mediaStream2.getVideoTracks()[0].getSettings();
+
+ assert_equals(settings1.deviceId, settings2.deviceId);
+ assert_between_inclusive(settings2.width, settings1.width / 2, settings1.width);
+ }, 'A device can be opened twice with different resolutions requested');
+
+ promise_test(async t => {
+ const devices = await navigator.mediaDevices.enumerateDevices();
+ const inputDevices = devices.filter(d => d.kind != "audiooutput");
+ assert_greater_than(inputDevices.length, 0);
+ for (const device of inputDevices) {
+ const device_id_constraint = {deviceId: {exact: device.deviceId}};
+ const constraints = device.kind == "audioinput"
+ ? {audio: device_id_constraint}
+ : {video: device_id_constraint};
+
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
+ assert_equals(stream.getTracks()[0].getSettings().groupId,
+ device.groupId);
+ assert_greater_than(device.groupId.length, 0);
+ }
+ }, 'groupId is correctly reported by getSettings() for all input devices');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.deviceId), "string",
"deviceId should exist and it should be a string.");
}, 'deviceId is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.groupId), "string",
"groupId should exist and it should be a string.");
}, 'groupId is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.sampleRate), "number",
"sampleRate should exist and it should be a number.");
assert_greater_than(settings.sampleRate, 0);
}, 'sampleRate is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.sampleSize), "number",
"sampleSize should exist and it should be a number.");
assert_greater_than(settings.sampleSize, 0);
}, 'sampleSize is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.echoCancellation), "boolean",
"echoCancellation should exist and it should be a boolean.");
}, 'echoCancellation is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.autoGainControl), "boolean",
"autoGainControl should exist and it should be a boolean.");
}, 'autoGainControl is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.noiseSuppression), "boolean",
"noiseSuppression should exist and it should be a boolean.");
}, 'noiseSuppression is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.latency), "number",
"latency should exist and it should be a number.");
assert_greater_than_equal(settings.latency,0);
}, 'latency is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
- const settings = await createAudioStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.channelCount), "number",
"channelCount should exist and it should be a number.");
assert_greater_than(settings.channelCount, 0);
}, 'channelCount is reported by getSettings() for getUserMedia() audio tracks');
- async function createVideoStreamAndGetSettings(t) {
- const stream = await navigator.mediaDevices.getUserMedia({video: true});
- t.add_cleanup(() => stream.getVideoTracks()[0].stop());
- return stream.getVideoTracks()[0].getSettings();
- }
-
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.deviceId), "string",
"deviceId should exist and it should be a string.");
}, 'deviceId is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.groupId), "string",
"groupId should exist and it should be a string.");
}, 'groupId is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.width), "number",
"width should exist and it should be a number.");
assert_true(Number.isInteger(settings.width), "width should be an integer.");
@@ -168,7 +158,7 @@
}, 'width is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.height), "number",
"height should exist and it should be a number.");
assert_true(Number.isInteger(settings.height), "height should be an integer.");
@@ -176,21 +166,21 @@
}, 'height is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.aspectRatio), "number",
"aspectRatio should exist and it should be a number.");
assert_greater_than_equal(settings.aspectRatio, 0);
}, 'aspectRatio is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.frameRate), "number",
"frameRate should exist and it should be a number.");
assert_greater_than_equal(settings.frameRate, 0);
}, 'frameRate is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
// facingMode not treated as mandatory because not all platforms provide
// this information.
if (settings.facingMode) {
@@ -202,7 +192,7 @@
}, 'facingMode is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
- const settings = await createVideoStreamAndGetSettings(t);
+ const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.resizeMode), "string",
"resizeMode should exist and it should be a string.");
assert_in_array(settings.resizeMode, ['none', 'crop-and-scale']);
diff --git a/tests/wpt/web-platform-tests/mixed-content/generic/tools/generate.py b/tests/wpt/web-platform-tests/mixed-content/generic/tools/generate.py
index ed978bcef9c..9c911aa6c41 100755
--- a/tests/wpt/web-platform-tests/mixed-content/generic/tools/generate.py
+++ b/tests/wpt/web-platform-tests/mixed-content/generic/tools/generate.py
@@ -48,25 +48,6 @@ expectation: %(expectation)s
self.spec_directory = os.path.abspath(
os.path.join(script_directory, '..', '..'))
- def handleDelivery(self, selection, spec):
- delivery_type = selection['delivery_type']
- delivery_value = selection['delivery_value']
-
- meta = ''
- headers = []
-
- if delivery_value is not None:
- if delivery_type == 'meta':
- meta = '<meta http-equiv="Content-Security-Policy" ' + \
- 'content="block-all-mixed-content">'
- elif delivery_type == 'http-rp':
- headers.append(
- "Content-Security-Policy: block-all-mixed-content")
- else:
- raise ValueError("Invalid delivery_type %s" % delivery_type)
-
- return {"meta": meta, "headers": headers}
-
if __name__ == '__main__':
generate.main(MixedContentConfig())
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-data.html b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-data.html
new file mode 100644
index 00000000000..06c3c9b0c4b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-data.html
@@ -0,0 +1,43 @@
+<html>
+ <head>
+ <title>Referrer Policy: iframes with data url uses no referrer</title>
+ <link rel="help" href="https://www.w3.org/TR/referrer-policy/#referrer-policy-delivery-nested">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <!-- Common global functions for referrer-policy tests. -->
+ <script src="/common/security-features/resources/common.js"></script>
+ <script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
+ <meta name="referrer" content="origin">
+ </head>
+ <body onload="runTest()">
+ <h1>Referrer Policy: iframes with data url uses no referrer</h1>
+ <script>
+ let test = async_test("iframes with data url uses no referrer");
+ window.addEventListener("message", test.step_func((msg) => {
+ assert_equals(msg.data.referrer, undefined);
+ test.done();
+ }));
+
+ function runTest() {
+ const BASE = location.protocol + "//www1." + location.hostname + ":" + location.port;
+ const TEST_DATA =
+ `data:text/html,<script src = "${BASE}/common/security-features/resources/common.js"></` + `script>
+ <script src = "${BASE}/referrer-policy/generic/referrer-policy-test-case.js"></` + `script>
+ <script>
+ var urlPath = "/referrer-policy/generic/subresource/xhr.py";
+ var url = "${BASE}" + urlPath;
+ requestViaXhr(url).then((msg) => {
+ parent.postMessage({referrer: msg.referrer}, "*")})
+ .catch((e) => {
+ parent.postMessage({referrer: "FAILURE"}, "*");
+ });
+ </` + "script>";
+
+ let iframe = document.createElement("iframe");
+ iframe.src = TEST_DATA;
+ document.body.appendChild(iframe);
+ }
+ </script>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html
new file mode 100644
index 00000000000..08acb405c21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc-child.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Referrer Policy: iframes srdoc child correctly inherit the ancestor's referrer policy</title>
+ <link rel="help" href="https://www.w3.org/TR/referrer-policy/#referrer-policy-delivery-nested">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <!-- Common global functions for referrer-policy tests. -->
+ <script src="/common/security-features/resources/common.js"></script>
+ <script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
+ <meta name="referrer" content="origin">
+ </head>
+ <body onload="runTest()">
+ <h1>Referrer Policy: iframes srcdoc child correctly inherit the ancestor's referrer policy</h1>
+ <script>
+ var test = async_test("iframes srcdoc child correctly inherit the ancestor's referrer policy");
+ window.addEventListener("message", test.step_func((msg) => {
+ assert_equals(msg.data.referrer, document.location.origin + "/");
+ test.done();
+ }));
+
+ const BASE = location.protocol + "//www1." + location.hostname + ":" + location.port;
+
+ function runTest() {
+ var iframe = document.createElement("iframe");
+ iframe.srcdoc = `<body><h1>Outer iframe</h1></body>`;
+ iframe.onload = function() {
+ iframe.onload = null;
+ var iframeChild = iframe.contentDocument.createElement("iframe");
+ iframeChild.srcdoc =
+ `<script src = "${BASE}/common/security-features/resources/common.js"></sc` + `ript>
+ <script src = "${BASE}/referrer-policy/generic/referrer-policy-test-case.js"></sc` + `ript>
+ <script>
+ var urlPath = "/common/security-features/subresource/xhr.py";
+ var url = "${BASE}" + urlPath;
+ requestViaXhr(url).then((msg) => {
+ window.top.postMessage({referrer: msg.referrer}, "*")})
+ .catch((e) => {
+ window.top.postMessage({referrer: "FAILURE"}, "*");
+ });
+ </sc` + "ript>";
+ iframe.contentDocument.body.appendChild(iframeChild);
+ };
+
+ document.body.appendChild(iframe);
+ }
+ </script>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/iframe-inheritance.html b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html
index 28e83df6c2a..34ea0045b48 100644
--- a/tests/wpt/web-platform-tests/referrer-policy/generic/iframe-inheritance.html
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/inheritance/iframe-inheritance-srcdoc.html
@@ -1,8 +1,7 @@
<!DOCTYPE html>
<html>
<head>
- <title>Referrer Policy: iframes correctly inherit the ancestor's referrer</title>
- <link rel="author" title="Jochen Eisinger" href="mailto:jochen@chromium.org">
+ <title>Referrer Policy: iframes srdoc correctly inherit the ancestor's referrer policy</title>
<link rel="help" href="https://www.w3.org/TR/referrer-policy/#referrer-policy-delivery-nested">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -12,9 +11,9 @@
<meta name="referrer" content="origin">
</head>
<body onload="runTest()">
- <h1>Referrer Policy: iframes correctly inherit the ancestor's referrer</h1>
+ <h1>Referrer Policy: iframes srcdoc correctly inherit the ancestor's referrer policy</h1>
<script>
- var test = async_test("iframes correctly inherit the ancestor's referrer");
+ var test = async_test("iframes srcdoc correctly inherit the ancestor's referrer policy");
window.addEventListener("message", test.step_func((msg) => {
assert_equals(msg.data.referrer, document.location.origin + "/");
test.done();
@@ -22,10 +21,8 @@
function runTest() {
var iframe = document.createElement("iframe");
- iframe.src = "about:blank";
- document.body.appendChild(iframe);
- iframe.contentDocument.write(`
- <script src = "/common/security-features/resources/common.js"></` + `script>
+ iframe.srcdoc =
+ `<script src = "/common/security-features/resources/common.js"></` + `script>
<script src = "/referrer-policy/generic/referrer-policy-test-case.sub.js"></` + `script>
<script>
var urlPath = "/common/security-features/subresource/xhr.py";
@@ -35,10 +32,11 @@
.catch((e) => {
parent.postMessage({referrer: "FAILURE"}, "*");
});
- </` + "script>");
- }
- </script>
+ </` + "script>";
+ document.body.appendChild(iframe);
+ }
+ </script>
<div id="log"></div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/tools/generate.py b/tests/wpt/web-platform-tests/referrer-policy/generic/tools/generate.py
index 98374982a8d..ba1e963787b 100755
--- a/tests/wpt/web-platform-tests/referrer-policy/generic/tools/generate.py
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/tools/generate.py
@@ -42,33 +42,6 @@ the target request is %(origin)s.'''
self.spec_directory = os.path.abspath(
os.path.join(script_directory, '..', '..'))
- def handleDelivery(self, selection, spec):
- delivery_type = selection['delivery_type']
- delivery_value = selection['delivery_value']
-
- meta = ''
- headers = []
- if delivery_value != None:
- if delivery_type == 'meta':
- meta = \
- '<meta name="referrer" content="%s">' % delivery_value
- elif delivery_type == 'http-rp':
- meta = \
- "<!-- No meta: Referrer policy delivered via HTTP headers. -->"
- headers.append('Referrer-Policy: ' + '%s' % delivery_value)
- # TODO(kristijanburnik): Limit to WPT origins.
- headers.append('Access-Control-Allow-Origin: *')
- elif delivery_type == 'attr':
- # attr-referrer is supported by the JS test wrapper.
- pass
- elif delivery_type == 'rel-noref':
- # rel=noreferrer is supported by the JS test wrapper.
- pass
- else:
- raise ValueError('Not implemented delivery_type: ' \
- + delivery_type)
- return {"meta": meta, "headers": headers}
-
if __name__ == '__main__':
generate.main(ReferrerPolicyConfig())
diff --git a/tests/wpt/web-platform-tests/resources/SVGAnimationTestCase-testharness.js b/tests/wpt/web-platform-tests/resources/SVGAnimationTestCase-testharness.js
new file mode 100644
index 00000000000..8fabc9a8c11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/SVGAnimationTestCase-testharness.js
@@ -0,0 +1,100 @@
+// NOTE(edvardt):
+// This file is a slimmed down wrapper for the Chromium SVGAnimationTestCase.js,
+// it has some convenience functions and should not be used for new tests.
+// New tests should not build on this API as it's just meant to keep things
+// working.
+
+// Helper functions
+const xlinkNS = "http://www.w3.org/1999/xlink"
+
+function expectFillColor(element, red, green, blue) {
+ let color = window.getComputedStyle(element, null).fill;
+ var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
+ rgb = re.exec(color);
+ assert_approx_equals(Number(rgb[1]), red, 2.0);
+ assert_approx_equals(Number(rgb[2]), green, 2.0);
+ assert_approx_equals(Number(rgb[3]), blue, 2.0);
+}
+
+function expectColor(element, red, green, blue, property) {
+ if (typeof property != "string")
+ color = getComputedStyle(element).getPropertyValue("color");
+ else
+ color = getComputedStyle(element).getPropertyValue(property);
+ var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
+ rgb = re.exec(color);
+ assert_approx_equals(Number(rgb[1]), red, 2.0);
+ assert_approx_equals(Number(rgb[2]), green, 2.0);
+ assert_approx_equals(Number(rgb[3]), blue, 2.0);
+}
+
+function createSVGElement(type) {
+ return document.createElementNS("http://www.w3.org/2000/svg", type);
+}
+
+function moveAnimationTimelineAndSample(index) {
+ var animationId = expectedResults[index][0];
+ var time = expectedResults[index][1];
+ var sampleCallback = expectedResults[index][2];
+ var animation = rootSVGElement.ownerDocument.getElementById(animationId);
+
+ // If we want to sample the animation end, add a small delta, to reliable point past the end of the animation.
+ newTime = time;
+
+ // The sample time is relative to the start time of the animation, take that into account.
+ rootSVGElement.setCurrentTime(newTime);
+
+ // NOTE(edvardt):
+ // This is a dumb hack, some of the old tests sampled before the animation start, this
+ // isn't technically part of the animation tests and is "impossible" to translate since
+ // tests start automatically. Thus I solved it by skipping it.
+ if (time != 0.0)
+ sampleCallback();
+}
+
+var currentTest = 0;
+var expectedResults;
+
+function sampleAnimation(t) {
+ if (currentTest == expectedResults.length) {
+ t.done();
+ return;
+ }
+
+ moveAnimationTimelineAndSample(currentTest);
+ ++currentTest;
+
+ step_timeout(t.step_func(function () { sampleAnimation(t); }), 0);
+}
+
+function runAnimationTest(t, expected) {
+ if (!expected)
+ throw("Expected results are missing!");
+ if (currentTest > 0)
+ throw("Not allowed to call runAnimationTest() twice");
+
+ expectedResults = expected;
+ testCount = expectedResults.length;
+ currentTest = 0;
+
+ step_timeout(t.step_func(function () { sampleAnimation(this); }), 50);
+}
+
+function smil_async_test(func) {
+ async_test(t => {
+ window.onload = t.step_func(function () {
+ // Pause animations, we'll drive them manually.
+ // This also ensures that the timeline is paused before
+ // it starts. This should make the instance time of the below
+ // 'click' (for instance) 0, and hence minimize rounding
+ // errors for the addition in moveAnimationTimelineAndSample.
+ rootSVGElement.pauseAnimations();
+
+ // If eg. an animation is running with begin="0s", and
+ // we want to sample the first time, before the animation
+ // starts, then we can't delay the testing by using an
+ // onclick event, as the animation would be past start time.
+ func(t);
+ });
+ });
+}
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
index 43857bdc695..19b207ff428 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
@@ -554,6 +554,7 @@ class MockXRInputSource {
this.handedness_ = fakeInputSourceInit.handedness;
this.target_ray_mode_ = fakeInputSourceInit.targetRayMode;
this.setPointerOrigin(fakeInputSourceInit.pointerOrigin);
+ this.setProfiles(fakeInputSourceInit.profiles);
this.primary_input_pressed_ = false;
if (fakeInputSourceInit.selectionStarted != null) {
@@ -593,7 +594,8 @@ class MockXRInputSource {
}
setProfiles(profiles) {
- // Profiles are not yet implemented by chromium
+ this.desc_dirty_ = true;
+ this.profiles_ = profiles;
}
setGripOrigin(transform, emulatedPosition = false) {
@@ -762,6 +764,8 @@ class MockXRInputSource {
input_desc.pointerOffset = this.pointer_offset_;
+ input_desc.profiles = this.profiles_;
+
input_state.description = input_desc;
this.desc_dirty_ = false;
diff --git a/tests/wpt/web-platform-tests/svg/animations/scripted/onhover-syncbases.html b/tests/wpt/web-platform-tests/svg/animations/scripted/onhover-syncbases.html
new file mode 100644
index 00000000000..86a0a40fa2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/scripted/onhover-syncbases.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Check if onhover events reset correctly when triggred multiple times</title>
+ <link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-EventAttributes">
+ <link rel="author" title="Edvard Thörnros" href="mailto:edvardt@opera.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <svg>
+ <circle id="circle" cx="150" cy="75" r="50" fill="#F00">
+ <set attributeName="fill" to="#0F0" begin="mouseover"/>
+ <set attributeName="fill" to="#F00" begin="mouseout"/>
+ </circle>
+ </svg>
+ <script>
+async_test(t => {
+ let rounds = 5; // How many times the cursor is moved in and out
+ let circle = document.querySelector("#circle");
+ let delay = 20;
+ let f = t.step_func(function() {
+ assert_equals(window.getComputedStyle(circle, null).fill,
+ "rgb(255, 0, 0)")
+ if (rounds-- == 0) {
+ t.done();
+ return;
+ }
+
+ circle.dispatchEvent(new Event("mouseover"));
+ step_timeout(function() {
+ assert_equals(window.getComputedStyle(circle, null).fill,
+ "rgb(0, 255, 0)")
+ circle.dispatchEvent(new Event("mouseout"))
+ t.step_timeout(f, delay);
+ }, delay);
+ });
+ step_timeout(function() { f(); }, 0);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgnumberoptionalnumber-animation-4.html b/tests/wpt/web-platform-tests/svg/animations/svgnumberoptionalnumber-animation-4.html
new file mode 100644
index 00000000000..4c734b53737
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgnumberoptionalnumber-animation-4.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<html>
+<title>Test 'by' animation of SVGNumberOptionalNumber.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var defs = createSVGElement("defs");
+rootSVGElement.appendChild(defs);
+
+var filter = createSVGElement("filter");
+filter.setAttribute("id", "filter");
+filter.setAttribute("x", "-30%");
+filter.setAttribute("y", "-30%");
+filter.setAttribute("width", "160%");
+filter.setAttribute("height", "160%");
+defs.appendChild(filter);
+
+var feGaussianBlur = createSVGElement("feGaussianBlur");
+feGaussianBlur.setAttribute("id", "blur");
+feGaussianBlur.setAttribute("stdDeviation", "5");
+filter.appendChild(feGaussianBlur);
+
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("x", "50");
+rect.setAttribute("y", "50");
+rect.setAttribute("width", "200");
+rect.setAttribute("height", "200");
+rect.setAttribute("fill", "green");
+rect.setAttribute("filter", "url(#filter)");
+rect.setAttribute("onclick", "executeTest()");
+rootSVGElement.appendChild(rect);
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "stdDeviation");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+animate.setAttribute("from", "5");
+animate.setAttribute("by", "10");
+feGaussianBlur.appendChild(animate);
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(feGaussianBlur.stdDeviationX.animVal, 5, epsilon);
+ assert_approx_equals(feGaussianBlur.stdDeviationY.animVal, 5, epsilon);
+
+ assert_equals(feGaussianBlur.stdDeviationX.baseVal, 5);
+ assert_equals(feGaussianBlur.stdDeviationY.baseVal, 5);
+}
+
+function sample2() {
+ assert_approx_equals(feGaussianBlur.stdDeviationX.animVal, 10, epsilon);
+ assert_approx_equals(feGaussianBlur.stdDeviationY.animVal, 10, epsilon);
+
+ assert_equals(feGaussianBlur.stdDeviationX.baseVal, 5);
+ assert_equals(feGaussianBlur.stdDeviationY.baseVal, 5);
+}
+
+function sample3() {
+ assert_approx_equals(feGaussianBlur.stdDeviationX.animVal, 15, epsilon);
+ assert_approx_equals(feGaussianBlur.stdDeviationY.animVal, 15, epsilon);
+
+ assert_equals(feGaussianBlur.stdDeviationX.baseVal, 5);
+ assert_equals(feGaussianBlur.stdDeviationY.baseVal, 5);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.clickX = 60;
+window.clickY = 60;
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgpath-animation-1.html b/tests/wpt/web-platform-tests/svg/animations/svgpath-animation-1.html
new file mode 100644
index 00000000000..220130532e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgpath-animation-1.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html>
+<title>Test 'by' animation on path. You should see a green 100x100 path and only PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M 40 40 L 60 40 L 60 60 L 40 60 z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M 40 40 L 60 40 L 60 60 L 40 60 z");
+animate.setAttribute("by", "M 0 0 L 100 0 L 100 100 L 0 100 z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("fill", "freeze");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ assert_equals(path.getAttribute('d'), "M 40 40 L 60 40 L 60 60 L 40 60 z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M 40 40 L 109.975 40 L 109.975 109.975 L 40 109.975 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M 40 40 L 110.025 40 L 110.025 110.025 L 40 110.025 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M 40 40 L 159.975 40 L 159.975 159.975 L 40 159.975 Z");
+}
+
+function sample5() {
+ assert_equals(path.getAttribute('d'), "M 40 40 L 160 40 L 160 160 L 40 160 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.999, sample2],
+ ["animation", 2.001, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample5]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-1.html b/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-1.html
new file mode 100644
index 00000000000..a3340ba83a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-1.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+<title>Tests from-to animation of points on polygons.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var poly = createSVGElement("polygon");
+poly.setAttribute("id", "poly");
+poly.setAttribute("fill", "green");
+poly.setAttribute("points", "0,0 200,0 200,200 0,200");
+poly.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "points");
+animate.setAttribute("from", "0,0 200,0 200,200 0,200");
+animate.setAttribute("to", "0,0 100,0 100,100 0,100");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+poly.appendChild(animate);
+rootSVGElement.appendChild(poly);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 200, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 200, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+function sample2() {
+ // Check half-time conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 150, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 150, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+function sample3() {
+ // Check just before-end conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 100, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 100, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-2.html b/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-2.html
new file mode 100644
index 00000000000..e0819cd519c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgpointlist-animation-2.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+<title>Tests from-by animation of points on polygons.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var poly = createSVGElement("polygon");
+poly.setAttribute("id", "poly");
+poly.setAttribute("fill", "green");
+poly.setAttribute("points", "0,0 200,0 200,200 0,200");
+poly.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "points");
+animate.setAttribute("from", "0,0 200,0 200,200 0,200");
+animate.setAttribute("by", "0,0 100,0 100,100 0,100");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+poly.appendChild(animate);
+rootSVGElement.appendChild(poly);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 200, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 200, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+function sample2() {
+ // Check half-time conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 250, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 250, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+function sample3() {
+ // Check just before-end conditions
+ assert_approx_equals(poly.animatedPoints.getItem(2).x, 300, epsilon);
+ assert_approx_equals(poly.animatedPoints.getItem(2).y, 300, epsilon);
+
+ assert_equals(poly.points.getItem(2).x, 200);
+ assert_equals(poly.points.getItem(2).y, 200);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-1.html b/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-1.html
new file mode 100644
index 00000000000..d13ccff418f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-1.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+<title>Test from-to SVGRect animation.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+rootSVGElement.appendChild(rect);
+
+rootSVGElement.setAttribute("id", "svg");
+rootSVGElement.setAttribute("viewBox", "0 0 100 100");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "viewBox");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+animate.setAttribute("from", "0 0 100 100");
+animate.setAttribute("to", "50 50 50 50");
+rootSVGElement.appendChild(animate);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 0, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 0, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 100, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 100, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 25, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 25, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 75, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 75, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 50, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 50, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 50, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 50, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-2.html b/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-2.html
new file mode 100644
index 00000000000..86f5368a3ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgrect-animation-2.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+<title>Tests from-by SVGRect animation.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+rootSVGElement.appendChild(rect);
+
+rootSVGElement.setAttribute("id", "svg");
+rootSVGElement.setAttribute("viewBox", "0 0 100 100");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "viewBox");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+animate.setAttribute("from", "0 0 100 100");
+animate.setAttribute("by", "50 50 50 50");
+rootSVGElement.appendChild(animate);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 0, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 0, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 100, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 100, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 25, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 25, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 125, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 125, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.viewBox.animVal.x, 50, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.y, 50, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.width, 150, epsilon);
+ assert_approx_equals(rootSVGElement.viewBox.animVal.height, 150, epsilon);
+
+ assert_equals(rootSVGElement.viewBox.baseVal.x, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.y, 0);
+ assert_equals(rootSVGElement.viewBox.baseVal.width, 100);
+ assert_equals(rootSVGElement.viewBox.baseVal.height, 100);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-1.html b/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-1.html
new file mode 100644
index 00000000000..259dfbd27a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-1.html
@@ -0,0 +1,66 @@
+<!doctype html>
+<html>
+<title>Test animVal support for SVGAnimatedString animations.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var aElement = createSVGElement("a");
+aElement.setAttribute("target", "base");
+
+var textElement = createSVGElement("text");
+textElement.setAttribute("id", "text");
+textElement.setAttribute("y", "50");
+textElement.textContent = "Test";
+aElement.appendChild(textElement);
+rootSVGElement.appendChild(aElement);
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "target");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+animate.setAttribute("values", "a;b");
+aElement.appendChild(animate);
+
+// Setup animation test
+function sample1() {
+ assert_equals(aElement.target.animVal, "base");
+ assert_equals(aElement.target.baseVal, "base");
+}
+
+function sample2() {
+ assert_equals(aElement.target.animVal, "a");
+ assert_equals(aElement.target.baseVal, "base");
+}
+
+function sample3() {
+ assert_equals(aElement.target.animVal, "b");
+ assert_equals(aElement.target.baseVal, "base");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 0.001, sample2],
+ ["animation", 1.999, sample2],
+ ["animation", 2.001, sample3],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-fallback-to-discrete.html b/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-fallback-to-discrete.html
new file mode 100644
index 00000000000..8cf6c34af0d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgstring-animation-fallback-to-discrete.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html>
+<title>Tests fallback to calcMode='discrete' on animation of SVGString with 'values'.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "visibility");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "6s");
+animate.setAttribute("calcMode", "linear");
+animate.setAttribute("values", "visible ; hidden ; visible");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(getComputedStyle(rect).visibility, 'visible');
+ assert_equals(rect.style.visibility, "");
+}
+
+function sample2() {
+ assert_equals(getComputedStyle(rect).visibility, 'hidden');
+ assert_equals(rect.style.visibility, "");
+}
+
+function sample3() {
+ assert_equals(getComputedStyle(rect).visibility, 'visible');
+ assert_equals(rect.style.visibility, "");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 1.999, sample1],
+ ["animation", 2.001, sample2],
+ ["animation", 5.999, sample3],
+ ["animation", 6.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-1.html b/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-1.html
new file mode 100644
index 00000000000..618ba9a31c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-1.html
@@ -0,0 +1,117 @@
+<!doctype html>
+<html>
+<title>Test accumulate=sum animation on SVGAnimateTransform.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animateTransform");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "transform");
+animate.setAttribute("type", "scale");
+animate.setAttribute("from", "0,0");
+animate.setAttribute("to", "2,2");
+animate.setAttribute("type", "scale");
+animate.setAttribute("fill", "freeze");
+animate.setAttribute("accumulate", "sum");
+animate.setAttribute("repeatCount", "3");
+animate.setAttribute("additive", "sum");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 0, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 0, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample2() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 1, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 1, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample3() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 2, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 2, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample4() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 3, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 3, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample5() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 4, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 4, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample6() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 5, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 5, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample7() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.a, 6, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.d, 6, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.001, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample3],
+ ["animation", 6.0, sample4],
+ ["animation", 7.999, sample5],
+ ["animation", 8.001, sample5],
+ ["animation", 10.0, sample6],
+ ["animation", 11.999, sample7],
+ ["animation", 12.001, sample7],
+ ["animation", 14.0, sample7],
+ ["animation", 60.0, sample7]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-discrete.html b/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-discrete.html
new file mode 100644
index 00000000000..17b78a2787d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/svgtransform-animation-discrete.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<html>
+<title>Test calcMode=discrete animation on SVGAnimateTransform.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("x", "0");
+rect.setAttribute("y", "0");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animateTransform");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "transform");
+animate.setAttribute("type", "translate");
+animate.setAttribute("from", "100,100");
+animate.setAttribute("to", "0,0");
+animate.setAttribute("type", "translate");
+animate.setAttribute("calcMode", "discrete");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_TRANSLATE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.e, 100, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.f, 100, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample2() {
+ assert_equals(rect.transform.animVal.numberOfItems, 1);
+ assert_equals(rect.transform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_TRANSLATE);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.e, 0, epsilon);
+ assert_approx_equals(rect.transform.animVal.getItem(0).matrix.f, 0, epsilon);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+function sample3() {
+ assert_equals(rect.transform.animVal.numberOfItems, 0);
+ assert_equals(rect.transform.baseVal.numberOfItems, 0);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.001, sample1],
+ ["animation", 1.999, sample1],
+ ["animation", 2.001, sample2],
+ ["animation", 3.999, sample2],
+ ["animation", 4.001, sample3]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script>
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/marker-computed.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-computed.svg
new file mode 100644
index 00000000000..329dedbbce2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-computed.svg
@@ -0,0 +1,27 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ width="800px" height="800px">
+ <title>SVG Painting: getComputedStyle().marker</title>
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html#MarkerProperty"/>
+ <h:meta name="assert" content="marker computed value is as specified, with url values absolute."/>
+ </metadata>
+ <g id="target"></g>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <h:script src="/css/support/computed-testcommon.js"/>
+ <script><![CDATA[
+
+test_computed_value("marker", "none");
+test_computed_value("marker", 'url("https://example.com/")');
+
+test(() => {
+ const target = document.getElementById('target');
+ target.style['marker'] = 'url("a.b#c")';
+ const result = getComputedStyle(target)['marker'];
+ const resolved = new URL("a.b#c", document.URL).href;
+ assert_equals(result, 'url("' + resolved + '")');
+}, 'url values are made absolute');
+
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/marker-invalid.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-invalid.svg
new file mode 100644
index 00000000000..64112cd6a77
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-invalid.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ width="800px" height="800px">
+ <title>SVG Painting: parsing marker with invalid values</title>
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html#MarkerProperty"/>
+ <h:meta name="assert" content="marker supports only the paint grammar 'none | marker-ref'."/>
+ </metadata>
+ <g id="target"></g>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <h:script src="/css/support/parsing-testcommon.js"/>
+ <script><![CDATA[
+
+test_invalid_value("marker", "auto");
+test_invalid_value("marker", 'none url("https://example.com/")');
+
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/marker-valid.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-valid.svg
new file mode 100644
index 00000000000..23d3f24f5cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/marker-valid.svg
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ width="800px" height="800px">
+ <title>SVG Painting: parsing marker with valid values</title>
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html#MarkerProperty"/>
+ <h:meta name="assert" content="marker supports the full paint grammar 'none | marker-ref'."/>
+ </metadata>
+ <g id="target"></g>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+ <h:script src="/css/support/parsing-testcommon.js"/>
+ <script><![CDATA[
+
+test_valid_value("marker", "none");
+
+test_valid_value("marker", 'url("https://example.com/")');
+
+ ]]></script>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/ci/tests/test_update_pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/tests/test_update_pr_preview.py
new file mode 100644
index 00000000000..08e46b9a63e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/tests/test_update_pr_preview.py
@@ -0,0 +1,403 @@
+try:
+ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+except ImportError:
+ # Python 3 case
+ from http.server import BaseHTTPRequestHandler, HTTPServer
+import json
+import os
+import subprocess
+import sys
+import tempfile
+import threading
+
+import pytest
+
+subject = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), '..', 'update_pr_preview.py'
+)
+test_host = 'localhost'
+
+
+class MockHandler(BaseHTTPRequestHandler, object):
+ def do_all(self):
+ request_body = None
+
+ if 'Content-Length' in self.headers:
+ request_body = self.rfile.read(
+ int(self.headers['Content-Length'])
+ ).decode('utf-8')
+
+ if self.headers.get('Content-Type') == 'application/json':
+ request_body = json.loads(request_body)
+
+ request = (self.command, self.path, request_body)
+
+ self.server.requests.append(request)
+ status_code, body = self.server.responses.get(request[:2], (200, '{}'))
+ self.send_response(status_code)
+ self.end_headers()
+ self.wfile.write(body.encode('utf-8'))
+
+ def do_DELETE(self):
+ return self.do_all()
+
+ def do_GET(self):
+ return self.do_all()
+
+ def do_PATCH(self):
+ return self.do_all()
+
+ def do_POST(self):
+ return self.do_all()
+
+
+class MockServer(HTTPServer, object):
+ '''HTTP server that responds to all requests with status code 200 and body
+ '{}' unless an alternative status code and body are specified for the given
+ method and path in the `responses` parameter.'''
+ def __init__(self, address, responses=None):
+ super(MockServer, self).__init__(address, MockHandler)
+ self.responses = responses or {}
+ self.requests = []
+
+
+def assert_success(returncode):
+ assert returncode == 0
+
+
+def assert_neutral(returncode):
+ assert returncode == 78
+
+
+def assert_fail(returncode):
+ assert returncode not in (0, 78)
+
+
+def run(event_data, responses=None):
+ event_data_file = tempfile.mkstemp()[1]
+ env = {
+ 'GITHUB_EVENT_PATH': event_data_file,
+ 'GITHUB_REPOSITORY': 'test-org/test-repo'
+ }
+ env.update(os.environ)
+ server = MockServer((test_host, 0), responses)
+ test_port = server.server_address[1]
+ threading.Thread(target=lambda: server.serve_forever()).start()
+
+ try:
+ with open(event_data_file, 'w') as handle:
+ json.dump(event_data, handle)
+
+ child = subprocess.Popen(
+ ['python', subject, 'http://{}:{}'.format(test_host, test_port)],
+ env=env
+ )
+
+ child.communicate()
+ finally:
+ server.shutdown()
+ os.remove(event_data_file)
+
+ return child.returncode, server.requests
+
+def to_key(request):
+ return request[:2]
+
+class Requests(object):
+ read_collaborator = (
+ 'GET', '/repos/test-org/test-repo/collaborators/rms', None
+ )
+ create_label = (
+ 'POST',
+ '/repos/test-org/test-repo/issues/543/labels',
+ {'labels': ['pull-request-has-preview']}
+ )
+ delete_label = (
+ 'DELETE',
+ '/repos/test-org/test-repo/issues/543/labels/pull-request-has-preview',
+ ''
+ )
+ get_ref_open = (
+ 'GET', '/repos/test-org/test-repo/git/refs/prs-open/gh-543', None
+ )
+ get_ref_labeled = (
+ 'GET',
+ '/repos/test-org/test-repo/git/refs/prs-labeled-for-preview/gh-543',
+ None
+ )
+ create_ref_open = (
+ 'POST',
+ '/repos/test-org/test-repo/git/refs',
+ {'ref': 'refs/prs-open/gh-543', 'sha': 'deadbeef'}
+ )
+ create_ref_labeled = (
+ 'POST',
+ '/repos/test-org/test-repo/git/refs',
+ {'ref': 'refs/prs-labeled-for-preview/gh-543', 'sha': 'deadbeef'}
+ )
+ delete_ref_open = (
+ 'DELETE', '/repos/test-org/test-repo/git/refs/prs-open/gh-543', ''
+ )
+ delete_ref_labeled = (
+ 'DELETE',
+ '/repos/test-org/test-repo/git/refs/prs-labeled-for-preview/gh-543', ''
+ )
+ update_ref_open = (
+ 'PATCH',
+ '/repos/test-org/test-repo/git/refs/prs-open/gh-543',
+ {'force': True, 'sha': 'deadbeef'}
+ )
+ update_ref_labeled = (
+ 'PATCH',
+ '/repos/test-org/test-repo/git/refs/prs-labeled-for-preview/gh-543',
+ {'force': True, 'sha': 'deadbeef'}
+ )
+
+
+def default_data(action):
+ return {
+ 'pull_request': {
+ 'number': 543,
+ 'closed_at': None,
+ 'head': {
+ 'sha': 'deadbeef'
+ },
+ 'user': {
+ 'login': 'rms'
+ },
+ 'labels': [
+ {'name': 'foo'},
+ {'name': 'bar'}
+ ]
+ },
+ 'action': action
+ }
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_close_active_with_label():
+ event_data = default_data('closed')
+ event_data['pull_request']['closed_at'] = '2019-07-05'
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+
+ returncode, requests = run(event_data)
+
+ assert_success(returncode)
+ assert Requests.delete_label in requests
+ assert Requests.delete_ref_open in requests
+ assert Requests.delete_ref_labeled not in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_close_active_with_label_error():
+ event_data = default_data('closed')
+ event_data['pull_request']['closed_at'] = '2019-07-05'
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+ responses = {
+ to_key(Requests.delete_label): (500, '{}')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_fail(returncode)
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_close_active_without_label():
+ event_data = default_data('closed')
+ event_data['pull_request']['closed_at'] = '2019-07-05'
+
+ returncode, requests = run(event_data)
+
+ assert_success(returncode)
+ assert [Requests.delete_ref_open] == requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_open_with_label():
+ event_data = default_data('opened')
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+
+ returncode, requests = run(event_data)
+
+ assert_success(returncode)
+ assert Requests.update_ref_open in requests
+ assert Requests.update_ref_labeled in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_open_without_label_for_collaborator():
+ event_data = default_data('opened')
+ responses = {
+ to_key(Requests.read_collaborator): (204, ''),
+ to_key(Requests.get_ref_open): (404, '{}'),
+ to_key(Requests.get_ref_labeled): (404, '{}'),
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_success(returncode)
+ assert Requests.create_label in requests
+ assert Requests.create_ref_open in requests
+ assert Requests.create_ref_labeled in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_open_without_label_for_non_collaborator():
+ event_data = default_data('opened')
+ responses = {
+ ('GET', '/repos/test-org/test-repo/collaborators/rms'): (404, '{}')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_neutral(returncode)
+ assert [Requests.read_collaborator] == requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_add_unrelated_label():
+ event_data = default_data('labeled')
+ event_data['label'] = {'name': 'foobar'}
+ event_data['pull_request']['labels'].append({'name': 'foobar'})
+
+ returncode, requests = run(event_data)
+
+ assert_neutral(returncode)
+ assert len(requests) == 0
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_add_active_label():
+ event_data = default_data('labeled')
+ event_data['label'] = {'name': 'pull-request-has-preview'}
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+ responses = {
+ to_key(Requests.get_ref_open): (404, '{}'),
+ to_key(Requests.get_ref_labeled): (404, '{}')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_success(returncode)
+ assert Requests.create_ref_open not in requests
+ assert Requests.create_ref_labeled in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_add_active_label_to_closed():
+ event_data = default_data('labeled')
+ event_data['pull_request']['closed_at'] = '2019-07-05'
+ event_data['label'] = {'name': 'pull-request-has-preview'}
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+ responses = {
+ to_key(Requests.get_ref_open): (404, '{}'),
+ to_key(Requests.get_ref_labeled): (404, '{}')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_success(returncode)
+ assert Requests.create_ref_open not in requests
+ assert Requests.create_ref_labeled in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_remove_unrelated_label():
+ event_data = default_data('unlabeled')
+ event_data['label'] = {'name': 'foobar'}
+
+ returncode, requests = run(event_data)
+
+ assert_neutral(returncode)
+ assert len(requests) == 0
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_remove_active_label():
+ event_data = default_data('unlabeled')
+ event_data['label'] = {'name': 'pull-request-has-preview'}
+ responses = {
+ to_key(Requests.delete_ref_labeled): (204, '')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_success(returncode)
+ assert Requests.delete_ref_labeled in requests
+ assert Requests.delete_ref_open not in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_remove_active_label_from_closed():
+ event_data = default_data('unlabeled')
+ event_data['pull_request']['closed_at'] = '2019-07-05'
+ event_data['label'] = {'name': 'pull-request-has-preview'}
+ responses = {
+ to_key(Requests.delete_ref_labeled): (204, '')
+ }
+
+ returncode, requests = run(event_data, responses)
+
+ assert_success(returncode)
+ assert Requests.delete_ref_labeled in requests
+ assert Requests.delete_ref_open not in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_synchronize_without_label():
+ event_data = default_data('synchronize')
+
+ returncode, requests = run(event_data)
+
+ assert_neutral(returncode)
+ assert len(requests) == 0
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_synchronize_with_label():
+ event_data = default_data('synchronize')
+ event_data['pull_request']['labels'].append(
+ {'name': 'pull-request-has-preview'}
+ )
+
+ returncode, requests = run(event_data)
+
+ assert_success(returncode)
+ assert Requests.update_ref_open in requests
+ assert Requests.update_ref_labeled in requests
+
+
+@pytest.mark.xfail(sys.platform == "win32",
+ reason="https://github.com/web-platform-tests/wpt/issues/18255")
+def test_unrecognized_action():
+ event_data = default_data('assigned')
+
+ returncode, requests = run(event_data)
+
+ assert_neutral(returncode)
+ assert len(requests) == 0
diff --git a/tests/wpt/web-platform-tests/tools/ci/update_pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/update_pr_preview.py
new file mode 100644
index 00000000000..9b104c66bb6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/update_pr_preview.py
@@ -0,0 +1,255 @@
+# wpt-submissions.live is a public deployment of WPT, maintained in an external
+# repository. It automatically fetches and deploys all refs in the WPT
+# repository which match a certain pattern. This behavior is intended to be
+# used for pull requests so that reviewers can preview changes without running
+# the WPT server locally.
+#
+# This script facilitates the service by maintaining the git refs. It creates
+# and updates refs in response to GitHub events. It does this automatically for
+# pull requests from GitHub users who have "collaborator" access permissions to
+# the WPT repository. It also does this for any pull requests which bear the
+# `pull-request-has-preview` label. Collaborators can add or remove this label
+# to enable or disable the preview for submissions from non-collaborators.
+#
+# Although the script relies on a secret access token, it is *not* limited to
+# use for pull requests from trusted collaborators due to the way GitHub
+# Actions are executed:
+#
+# > # Pull request events for forked repositories
+# >
+# > [...]
+# >
+# > ## Pull request with base and head branches in different repositories
+# >
+# > The base repository receives a `pull_request` event where the SHA is the
+# > latest commit of base branch and ref is the base branch.
+#
+# https://developer.github.com/actions/managing-workflows/workflow-configuration-options/#pull-request-events-for-forked-repositories
+import json
+import logging
+import os
+import sys
+
+import requests
+
+active_label = 'pull-request-has-preview'
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
+
+class Status(object):
+ SUCCESS = 0
+ FAIL = 1
+ NEUTRAL = 78
+
+
+def request(url, method_name, data=None, json_data=None, ignore_body=False):
+ github_token = os.environ.get('GITHUB_TOKEN')
+
+ kwargs = {
+ 'headers': {
+ 'Authorization': 'token {}'.format(github_token),
+ 'Accept': 'application/vnd.github.machine-man-preview+json'
+ }
+ }
+ method = getattr(requests, method_name)
+
+ logger.info('Issuing request: {} {}'.format(method_name.upper(), url))
+ if json_data is not None or data is not None:
+ kwargs['json'] = json_data
+ kwargs['data'] = data
+
+ resp = method(url, **kwargs)
+
+ resp.raise_for_status()
+
+ if not ignore_body:
+ return resp.json()
+
+
+def resource_exists(url):
+ try:
+ request(url, 'get', ignore_body=True)
+ except requests.HTTPError as exception:
+ if exception.response.status_code == 404:
+ return False
+ raise
+
+ return True
+
+
+class GitHub(object):
+ def __init__(self, api_root, owner, repo):
+ self.api_root = api_root
+ self.owner = owner
+ self.repo = repo
+
+ def is_collaborator(self, login):
+ return resource_exists(
+ '{}/repos/{}/{}/collaborators/{}'.format(
+ self.api_root, self.owner, self.repo, login
+ )
+ )
+
+ def ref_exists(self, ref):
+ return resource_exists(
+ '{}/repos/{}/{}/git/refs/{}'.format(
+ self.api_root, self.owner, self.repo, ref
+ )
+ )
+
+ def create_ref(self, ref, sha):
+ data = {
+ 'ref': 'refs/{}'.format(ref),
+ 'sha': sha
+ }
+ url = '{}/repos/{}/{}/git/refs'.format(
+ self.api_root, self.owner, self.repo
+ )
+
+ logger.info('Creating ref "{}" as {}'.format(ref, sha))
+
+ request(url, 'post', json_data=data)
+
+ def update_ref(self, ref, sha):
+ data = {
+ 'force': True,
+ 'sha': sha
+ }
+ url = '{}/repos/{}/{}/git/refs/{}'.format(
+ self.api_root, self.owner, self.repo, ref
+ )
+
+ logger.info('Updating ref "{}" as {}'.format(ref, sha))
+
+ request(url, 'patch', json_data=data)
+
+ def delete_ref(self, ref):
+ url = '{}/repos/{}/{}/git/refs/{}'.format(
+ self.api_root, self.owner, self.repo, ref
+ )
+
+ logger.info('Deleting ref "{}"'.format(ref))
+
+ try:
+ request(url, 'delete', ignore_body=True)
+ except requests.HTTPError as exception:
+ if exception.response.status_code != 404:
+ raise
+
+ logger.info(
+ 'Attempted to delete non-existent ref: {}'.format(ref)
+ )
+
+ def set_ref(self, ref, sha):
+ if self.ref_exists(ref):
+ self.update_ref(ref, sha)
+ else:
+ self.create_ref(ref, sha)
+
+ def add_label(self, pr_number, label_name):
+ data = {
+ 'labels': [label_name]
+ }
+ url = '{}/repos/{}/{}/issues/{}/labels'.format(
+ self.api_root, self.owner, self.repo, pr_number
+ )
+
+ logger.info('Adding label')
+
+ request(url, 'post', json_data=data)
+
+ def remove_label(self, pr_number, label_name):
+ url = '{}/repos/{}/{}/issues/{}/labels/{}'.format(
+ self.api_root, self.owner, self.repo, pr_number, label_name
+ )
+
+ logger.info('Removing label')
+
+ try:
+ request(url, 'delete')
+ except requests.HTTPError as exception:
+ if exception.response.status_code != 404:
+ raise
+
+ logger.info(
+ 'Attempted to remove non-existent label: {}'.format(label_name)
+ )
+
+
+def main(api_root):
+ with open(os.environ['GITHUB_EVENT_PATH']) as handle:
+ event = json.load(handle)
+ logger.info(json.dumps(event, indent=2))
+
+ if 'pull_request' not in event:
+ logger.info('Unexpected event data')
+ return Status.FAIL
+
+ owner, repo = os.environ['GITHUB_REPOSITORY'].split('/', 1)
+ github = GitHub(api_root, owner, repo)
+ action = event['action']
+ pr_number = event['pull_request']['number']
+ ref_open = 'prs-open/gh-{}'.format(pr_number)
+ ref_labeled = 'prs-labeled-for-preview/gh-{}'.format(pr_number)
+ sha = event['pull_request']['head']['sha']
+ login = event['pull_request']['user']['login']
+ has_label = any([
+ label['name'] == active_label
+ for label in event['pull_request']['labels']
+ ])
+ target_label = event.get('label', {}).get('name')
+
+ if action == 'closed':
+ if has_label:
+ github.remove_label(pr_number, active_label)
+
+ # Removing a label from a GitHub Action will not trigger another
+ # Workflow, so the corresponding ref must be deleted while processing
+ # the "closed" action.
+ #
+ # > An action can't trigger other workflows. For example, a push,
+ # > deployment, or any task performed within an action with the
+ # > provided `GITHUB_TOKEN` will not trigger a workflow listening on
+ # > push, deploy, or any other supported action triggers.
+ #
+ # https://developer.github.com/actions/managing-workflows/workflow-configuration-options/
+ github.delete_ref(ref_open)
+
+ return Status.SUCCESS
+ elif action in ('opened', 'reopened') and has_label:
+ github.set_ref(ref_open, sha)
+ github.set_ref(ref_labeled, sha)
+ elif action in ('opened', 'reopened') and github.is_collaborator(login):
+ github.add_label(pr_number, active_label)
+
+ # Removing a label from a GitHub Action will not trigger another
+ # Workflow, so the corresponding ref must be created while processing
+ # the "opened" and "reopened" actions.
+ #
+ # > An action can't trigger other workflows. For example, a push,
+ # > deployment, or any task performed within an action with the
+ # > provided `GITHUB_TOKEN` will not trigger a workflow listening on
+ # > push, deploy, or any other supported action triggers.
+ #
+ # https://developer.github.com/actions/managing-workflows/workflow-configuration-options/
+ github.set_ref(ref_open, sha)
+ github.set_ref(ref_labeled, sha)
+ elif action == 'labeled' and target_label == active_label:
+ github.set_ref(ref_labeled, sha)
+ elif action == 'unlabeled' and target_label == active_label:
+ github.delete_ref(ref_labeled)
+ elif action == 'synchronize' and has_label:
+ github.set_ref(ref_open, sha)
+ github.set_ref(ref_labeled, sha)
+ else:
+ return Status.NEUTRAL
+
+ return Status.SUCCESS
+
+
+if __name__ == '__main__':
+ code = main(sys.argv[1])
+ assert isinstance(code, int)
+ sys.exit(code)
diff --git a/tests/wpt/web-platform-tests/tools/docker/__init__.py b/tests/wpt/web-platform-tests/tools/docker/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/docker/__init__.py
diff --git a/tests/wpt/web-platform-tests/tools/docker/commands.json b/tests/wpt/web-platform-tests/tools/docker/commands.json
new file mode 100644
index 00000000000..15182cc9e65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/docker/commands.json
@@ -0,0 +1,6 @@
+{
+ "docker-run": {"path": "frontend.py", "script": "run", "parser": "parser_run", "help": "Run wpt docker image",
+ "virtualenv": false},
+ "docker-build": {"path": "frontend.py", "script": "build", "help": "Build wpt docker image",
+ "virtualenv": false}
+}
diff --git a/tests/wpt/web-platform-tests/tools/docker/frontend.py b/tests/wpt/web-platform-tests/tools/docker/frontend.py
new file mode 100644
index 00000000000..c4a20734582
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/docker/frontend.py
@@ -0,0 +1,43 @@
+import argparse
+import subprocess
+import os
+
+here = os.path.abspath(os.path.dirname(__file__))
+wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
+def build(*args, **kwargs):
+ subprocess.check_call(["docker",
+ "build",
+ "--tag", "wpt:local",
+ here])
+
+
+def parser_run():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--rebuild", action="store_true", help="Force rebuild of image")
+ parser.add_argument("--checkout", action="store",
+ help="Revision to checkout in the image. "
+ "If this is not supplied we mount the wpt checkout on the host as "
+ "/home/test/web-platform-tests/")
+ parser.add_argument("--privileged", action="store_true",
+ help="Run the image in priviledged mode (required for emulators)")
+ return parser
+
+
+def run(*args, **kwargs):
+ if kwargs["rebuild"]:
+ build()
+
+ args = ["docker", "run"]
+ if kwargs["privileged"]:
+ args.append("--privileged")
+ if kwargs["checkout"]:
+ args.extend(["--env", "REF==%s" % kwargs["checkout"]])
+ else:
+ args.extend(["--mount",
+ "type=bind,source=%s,target=/home/test/web-platform-tests" % wpt_root])
+ args.extend(["-it", "wpt:local"])
+
+ proc = subprocess.Popen(args)
+ proc.wait()
+ return proc.returncode
diff --git a/tests/wpt/web-platform-tests/tools/docker/start.sh b/tests/wpt/web-platform-tests/tools/docker/start.sh
index b1ff4a7faa5..dbeeed41c14 100755
--- a/tests/wpt/web-platform-tests/tools/docker/start.sh
+++ b/tests/wpt/web-platform-tests/tools/docker/start.sh
@@ -17,13 +17,15 @@ REF=${2:-master}
cd ~
-mkdir web-platform-tests
-cd web-platform-tests
+if [ ! -d web-platform-tests ]; then
+ mkdir web-platform-tests
+ cd web-platform-tests
-git init
-git remote add origin ${REMOTE}
+ git init
+ git remote add origin ${REMOTE}
-# Initially we just fetch 50 commits in order to save several minutes of fetching
-retry git fetch --quiet --depth=50 --tags origin ${REF}:task_head
+ # Initially we just fetch 50 commits in order to save several minutes of fetching
+ retry git fetch --quiet --depth=50 --tags origin ${REF}:task_head
-git checkout --quiet task_head
+ git checkout --quiet task_head
+fi
diff --git a/tests/wpt/web-platform-tests/tools/manifest/tests/test_item.py b/tests/wpt/web-platform-tests/tools/manifest/tests/test_item.py
index 1cbe84708b4..cf52fe80aad 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/tests/test_item.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/tests/test_item.py
@@ -4,7 +4,9 @@ import json
import pytest
from ..manifest import Manifest
-from ..item import TestharnessTest, RefTest, item_types
+# Prevent pytest from treating TestharnessTest as a test class
+from ..item import TestharnessTest as HarnessTest
+from ..item import RefTest, item_types
@pytest.mark.parametrize("path", [
@@ -18,7 +20,7 @@ from ..item import TestharnessTest, RefTest, item_types
"a.b.serviceworker.c.d",
])
def test_url_https(path):
- m = TestharnessTest("/foo", "bar/" + path, "/", "bar/" + path)
+ m = HarnessTest("/foo", "bar/" + path, "/", "bar/" + path)
assert m.https is True
@@ -40,7 +42,7 @@ def test_url_https(path):
"a.serviceworkerb.c",
])
def test_url_not_https(path):
- m = TestharnessTest("/foo", "bar/" + path, "/", "bar/" + path)
+ m = HarnessTest("/foo", "bar/" + path, "/", "bar/" + path)
assert m.https is False
diff --git a/tests/wpt/web-platform-tests/tools/pytest.ini b/tests/wpt/web-platform-tests/tools/pytest.ini
index b52e465598a..6bdb4d563f6 100644
--- a/tests/wpt/web-platform-tests/tools/pytest.ini
+++ b/tests/wpt/web-platform-tests/tools/pytest.ini
@@ -1,3 +1,7 @@
[pytest]
norecursedirs = .* {arch} *.egg html5lib third_party pywebsocket six wpt wptrunner
-xfail_strict=true
+xfail_strict = true
+addopts = --strict-markers
+markers =
+ slow: marks tests as slow (deselect with '-m "not slow"')
+ remote_network
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index 63fb8ed9832..52e749e4bdc 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -8,6 +8,8 @@ deps =
pytest-cov
mock
hypothesis
+ # `requests` is required by `update_pr_preview.py`
+ requests
commands = pytest {posargs}
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index 1f013415316..0943ee9f3d7 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -36,6 +36,7 @@ def handle_remove_readonly(func, path, exc):
else:
raise
+
class Browser(object):
__metaclass__ = ABCMeta
@@ -439,17 +440,6 @@ class Chrome(Browser):
product = "chrome"
requirements = "requirements_chrome.txt"
- @property
- def binary(self):
- if uname[0] == "Linux":
- return "/usr/bin/google-chrome"
- if uname[0] == "Darwin":
- return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
- if uname[0] == "Windows":
- return os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe")
- self.logger.warning("Unable to find the browser binary.")
- return None
-
def install(self, dest=None, channel=None):
raise NotImplementedError
@@ -488,7 +478,25 @@ class Chrome(Browser):
return platform
def find_binary(self, venv_path=None, channel=None):
- raise NotImplementedError
+ if uname[0] == "Linux":
+ name = "google-chrome"
+ if channel == "stable":
+ name += "-stable"
+ elif channel == "beta":
+ name += "-beta"
+ elif channel == "dev":
+ name += "-unstable"
+ # No Canary on Linux.
+ return find_executable(name)
+ if uname[0] == "Darwin":
+ if channel == "canary":
+ return "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"
+ # All other channels share the same path on macOS.
+ return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
+ if uname[0] == "Windows":
+ return os.path.expandvars(r"$SYSTEMDRIVE\Program Files (x86)\Google\Chrome\Application\chrome.exe")
+ self.logger.warning("Unable to find the browser binary.")
+ return None
def find_webdriver(self, channel=None):
return find_executable("chromedriver")
@@ -527,28 +535,37 @@ class Chrome(Browser):
self.chromium_platform_string(), revision, self.platform_string())
return url
- def _latest_chromedriver_url(self, browser_binary=None):
- chrome_version = self.version(browser_binary)
- assert chrome_version, "Cannot detect the version of Chrome"
+ def _latest_chromedriver_url(self, chrome_version):
# Remove channel suffixes (e.g. " dev").
chrome_version = chrome_version.split(' ')[0]
return (self._official_chromedriver_url(chrome_version) or
self._chromium_chromedriver_url(chrome_version))
- def install_webdriver(self, dest=None, channel=None, browser_binary=None):
+ def install_webdriver_by_version(self, version, dest=None):
+ assert version, "Cannot install ChromeDriver without Chrome version"
if dest is None:
dest = os.pwd
- url = self._latest_chromedriver_url(browser_binary)
+ url = self._latest_chromedriver_url(version)
self.logger.info("Downloading ChromeDriver from %s" % url)
unzip(get(url).raw, dest)
- chromedriver_dir = os.path.join(dest, 'chromedriver_%s' % self.platform_string())
+ chromedriver_dir = os.path.join(
+ dest, 'chromedriver_%s' % self.platform_string())
if os.path.isfile(os.path.join(chromedriver_dir, "chromedriver")):
shutil.move(os.path.join(chromedriver_dir, "chromedriver"), dest)
shutil.rmtree(chromedriver_dir)
return find_executable("chromedriver", dest)
+ def install_webdriver(self, dest=None, channel=None, browser_binary=None):
+ if browser_binary is None:
+ browser_binary = self.find_binary(channel)
+ return self.install_webdriver_by_version(
+ self.version(browser_binary), dest)
+
def version(self, binary=None, webdriver_binary=None):
- binary = binary or self.binary
+ if not binary:
+ self.logger.warning("No browser binary provided.")
+ return None
+
if uname[0] == "Windows":
return _get_fileversion(binary, self.logger)
@@ -573,21 +590,43 @@ class ChromeAndroid(Browser):
product = "chrome_android"
requirements = "requirements_chrome_android.txt"
+ def __init__(self, logger):
+ super(ChromeAndroid, self).__init__(logger)
+
def install(self, dest=None, channel=None):
raise NotImplementedError
def find_binary(self, venv_path=None, channel=None):
- raise NotImplementedError
+ if channel in ("beta", "dev", "canary"):
+ return "com.chrome." + channel
+ return "com.android.chrome"
def find_webdriver(self, channel=None):
return find_executable("chromedriver")
def install_webdriver(self, dest=None, channel=None, browser_binary=None):
- chrome = Chrome()
- return chrome.install_webdriver(dest, channel)
+ if browser_binary is None:
+ browser_binary = self.find_binary(channel)
+ chrome = Chrome(self.logger)
+ return chrome.install_webdriver_by_version(
+ self.version(browser_binary), dest)
def version(self, binary=None, webdriver_binary=None):
- return None
+ if not binary:
+ self.logger.warning("No package name provided.")
+ return None
+
+ command = ['adb', 'shell', 'dumpsys', 'package', binary]
+ try:
+ output = call(*command)
+ except (subprocess.CalledProcessError, OSError):
+ self.logger.warning("Failed to call %s" % " ".join(command))
+ return None
+ match = re.search(r'versionName=(.*)', output)
+ if not match:
+ self.logger.warning("Failed to find versionName")
+ return None
+ return match.group(1)
class ChromeiOS(Browser):
@@ -687,6 +726,7 @@ class Opera(Browser):
if m:
return m.group(0)
+
class EdgeChromium(Browser):
"""MicrosoftEdge-specific interface."""
platform = {
@@ -713,16 +753,16 @@ class EdgeChromium(Browser):
os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Dev\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Beta\\Application"),
os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Dev\\Application"),
- os.path.expanduser("~\\AppData\Local\\Microsoft\\Edge SxS\\Application"),]
+ os.path.expanduser("~\\AppData\Local\\Microsoft\\Edge SxS\\Application")]
return find_executable(binaryname, os.pathsep.join(winpaths))
if self.platform == "macos":
binaryname = "Microsoft Edge Canary"
binary = find_executable(binaryname)
if not binary:
macpaths = ["/Applications/Microsoft Edge.app/Contents/MacOS",
- os.path.expanduser("~/Applications/Microsoft Edge.app/Contents/MacOS"),
- "/Applications/Microsoft Edge Canary.app/Contents/MacOS",
- os.path.expanduser("~/Applications/Microsoft Edge Canary.app/Contents/MacOS")]
+ os.path.expanduser("~/Applications/Microsoft Edge.app/Contents/MacOS"),
+ "/Applications/Microsoft Edge Canary.app/Contents/MacOS",
+ os.path.expanduser("~/Applications/Microsoft Edge Canary.app/Contents/MacOS")]
return find_executable("Microsoft Edge Canary", os.pathsep.join(macpaths))
return binary
@@ -785,6 +825,7 @@ class EdgeChromium(Browser):
self.logger.warning("Failed to find Edge binary.")
return None
+
class Edge(Browser):
"""Edge-specific interface."""
diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py
index b107752d81b..8215dfe0916 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/install.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/install.py
@@ -6,6 +6,7 @@ import sys
latest_channels = {
'firefox': 'nightly',
'chrome': 'dev',
+ 'chrome_android': 'dev',
'edgechromium': 'dev',
'safari': 'preview',
'servo': 'nightly'
diff --git a/tests/wpt/web-platform-tests/tools/wpt/paths b/tests/wpt/web-platform-tests/tools/wpt/paths
index 4528222fbf5..093a7156892 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/paths
+++ b/tests/wpt/web-platform-tests/tools/wpt/paths
@@ -1,4 +1,5 @@
tools/ci/
+tools/docker/
tools/lint/
tools/manifest/
tools/serve/
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
index d5d7e7a21f5..617ea7282b8 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -264,6 +264,13 @@ class Chrome(BrowserSetup):
browser_cls = browser.Chrome
def setup_kwargs(self, kwargs):
+ browser_channel = kwargs["browser_channel"]
+ if kwargs["binary"] is None:
+ binary = self.browser.find_binary(channel=browser_channel)
+ if binary:
+ kwargs["binary"] = binary
+ else:
+ raise WptrunError("Unable to locate Chrome binary")
if kwargs["webdriver_binary"] is None:
webdriver_binary = self.browser.find_webdriver()
@@ -272,7 +279,10 @@ class Chrome(BrowserSetup):
if install:
logger.info("Downloading chromedriver")
- webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path, browser_binary=kwargs["binary"])
+ webdriver_binary = self.browser.install_webdriver(
+ dest=self.venv.bin_path,
+ browser_binary=kwargs["binary"],
+ )
else:
logger.info("Using webdriver binary %s" % webdriver_binary)
@@ -280,8 +290,8 @@ class Chrome(BrowserSetup):
kwargs["webdriver_binary"] = webdriver_binary
else:
raise WptrunError("Unable to locate or install chromedriver binary")
- if kwargs["browser_channel"] == "dev":
- logger.info("Automatically turning on experimental features for Chrome Dev")
+ if browser_channel in ("dev", "canary"):
+ logger.info("Automatically turning on experimental features for Chrome Dev/Canary")
kwargs["binary_args"].append("--enable-experimental-web-platform-features")
# HACK(Hexcles): work around https://github.com/web-platform-tests/wpt/issues/16448
kwargs["webdriver_args"].append("--disable-build-check")
@@ -292,6 +302,10 @@ class ChromeAndroid(BrowserSetup):
browser_cls = browser.ChromeAndroid
def setup_kwargs(self, kwargs):
+ browser_channel = kwargs["browser_channel"]
+ if kwargs["package_name"] is None:
+ kwargs["package_name"] = self.browser.find_binary(
+ channel=browser_channel)
if kwargs["webdriver_binary"] is None:
webdriver_binary = self.browser.find_webdriver()
@@ -300,7 +314,10 @@ class ChromeAndroid(BrowserSetup):
if install:
logger.info("Downloading chromedriver")
- webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
+ webdriver_binary = self.browser.install_webdriver(
+ dest=self.venv.bin_path,
+ browser_binary=kwargs["package_name"],
+ )
else:
logger.info("Using webdriver binary %s" % webdriver_binary)
@@ -308,6 +325,11 @@ class ChromeAndroid(BrowserSetup):
kwargs["webdriver_binary"] = webdriver_binary
else:
raise WptrunError("Unable to locate or install chromedriver binary")
+ if browser_channel in ("dev", "canary"):
+ logger.info("Automatically turning on experimental features for Chrome Dev/Canary")
+ kwargs["binary_args"].append("--enable-experimental-web-platform-features")
+ # HACK(Hexcles): work around https://github.com/web-platform-tests/wpt/issues/16448
+ kwargs["webdriver_args"].append("--disable-build-check")
class ChromeiOS(BrowserSetup):
@@ -351,7 +373,7 @@ class EdgeChromium(BrowserSetup):
if kwargs["binary"] is None:
binary = self.browser.find_binary(channel=browser_channel)
if binary:
- kwargs["binary"] = self.browser.find_binary()
+ kwargs["binary"] = binary
else:
raise WptrunError("Unable to locate Edge binary")
if kwargs["webdriver_binary"] is None:
@@ -616,8 +638,10 @@ def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs):
# Only update browser_version if it was not given as a command line
# argument, so that it can be overridden on the command line.
if not kwargs["browser_version"]:
- kwargs["browser_version"] = setup_cls.browser.version(binary=kwargs.get("binary"),
- webdriver_binary=kwargs.get("webdriver_binary"))
+ kwargs["browser_version"] = setup_cls.browser.version(
+ binary=kwargs.get("binary") or kwargs.get("package_name"),
+ webdriver_binary=kwargs.get("webdriver_binary"),
+ )
return kwargs
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py
index cd70fef5e8b..bc43e647c31 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py
@@ -55,7 +55,7 @@ def test_check_environ_fail(platform):
with pytest.raises(run.WptrunError) as excinfo:
run.check_environ("foo")
- assert "wpt make-hosts-file" in excinfo.value.message
+ assert "wpt make-hosts-file" in str(excinfo.value)
@pytest.mark.parametrize("product", product_list)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt
index 1bf6ef32ad4..470aaf9a939 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_chrome_android.txt
@@ -1,2 +1 @@
mozprocess==1.0.0
-selenium==3.141.0
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
index 31ae7995b40..b8ebedef048 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -2,18 +2,18 @@ import subprocess
from .base import Browser, ExecutorBrowser, require_arg
from .base import get_timeout_multiplier # noqa: F401
+from .chrome import executor_kwargs as chrome_executor_kwargs
from ..webdriver_server import ChromeDriverServer
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorselenium import (SeleniumTestharnessExecutor, # noqa: F401
- SeleniumRefTestExecutor) # noqa: F401
+from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
+ WebDriverRefTestExecutor) # noqa: F401
from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401
__wptrunner__ = {"product": "chrome_android",
"check_args": "check_args",
"browser": "ChromeAndroidBrowser",
- "executor": {"testharness": "SeleniumTestharnessExecutor",
- "reftest": "SeleniumRefTestExecutor",
+ "executor": {"testharness": "WebDriverTestharnessExecutor",
+ "reftest": "WebDriverRefTestExecutor",
"wdspec": "ChromeDriverWdspecExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
@@ -25,42 +25,35 @@ _wptserve_ports = set()
def check_args(**kwargs):
+ require_arg(kwargs, "package_name")
require_arg(kwargs, "webdriver_binary")
def browser_kwargs(test_type, run_info_data, config, **kwargs):
- return {"binary": kwargs["binary"],
+ return {"package_name": kwargs["package_name"],
"webdriver_binary": kwargs["webdriver_binary"],
"webdriver_args": kwargs.get("webdriver_args")}
def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
**kwargs):
- from selenium.webdriver import DesiredCapabilities
-
- # Use extend() to modify the global list in place.
+ # Use update() to modify the global list in place.
_wptserve_ports.update(set(
server_config['ports']['http'] + server_config['ports']['https'] +
server_config['ports']['ws'] + server_config['ports']['wss']
))
- executor_kwargs = base_executor_kwargs(test_type, server_config, cache_manager, run_info_data,
- **kwargs)
- executor_kwargs["close_after_done"] = True
- capabilities = dict(DesiredCapabilities.CHROME.items())
- capabilities["goog:chromeOptions"] = {}
- # TODO(chrome): browser_channel should be properly supported.
- package_name = "com.android.chrome" # stable channel
- # Required to start on mobile
- capabilities["goog:chromeOptions"]["androidPackage"] = package_name
-
- for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
- if kwargs[kwarg] is not None:
- capabilities["goog:chromeOptions"][capability] = kwargs[kwarg]
- if test_type == "testharness":
- capabilities["useAutomationExtension"] = False
- capabilities["excludeSwitches"] = ["enable-automation"]
- executor_kwargs["capabilities"] = capabilities
+ executor_kwargs = chrome_executor_kwargs(test_type, server_config,
+ cache_manager, run_info_data,
+ **kwargs)
+ # Remove unsupported options on mobile.
+ del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"]
+ del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"]
+
+ assert kwargs["package_name"], "missing --package-name"
+ executor_kwargs["capabilities"]["goog:chromeOptions"]["androidPackage"] = \
+ kwargs["package_name"]
+
return executor_kwargs
@@ -77,12 +70,10 @@ class ChromeAndroidBrowser(Browser):
``wptrunner.webdriver.ChromeDriverServer``.
"""
- def __init__(self, logger, binary, webdriver_binary="chromedriver",
+ def __init__(self, logger, package_name, webdriver_binary="chromedriver",
webdriver_args=None):
- """Creates a new representation of Chrome. The `binary` argument gives
- the browser binary to use for testing."""
Browser.__init__(self, logger)
- self.binary = binary
+ self.package_name = package_name
self.server = ChromeDriverServer(self.logger,
binary=webdriver_binary,
args=webdriver_args)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
index 7e6d017d541..13739e5103e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -179,8 +179,8 @@ def run_info_browser_version(binary):
def update_properties():
- return (["debug", "webrender", "e10s", "os", "version", "processor", "bits"],
- {"debug", "e10s", "webrender"})
+ return (["os", "debug", "webrender", "e10s", "sw-e10s", "processor"],
+ {"os": ["version"], "processor": ["bits"]})
class FirefoxBrowser(Browser):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index b6d7bc8851e..30e53a593cf 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -1,7 +1,6 @@
import os
import moznetwork
-from mozprocess import ProcessHandler
from mozprofile import FirefoxProfile
from mozrunner import FennecEmulatorRunner
@@ -52,7 +51,8 @@ def browser_kwargs(test_type, run_info_data, config, **kwargs):
"timeout_multiplier": get_timeout_multiplier(test_type,
run_info_data,
**kwargs),
- "leak_check": kwargs["leak_check"],
+ # desktop only
+ "leak_check": False,
"stylo_threads": kwargs["stylo_threads"],
"chaos_mode_flags": kwargs["chaos_mode_flags"],
"config": config,
@@ -145,13 +145,7 @@ class FirefoxAndroidBrowser(FirefoxBrowser):
with open(os.path.join(font_dir, "Ahem.ttf"), "wb") as dest:
dest.write(src.read())
- if self.leak_check and kwargs.get("check_leaks", True):
- self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log")
- if os.path.exists(self.leak_report_file):
- os.remove(self.leak_report_file)
- env["XPCOM_MEM_BLOAT_LOG"] = self.leak_report_file
- else:
- self.leak_report_file = None
+ self.leak_report_file = None
if self.ca_certificate_path is not None:
self.setup_ssl()
@@ -168,9 +162,7 @@ class FirefoxAndroidBrowser(FirefoxBrowser):
symbols_path=self.symbols_path,
serial=self.device_serial,
# TODO - choose appropriate log dir
- logdir=os.getcwd(),
- process_class=ProcessHandler,
- process_args={"processOutputLine": [self.on_output]})
+ logdir=os.getcwd())
self.logger.debug("Starting %s" % self.package_name)
# connect to a running emulator
@@ -201,11 +193,11 @@ class FirefoxAndroidBrowser(FirefoxBrowser):
except Exception as e:
self.logger.warning("Failed to remove forwarded or reversed ports: %s" % e)
# We assume that stopping the runner prompts the
- # browser to shut down. This allows the leak log to be written
+ # browser to shut down.
self.runner.stop()
self.logger.debug("stopped")
def check_crash(self, process, test):
if not os.environ.get("MINIDUMP_STACKWALK", "") and self.stackwalk_binary:
os.environ["MINIDUMP_STACKWALK"] = self.stackwalk_binary
- return self.runner.check_for_crashes()
+ return bool(self.runner.check_for_crashes(test_name=test))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servo.py
index 2e0b0a25c14..d3ed4b3fb1d 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servo.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servo.py
@@ -61,7 +61,7 @@ def env_options():
def update_properties():
- return ["debug", "os", "version", "processor", "bits"], None
+ return ["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]}
class ServoBrowser(NullBrowser):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servodriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servodriver.py
index 2bf6b282819..54a22b4f729 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servodriver.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/servodriver.py
@@ -63,7 +63,7 @@ def env_options():
def update_properties():
- return ["debug", "os", "version", "processor", "bits"], None
+ return ["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]}
def write_hosts_file(config):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 37f735d5751..898447df6f5 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -86,6 +86,7 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart):
self.parent.base.execute_script(self.runner_script % format_map)
def close_old_windows(self):
+ self.webdriver.actions.release()
handles = [item for item in self.webdriver.handles if item != self.runner_handle]
for handle in handles:
try:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py
new file mode 100644
index 00000000000..4d505086bd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py
@@ -0,0 +1,131 @@
+from math import log
+from collections import defaultdict
+
+class Node(object):
+ def __init__(self, prop, value):
+ self.prop = prop
+ self.value = value
+ self.parent = None
+
+ self.children = set()
+
+ # Populated for leaf nodes
+ self.run_info = set()
+ self.result_values = defaultdict(int)
+
+ def add(self, node):
+ self.children.add(node)
+ node.parent = self
+
+ def __iter__(self):
+ yield self
+ for node in self.children:
+ for item in node:
+ yield item
+
+ def __len__(self):
+ return 1 + sum(len(item) for item in self.children)
+
+
+def entropy(results):
+ """This is basically a measure of the uniformity of the values in results
+ based on the shannon entropy"""
+
+ result_counts = defaultdict(int)
+ total = float(len(results))
+ for values in results.itervalues():
+ # Not sure this is right, possibly want to treat multiple values as
+ # distinct from multiple of the same value?
+ for value in values:
+ result_counts[value] += 1
+
+ entropy_sum = 0
+
+ for count in result_counts.itervalues():
+ prop = float(count) / total
+ entropy_sum -= prop * log(prop, 2)
+
+ return entropy_sum
+
+
+def split_results(prop, results):
+ """Split a dictionary of results into a dictionary of dictionaries where
+ each sub-dictionary has a specific value of the given property"""
+ by_prop = defaultdict(dict)
+ for run_info, value in results.iteritems():
+ by_prop[run_info[prop]][run_info] = value
+
+ return by_prop
+
+
+def build_tree(properties, dependent_props, results, tree=None):
+ """Build a decision tree mapping properties to results
+
+ :param properties: - A list of run_info properties to consider
+ in the tree
+ :param dependent_props: - A dictionary mapping property name
+ to properties that should only be considered
+ after the properties in the key. For example
+ {"os": ["version"]} means that "version" won't
+ be used until after os.
+ :param results: Dictionary mapping run_info to set of results
+ :tree: A Node object to use as the root of the (sub)tree"""
+
+ if tree is None:
+ tree = Node(None, None)
+
+ prop_index = {prop: i for i, prop in enumerate(properties)}
+
+ all_results = defaultdict(int)
+ for result_values in results.itervalues():
+ for result_value, count in result_values.iteritems():
+ all_results[result_value] += count
+
+ # If there is only one result we are done
+ if not properties or len(all_results) == 1:
+ for value, count in all_results.iteritems():
+ tree.result_values[value] += count
+ tree.run_info |= set(results.keys())
+ return tree
+
+ results_partitions = []
+ remove_properties = set()
+ for prop in properties:
+ result_sets = split_results(prop, results)
+ if len(result_sets) == 1:
+ # If this property doesn't partition the space then just remove it
+ # from the set to consider
+ remove_properties.add(prop)
+ continue
+ new_entropy = 0.
+ results_sets_entropy = []
+ for prop_value, result_set in result_sets.iteritems():
+ results_sets_entropy.append((entropy(result_set), prop_value, result_set))
+ new_entropy += (float(len(result_set)) / len(results)) * results_sets_entropy[-1][0]
+
+ results_partitions.append((new_entropy,
+ prop,
+ results_sets_entropy))
+
+ # In the case that no properties partition the space
+ if not results_partitions:
+ for value, count in all_results.iteritems():
+ tree.result_values[value] += count
+ tree.run_info |= set(results.keys())
+ return tree
+
+ # split by the property with the highest entropy
+ results_partitions.sort(key=lambda x: (x[0], prop_index[x[1]]))
+ _, best_prop, sub_results = results_partitions[0]
+
+ # Create a new set of properties that can be used
+ new_props = properties[:prop_index[best_prop]] + properties[prop_index[best_prop] + 1:]
+ new_props.extend(dependent_props.get(best_prop, []))
+ if remove_properties:
+ new_props = [item for item in new_props if item not in remove_properties]
+
+ for _, prop_value, results_sets in sub_results:
+ node = Node(best_prop, prop_value)
+ tree.add(node)
+ build_tree(new_props, dependent_props, results_sets, node)
+ return tree
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 15e8e0b0ce9..707a8519a55 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
@@ -28,11 +28,15 @@ class ChromiumFormatter(base.BaseFormatter):
# the subtest messages for this test.
self.messages = defaultdict(str)
+ # List of tests that have failing subtests.
+ self.tests_with_subtest_fails = set()
+
def _append_test_message(self, test, subtest, status, message):
"""
Appends the message data for a test.
:param str test: the name of the test
:param str subtest: the name of the subtest with the message
+ :param str status: the subtest status
:param str message: the string to append to the message for this test
"""
if not message:
@@ -107,15 +111,25 @@ class ChromiumFormatter(base.BaseFormatter):
else time.time())
def test_status(self, data):
+ test_name = data["test"]
+ if data["status"] != "PASS" and test_name not in self.tests_with_subtest_fails:
+ self.tests_with_subtest_fails.add(test_name)
if "message" in data:
- self._append_test_message(data["test"], data["subtest"],
+ self._append_test_message(test_name, data["subtest"],
data["status"], data["message"])
def test_end(self, data):
- actual_status = self._map_status_name(data["status"])
expected_status = (self._map_status_name(data["expected"])
if "expected" in data else "PASS")
test_name = data["test"]
+ actual_status = self._map_status_name(data["status"])
+ if actual_status == "PASS" and test_name in self.tests_with_subtest_fails:
+ # This test passed but it has failing subtests, so we flip the status
+ # to FAIL.
+ actual_status = "FAIL"
+ # Clean up the test list to avoid accumulating too many.
+ self.tests_with_subtest_fails.remove(test_name)
+
if "message" in data:
self._append_test_message(test_name, None, actual_status,
data["message"])
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 b2c261f92f7..87691cf5a98 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
@@ -162,3 +162,52 @@ def test_subtest_messages(capfd):
t2_log = output_json["tests"]["t2"]["artifacts"]["log"]
assert t2_log == "[TIMEOUT] t2_message\n"
+
+
+def test_subtest_failure(capfd):
+ # Tests that a test fails if a subtest fails
+
+ # Set up the handler.
+ output = StringIO()
+ logger = structuredlog.StructuredLogger("test_a")
+ formatter = ChromiumFormatter()
+ logger.add_handler(handlers.StreamHandler(output, formatter))
+
+ # Run a test with some subtest failures.
+ logger.suite_start(["t1"], run_info={}, time=123)
+ logger.test_start("t1")
+ logger.test_status("t1", status="FAIL", subtest="t1_a",
+ message="t1_a_message")
+ logger.test_status("t1", status="PASS", subtest="t1_b",
+ message="t1_b_message")
+ logger.test_status("t1", status="TIMEOUT", subtest="t1_c",
+ message="t1_c_message")
+
+ # Make sure the test name was added to the set of tests with subtest fails
+ assert "t1" in formatter.tests_with_subtest_fails
+
+ # The test status is reported as a pass here because the harness was able to
+ # run the test to completion.
+ logger.test_end("t1", status="PASS", expected="PASS")
+ 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"]
+ 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"
+ # The status of the test in the output is a failure because subtests failed,
+ # despite the harness reporting that the test passed.
+ assert test_obj["actual"] == "FAIL"
+ # Also ensure that the formatter cleaned up its internal state
+ assert "t1" not in formatter.tests_with_subtest_fails
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
index 2b0288668cc..4753fde0083 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
@@ -1,17 +1,19 @@
from __future__ import print_function
-import itertools
import os
from six.moves.urllib.parse import urljoin
-from collections import namedtuple, defaultdict
+from collections import namedtuple, defaultdict, deque
from math import ceil
+from wptmanifest import serialize
from wptmanifest.node import (DataNode, ConditionalNode, BinaryExpressionNode,
- BinaryOperatorNode, VariableNode, StringNode, NumberNode,
- UnaryExpressionNode, UnaryOperatorNode, KeyValueNode)
+ BinaryOperatorNode, NumberNode, StringNode, VariableNode,
+ ValueNode, UnaryExpressionNode, UnaryOperatorNode,
+ ListNode)
from wptmanifest.backends import conditional
from wptmanifest.backends.conditional import ManifestItem
import expected
+import expectedtree
"""Manifest structure used to update the expected results of a test
@@ -27,7 +29,7 @@ at runtime.
When a result for a test is to be updated set_result on the
[Sub]TestNode is called to store the new result, alongside the
existing conditional that result's run info matched, if any. Once all
-new results are known, coalesce_expected is called to compute the new
+new results are known, update is called to compute the new
set of results and conditionals. The AST of the underlying parsed manifest
is updated with the changes, and the result is serialised to a file.
"""
@@ -57,19 +59,43 @@ def data_cls_getter(output_node, visited_node):
raise ValueError
+class UpdateProperties(object):
+ def __init__(self, manifest, **kwargs):
+ self._manifest = manifest
+ self._classes = kwargs
+
+ def __getattr__(self, name):
+ if name in self._classes:
+ rv = self._classes[name](self._manifest)
+ setattr(self, name, rv)
+ return rv
+ raise AttributeError
+
+ def __contains__(self, name):
+ return name in self._classes
+
+ def __iter__(self):
+ for name in self._classes.iterkeys():
+ yield getattr(self, name)
+
+
class ExpectedManifest(ManifestItem):
- def __init__(self, node, test_path=None, url_base=None, property_order=None,
- boolean_properties=None):
+ def __init__(self, node, test_path, url_base, run_info_properties):
"""Object representing all the tests in a particular manifest
:param node: AST Node associated with this object. If this is None,
a new AST is created to associate with this manifest.
:param test_path: Path of the test file associated with this manifest.
:param url_base: Base url for serving the tests in this manifest.
- :param property_order: List of properties to use in expectation metadata
- from most to least significant.
- :param boolean_properties: Set of properties in property_order that should
- be treated as boolean.
+ :param run_info_properties: Tuple of ([property name],
+ {property_name: [dependent property]})
+ The first part lists run_info properties
+ that are always used in the update, the second
+ maps property names to additional properties that
+ can be considered if we already have a condition on
+ the key property e.g. {"foo": ["bar"]} means that
+ we consider making conditions on bar only after we
+ already made one on foo.
"""
if node is None:
node = DataNode(None)
@@ -78,14 +104,24 @@ class ExpectedManifest(ManifestItem):
self.test_path = test_path
self.url_base = url_base
assert self.url_base is not None
- self.modified = False
- self.boolean_properties = boolean_properties
- self.property_order = property_order
- self.update_properties = {
- "lsan": LsanUpdate(self),
- "leak-object": LeakObjectUpdate(self),
- "leak-threshold": LeakThresholdUpdate(self),
- }
+ self._modified = False
+ self.run_info_properties = run_info_properties
+
+ self.update_properties = UpdateProperties(self, **{
+ "lsan": LsanUpdate,
+ "leak_object": LeakObjectUpdate,
+ "leak_threshold": LeakThresholdUpdate,
+ })
+
+ @property
+ def modified(self):
+ if self._modified:
+ return True
+ return any(item.modified for item in self.children)
+
+ @modified.setter
+ def modified(self, value):
+ self._modified = value
def append(self, child):
ManifestItem.append(self, child)
@@ -123,8 +159,7 @@ class ExpectedManifest(ManifestItem):
:param run_info: Dictionary of run_info parameters corresponding
to this run
:param result: Lsan violations detected"""
-
- self.update_properties["lsan"].set(run_info, result)
+ self.update_properties.lsan.set(run_info, result)
def set_leak_object(self, run_info, result):
"""Set the result of the test in a particular run
@@ -132,8 +167,7 @@ class ExpectedManifest(ManifestItem):
:param run_info: Dictionary of run_info parameters corresponding
to this run
:param result: Leaked objects deletec"""
-
- self.update_properties["leak-object"].set(run_info, result)
+ self.update_properties.leak_object.set(run_info, result)
def set_leak_threshold(self, run_info, result):
"""Set the result of the test in a particular run
@@ -141,12 +175,14 @@ class ExpectedManifest(ManifestItem):
:param run_info: Dictionary of run_info parameters corresponding
to this run
:param result: Total number of bytes leaked"""
+ self.update_properties.leak_threshold.set(run_info, result)
- self.update_properties["leak-threshold"].set(run_info, result)
-
- def coalesce_properties(self, stability):
- for prop_update in self.update_properties.itervalues():
- prop_update.coalesce(stability)
+ def update(self, full_update, disable_intermittent, update_intermittent, remove_intermittent):
+ for prop_update in self.update_properties:
+ prop_update.update(full_update,
+ disable_intermittent,
+ update_intermittent,
+ remove_intermittent)
class TestNode(ManifestItem):
@@ -159,11 +195,14 @@ class TestNode(ManifestItem):
self.subtests = {}
self._from_file = True
self.new_disabled = False
- self.update_properties = {
- "expected": ExpectedUpdate(self),
- "max-asserts": MaxAssertsUpdate(self),
- "min-asserts": MinAssertsUpdate(self)
- }
+ self.has_result = False
+ self.modified = False
+ self.update_properties = UpdateProperties(
+ self,
+ expected=ExpectedUpdate,
+ max_asserts=MaxAssertsUpdate,
+ min_asserts=MinAssertsUpdate
+ )
@classmethod
def create(cls, test_id):
@@ -212,37 +251,14 @@ class TestNode(ManifestItem):
to this run
:param result: Status of the test in this run"""
- self.update_properties["expected"].set(run_info, result)
+ self.update_properties.expected.set(run_info, result)
def set_asserts(self, run_info, count):
"""Set the assert count of a test
"""
- self.update_properties["min-asserts"].set(run_info, count)
- self.update_properties["max-asserts"].set(run_info, count)
-
- def _add_key_value(self, node, values):
- ManifestItem._add_key_value(self, node, values)
- if node.data in self.update_properties:
- new_updated = []
- self.update_properties[node.data].updated = new_updated
- for value in values:
- new_updated.append((value, []))
-
- def clear(self, key):
- """Clear all the expected data for this test and all of its subtests"""
-
- self.updated = []
- if key in self._data:
- for child in self.node.children:
- if (isinstance(child, KeyValueNode) and
- child.data == key):
- child.remove()
- del self._data[key]
- break
-
- for subtest in self.subtests.itervalues():
- subtest.clear(key)
+ self.update_properties.min_asserts.set(run_info, count)
+ self.update_properties.max_asserts.set(run_info, count)
def append(self, node):
child = ManifestItem.append(self, node)
@@ -262,9 +278,12 @@ class TestNode(ManifestItem):
self.append(subtest)
return subtest
- def coalesce_properties(self, stability):
- for prop_update in self.update_properties.itervalues():
- prop_update.coalesce(stability)
+ def update(self, full_update, disable_intermittent, update_intermittent, remove_intermittent):
+ for prop_update in self.update_properties:
+ prop_update.update(full_update,
+ disable_intermittent,
+ update_intermittent,
+ remove_intermittent)
class SubtestNode(TestNode):
@@ -285,41 +304,88 @@ class SubtestNode(TestNode):
return True
+def build_conditional_tree(_, run_info_properties, results):
+ properties, dependent_props = run_info_properties
+ return expectedtree.build_tree(properties, dependent_props, results)
+
+
+def build_unconditional_tree(_, run_info_properties, results):
+ root = expectedtree.Node(None, None)
+ for run_info, values in results.iteritems():
+ for value, count in values.iteritems():
+ root.result_values[value] += count
+ root.run_info.add(run_info)
+ return root
+
+
class PropertyUpdate(object):
property_name = None
cls_default_value = None
value_type = None
+ property_builder = None
def __init__(self, node):
self.node = node
- self.updated = []
- self.new = []
self.default_value = self.cls_default_value
-
- def set(self, run_info, in_value):
- self.check_default(in_value)
- value = self.get_value(in_value)
-
- # Add this result to the list of results satisfying
- # any condition in the list of updated results it matches
- for (cond, values) in self.updated:
- if cond(run_info):
- values.append(Value(run_info, value))
- if value != cond.value_as(self.value_type):
- self.node.root.modified = True
- break
- else:
- # We didn't find a previous value for this
- self.new.append(Value(run_info, value))
- self.node.root.modified = True
+ self.has_result = False
+ self.results = defaultdict(lambda: defaultdict(int))
+ self.update_intermittent = False
+ self.remove_intermittent = False
+
+ def run_info_by_condition(self, run_info_index, conditions):
+ run_info_by_condition = defaultdict(list)
+ # A condition might match 0 or more run_info values
+ run_infos = run_info_index.keys()
+ for cond in conditions:
+ for run_info in run_infos:
+ if cond(run_info):
+ run_info_by_condition[cond].append(run_info)
+
+ return run_info_by_condition
+
+ def set(self, run_info, value):
+ self.has_result = True
+ self.node.has_result = True
+ self.check_default(value)
+ value = self.from_result_value(value)
+ self.results[run_info][value] += 1
def check_default(self, result):
return
- def get_value(self, in_value):
- return in_value
+ def from_result_value(self, value):
+ """Convert a value from a test result into the internal format"""
+ return value
- def coalesce(self, stability=None):
+ def from_ini_value(self, value):
+ """Convert a value from an ini file into the internal format"""
+ if self.value_type:
+ return self.value_type(value)
+ return value
+
+ def to_ini_value(self, value):
+ """Convert a value from the internal format to the ini file format"""
+ return str(value)
+
+ def updated_value(self, current, new):
+ """Given a single current value and a set of observed new values,
+ compute an updated value for the property"""
+ return new
+
+ @property
+ def unconditional_value(self):
+ try:
+ unconditional_value = self.from_ini_value(
+ self.node.get(self.property_name))
+ except KeyError:
+ unconditional_value = self.default_value
+ return unconditional_value
+
+ def update(self,
+ full_update=False,
+ disable_intermittent=None,
+ update_intermittent=False,
+ remove_intermittent=False):
"""Update the underlying manifest AST for this test based on all the
added results.
@@ -330,96 +396,301 @@ class PropertyUpdate(object):
Conditionals not matched by any added result are not changed.
- When `stability` is not None, disable any test that shows multiple
+ When `disable_intermittent` is not None, disable any test that shows multiple
unexpected results for the same set of parameters.
- """
- try:
- unconditional_value = self.node.get(self.property_name)
- if self.value_type:
- unconditional_value = self.value_type(unconditional_value)
- except KeyError:
- unconditional_value = self.default_value
+ When `update_intermittent` is True, intermittent statuses will be recorded
+ as `expected` in the test metadata.
- for conditional_value, results in self.updated:
- if not results:
- # The conditional didn't match anything in these runs so leave it alone
- pass
- elif all(results[0].value == result.value for result in results):
- # All the new values for this conditional matched, so update the node
- result = results[0]
- if (result.value == unconditional_value and
- conditional_value.condition_node is not None):
- if self.property_name in self.node:
- self.node.remove_value(self.property_name, conditional_value)
- else:
- conditional_value.value = self.update_value(conditional_value.value_as(self.value_type),
- result.value)
- elif conditional_value.condition_node is not None:
- # Blow away the existing condition and rebuild from scratch
- # This isn't sure to work if we have a conditional later that matches
- # these values too, but we can hope, verify that we get the results
- # we expect, and if not let a human sort it out
- self.node.remove_value(self.property_name, conditional_value)
- self.new.extend(results)
- elif conditional_value.condition_node is None:
- self.new.extend(result for result in results
- if result.value != unconditional_value)
-
- # It is an invariant that nothing in new matches an existing
- # condition except for the default condition
- if self.new:
- update_default, new_default_value = self.update_default()
- if update_default:
- if new_default_value != self.default_value:
- self.node.set(self.property_name,
- self.update_value(unconditional_value, new_default_value),
- condition=None)
+ When `remove_intermittent` is True, old intermittent statuses will be removed
+ if no longer intermittent. This is only relevant if `update_intermittent` is
+ also True, because if False, the metadata will simply update one `expected`
+ status.
+ """
+ if not self.has_result:
+ return
+
+ property_tree = self.property_builder(self.node.root.run_info_properties,
+ self.results)
+
+ conditions, errors = self.update_conditions(property_tree,
+ full_update,
+ update_intermittent,
+ remove_intermittent)
+
+ for e in errors:
+ if disable_intermittent:
+ condition = e.cond.children[0] if e.cond else None
+ msg = disable_intermittent if isinstance(disable_intermittent, (str, unicode)) else "unstable"
+ self.node.set("disabled", msg, condition)
+ self.node.new_disabled = True
else:
- try:
- self.add_new(unconditional_value, stability)
- except UpdateError as e:
- print("%s for %s, cannot update %s" % (e, self.node.root.test_path,
- self.property_name))
-
- # Remove cases where the value matches the default
- if (self.property_name in self.node._data and
- len(self.node._data[self.property_name]) > 0 and
- self.node._data[self.property_name][-1].condition_node is None and
- self.node._data[self.property_name][-1].value_as(self.value_type) == self.default_value):
-
- self.node.remove_value(self.property_name, self.node._data[self.property_name][-1])
-
- # Remove empty properties
- if (self.property_name in self.node._data and len(self.node._data[self.property_name]) == 0):
- for child in self.node.children:
- if (isinstance(child, KeyValueNode) and child.data == self.property_name):
- child.remove()
- break
-
- def update_default(self):
- """Get the updated default value for the property (i.e. the one chosen when no conditions match).
+ msg = "Conflicting metadata values for %s" % (
+ self.node.root.test_path)
+ if e.cond:
+ msg += ": %s" % serialize(e.cond).strip()
+ print(msg)
+
+ # If all the values match remove all conditionals
+ # This handles the case where we update a number of existing conditions and they
+ # all end up looking like the post-update default.
+ new_default = self.default_value
+ if conditions and conditions[-1][0] is None:
+ new_default = conditions[-1][1]
+ if all(condition[1] == new_default for condition in conditions):
+ conditions = [(None, new_default)]
+
+ # Don't set the default to the class default
+ if (conditions and
+ conditions[-1][0] is None and
+ conditions[-1][1] == self.default_value):
+ self.node.modified = True
+ conditions = conditions[:-1]
+
+ if self.node.modified:
+ self.node.clear(self.property_name)
+
+ for condition, value in conditions:
+ self.node.set(self.property_name,
+ self.to_ini_value(value),
+ condition)
+
+ def update_conditions(self,
+ property_tree,
+ full_update,
+ update_intermittent,
+ remove_intermittent):
+ # This is complicated because the expected behaviour is complex
+ # The complexity arises from the fact that there are two ways of running
+ # the tool, with a full set of runs (full_update=True) or with partial metadata
+ # (full_update=False). In the case of a full update things are relatively simple:
+ # * All existing conditionals are ignored, with the exception of conditionals that
+ # depend on variables not used by the updater, which are retained as-is
+ # * All created conditionals are independent of each other (i.e. order isn't
+ # important in the created conditionals)
+ # In the case where we don't have a full set of runs, the expected behaviour
+ # is much less clear. This is of course the common case for when a developer
+ # runs the test on their own machine. In this case the assumptions above are untrue
+ # * The existing conditions may be required to handle other platforms
+ # * The order of the conditions may be important, since we don't know if they overlap
+ # e.g. `if os == linux and version == 18.04` overlaps with `if (os != win)`.
+ # So in the case we have a full set of runs, the process is pretty simple:
+ # * Generate the conditionals for the property_tree
+ # * Pick the most common value as the default and add only those conditions
+ # not matching the default
+ # In the case where we have a partial set of runs, things are more complex
+ # and more best-effort
+ # * For each existing conditional, see if it matches any of the run info we
+ # have. In cases where it does match, record the new results
+ # * Where all the new results match, update the right hand side of that
+ # conditional, otherwise remove it
+ # * If this leaves nothing existing, then proceed as with the full update
+ # * Otherwise add conditionals for the run_info that doesn't match any
+ # remaining conditions
+ prev_default = None
+ self.update_intermittent = update_intermittent
+ self.remove_intermittent = remove_intermittent
+
+ current_conditions = self.node.get_conditions(self.property_name)
+
+ # Ignore the current default value
+ if current_conditions and current_conditions[-1].condition_node is None:
+ self.node.modified = True
+ prev_default = current_conditions[-1].value
+ current_conditions = current_conditions[:-1]
+
+ # If there aren't any current conditions, or there is just a default
+ # value for all run_info, proceed as for a full update
+ if not current_conditions:
+ return self._update_conditions_full(property_tree,
+ update_intermittent,
+ remove_intermittent,
+ prev_default=prev_default)
+
+ conditions = []
+ errors = []
+
+ run_info_index = {run_info: node
+ for node in property_tree
+ for run_info in node.run_info}
+
+ node_by_run_info = {run_info: node
+ for (run_info, node) in run_info_index.iteritems()
+ if node.result_values}
+
+ run_info_by_condition = self.run_info_by_condition(run_info_index,
+ current_conditions)
+
+ run_info_with_condition = set()
+
+ if full_update:
+ # Even for a full update we need to keep hand-written conditions not
+ # using the properties we've specified and not matching any run_info
+ top_level_props, dependent_props = self.node.root.run_info_properties
+ update_properties = set(top_level_props)
+ for item in dependent_props.itervalues():
+ update_properties |= set(dependent_props)
+ for condition in current_conditions:
+ if (not condition.variables.issubset(update_properties) and
+ not run_info_by_condition[condition]):
+ conditions.append((condition.condition_node,
+ self.from_ini_value(condition.value)))
+ new_conditions, errors = self._update_conditions_full(property_tree,
+ update_intermittent,
+ remove_intermittent,
+ prev_default=prev_default)
+ conditions.extend(new_conditions)
+ return conditions, errors
+
+ # Retain existing conditions if they match the updated values
+ for condition in current_conditions:
+ # All run_info that isn't handled by some previous condition
+ all_run_infos_condition = run_info_by_condition[condition]
+ run_infos = {item for item in all_run_infos_condition
+ if item not in run_info_with_condition}
+
+ if not run_infos:
+ # Retain existing conditions that don't match anything in the update
+ conditions.append((condition.condition_node,
+ self.from_ini_value(condition.value)))
+ continue
- :returns: (update, new_default_value) where updated is a bool indicating whether the property
- should be updated, and new_default_value is the value to set if it should."""
- raise NotImplementedError
+ # Set of nodes in the updated tree that match the same run_info values as the
+ # current existing node
+ nodes = [node_by_run_info[run_info] for run_info in run_infos
+ if run_info in node_by_run_info]
+ # If all the values are the same, update the value
+ if nodes and all(set(node.result_values.keys()) == set(nodes[0].result_values.keys()) for node in nodes):
+ current_value = self.from_ini_value(condition.value)
+ try:
+ new_value = self.updated_value(current_value,
+ nodes[0].result_values)
+ except ConditionError as e:
+ errors.append(e)
+ continue
+ if new_value != current_value:
+ self.node.modified = True
+ conditions.append((condition.condition_node, new_value))
+ run_info_with_condition |= set(run_infos)
+ else:
+ # Don't append this condition
+ self.node.modified = True
+
+ new_conditions, new_errors = self.build_tree_conditions(property_tree,
+ run_info_with_condition,
+ update_intermittent,
+ remove_intermittent,
+ prev_default)
+ if new_conditions:
+ self.node.modified = True
+
+ conditions.extend(new_conditions)
+ errors.extend(new_errors)
+
+ return conditions, errors
+
+ def _update_conditions_full(self,
+ property_tree,
+ update_intermittent,
+ remove_intermittent,
+ prev_default=None):
+ self.node.modified = True
+ conditions, errors = self.build_tree_conditions(property_tree,
+ set(),
+ update_intermittent,
+ remove_intermittent,
+ prev_default)
+
+ return conditions, errors
+
+ def build_tree_conditions(self,
+ property_tree,
+ run_info_with_condition,
+ update_intermittent,
+ remove_intermittent,
+ prev_default=None):
+ conditions = []
+ errors = []
+
+ self.update_intermittent = update_intermittent
+ self.remove_intermittent = remove_intermittent
+
+ value_count = defaultdict(int)
+
+ def to_count_value(v):
+ if v is None:
+ return v
+ # Need to count the values in a hashable type
+ count_value = self.to_ini_value(v)
+ if isinstance(count_value, list):
+ count_value = tuple(count_value)
+ return count_value
+
+
+ queue = deque([(property_tree, [])])
+ while queue:
+ node, parents = queue.popleft()
+ parents_and_self = parents + [node]
+ if node.result_values and any(run_info not in run_info_with_condition
+ for run_info in node.run_info):
+ prop_set = [(item.prop, item.value) for item in parents_and_self if item.prop]
+ value = node.result_values
+ error = None
+ if parents:
+ try:
+ value = self.updated_value(None, value)
+ except ConditionError:
+ expr = make_expr(prop_set, value)
+ error = ConditionError(expr)
+ expr = make_expr(prop_set, value)
+ else:
+ # The root node needs special handling
+ expr = None
+ try:
+ value = self.updated_value(self.unconditional_value,
+ value)
+ except ConditionError:
+ error = ConditionError(expr)
+ # If we got an error for the root node, re-add the previous
+ # default value
+ if prev_default:
+ conditions.append((None, prev_default))
+ if error is None:
+ count_value = to_count_value(value)
+ value_count[count_value] += len(node.run_info)
+
+ if error is None:
+ conditions.append((expr, value))
+ else:
+ errors.append(error)
- def add_new(self, unconditional_value, stability):
- """Add new conditional values for the property.
+ for child in node.children:
+ queue.append((child, parents_and_self))
- Subclasses need not implement this if they only ever update the default value."""
- raise NotImplementedError
+ conditions = conditions[::-1]
- def update_value(self, old_value, new_value):
- """Get a value to set on the property, given its previous value and the new value from logs.
+ # If we haven't set a default condition, add one and remove all the conditions
+ # with the same value
+ if value_count and (not conditions or conditions[-1][0] is not None):
+ # Sort in order of occurence, prioritising values that match the class default
+ # or the previous default
+ cls_default = to_count_value(self.default_value)
+ prev_default = to_count_value(prev_default)
+ commonest_value = max(value_count, key=lambda x:(value_count.get(x),
+ x == cls_default,
+ x == prev_default))
+ if isinstance(commonest_value, tuple):
+ commonest_value = list(commonest_value)
+ commonest_value = self.from_ini_value(commonest_value)
+ conditions = [item for item in conditions if item[1] != commonest_value]
+ conditions.append((None, commonest_value))
- By default this just returns the new value, but overriding is useful in cases
- where we want the new value to be some function of both old and new e.g. max(old_value, new_value)"""
- return new_value
+ return conditions, errors
class ExpectedUpdate(PropertyUpdate):
property_name = "expected"
+ property_builder = build_conditional_tree
def check_default(self, result):
if self.default_value is not None:
@@ -427,30 +698,42 @@ class ExpectedUpdate(PropertyUpdate):
else:
self.default_value = result.default_expected
- def get_value(self, in_value):
- return in_value.status
+ def from_result_value(self, result):
+ return result.status
- def update_default(self):
- update_default = all(self.new[0].value == result.value
- for result in self.new) and not self.updated
- new_value = self.new[0].value
- return update_default, new_value
+ def to_ini_value(self, value):
+ if isinstance(value, list):
+ return [str(item) for item in value]
+ return str(value)
- def add_new(self, unconditional_value, stability):
- try:
- conditionals = group_conditionals(
- self.new,
- property_order=self.node.root.property_order,
- boolean_properties=self.node.root.boolean_properties)
- except ConditionError as e:
- if stability is not None:
- self.node.set("disabled", stability or "unstable", e.cond.children[0])
- self.node.new_disabled = True
- else:
- raise UpdateError("Conflicting metadata values")
- for conditional_node, value in conditionals:
- if value != unconditional_value:
- self.node.set(self.property_name, value, condition=conditional_node.children[0])
+ def updated_value(self, current, new):
+ if len(new) > 1 and not self.update_intermittent and not isinstance(current, list):
+ raise ConditionError
+
+ if not (self.update_intermittent or isinstance(current, list)):
+ return list(new)[0]
+
+ statuses = ["OK", "PASS", "FAIL", "ERROR", "TIMEOUT", "CRASH"]
+ status_priority = {value: i for i, value in enumerate(statuses)}
+ sorted_new = sorted(new.iteritems(), key=lambda x:(-1 * x[1],
+ status_priority.get(x[0],
+ len(status_priority))))
+ expected = [status for status, _ in sorted_new]
+ if self.update_intermittent:
+ if not self.remove_intermittent:
+ # If we are not removing existing recorded intermittents that don't
+ # appear in new, manually add them back in to expected.
+ if isinstance(current, list):
+ expected.extend([status for status in current if status not in expected])
+ if len(expected) == 1:
+ return expected[0]
+ return expected
+
+ # If nothing has changed and not self.update_intermittent, preserve existing
+ # intermittent.
+ if set(expected).issubset(set(current)):
+ return current
+ return expected[0]
class MaxAssertsUpdate(PropertyUpdate):
@@ -461,102 +744,54 @@ class MaxAssertsUpdate(PropertyUpdate):
property_name = "max-asserts"
cls_default_value = 0
value_type = int
+ property_builder = build_unconditional_tree
- def update_value(self, old_value, new_value):
- new_value = self.value_type(new_value)
- if old_value is not None:
- old_value = self.value_type(old_value)
- if old_value is not None and old_value < new_value:
- return new_value + 1
- if old_value is None:
- return new_value + 1
- return old_value
-
- def update_default(self):
- # Current values
- values = []
- current_default = None
- if self.property_name in self.node._data:
- current_default = [item for item in
- self.node._data[self.property_name]
- if item.condition_node is None]
- if current_default:
- values.append(int(current_default[0].value))
- values.extend(item.value for item in self.new)
- values.extend(item.value for item in
- itertools.chain.from_iterable(results for _, results in self.updated))
- new_value = max(values)
- return True, new_value
+ def updated_value(self, current, new):
+ if any(item > current for item in new):
+ return max(new) + 1
+ return current
class MinAssertsUpdate(PropertyUpdate):
property_name = "min-asserts"
cls_default_value = 0
value_type = int
+ property_builder = build_unconditional_tree
- def update_value(self, old_value, new_value):
- new_value = self.value_type(new_value)
- if old_value is not None:
- old_value = self.value_type(old_value)
- if old_value is not None and new_value < old_value:
- return 0
- if old_value is None:
- # If we are getting some asserts for the first time, set the minimum to 0
- return new_value
- return old_value
-
- def update_default(self):
- """For asserts we always update the default value and never add new conditionals.
- This is either set to the current value or one less than the number of asserts
- we saw, whichever is lower."""
- values = []
- current_default = None
- if self.property_name in self.node._data:
- current_default = [item for item in
- self.node._data[self.property_name]
- if item.condition_node is None]
- if current_default:
- values.append(current_default[0].value_as(self.value_type))
- values.extend(max(0, item.value) for item in self.new)
- values.extend(max(0, item.value) for item in
- itertools.chain.from_iterable(results for _, results in self.updated))
- new_value = min(values)
- return True, new_value
+ def updated_value(self, current, new):
+ if any(item < current for item in new):
+ rv = min(new) - 1
+ else:
+ rv = current
+ return max(rv, 0)
class AppendOnlyListUpdate(PropertyUpdate):
- cls_default_value = None
-
- def get_value(self, result):
- raise NotImplementedError
+ cls_default_value = []
+ property_builder = build_unconditional_tree
- def update_value(self, old_value, new_value):
- if isinstance(new_value, (str, unicode)):
- new_value = {new_value}
+ def updated_value(self, current, new):
+ if current is None:
+ rv = set()
else:
- new_value = set(new_value)
- if old_value is None:
- old_value = set()
- old_value = set(old_value)
- return sorted((old_value | new_value) - {None})
-
- def update_default(self):
- current_default = None
- if self.property_name in self.node._data:
- current_default = [item for item in
- self.node._data[self.property_name]
- if item.condition_node is None]
- if current_default:
- current_default = current_default[0].value
- new_values = [item.value for item in self.new]
- new_value = self.update_value(current_default, new_values)
- return True, new_value if new_value else None
+ rv = set(current)
+
+ for item in new:
+ if item is None:
+ continue
+ elif isinstance(item, (str, unicode)):
+ rv.add(item)
+ else:
+ rv |= item
+
+ return sorted(rv)
class LsanUpdate(AppendOnlyListUpdate):
property_name = "lsan-allowed"
+ property_builder = build_unconditional_tree
- def get_value(self, result):
+ def from_result_value(self, result):
# If we have an allowed_match that matched, return None
# This value is ignored later (because it matches the default)
# We do that because then if we allow a failure in foo/__dir__.ini
@@ -567,11 +802,15 @@ class LsanUpdate(AppendOnlyListUpdate):
# TODO: there is probably some improvement to be made by looking for a "better" stack frame
return result[0][0]
+ def to_ini_value(self, value):
+ return value
+
class LeakObjectUpdate(AppendOnlyListUpdate):
property_name = "leak-allowed"
+ property_builder = build_unconditional_tree
- def get_value(self, result):
+ def from_result_value(self, result):
# If we have an allowed_match that matched, return None
if result[1]:
return None
@@ -581,133 +820,47 @@ class LeakObjectUpdate(AppendOnlyListUpdate):
class LeakThresholdUpdate(PropertyUpdate):
property_name = "leak-threshold"
- cls_default_value = []
+ cls_default_value = {}
+ property_builder = build_unconditional_tree
- def __init__(self, node):
- PropertyUpdate.__init__(self, node)
- self.thresholds = {}
-
- def get_value(self, value):
- threshold = value[2]
- key = value[0]
- self.thresholds[key] = threshold
- return value[:2]
-
- def value_type(self, data):
- if all(isinstance(item, tuple) for item in data):
- return data
- values = [item.rsplit(":", 1) for item in data]
- return [(key, int(float(value))) for key, value in values]
-
- def update_value(self, old_value, new_value, allow_buffer=True):
- rv = []
- old_value = dict(old_value)
- new_value = dict(self.value_type(new_value))
- for key in set(new_value.keys()) | set(old_value.keys()):
- old = old_value.get(key, 0)
- new = new_value.get(key, 0)
- threshold = self.thresholds.get(key, 0)
+ def from_result_value(self, result):
+ return result
+
+ def to_ini_value(self, data):
+ return ["%s:%s" % item for item in sorted(data.iteritems())]
+
+ def from_ini_value(self, data):
+ rv = {}
+ for item in data:
+ key, value = item.split(":", 1)
+ rv[key] = int(float(value))
+ return rv
+
+ def updated_value(self, current, new):
+ if current:
+ rv = current.copy()
+ else:
+ rv = {}
+ for process, leaked_bytes, threshold in new:
# If the value is less than the threshold but there isn't
# an old value we must have inherited the threshold from
# a parent ini file so don't any anything to this one
- if not old and new < threshold:
+ if process not in rv and leaked_bytes < threshold:
continue
- if old >= new:
- updated = old
- else:
- if allow_buffer:
- # Round up to nearest 50 kb
- boundary = 50 * 1024
- updated = int(boundary * ceil(float(new) / boundary))
- else:
- updated = new
- rv.append((key, updated))
- return ["%s:%s" % item for item in sorted(rv)]
-
- def update_default(self):
- # Current values
- current_default = []
- if self.property_name in self.node._data:
- current_default = [item for item in
- self.node._data[self.property_name]
- if item.condition_node is None]
- current_default = current_default[0].value_as(self.value_type)
- max_new = {}
- for item in self.new:
- key, value = item.value
- if value > max_new.get(key, 0):
- max_new[key] = value
- new_value = self.update_value(current_default,
- max_new.items(),
- allow_buffer=False)
- return True, new_value
-
-
-def group_conditionals(values, property_order=None, boolean_properties=None):
- """Given a list of Value objects, return a list of
- (conditional_node, status) pairs representing the conditional
- expressions that are required to match each status
-
- :param values: List of Values
- :param property_order: List of properties to use in expectation metadata
- from most to least significant.
- :param boolean_properties: Set of properties in property_order that should
- be treated as boolean."""
-
- by_property = defaultdict(set)
- for run_info, value in values:
- for prop_name, prop_value in run_info.iteritems():
- by_property[(prop_name, prop_value)].add(value)
-
- if property_order is None:
- property_order = ["debug", "os", "version", "processor", "bits"]
-
- if boolean_properties is None:
- boolean_properties = {"debug"}
- else:
- boolean_properties = set(boolean_properties)
-
- # If we have more than one value, remove any properties that are common
- # for all the values
- if len(values) > 1:
- for key, statuses in by_property.copy().iteritems():
- if len(statuses) == len(values):
- del by_property[key]
- if not by_property:
- raise ConditionError
-
- properties = {item[0] for item in by_property.iterkeys()}
- include_props = []
+ if leaked_bytes > rv.get(process, 0):
+ # Round up to nearest 50 kb
+ boundary = 50 * 1024
+ rv[process] = int(boundary * ceil(float(leaked_bytes) / boundary))
+ return rv
- for prop in property_order:
- if prop in properties:
- include_props.append(prop)
- conditions = {}
-
- for run_info, value in values:
- prop_set = tuple((prop, run_info[prop]) for prop in include_props)
- if prop_set in conditions:
- if conditions[prop_set][1] != value:
- # A prop_set contains contradictory results
- raise ConditionError(make_expr(prop_set, value, boolean_properties))
- continue
-
- expr = make_expr(prop_set, value, boolean_properties=boolean_properties)
- conditions[prop_set] = (expr, value)
-
- return conditions.values()
-
-
-def make_expr(prop_set, rhs, boolean_properties=None):
+def make_expr(prop_set, rhs):
"""Create an AST that returns the value ``status`` given all the
properties in prop_set match.
:param prop_set: tuple of (property name, value) pairs for each
property in this expression and the value it must match
:param status: Status on RHS when all the given properties match
- :param boolean_properties: Set of properties in property_order that should
- be treated as boolean.
"""
root = ConditionalNode()
@@ -715,17 +868,12 @@ def make_expr(prop_set, rhs, boolean_properties=None):
expressions = []
for prop, value in prop_set:
- number_types = (int, float, long)
- value_cls = (NumberNode
- if type(value) in number_types
- else StringNode)
- if prop not in boolean_properties:
+ if value not in (True, False):
expressions.append(
BinaryExpressionNode(
BinaryOperatorNode("=="),
VariableNode(prop),
- value_cls(unicode(value))
- ))
+ make_node(value)))
else:
if value:
expressions.append(VariableNode(prop))
@@ -747,41 +895,56 @@ def make_expr(prop_set, rhs, boolean_properties=None):
node = expressions[0]
root.append(node)
- if type(rhs) in number_types:
- rhs_node = NumberNode(rhs)
- else:
- rhs_node = StringNode(rhs)
+ rhs_node = make_value_node(rhs)
root.append(rhs_node)
return root
-def get_manifest(metadata_root, test_path, url_base, property_order=None,
- boolean_properties=None):
+def make_node(value):
+ if type(value) in (int, float, long):
+ node = NumberNode(value)
+ elif type(value) in (str, unicode):
+ node = StringNode(unicode(value))
+ elif hasattr(value, "__iter__"):
+ node = ListNode()
+ for item in value:
+ node.append(make_node(item))
+ return node
+
+
+def make_value_node(value):
+ if type(value) in (int, float, long):
+ node = ValueNode(value)
+ elif type(value) in (str, unicode):
+ node = ValueNode(unicode(value))
+ elif hasattr(value, "__iter__"):
+ node = ListNode()
+ for item in value:
+ node.append(make_node(item))
+ return node
+
+
+def get_manifest(metadata_root, test_path, url_base, run_info_properties):
"""Get the ExpectedManifest for a particular test path, or None if there is no
metadata stored for that test path.
:param metadata_root: Absolute path to the root of the metadata directory
:param test_path: Path to the test(s) relative to the test root
- :param url_base: Base url for serving the tests in this manifest
- :param property_order: List of properties to use in expectation metadata
- from most to least significant.
- :param boolean_properties: Set of properties in property_order that should
- be treated as boolean."""
+ :param url_base: Base url for serving the tests in this manifest"""
manifest_path = expected.expected_path(metadata_root, test_path)
try:
with open(manifest_path) as f:
- return compile(f, test_path, url_base, property_order=property_order,
- boolean_properties=boolean_properties)
+ rv = compile(f, test_path, url_base,
+ run_info_properties)
except IOError:
return None
+ return rv
-def compile(manifest_file, test_path, url_base, property_order=None,
- boolean_properties=None):
+def compile(manifest_file, test_path, url_base, run_info_properties):
return conditional.compile(manifest_file,
data_cls_getter=data_cls_getter,
test_path=test_path,
url_base=url_base,
- property_order=property_order,
- boolean_properties=boolean_properties)
+ run_info_properties=run_info_properties)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
index 6c8f9ee37f4..ca6165f7ad0 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
@@ -1,9 +1,6 @@
from __future__ import print_function
import array
import os
-import shutil
-import tempfile
-import uuid
from collections import defaultdict, namedtuple
from mozlog import structuredlog
@@ -25,28 +22,56 @@ except ImportError:
import json
+class RunInfo(object):
+ """A wrapper around RunInfo dicts so that they can be hashed by identity"""
+
+ def __init__(self, dict_value):
+ self.data = dict_value
+ self.canonical_repr = tuple(tuple(item) for item in sorted(dict_value.items()))
+
+ def __getitem__(self, key):
+ return self.data[key]
+
+ def __setitem__(self, key, value):
+ raise TypeError
+
+ def __hash__(self):
+ return hash(self.canonical_repr)
+
+ def __eq__(self, other):
+ return self.canonical_repr == other.canonical_repr
+
+ def iteritems(self):
+ for key, value in self.data.iteritems():
+ yield key, value
+
+ def items(self):
+ return list(self.iteritems())
+
+
def update_expected(test_paths, serve_root, log_file_names,
- rev_old=None, rev_new="HEAD", ignore_existing=False,
- sync_root=None, property_order=None, boolean_properties=None,
- stability=None):
+ update_properties, rev_old=None, rev_new="HEAD",
+ full_update=False, sync_root=None, disable_intermittent=None,
+ update_intermittent=False, remove_intermittent=False):
"""Update the metadata files for web-platform-tests based on
the results obtained in a previous run or runs
- If stability is not None, assume log_file_names refers to logs from repeated
+ If disable_intermittent is not None, assume log_file_names refers to logs from repeated
test jobs, disable tests that don't behave as expected on all runs"""
do_delayed_imports(serve_root)
id_test_map = load_test_data(test_paths)
for metadata_path, updated_ini in update_from_logs(id_test_map,
- *log_file_names,
- ignore_existing=ignore_existing,
- property_order=property_order,
- boolean_properties=boolean_properties,
- stability=stability):
+ update_properties,
+ disable_intermittent,
+ update_intermittent,
+ remove_intermittent,
+ full_update,
+ *log_file_names):
write_new_expected(metadata_path, updated_ini)
- if stability:
+ if disable_intermittent:
for test in updated_ini.iterchildren():
for subtest in test.iterchildren():
if subtest.new_disabled:
@@ -113,7 +138,7 @@ def unexpected_changes(manifests, change_data, files_changed):
# for each conditional:
# If all the new values match (or there aren't any) retain that conditional
# If any new values mismatch:
-# If stability and any repeated values don't match, disable the test
+# If disable_intermittent and any repeated values don't match, disable the test
# else mark the test as needing human attention
# Check if all the RHS values are the same; if so collapse the conditionals
@@ -139,6 +164,9 @@ class InternedData(object):
# Reserve 0 as a sentinal
self._data = [None], {}
+ def clear(self):
+ self.__init__()
+
def store(self, obj):
if self.type_conv is not None:
obj = self.type_conv(obj)
@@ -160,6 +188,10 @@ class InternedData(object):
obj = self.rev_type_conv(obj)
return obj
+ def __iter__(self):
+ for i in xrange(1, len(self._data[0])):
+ yield self.get(i)
+
class RunInfoInterned(InternedData):
def type_conv(self, value):
@@ -170,7 +202,7 @@ class RunInfoInterned(InternedData):
prop_intern = InternedData(4)
-run_info_intern = RunInfoInterned()
+run_info_intern = InternedData(8)
status_intern = InternedData(4)
@@ -185,25 +217,27 @@ def load_test_data(test_paths):
return id_test_map
-def update_from_logs(id_test_map, *log_filenames, **kwargs):
- ignore_existing = kwargs.get("ignore_existing", False)
- property_order = kwargs.get("property_order")
- boolean_properties = kwargs.get("boolean_properties")
- stability = kwargs.get("stability")
+def update_from_logs(id_test_map, update_properties, disable_intermittent, update_intermittent,
+ remove_intermittent, full_update, *log_filenames):
- updater = ExpectedUpdater(id_test_map,
- ignore_existing=ignore_existing)
+ updater = ExpectedUpdater(id_test_map)
for i, log_filename in enumerate(log_filenames):
print("Processing log %d/%d" % (i + 1, len(log_filenames)))
with open(log_filename) as f:
updater.update_from_log(f)
- for item in update_results(id_test_map, property_order, boolean_properties, stability):
+ for item in update_results(id_test_map, update_properties, full_update,
+ disable_intermittent, update_intermittent, remove_intermittent):
yield item
-def update_results(id_test_map, property_order, boolean_properties, stability):
+def update_results(id_test_map,
+ update_properties,
+ full_update,
+ disable_intermittent,
+ update_intermittent=False,
+ remove_intermittent=False):
test_file_items = set(id_test_map.itervalues())
default_expected_by_type = {}
@@ -214,8 +248,9 @@ def update_results(id_test_map, property_order, boolean_properties, stability):
default_expected_by_type[(test_type, True)] = test_cls.subtest_result_cls.default_expected
for test_file in test_file_items:
- updated_expected = test_file.update(property_order, boolean_properties, stability,
- default_expected_by_type)
+ updated_expected = test_file.update(default_expected_by_type, update_properties,
+ full_update, disable_intermittent,
+ update_intermittent, remove_intermittent)
if updated_expected is not None and updated_expected.modified:
yield test_file.metadata_path, updated_expected
@@ -229,36 +264,12 @@ def directory_manifests(metadata_path):
return rv
-def write_changes(metadata_path, expected):
- # First write the new manifest files to a temporary directory
- temp_path = tempfile.mkdtemp(dir=os.path.split(metadata_path)[0])
- write_new_expected(temp_path, expected)
-
- # Copy all files in the root to the temporary location since
- # these cannot be ini files
- keep_files = [item for item in os.listdir(metadata_path) if
- not os.path.isdir(os.path.join(metadata_path, item))]
-
- for item in keep_files:
- dest_dir = os.path.dirname(os.path.join(temp_path, item))
- if not os.path.exists(dest_dir):
- os.makedirs(dest_dir)
- shutil.copyfile(os.path.join(metadata_path, item),
- os.path.join(temp_path, item))
-
- # Then move the old manifest files to a new location
- temp_path_2 = metadata_path + str(uuid.uuid4())
- os.rename(metadata_path, temp_path_2)
- # Move the new files to the destination location and remove the old files
- os.rename(temp_path, metadata_path)
- shutil.rmtree(temp_path_2)
-
-
def write_new_expected(metadata_path, expected):
# Serialize the data back to a file
path = expected_path(metadata_path, expected.test_path)
if not expected.is_empty:
- manifest_str = wptmanifest.serialize(expected.node, skip_empty_data=True)
+ manifest_str = wptmanifest.serialize(expected.node,
+ skip_empty_data=True)
assert manifest_str != ""
dir = os.path.split(path)[0]
if not os.path.exists(dir):
@@ -281,9 +292,8 @@ def write_new_expected(metadata_path, expected):
class ExpectedUpdater(object):
- def __init__(self, id_test_map, ignore_existing=False):
+ def __init__(self, id_test_map):
self.id_test_map = id_test_map
- self.ignore_existing = ignore_existing
self.run_info = None
self.action_map = {"suite_start": self.suite_start,
"test_start": self.test_start,
@@ -331,11 +341,11 @@ class ExpectedUpdater(object):
"subtest": subtest["name"],
"status": subtest["status"],
"expected": subtest.get("expected"),
- "known_intermittent": subtest.get("known_intermittent")})
+ "known_intermittent": subtest.get("known_intermittent", [])})
action_map["test_end"]({"test": test["test"],
"status": test["status"],
"expected": test.get("expected"),
- "known_intermittent": test.get("known_intermittent")})
+ "known_intermittent": test.get("known_intermittent", [])})
if "asserts" in test:
asserts = test["asserts"]
action_map["assertion_count"]({"test": test["test"],
@@ -355,19 +365,16 @@ class ExpectedUpdater(object):
action_map[action](item_data)
def suite_start(self, data):
- self.run_info = run_info_intern.store(data["run_info"])
+ self.run_info = run_info_intern.store(RunInfo(data["run_info"]))
def test_start(self, data):
test_id = intern(data["test"].encode("utf8"))
try:
- test_data = self.id_test_map[test_id]
+ self.id_test_map[test_id]
except KeyError:
print("Test not found %s, skipping" % test_id)
return
- if self.ignore_existing:
- test_data.set_requires_update()
- test_data.clear.add("expected")
self.tests_visited[test_id] = set()
def test_status(self, data):
@@ -530,7 +537,7 @@ class PackedResultList(object):
class TestFileData(object):
__slots__ = ("url_base", "item_type", "test_path", "metadata_path", "tests",
- "_requires_update", "clear", "data")
+ "_requires_update", "data")
def __init__(self, url_base, item_type, metadata_path, test_path, tests):
self.url_base = url_base
@@ -539,37 +546,75 @@ class TestFileData(object):
self.metadata_path = metadata_path
self.tests = {intern(item.id.encode("utf8")) for item in tests}
self._requires_update = False
- self.clear = set()
self.data = defaultdict(lambda: defaultdict(PackedResultList))
def set_requires_update(self):
self._requires_update = True
+ @property
+ def requires_update(self):
+ return self._requires_update
+
def set(self, test_id, subtest_id, prop, run_info, value):
self.data[test_id][subtest_id].append(prop_intern.store(prop),
run_info,
value)
- def expected(self, property_order, boolean_properties):
+ def expected(self, update_properties):
expected_data = load_expected(self.url_base,
self.metadata_path,
self.test_path,
self.tests,
- property_order,
- boolean_properties)
+ update_properties)
if expected_data is None:
expected_data = create_expected(self.url_base,
self.test_path,
- property_order,
- boolean_properties)
+ update_properties)
return expected_data
- def update(self, property_order, boolean_properties, stability,
- default_expected_by_type):
- if not self._requires_update:
+ def is_disabled(self, test):
+ # This conservatively assumes that anything that was disabled remains disabled
+ # we could probably do better by checking if it's in the full set of run infos
+ return test.has_key("disabled")
+
+ def orphan_subtests(self, expected):
+ # Return subtest nodes present in the expected file, but missing from the data
+ rv = []
+
+ for test_id, subtests in self.data.iteritems():
+ test = expected.get_test(test_id.decode("utf8"))
+ if not test:
+ continue
+ seen_subtests = set(item.decode("utf8") for item in subtests.iterkeys() if item is not None)
+ missing_subtests = set(test.subtests.keys()) - seen_subtests
+ for item in missing_subtests:
+ expected_subtest = test.get_subtest(item)
+ if not self.is_disabled(expected_subtest):
+ rv.append(expected_subtest)
+
+ return rv
+
+ def update(self, default_expected_by_type, update_properties,
+ full_update=False, disable_intermittent=None, update_intermittent=False,
+ remove_intermittent=False):
+ # If we are doing a full update, we may need to prune missing nodes
+ # even if the expectations didn't change
+ if not self.requires_update and not full_update:
return
- expected = self.expected(property_order, boolean_properties)
+ expected = self.expected(update_properties)
+
+ if full_update:
+ orphans = self.orphan_subtests(expected)
+
+ if not self.requires_update and not orphans:
+ return
+
+ if orphans:
+ expected.modified = True
+ for item in orphans:
+ item.remove()
+
expected_by_test = {}
for test_id in self.tests:
@@ -577,10 +622,9 @@ class TestFileData(object):
expected.append(manifestupdate.TestNode.create(test_id))
test_expected = expected.get_test(test_id)
expected_by_test[test_id] = test_expected
- for prop in self.clear:
- test_expected.clear(prop)
for test_id, test_data in self.data.iteritems():
+ test_id = test_id.decode("utf8")
for subtest_id, results_list in test_data.iteritems():
for prop, run_info, value in results_list:
# Special case directory metadata
@@ -601,17 +645,28 @@ class TestFileData(object):
if subtest_id is None:
item_expected = test_expected
else:
+ if isinstance(subtest_id, str):
+ subtest_id = subtest_id.decode("utf8")
item_expected = test_expected.get_subtest(subtest_id)
if prop == "status":
item_expected.set_result(run_info, value)
elif prop == "asserts":
item_expected.set_asserts(run_info, value)
- expected.coalesce_properties(stability=stability)
+ expected.update(full_update=full_update,
+ disable_intermittent=disable_intermittent,
+ update_intermittent=update_intermittent,
+ remove_intermittent=remove_intermittent)
for test in expected.iterchildren():
for subtest in test.iterchildren():
- subtest.coalesce_properties(stability=stability)
- test.coalesce_properties(stability=stability)
+ subtest.update(full_update=full_update,
+ disable_intermittent=disable_intermittent,
+ update_intermittent=update_intermittent,
+ remove_intermittent=remove_intermittent)
+ test.update(full_update=full_update,
+ disable_intermittent=disable_intermittent,
+ update_intermittent=update_intermittent,
+ remove_intermittent=remove_intermittent)
return expected
@@ -619,29 +674,17 @@ class TestFileData(object):
Result = namedtuple("Result", ["status", "default_expected"])
-def create_expected(url_base, test_path, property_order=None,
- boolean_properties=None):
+def create_expected(url_base, test_path, run_info_properties):
expected = manifestupdate.ExpectedManifest(None,
test_path,
url_base,
- property_order=property_order,
- boolean_properties=boolean_properties)
+ run_info_properties)
return expected
-def load_expected(url_base, metadata_path, test_path, tests, property_order=None,
- boolean_properties=None):
+def load_expected(url_base, metadata_path, test_path, tests, run_info_properties):
expected_manifest = manifestupdate.get_manifest(metadata_path,
test_path,
url_base,
- property_order=property_order,
- boolean_properties=boolean_properties)
- if expected_manifest is None:
- return
-
- # Remove expected data for tests that no longer exist
- for test in expected_manifest.iterchildren():
- if test.id not in tests:
- test.remove()
-
+ run_info_properties)
return expected_manifest
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
index 4575dfb5e95..e3117042709 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
@@ -73,6 +73,6 @@ def load_product_update(config, product):
data = module.__wptrunner__
update_properties = (getattr(module, data["update_properties"])()
- if "update_properties" in data else (None, None))
+ if "update_properties" in data else {})
return update_properties
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
index d7b51c5eb27..c6dbd70f1bf 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
@@ -576,7 +576,8 @@ class TestRunnerManager(threading.Thread):
if test.disabled(result.name):
continue
expected = test.expected(result.name)
- is_unexpected = expected != result.status
+ known_intermittent = test.known_intermittent(result.name)
+ is_unexpected = expected != result.status and result.status not in known_intermittent
if is_unexpected:
self.unexpected_count += 1
@@ -587,6 +588,7 @@ class TestRunnerManager(threading.Thread):
result.status,
message=result.message,
expected=expected,
+ known_intermittent=known_intermittent,
stack=result.stack)
# We have a couple of status codes that are used internally, but not exposed to the
@@ -598,13 +600,14 @@ class TestRunnerManager(threading.Thread):
status_subns = {"INTERNAL-ERROR": "ERROR",
"EXTERNAL-TIMEOUT": "TIMEOUT"}
expected = test.expected()
+ known_intermittent = test.known_intermittent()
status = status_subns.get(file_result.status, file_result.status)
if self.browser.check_crash(test.id):
status = "CRASH"
self.test_count += 1
- is_unexpected = expected != status
+ is_unexpected = expected != status and status not in known_intermittent
if is_unexpected:
self.unexpected_count += 1
self.logger.debug("Unexpected count in this thread %i" % self.unexpected_count)
@@ -623,6 +626,7 @@ class TestRunnerManager(threading.Thread):
status,
message=file_result.message,
expected=expected,
+ known_intermittent=known_intermittent,
extra=file_result.extra,
stack=file_result.stack)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py
new file mode 100644
index 00000000000..2308be9590e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py
@@ -0,0 +1,132 @@
+import sys
+
+import pytest
+
+from .. import expectedtree, metadata
+from collections import defaultdict
+
+
+def dump_tree(tree):
+ rv = []
+
+ def dump_node(node, indent=0):
+ prefix = " " * indent
+ if not node.prop:
+ data = "root"
+ else:
+ data = "%s:%s" % (node.prop, node.value)
+ if node.result_values:
+ data += " result_values:%s" % (",".join(sorted(node.result_values)))
+ rv.append("%s<%s>" % (prefix, data))
+ for child in sorted(node.children, key=lambda x:x.value):
+ dump_node(child, indent + 2)
+ dump_node(tree)
+ return "\n".join(rv)
+
+
+def results_object(results):
+ results_obj = defaultdict(lambda: defaultdict(int))
+ for run_info, status in results:
+ run_info = metadata.RunInfo(run_info)
+ results_obj[run_info][status] += 1
+ return results_obj
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_build_tree_0():
+ # Pass if debug
+ results = [({"os": "linux", "version": "18.04", "debug": True}, "FAIL"),
+ ({"os": "linux", "version": "18.04", "debug": False}, "PASS"),
+ ({"os": "linux", "version": "16.04", "debug": False}, "PASS"),
+ ({"os": "mac", "version": "10.12", "debug": True}, "FAIL"),
+ ({"os": "mac", "version": "10.12", "debug": False}, "PASS"),
+ ({"os": "win", "version": "7", "debug": False}, "PASS"),
+ ({"os": "win", "version": "10", "debug": False}, "PASS")]
+ results_obj = results_object(results)
+ tree = expectedtree.build_tree(["os", "version", "debug"], {}, results_obj)
+
+ expected = """<root>
+ <debug:False result_values:PASS>
+ <debug:True result_values:FAIL>"""
+
+ assert dump_tree(tree) == expected
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_build_tree_1():
+ # Pass if linux or windows 10
+ results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"),
+ ({"os": "linux", "version": "18.04", "debug": False}, "PASS"),
+ ({"os": "linux", "version": "16.04", "debug": False}, "PASS"),
+ ({"os": "mac", "version": "10.12", "debug": True}, "FAIL"),
+ ({"os": "mac", "version": "10.12", "debug": False}, "FAIL"),
+ ({"os": "win", "version": "7", "debug": False}, "FAIL"),
+ ({"os": "win", "version": "10", "debug": False}, "PASS")]
+ results_obj = results_object(results)
+ tree = expectedtree.build_tree(["os", "debug"], {"os": ["version"]}, results_obj)
+
+ expected = """<root>
+ <os:linux result_values:PASS>
+ <os:mac result_values:FAIL>
+ <os:win>
+ <version:10 result_values:PASS>
+ <version:7 result_values:FAIL>"""
+
+ assert dump_tree(tree) == expected
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_build_tree_2():
+ # Fails in a specific configuration
+ results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"),
+ ({"os": "linux", "version": "18.04", "debug": False}, "FAIL"),
+ ({"os": "linux", "version": "16.04", "debug": False}, "PASS"),
+ ({"os": "linux", "version": "16.04", "debug": True}, "PASS"),
+ ({"os": "mac", "version": "10.12", "debug": True}, "PASS"),
+ ({"os": "mac", "version": "10.12", "debug": False}, "PASS"),
+ ({"os": "win", "version": "7", "debug": False}, "PASS"),
+ ({"os": "win", "version": "10", "debug": False}, "PASS")]
+ results_obj = results_object(results)
+ tree = expectedtree.build_tree(["os", "debug"], {"os": ["version"]}, results_obj)
+
+ expected = """<root>
+ <os:linux>
+ <debug:False>
+ <version:16.04 result_values:PASS>
+ <version:18.04 result_values:FAIL>
+ <debug:True result_values:PASS>
+ <os:mac result_values:PASS>
+ <os:win result_values:PASS>"""
+
+ assert dump_tree(tree) == expected
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_build_tree_3():
+
+ results = [({"os": "linux", "version": "18.04", "debug": True, "unused": False}, "PASS"),
+ ({"os": "linux", "version": "18.04", "debug": True, "unused": True}, "FAIL")]
+ results_obj = results_object(results)
+ tree = expectedtree.build_tree(["os", "debug"], {"os": ["version"]}, results_obj)
+
+ expected = """<root result_values:FAIL,PASS>"""
+
+ assert dump_tree(tree) == expected
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_build_tree_4():
+ # Check counts for multiple statuses
+ results = [({"os": "linux", "version": "18.04", "debug": False}, "FAIL"),
+ ({"os": "linux", "version": "18.04", "debug": False}, "PASS"),
+ ({"os": "linux", "version": "18.04", "debug": False}, "PASS")]
+ results_obj = results_object(results)
+ tree = expectedtree.build_tree(["os", "version", "debug"], {}, results_obj)
+
+ assert tree.result_values["PASS"] == 2
+ assert tree.result_values["FAIL"] == 1
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
index 0c1fa78dc06..3860ba6f36d 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
@@ -6,11 +6,12 @@ import sys
from io import BytesIO
from .. import metadata, manifestupdate
-from ..update import WPTUpdate
+from ..update.update import WPTUpdate
from ..update.base import StepRunner, Step
from mozlog import structuredlog, handlers, formatters
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir))
+here = os.path.dirname(__file__)
+sys.path.insert(0, os.path.join(here, os.pardir, os.pardir, os.pardir))
from manifest import manifest, item as manifest_item
@@ -37,31 +38,61 @@ item_classes = {"testharness": manifest_item.TestharnessTest,
"support": manifest_item.SupportFile}
-def update(tests, *logs):
+default_run_info = {"debug": False, "os": "linux", "version": "18.04", "processor": "x86_64", "bits": 64}
+test_id = "/path/to/test.htm"
+dir_id = "path/to/__dir__"
+
+
+def reset_globals():
+ metadata.prop_intern.clear()
+ metadata.run_info_intern.clear()
+ metadata.status_intern.clear()
+
+
+def get_run_info(overrides):
+ run_info = default_run_info.copy()
+ run_info.update(overrides)
+ return run_info
+
+
+def update(tests, *logs, **kwargs):
+ full_update = kwargs.pop("full_update", False)
+ disable_intermittent = kwargs.pop("disable_intermittent", False)
+ update_intermittent = kwargs.pop("update_intermittent", False)
+ remove_intermittent = kwargs.pop("remove_intermittent", False)
+ assert not kwargs
id_test_map, updater = create_updater(tests)
+
for log in logs:
log = create_log(log)
updater.update_from_log(log)
+ update_properties = (["debug", "os", "version", "processor"],
+ {"os": ["version"], "processor": "bits"})
+
+ expected_data = {}
+ metadata.load_expected = lambda _, __, test_path, *args: expected_data.get(test_path)
+ for test_path, test_ids, test_type, manifest_str in tests:
+ expected_data[test_path] = manifestupdate.compile(BytesIO(manifest_str),
+ test_path,
+ "/",
+ update_properties)
+
return list(metadata.update_results(id_test_map,
- ["debug", "os", "version", "processor", "bits"],
- ["debug"],
- False))
+ update_properties,
+ full_update,
+ disable_intermittent,
+ update_intermittent,
+ remove_intermittent))
def create_updater(tests, url_base="/", **kwargs):
id_test_map = {}
m = create_test_manifest(tests, url_base)
- expected_data = {}
- metadata.load_expected = lambda _, __, test_path, *args: expected_data[test_path]
+ reset_globals()
id_test_map = metadata.create_test_tree(None, m)
- for test_path, test_ids, test_type, manifest_str in tests:
- expected_data[test_path] = manifestupdate.compile(BytesIO(manifest_str),
- test_path,
- url_base)
-
return id_test_map, metadata.ExpectedUpdater(id_test_map, **kwargs)
@@ -83,7 +114,10 @@ def create_log(entries):
def suite_log(entries, run_info=None):
- return ([("suite_start", {"tests": [], "run_info": run_info or {}})] +
+ _run_info = default_run_info.copy()
+ if run_info:
+ _run_info.update(run_info)
+ return ([("suite_start", {"tests": [], "run_info": _run_info})] +
entries +
[("suite_end", {})])
@@ -101,7 +135,7 @@ def create_test_manifest(tests, url_base="/"):
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_0():
- tests = [("path/to/test.htm", ["/path/to/test.htm"], "testharness",
+ tests = [("path/to/test.htm", [test_id], "testharness",
"""[test.htm]
[test1]
expected: FAIL""")]
@@ -123,7 +157,6 @@ def test_update_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_1():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness",
"""[test.htm]
[test1]
@@ -141,13 +174,418 @@ def test_update_1():
new_manifest = updated[0][1]
assert not new_manifest.is_empty
- assert new_manifest.get_test(test_id).children[0].get("expected") == "FAIL"
+ assert new_manifest.get_test(test_id).children[0].get("expected", default_run_info) == "FAIL"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_known_intermittent_1():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: PASS""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, log_1, log_2, update_intermittent=True)
+
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["PASS", "FAIL"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_known_intermittent_2():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: PASS""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, update_intermittent=True)
+
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == "FAIL"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_existing_known_intermittent():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "ERROR",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, log_1, log_2, update_intermittent=True)
+
+ new_manifest = updated[0][1]
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["PASS", "ERROR", "FAIL"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_remove_previous_intermittent():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "ERROR",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests,
+ log_0,
+ log_1,
+ log_2,
+ update_intermittent=True,
+ remove_intermittent=True)
+
+ new_manifest = updated[0][1]
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["PASS", "ERROR"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_new_test_with_intermittent():
+ tests = [("path/to/test.htm", [test_id], "testharness", None)]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, log_1, log_2, update_intermittent=True)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test("test.htm") is None
+ assert len(new_manifest.get_test(test_id).children) == 1
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["PASS", "FAIL"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_expected_tie_resolution():
+ tests = [("path/to/test.htm", [test_id], "testharness", None)]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, log_1, update_intermittent=True)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["PASS", "FAIL"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_reorder_expected():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0, log_1, log_2, update_intermittent=True)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == ["FAIL", "PASS"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_and_preserve_unchanged_expected_intermittent():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected:
+ if os == "android": [PASS, FAIL]
+ FAIL""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "FAIL",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS",
+ "expected": "FAIL"})])
+
+ updated = update(tests, log_0, log_1, log_2)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "android"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == ["PASS", "FAIL"]
+ assert new_manifest.get_test(test_id).get(
+ "expected", default_run_info) == "PASS"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_test_with_intermittent_to_one_expected_status():
+ tests = [("path/to/test.htm", [test_id], "testharness",
+ """[test.htm]
+ [test1]
+ expected: [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "ERROR",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+
+ updated = update(tests, log_0)
+
+ new_manifest = updated[0][1]
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", default_run_info) == "ERROR"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_intermittent_with_conditions():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected:
+ if os == "android": [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "TIMEOUT",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ updated = update(tests, log_0, log_1, update_intermittent=True)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "android"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == ["PASS", "TIMEOUT", "FAIL"]
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_and_remove_intermittent_with_conditions():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected:
+ if os == "android": [PASS, FAIL]""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "TIMEOUT",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS",
+ "expected": "PASS",
+ "known_intermittent": ["FAIL"]})],
+ run_info={"os": "android"})
+
+ updated = update(tests, log_0, log_1, update_intermittent=True, remove_intermittent=True)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "android"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == ["PASS", "TIMEOUT"]
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_skip_0():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness",
"""[test.htm]
[test1]
@@ -168,7 +606,6 @@ def test_skip_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_new_subtest():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected: FAIL""")]
@@ -187,14 +624,13 @@ def test_new_subtest():
updated = update(tests, log)
new_manifest = updated[0][1]
assert not new_manifest.is_empty
- assert new_manifest.get_test(test_id).children[0].get("expected") == "FAIL"
- assert new_manifest.get_test(test_id).children[1].get("expected") == "FAIL"
+ assert new_manifest.get_test(test_id).children[0].get("expected", default_run_info) == "FAIL"
+ assert new_manifest.get_test(test_id).children[1].get("expected", default_run_info) == "FAIL"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_multiple_0():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected: FAIL""")]
@@ -221,8 +657,12 @@ def test_update_multiple_0():
new_manifest = updated[0][1]
assert not new_manifest.is_empty
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"debug": False, "os": "osx"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"debug": False, "os": "linux"})
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "osx"}) == "FAIL"
+ "expected", run_info_1) == "FAIL"
assert new_manifest.get_test(test_id).children[0].get(
"expected", {"debug": False, "os": "linux"}) == "TIMEOUT"
@@ -230,7 +670,6 @@ def test_update_multiple_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_multiple_1():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected: FAIL""")]
@@ -242,7 +681,7 @@ def test_update_multiple_1():
"expected": "FAIL"}),
("test_end", {"test": test_id,
"status": "OK"})],
- run_info={"debug": False, "os": "osx"})
+ run_info={"os": "osx"})
log_1 = suite_log([("test_start", {"test": test_id}),
("test_status", {"test": test_id,
@@ -251,24 +690,30 @@ def test_update_multiple_1():
"expected": "FAIL"}),
("test_end", {"test": test_id,
"status": "OK"})],
- run_info={"debug": False, "os": "linux"})
+ run_info={"os": "linux"})
updated = update(tests, log_0, log_1)
new_manifest = updated[0][1]
assert not new_manifest.is_empty
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "osx"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"os": "linux"})
+ run_info_3 = default_run_info.copy()
+ run_info_3.update({"os": "win"})
+
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "osx"}) == "FAIL"
+ "expected", run_info_1) == "FAIL"
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "linux"}) == "TIMEOUT"
+ "expected", run_info_2) == "TIMEOUT"
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "windows"}) == "FAIL"
+ "expected", run_info_3) == "FAIL"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_multiple_2():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected: FAIL""")]
@@ -294,17 +739,21 @@ def test_update_multiple_2():
updated = update(tests, log_0, log_1)
new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"debug": False, "os": "osx"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"debug": True, "os": "osx"})
+
assert not new_manifest.is_empty
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "osx"}) == "FAIL"
+ "expected", run_info_1) == "FAIL"
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": True, "os": "osx"}) == "TIMEOUT"
+ "expected", run_info_2) == "TIMEOUT"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_multiple_3():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected:
@@ -332,17 +781,21 @@ def test_update_multiple_3():
updated = update(tests, log_0, log_1)
new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"debug": False, "os": "osx"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"debug": True, "os": "osx"})
+
assert not new_manifest.is_empty
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "osx"}) == "FAIL"
+ "expected", run_info_1) == "FAIL"
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": True, "os": "osx"}) == "TIMEOUT"
+ "expected", run_info_2) == "TIMEOUT"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_ignore_existing():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
[test1]
expected:
@@ -370,17 +823,318 @@ def test_update_ignore_existing():
updated = update(tests, log_0, log_1)
new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"debug": False, "os": "linux"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"debug": False, "os": "osx"})
+
assert not new_manifest.is_empty
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": True, "os": "osx"}) == "FAIL"
+ "expected", run_info_1) == "FAIL"
assert new_manifest.get_test(test_id).children[0].get(
- "expected", {"debug": False, "os": "osx"}) == "NOTRUN"
+ "expected", run_info_2) == "NOTRUN"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_new_test():
+ tests = [("path/to/test.htm", [test_id], "testharness", None)]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})])
+ updated = update(tests, log_0)
+ new_manifest = updated[0][1]
+
+ run_info_1 = default_run_info.copy()
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test("test.htm") is None
+ assert len(new_manifest.get_test(test_id).children) == 1
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", run_info_1) == "FAIL"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_duplicate():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected: ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS"})])
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "FAIL"})])
+
+ updated = update(tests, log_0, log_1)
+ new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == "ERROR"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_disable_intermittent():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected: ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS"})])
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "FAIL"})])
+
+ updated = update(tests, log_0, log_1, disable_intermittent="Some message")
+ new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+
+ assert new_manifest.get_test(test_id).get(
+ "disabled", run_info_1) == "Some message"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_stability_conditional_instability():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected: ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "PASS"})],
+ run_info={"os": "linux"})
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "FAIL"})],
+ run_info={"os": "linux"})
+ log_2 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "status": "FAIL"})],
+ run_info={"os": "mac"})
+
+ updated = update(tests, log_0, log_1, log_2, disable_intermittent="Some message")
+ new_manifest = updated[0][1]
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "linux"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"os": "mac"})
+
+ assert new_manifest.get_test(test_id).get(
+ "disabled", run_info_1) == "Some message"
+ with pytest.raises(KeyError):
+ assert new_manifest.get_test(test_id).get(
+ "disabled", run_info_2)
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_2) == "FAIL"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_full():
+ tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ [test1]
+ expected:
+ if debug: TIMEOUT
+ if not debug and os == "osx": NOTRUN
+
+ [test2]
+ expected: FAIL
+
+[test.js]
+ [test1]
+ expected: FAIL
+""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"debug": False})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "ERROR",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"debug": True})
+
+ updated = update(tests, log_0, log_1, full_update=True)
+ new_manifest = updated[0][1]
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"debug": False, "os": "win"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"debug": True, "os": "osx"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test("test.js") is None
+ assert len(new_manifest.get_test(test_id).children) == 1
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", run_info_1) == "FAIL"
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", run_info_2) == "ERROR"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_full_unknown():
+ tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ [test1]
+ expected:
+ if release_or_beta: ERROR
+ if not debug and os == "osx": NOTRUN
+""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"debug": False, "release_or_beta": False})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "FAIL",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"debug": True, "release_or_beta": False})
+
+ updated = update(tests, log_0, log_1, full_update=True)
+ new_manifest = updated[0][1]
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"release_or_beta": False})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"release_or_beta": True})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", run_info_1) == "FAIL"
+ assert new_manifest.get_test(test_id).children[0].get(
+ "expected", run_info_2) == "ERROR"
+
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_default():
+ tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ [test1]
+ expected:
+ if os == "mac": FAIL
+ ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "FAIL"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"os": "mac"})
+
+ log_1 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "ERROR"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"os": "linux"})
+
+ updated = update(tests, log_0, log_1)
+ new_manifest = updated[0][1]
+
+ assert new_manifest.is_empty
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_default_1():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected:
+ if os == "mac": TIMEOUT
+ ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "expected": "ERROR",
+ "status": "FAIL"})],
+ run_info={"os": "linux"})
+
+ updated = update(tests, log_0)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "mac"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"os": "win"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == "TIMEOUT"
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_2) == "FAIL"
+
+
+@pytest.mark.xfail(sys.version[0] == "3",
+ reason="metadata doesn't support py3")
+def test_update_default_2():
+ tests = [("path/to/test.htm", [test_id], "testharness", """
+[test.htm]
+ expected:
+ if os == "mac": TIMEOUT
+ ERROR""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_end", {"test": test_id,
+ "expected": "ERROR",
+ "status": "TIMEOUT"})],
+ run_info={"os": "linux"})
+
+ updated = update(tests, log_0)
+ new_manifest = updated[0][1]
+
+ assert not new_manifest.is_empty
+
+ run_info_1 = default_run_info.copy()
+ run_info_1.update({"os": "mac"})
+ run_info_2 = default_run_info.copy()
+ run_info_2.update({"os": "win"})
+
+ assert not new_manifest.is_empty
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_1) == "TIMEOUT"
+ assert new_manifest.get_test(test_id).get(
+ "expected", run_info_2) == "TIMEOUT"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_assertion_count_0():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
max-asserts: 4
min-asserts: 2
@@ -398,14 +1152,13 @@ def test_update_assertion_count_0():
new_manifest = updated[0][1]
assert not new_manifest.is_empty
- assert new_manifest.get_test(test_id).get("max-asserts") == 7
- assert new_manifest.get_test(test_id).get("min-asserts") == 2
+ assert new_manifest.get_test(test_id).get("max-asserts") == "7"
+ assert new_manifest.get_test(test_id).get("min-asserts") == "2"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_assertion_count_1():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
max-asserts: 4
min-asserts: 2
@@ -423,14 +1176,13 @@ def test_update_assertion_count_1():
new_manifest = updated[0][1]
assert not new_manifest.is_empty
- assert new_manifest.get_test(test_id).get("max-asserts") == 4
+ assert new_manifest.get_test(test_id).get("max-asserts") == "4"
assert new_manifest.get_test(test_id).has_key("min-asserts") is False
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_assertion_count_2():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
max-asserts: 4
min-asserts: 2
@@ -451,7 +1203,6 @@ def test_update_assertion_count_2():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_assertion_count_3():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
max-asserts: 4
min-asserts: 2
@@ -479,14 +1230,13 @@ def test_update_assertion_count_3():
new_manifest = updated[0][1]
assert not new_manifest.is_empty
- assert new_manifest.get_test(test_id).get("max-asserts") == 8
- assert new_manifest.get_test(test_id).get("min-asserts") == 2
+ assert new_manifest.get_test(test_id).get("max-asserts") == "8"
+ assert new_manifest.get_test(test_id).get("min-asserts") == "2"
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_assertion_count_4():
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]""")]
log_0 = suite_log([("test_start", {"test": test_id}),
@@ -518,8 +1268,6 @@ def test_update_assertion_count_4():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_lsan_0():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, "")]
@@ -537,8 +1285,6 @@ def test_update_lsan_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_lsan_1():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, """
lsan-allowed: [foo]""")]
@@ -559,8 +1305,6 @@ lsan-allowed: [foo]""")]
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_lsan_2():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/__dir__", ["path/__dir__"], None, """
lsan-allowed: [foo]"""),
@@ -583,8 +1327,6 @@ lsan-allowed: [foo]"""),
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_lsan_3():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, "")]
@@ -607,12 +1349,12 @@ def test_update_lsan_3():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_wptreport_0():
- tests = [("path/to/test.htm", ["/path/to/test.htm"], "testharness",
+ tests = [("path/to/test.htm", [test_id], "testharness",
"""[test.htm]
[test1]
expected: FAIL""")]
- log = {"run_info": {},
+ log = {"run_info": default_run_info.copy(),
"results": [
{"test": "/path/to/test.htm",
"subtests": [{"name": "test1",
@@ -629,10 +1371,10 @@ def test_update_wptreport_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_wptreport_1():
- tests = [("path/to/test.htm", ["/path/to/test.htm"], "testharness", ""),
- ("path/to/__dir__", ["path/to/__dir__"], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", ""),
+ ("path/to/__dir__", [dir_id], None, "")]
- log = {"run_info": {},
+ log = {"run_info": default_run_info.copy(),
"results": [],
"lsan_leaks": [{"scope": "path/to/",
"frames": ["baz", "foobar"]}]}
@@ -646,8 +1388,6 @@ def test_update_wptreport_1():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_leak_total_0():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, "")]
@@ -667,8 +1407,6 @@ def test_update_leak_total_0():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_leak_total_1():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, "")]
@@ -685,8 +1423,6 @@ def test_update_leak_total_1():
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_leak_total_2():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, """
leak-total: 110""")]
@@ -704,8 +1440,6 @@ leak-total: 110""")]
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_leak_total_3():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, """
leak-total: 100""")]
@@ -726,8 +1460,6 @@ leak-total: 100""")]
@pytest.mark.xfail(sys.version[0] == "3",
reason="metadata doesn't support py3")
def test_update_leak_total_4():
- test_id = "/path/to/test.htm"
- dir_id = "path/to/__dir__"
tests = [("path/to/test.htm", [test_id], "testharness", ""),
("path/to/__dir__", [dir_id], None, """
leak-total: 110""")]
@@ -750,20 +1482,25 @@ leak-total: 110""")]
class TestStep(Step):
def create(self, state):
- test_id = "/path/to/test.htm"
tests = [("path/to/test.htm", [test_id], "testharness", "")]
state.foo = create_test_manifest(tests)
+
class UpdateRunner(StepRunner):
steps = [TestStep]
+
@pytest.mark.xfail(sys.version[0] == "3",
reason="update.state doesn't support py3")
def test_update_pickle():
logger = structuredlog.StructuredLogger("expected_test")
args = {
"test_paths": {
- "/": {"tests_path": ""},
+ "/": {"tests_path": os.path.abspath(os.path.join(here,
+ os.pardir,
+ os.pardir,
+ os.pardir,
+ os.pardir))},
},
"abort": False,
"continue": False,
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
index 62569fbd9ff..4bc70d31104 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
@@ -6,13 +6,10 @@ from .base import Step, StepRunner
class GetUpdatePropertyList(Step):
- provides = ["property_order", "boolean_properties"]
+ provides = ["update_properties"]
def create(self, state):
- property_order, boolean_properties = products.load_product_update(
- state.config, state.product)
- state.property_order = (property_order or []) + state.extra_properties
- state.boolean_properties = boolean_properties
+ state.update_properties = products.load_product_update(state.config, state.product)
class UpdateExpected(Step):
@@ -27,12 +24,13 @@ class UpdateExpected(Step):
metadata.update_expected(state.paths,
state.serve_root,
state.run_log,
+ update_properties=state.update_properties,
rev_old=None,
- ignore_existing=state.ignore_existing,
+ full_update=state.full_update,
sync_root=sync_root,
- property_order=state.property_order,
- boolean_properties=state.boolean_properties,
- stability=state.stability)
+ disable_intermittent=state.disable_intermittent,
+ update_intermittent=state.update_intermittent,
+ remove_intermittent=state.remove_intermittent)
class CreateMetadataPatch(Step):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
index 0bcaf823b72..c4f1e7e93ec 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
@@ -85,12 +85,14 @@ class UpdateMetadata(Step):
kwargs = state.kwargs
with state.push(["local_tree", "sync_tree", "paths", "serve_root"]):
state.run_log = kwargs["run_log"]
- state.ignore_existing = kwargs["ignore_existing"]
- state.stability = kwargs["stability"]
+ state.disable_intermittent = kwargs["disable_intermittent"]
+ state.update_intermittent = kwargs["update_intermittent"]
+ state.remove_intermittent = kwargs["remove_intermittent"]
state.patch = kwargs["patch"]
state.suite_name = kwargs["suite_name"]
state.product = kwargs["product"]
state.config = kwargs["config"]
+ state.full_update = kwargs["full"]
state.extra_properties = kwargs["extra_property"]
runner = MetadataUpdateRunner(self.logger, state)
runner.run()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
index 928a153dbd9..5ac29b302e6 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -269,7 +269,7 @@ scheme host and port.""")
help="Defines an extra user preference (overrides those in prefs_root)")
gecko_group.add_argument("--leak-check", dest="leak_check", action="store_true", default=None,
help="Enable leak checking (enabled by default for debug builds, "
- "silently ignored for opt)")
+ "silently ignored for opt, mobile)")
gecko_group.add_argument("--no-leak-check", dest="leak_check", action="store_false", default=None,
help="Disable leak checking")
gecko_group.add_argument("--stylo-threads", action="store", type=int, default=1,
@@ -609,11 +609,15 @@ def create_parser_update(product_choices=None):
help="Don't create a VCS commit containing the changes.")
parser.add_argument("--sync", dest="sync", action="store_true", default=False,
help="Sync the tests with the latest from upstream (implies --patch)")
- parser.add_argument("--ignore-existing", action="store_true",
- help="When updating test results only consider results from the logfiles provided, not existing expectations.")
- parser.add_argument("--stability", nargs="?", action="store", const="unstable", default=None,
+ parser.add_argument("--full", action="store_true", default=False,
+ help=("For all tests that are updated, remove any existing conditions and missing subtests"))
+ parser.add_argument("--disable-intermittent", nargs="?", action="store", const="unstable", default=None,
help=("Reason for disabling tests. When updating test results, disable tests that have "
"inconsistent results across many runs with the given reason."))
+ parser.add_argument("--update-intermittent", action="store_true", default=False,
+ help=("Update test metadata with expected intermittent statuses."))
+ parser.add_argument("--remove-intermittent", action="store_true", default=False,
+ help=("Remove obsolete intermittent statuses from expected statuses."))
parser.add_argument("--no-remove-obsolete", action="store_false", dest="remove_obsolete", default=True,
help=("Don't remove metadata files that no longer correspond to a test file"))
parser.add_argument("--no-store-state", action="store_false", dest="store_state",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
index 5719a859fa4..43225a1e728 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
@@ -1,16 +1,18 @@
import operator
-from ..node import NodeVisitor, DataNode, ConditionalNode, KeyValueNode, ListNode, ValueNode
+from ..node import NodeVisitor, DataNode, ConditionalNode, KeyValueNode, ListNode, ValueNode, BinaryExpressionNode, VariableNode
from ..parser import parse
class ConditionalValue(object):
def __init__(self, node, condition_func):
self.node = node
+ assert callable(condition_func)
self.condition_func = condition_func
if isinstance(node, ConditionalNode):
assert len(node.children) == 2
self.condition_node = self.node.children[0]
+ assert isinstance(node.children[1], (ValueNode, ListNode))
self.value_node = self.node.children[1]
else:
assert isinstance(node, (ValueNode, ListNode))
@@ -59,6 +61,20 @@ class ConditionalValue(object):
self.node.parent.remove()
self.node.remove()
+ @property
+ def variables(self):
+ rv = set()
+ if self.condition_node is None:
+ return rv
+ stack = [self.condition_node]
+ while stack:
+ node = stack.pop()
+ if isinstance(node, VariableNode):
+ rv.add(node.data)
+ for child in reversed(node.children):
+ stack.append(child)
+ return rv
+
class Compiler(NodeVisitor):
def compile(self, tree, data_cls_getter=None, **kwargs):
@@ -191,6 +207,7 @@ class Compiler(NodeVisitor):
return {"not": operator.not_}[node.data]
def visit_BinaryOperatorNode(self, node):
+ assert isinstance(node.parent, BinaryExpressionNode)
return {"and": operator.and_,
"or": operator.or_,
"==": operator.eq,
@@ -216,6 +233,12 @@ class ManifestItem(object):
def __contains__(self, key):
return key in self._data
+ def __iter__(self):
+ yield self
+ for child in self.children:
+ for node in child:
+ yield node
+
@property
def is_empty(self):
if self._data:
@@ -282,9 +305,12 @@ class ManifestItem(object):
else:
value_node = ValueNode(unicode(value))
if condition is not None:
- conditional_node = ConditionalNode()
- conditional_node.append(condition)
- conditional_node.append(value_node)
+ if not isinstance(condition, ConditionalNode):
+ conditional_node = ConditionalNode()
+ conditional_node.append(condition)
+ conditional_node.append(value_node)
+ else:
+ conditional_node = condition
node.append(conditional_node)
cond_value = Compiler().compile_condition(conditional_node)
else:
@@ -300,6 +326,21 @@ class ManifestItem(object):
else:
self._data[key].append(cond_value)
+ def clear(self, key):
+ """Clear all the expected data for this node"""
+ if key in self._data:
+ for child in self.node.children:
+ if (isinstance(child, KeyValueNode) and
+ child.data == key):
+ child.remove()
+ del self._data[key]
+ break
+
+ def get_conditions(self, property_name):
+ if property_name in self._data:
+ return self._data[property_name]
+ return []
+
def _add_key_value(self, node, values):
"""Called during construction to set a key-value node"""
self._data[node.data] = values
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/node.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/node.py
index 24d523f924a..200605c05aa 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/node.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/node.py
@@ -68,9 +68,11 @@ class KeyValueNode(Node):
# Append that retains the invariant that conditional nodes
# come before unconditional nodes
other.parent = self
- if isinstance(other, ValueNode):
+ if not isinstance(other, (ListNode, ValueNode, ConditionalNode)):
+ raise TypeError
+ if isinstance(other, (ListNode, ValueNode)):
if self.children:
- assert not isinstance(self.children[-1], ValueNode)
+ assert not isinstance(self.children[-1], (ListNode, ValueNode))
self.children.append(other)
else:
if self.children and isinstance(self.children[-1], ValueNode):
@@ -95,7 +97,17 @@ class AtomNode(ValueNode):
class ConditionalNode(Node):
- pass
+ def append(self, other):
+ if not len(self.children):
+ if not isinstance(other, (BinaryExpressionNode, UnaryExpressionNode, VariableNode)):
+ raise TypeError
+ else:
+ if len(self.children) > 1:
+ raise ValueError
+ if not isinstance(other, (ListNode, ValueNode)):
+ raise TypeError
+ other.parent = self
+ self.children.append(other)
class UnaryExpressionNode(Node):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py
index 8f1897b08f3..833e0b8ed1a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py
@@ -16,7 +16,7 @@ from __future__ import unicode_literals
from six import binary_type, text_type, BytesIO
-from .node import (AtomNode, BinaryExpressionNode, BinaryOperatorNode,
+from .node import (Node, AtomNode, BinaryExpressionNode, BinaryOperatorNode,
ConditionalNode, DataNode, IndexNode, KeyValueNode, ListNode,
NumberNode, StringNode, UnaryExpressionNode,
UnaryOperatorNode, ValueNode, VariableNode)
@@ -339,7 +339,14 @@ class Tokenizer(object):
spaces = 0
rv += c
self.consume()
- yield (token_types.string, decode(rv))
+ rv = decode(rv)
+ if rv.startswith("if "):
+ # Hack to avoid a problem where people write
+ # disabled: if foo
+ # and expect that to disable conditionally
+ raise ParseError(self.filename, self.line_number, "Strings starting 'if ' must be quoted "
+ "(expressions must start on a newline and be indented)")
+ yield (token_types.string, rv)
def comment_state(self):
while self.char() is not eol:
@@ -698,13 +705,16 @@ class Treebuilder(object):
self.node = root
def append(self, node):
+ assert isinstance(node, Node)
self.node.append(node)
self.node = node
+ assert self.node is not None
return node
def pop(self):
node = self.node
self.node = self.node.parent
+ assert self.node is not None
return node
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
index d24becbec6d..3b29c99ede7 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
@@ -78,8 +78,10 @@ class ManifestSerializer(NodeVisitor):
data = unicode(node.data)
else:
data = node.data
- if "#" in data or (isinstance(node.parent, ListNode) and
- ("," in data or "]" in data)):
+ if ("#" in data or
+ data.startswith("if ") or
+ (isinstance(node.parent, ListNode) and
+ ("," in data or "]" in data))):
if "\"" in data:
quote = "'"
else:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
index c00320fa5ed..ad532dd92ea 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
@@ -90,7 +90,7 @@ key:
self.compare(
"""
key:
- if x == 1: if b: value""",
+ if x == 1: 'if b: value'""",
["DataNode", None,
[["KeyValueNode", "key",
[["ConditionalNode", None,
@@ -111,6 +111,10 @@ key:
with self.assertRaises(parser.ParseError):
self.parse("key: @true")
+ def test_if_1(self):
+ with self.assertRaises(parser.ParseError):
+ self.parse("key: if foo")
+
if __name__ == "__main__":
unittest.main()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
index 14c2ef2e228..7fe7ac85cb8 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
@@ -230,3 +230,7 @@ class TokenizerTest(unittest.TestCase):
self.compare("""foo:
if a or b: [1, 2]
""")
+
+ def test_if_string_0(self):
+ self.compare("""foo: "if bar"
+""")
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
index e4714be02f8..ca0997ac8f9 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
@@ -5,6 +5,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
+<script src="../../resources/timing-override.js"></script>
<body>
<div id="log"></div>
<script>
diff --git a/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js
new file mode 100755
index 00000000000..a1d65030f02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js
@@ -0,0 +1,18 @@
+// Firefox implements unconditional clamping of 20 usec; and for certain web-animation tests,
+// we hit some test failures because the Time Precision is too small. We override these functions
+// on a per-test basis for Firefox only.
+if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){
+ window.assert_times_equal = (actual, expected, description) => {
+ let TIME_PRECISION = 0.02;
+ assert_approx_equals(actual, expected, TIME_PRECISION * 2, description);
+ };
+
+ window.assert_time_equals_literal = (actual, expected, description) => {
+ let TIME_PRECISION = 0.02;
+ if (Math.abs(expected) === Infinity) {
+ assert_equals(actual, expected, description);
+ } else {
+ assert_approx_equals(actual, expected, TIME_PRECISION, description);
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/finishing-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/finishing-an-animation.html
index cb824ae30ed..779bee184b8 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/finishing-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/finishing-an-animation.html
@@ -6,6 +6,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
+<script src="../../resources/timing-override.js"></script>
<body>
<div id="log"></div>
<script>
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
index 454a294239a..a1727994bdb 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
@@ -5,6 +5,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
+<script src="../../resources/timing-override.js"></script>
<body>
<div id="log"></div>
<script>
@@ -262,7 +263,7 @@ promise_test(async t => {
// calculated using the new playback rate
assert_times_equal(anim.startTime,
anim.timeline.currentTime - 25 * MS_PER_SEC);
- assert_time_equals_literal(anim.currentTime, 50 * MS_PER_SEC);
+ assert_time_equals_literal(parseInt(anim.currentTime.toPrecision(5), 10), 50 * MS_PER_SEC);
}, 'Setting the start time of a playing animation applies a pending playback rate');
</script>
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/the-current-time-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/the-current-time-of-an-animation.html
index a0e1a111fd4..77a6b716d22 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/the-current-time-of-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/the-current-time-of-an-animation.html
@@ -5,6 +5,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
+<script src="../../resources/timing-override.js"></script>
<body>
<div id="log"></div>
<script>
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/timelines/document-timelines.html b/tests/wpt/web-platform-tests/web-animations/timing-model/timelines/document-timelines.html
index 4023bba5561..f45865ac7c0 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/timelines/document-timelines.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/timelines/document-timelines.html
@@ -9,6 +9,10 @@
<script>
'use strict';
+function matchUnconditionalClamping(timestamp) {
+ return parseFloat((Math.floor(timestamp / .02) * .02).toPrecision(8), 10);
+}
+
async_test(t => {
assert_greater_than_equal(document.timeline.currentTime, 0,
'The current time is initially is positive or zero');
@@ -28,7 +32,7 @@ async_test(t => {
// so we use requestAnimationFrame instead.
window.requestAnimationFrame(rafTime => {
t.step(() => {
- assert_equals(document.timeline.currentTime, rafTime,
+ assert_equals(document.timeline.currentTime, matchUnconditionalClamping(rafTime),
'The current time matches requestAnimationFrame time');
});
t.done();
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/execute_script/execute.py b/tests/wpt/web-platform-tests/webdriver/tests/execute_script/execute.py
index 2af16c1e5e8..1dde379c8a8 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/execute_script/execute.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/execute_script/execute.py
@@ -3,6 +3,7 @@ import pytest
from webdriver.transport import Response
from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
def execute_script(session, script, args=None):
@@ -32,6 +33,20 @@ def test_ending_comment(session):
assert_success(response, 1)
+def test_override_listeners(session):
+ session.url = inline("""
+<script>
+called = [];
+window.addEventListener = () => {called.push("Internal addEventListener")}
+window.removeEventListener = () => {called.push("Internal removeEventListener")}
+</script>
+})""")
+ response = execute_script(session, "return !window.onunload");
+ assert_success(response, True);
+ response = execute_script(session, "return called")
+ assert_success(response, [])
+
+
@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
def test_abort_by_user_prompt(session, dialog_type):
response = execute_script(
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/validity.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/validity.py
index ce8a0d60f7d..656406718e7 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/validity.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/validity.py
@@ -62,3 +62,16 @@ def test_pause_without_duration(session, action_type):
}]
response = perform_actions(session, actions)
assert_success(response)
+
+
+@pytest.mark.parametrize("action_type", ["none", "key", "pointer"])
+def test_action_without_id(session, action_type):
+ actions = [{
+ "type": action_type,
+ "actions": [{
+ "type": "pause",
+ "duration": 1
+ }]
+ }]
+ response = perform_actions(session, actions)
+ assert_error(response, "invalid argument")
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html
index 1848cdf67f6..85683c7ba5c 100644
--- a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>Reference for WebVTT rendering, size:50%, cue too long - should be cut</title>
+<title>Reference for WebVTT rendering, size:50%, cue too long - should be hidden</title>
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
html { overflow:hidden }
@@ -11,18 +11,5 @@ body { margin:0 }
position: relative;
font-size: 9px;
}
-.cue {
- position: absolute;
- bottom: 0;
- left: 25%;
- right: 0;
- width: 50%;
- text-align: center
-}
-.cue > span {
- font-family: Ahem, sans-serif;
- background: rgba(0,0,0,0.8);
- color: green;
-}
</style>
-<div class="video"><span class="cue"><span>This is a test subtitle that should wrap several times and become so long that the cue must be cut when displayed, because it does not fit on the screen. This is a test subtitle that should wrap several times and become so long that the cue must be cut when displayed, because it does not fit on the</span></span></div>
+<div class="video"><span class="cue"></span></span></div>
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html
index 7f020bcd96d..1dc19e62594 100644
--- a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
-<title>WebVTT rendering, size:50%, cue too long - should be cut</title>
+<title>WebVTT rendering, size:50%, cue too long - should be hidden</title>
<link rel="match" href="cue_too_long-ref.html">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt
index fc62842108f..fa1aad85c50 100644
--- a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/very_long_cue.vtt
@@ -1,4 +1,4 @@
WEBVTT
00:00:00.000 --> 00:00:10.000 size:50%
-This is a test subtitle that should wrap several times and become so long that the cue must be cut when displayed, because it does not fit on the screen. This is a test subtitle that should wrap several times and become so long that the cue must be cut when displayed, because it does not fit on the screen.
+This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen. This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen. This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen. This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen. This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen. This is a test subtitle that should wrap several times and become so long that exceeds the video rendering area. In this situation, the cue won't be showed in the screen.
diff --git a/tests/wpt/web-platform-tests/webxr/exclusive_requestFrame_nolayer.https.html b/tests/wpt/web-platform-tests/webxr/exclusive_requestFrame_nolayer.https.html
index d31b927631f..f76847a8769 100644
--- a/tests/wpt/web-platform-tests/webxr/exclusive_requestFrame_nolayer.https.html
+++ b/tests/wpt/web-platform-tests/webxr/exclusive_requestFrame_nolayer.https.html
@@ -25,8 +25,7 @@ let testFunction = (session, controller, t, sessionObjects) => new Promise((reso
let gl = sessionObjects.gl;
// Session must have a baseLayer or frame requests will be ignored.
- let webglLayer = new XRWebGLLayer(session, gl, {
- compositionDisabled: session.mode == 'inline' });
+ let webglLayer = new XRWebGLLayer(session, gl);
function onEarlyFrame(time, vrFrame) {
// We shouldn't be allowed to reach this callback with no baseLayer
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
index 61b25991b37..935f49a1fc9 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
@@ -71,9 +71,7 @@ function xr_session_promise_test(
.then((session) => {
testSession = session;
session.mode = sessionMode;
- let glLayer = new XRWebGLLayer(session, gl, {
- compositionDisabled: session.mode == 'inline'
- });
+ let glLayer = new XRWebGLLayer(session, gl);
glLayer.context = gl;
// Session must have a baseLayer or frame requests
// will be ignored.
diff --git a/tests/wpt/web-platform-tests/webxr/xrInputSource_profiles.https.html b/tests/wpt/web-platform-tests/webxr/xrInputSource_profiles.https.html
new file mode 100644
index 00000000000..32073c631f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/xrInputSource_profiles.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+let testName = "WebXR InputSource's profiles list can be set";
+
+let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
+
+let testFunction = function(session, fakeDeviceController, t) {
+
+ let input_source = fakeDeviceController.simulateInputSourceConnection({
+ handedness: "right",
+ targetRayMode: "tracked-pointer",
+ pointerOrigin: VALID_POINTER_TRANSFORM,
+ profiles: ["most-specific-name", "less-specific-name"]
+ });
+
+ // Input events and state changes need one frame to propagate, which is why we
+ // are requesting an animation frame before checking the profiles list.
+ return new Promise((resolve) => {
+ session.requestAnimationFrame(() => {
+ let profiles = session.inputSources[0].profiles;
+ t.step(() => {
+ assert_equals(profiles.length, 2);
+ assert_equals(profiles[0], "most-specific-name");
+ assert_equals(profiles[1], "less-specific-name");
+ }, "Verify profiles list is set");
+ resolve();
+ });
+ });
+};
+
+xr_session_promise_test(
+ testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
+</script>
diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
index b4e1c8e5c97..516df836b1b 100644
--- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html
@@ -48,7 +48,8 @@ let testFunction =
handedness: "right",
targetRayMode: "tracked-pointer",
pointerOrigin: POINTER_TRANSFORM_WITH_ROTATION,
- gripOrigin: GRIP_TRANSFORM_WITH_ROTATION
+ gripOrigin: GRIP_TRANSFORM_WITH_ROTATION,
+ profiles: []
});
const RADIANS_90D = Math.PI / 2;
diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
index f76c3c430e0..ae1767ba74e 100644
--- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html
@@ -60,7 +60,8 @@ function testFunction(session, fakeDeviceController, t) {
handedness: "right",
targetRayMode: "tracked-pointer",
pointerOrigin: LOCAL_POINTER_TRANSFORM,
- gripOrigin: INITIAL_GRIP_TRANSFORM
+ gripOrigin: INITIAL_GRIP_TRANSFORM,
+ profiles: []
});
return new Promise((resolve, reject) => {
diff --git a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html
index 74f0e7611e5..0584da79c12 100644
--- a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html
@@ -16,7 +16,17 @@ xr_promise_test("Ensure that XRWebGLLayer's constructor throws appropriate error
};
let gl = webglCanvas.getContext('webgl', glAttributes);
return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
- .then((controller) => {
+ .then(() => {
+ return navigator.xr.requestSession('inline')
+ .then((session) => {
+ try {
+ let webglLayerIncompatible = new XRWebGLLayer(session, gl);
+ } catch (err) {
+ assert_unreached("Inline XRWebGLLayers should not fail when created with a context that is not XRCompatible");
+ }
+ });
+ })
+ .then(() => {
return new Promise((resolve) => {
navigator.xr.test.simulateUserActivation(() => {
navigator.xr.requestSession('immersive-vr')
diff --git a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_opaque_framebuffer.https.html b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_opaque_framebuffer.https.html
index 37955f3988d..4d27a9155e6 100644
--- a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_opaque_framebuffer.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_opaque_framebuffer.https.html
@@ -23,7 +23,7 @@ let testFunction =
assert_equals(gl.getError(), gl.NO_ERROR);
if (session.mode == 'inline') {
- // Creating a layer with compositionDisabled should return a framebuffer of
+ // Creating a layer with an inline session should return a framebuffer of
// null, and as such most of these tests won't apply.
assert_equals(xrFramebuffer, null);
resolve();
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.html
index a9719d9dea6..a8dc7140671 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.html
@@ -1,9 +1,3 @@
-<!--
-onconnect = function(e) {
- e.ports[0].postMessage([e.data === '', e instanceof MessageEvent, e.ports.length == 1]);
-};
-/*
--->
<!doctype html>
<title>connect event</title>
<script src="/resources/testharness.js"></script>
@@ -11,7 +5,7 @@ onconnect = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('connect-event.js');
worker.port.addEventListener('message', this.step_func(function(e) {
assert_true(e.data[0], "e.data === ''");
assert_true(e.data[1], "e instanceof MessageEvent");
@@ -20,7 +14,4 @@ onconnect = function(e) {
}), false);
worker.port.start();
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.js
new file mode 100644
index 00000000000..c397152fe9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/connect-event.js
@@ -0,0 +1,3 @@
+onconnect = function(e) {
+ e.ports[0].postMessage([e.data === '', e instanceof MessageEvent, e.ports.length == 1]);
+}; \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-name.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-name.html
index 9e2732923ec..59097c722e6 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-name.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-name.html
@@ -1,6 +1,3 @@
-<!--
-/*
--->
<!doctype html>
<title>creating a dummy shared worker with name "foo"</title>
<link rel=help href="http://www.whatwg.org/html/#dom-sharedworker">
@@ -9,9 +6,6 @@
<div id="log"></div>
<script>
test(function() {
- var worker = new SharedWorker('#', 'foo');
+ var worker = new SharedWorker('empty.js', 'foo');
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.html
index e9aff9c5b4c..0c04f1f5fec 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.html
@@ -1,6 +1,3 @@
-<!--
-/*
--->
<!doctype html>
<title>creating a dummy shared worker</title>
<link rel=help href="http://www.whatwg.org/html/#dom-sharedworker">
@@ -9,9 +6,6 @@
<div id="log"></div>
<script>
test(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('dummy-shared-worker.js');
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.js
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/dummy-shared-worker.js
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty-name.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty-name.html
index 95ff6d1ad29..c37f6b629b0 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty-name.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty-name.html
@@ -1,6 +1,3 @@
-<!--
-/*
--->
<!doctype html>
<title>creating a dummy shared worker with explicit name ""</title>
<link rel=help href="http://www.whatwg.org/html/#dom-sharedworker">
@@ -9,9 +6,6 @@
<div id="log"></div>
<script>
test(function() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('empty.js', '');
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty.js
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/empty.js
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.html
index 1396dc7b0ba..6860e68579b 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.html
@@ -1,15 +1,3 @@
-<!--
-var expected = 'self location close onerror importScripts navigator addEventListener removeEventListener dispatchEvent name onconnect setTimeout clearTimeout setInterval clearInterval'.split(' ');
-var log = '';
-for (var i = 0; i < expected.length; ++i) {
- if (!(expected[i] in self))
- log += expected[i] + ' did not exist\n';
-}
-onconnect = function(e) {
- e.ports[0].postMessage(log);
-};
-/*
--->
<!doctype html>
<title>members of SharedWorkerGlobalScope</title>
<script src="/resources/testharness.js"></script>
@@ -17,18 +5,11 @@ onconnect = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('global-members.js');
worker.port.addEventListener('message', this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
}), false);
worker.port.start();
});
-</script>
-<!--
-*/
-//-->
-
-
-
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.js
new file mode 100644
index 00000000000..47834479316
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/global-members.js
@@ -0,0 +1,9 @@
+var expected = 'self location close onerror importScripts navigator addEventListener removeEventListener dispatchEvent name onconnect setTimeout clearTimeout setInterval clearInterval'.split(' ');
+var log = '';
+for (var i = 0; i < expected.length; ++i) {
+ if (!(expected[i] in self))
+ log += expected[i] + ' did not exist\n';
+}
+onconnect = function(e) {
+ e.ports[0].postMessage(log);
+}; \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.html
index e91b2dc6a8c..01949ddbf75 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.html
@@ -1,19 +1,3 @@
-<!--
-var prt;
-function handleCall(e) {
- var log = [];
- for (var i = 0; i < e.data.length; ++i) {
- if (!(e.data[i] in self))
- log.push(e.data[i]);
- }
- prt.postMessage('These were missing: '+log.join(', '));
-}
-onconnect = function(e) {
- prt = e.ports[0];
- prt.onmessage = handleCall;
-};
-/*
--->
<!doctype html>
<title>expected interface objects/constructors</title>
<script src="/resources/testharness.js"></script>
@@ -27,7 +11,7 @@ onconnect = function(e) {
if (expected[i] in window)
supported.push(expected[i]);
}
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('interface-objects.js');
worker.port.start();
worker.port.postMessage(supported);
worker.port.addEventListener('message', this.step_func(function(e) {
@@ -35,7 +19,4 @@ onconnect = function(e) {
this.done();
}), false);
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.js
new file mode 100644
index 00000000000..15de7c9a545
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/interface-objects.js
@@ -0,0 +1,13 @@
+var prt;
+function handleCall(e) {
+ var log = [];
+ for (var i = 0; i < e.data.length; ++i) {
+ if (!(e.data[i] in self))
+ log.push(e.data[i]);
+ }
+ prt.postMessage('These were missing: '+log.join(', '));
+}
+onconnect = function(e) {
+ prt = e.ports[0];
+ prt.onmessage = handleCall;
+}; \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.html
index 823e16c7c1f..83b00725bcc 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.html
@@ -1,9 +1,3 @@
-<!--
-onconnect = function(e) {
- e.ports[0].postMessage(self.name);
-}
-/*
--->
<!doctype html>
<title>self.name</title>
<script src="/resources/testharness.js"></script>
@@ -11,7 +5,7 @@ onconnect = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new SharedWorker('#', 'hello');
+ var worker = new SharedWorker('name.js', 'hello');
worker.port.addEventListener('message', this.step_func(function(e) {
assert_equals(e.data, 'hello');
this.done();
@@ -19,6 +13,3 @@ onconnect = function(e) {
worker.port.start();
});
</script>
-<!--
-*/
-//--> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.js
new file mode 100644
index 00000000000..88b26847602
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/name.js
@@ -0,0 +1,3 @@
+onconnect = function(e) {
+ e.ports[0].postMessage(self.name);
+}
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.html
index a2f4df0bfdd..12784e9ba40 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.html
@@ -1,9 +1,3 @@
-<!--
-onconnect = function(e) {
- e.ports[0].postMessage(true);
-}
-/*
--->
<!doctype html>
<title>worker.port.onmessage</title>
<script src="/resources/testharness.js"></script>
@@ -11,13 +5,10 @@ onconnect = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('port-onmessage.js', '');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.js
new file mode 100644
index 00000000000..83d4579287a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-onmessage.js
@@ -0,0 +1,3 @@
+onconnect = function(e) {
+ e.ports[0].postMessage(true);
+}
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-properties.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-properties.html
index f8a676dd248..8f6f58a2810 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-properties.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-properties.html
@@ -1,6 +1,3 @@
-<!--
-/*
--->
<!doctype html>
<title>worker.port</title>
<link rel=help href="http://www.whatwg.org/html/#sharedworker">
@@ -10,7 +7,7 @@
<div id="log"></div>
<script>
test(function() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('empty.js', '');
assert_true('port' in worker, "port");
assert_true('postMessage' in worker.port, "postMessage");
assert_true('start' in worker.port, "start");
@@ -21,6 +18,3 @@ test(function() {
assert_true('dispatchEvent' in worker.port, "dispatchEvent");
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-readonly.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-readonly.html
index f087ab0f623..181b3116f99 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-readonly.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/port-readonly.html
@@ -1,6 +1,3 @@
-<!--
-/*
--->
<!doctype html>
<title>setting worker.port</title>
<link rel=help href="http://www.whatwg.org/html/#sharedworker">
@@ -10,12 +7,9 @@
<div id="log"></div>
<script>
test(function() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('empty.js', '');
var x = worker.port;
worker.port = 1;
assert_equals(worker.port, x);
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.html b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.html
index 39739022d7e..77a4f630416 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.html
@@ -1,15 +1,3 @@
-<!--
-var unexpected = 'open print stop getComputedStyle getSelection releaseEvents captureEvents alert confirm prompt addEventStream removeEventStream back forward attachEvent detachEvent navigate DOMParser XMLSerializer XPathEvaluator XSLTProcessor opera Image Option frames Audio SVGUnitTypes SVGZoomAndPan java netscape sun Packages ByteArray closed defaultStatus document event frameElement history innerHeight innerWidth opener outerHeight outerWidth pageXOffset pageYOffset parent screen screenLeft screenTop screenX screenY status top window length'.split(' '); // iterated window in opera and removed expected ones
-var log = '';
-for (var i = 0; i < unexpected.length; ++i) {
- if (unexpected[i] in self)
- log += unexpected[i] + ' ';
-}
-onconnect = function(e) {
- e.ports[0].postMessage(log);
-};
-/*
--->
<!doctype html>
<title>unexpected members/interface objects/constructors</title>
<script src="/resources/testharness.js"></script>
@@ -17,14 +5,11 @@ onconnect = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('unexpected-global-properties.js');
worker.port.addEventListener('message', this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
}), false);
worker.port.start();
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.js b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.js
new file mode 100644
index 00000000000..d2cd94b4d90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/unexpected-global-properties.js
@@ -0,0 +1,9 @@
+var unexpected = 'open print stop getComputedStyle getSelection releaseEvents captureEvents alert confirm prompt addEventStream removeEventStream back forward attachEvent detachEvent navigate DOMParser XMLSerializer XPathEvaluator XSLTProcessor opera Image Option frames Audio SVGUnitTypes SVGZoomAndPan java netscape sun Packages ByteArray closed defaultStatus document event frameElement history innerHeight innerWidth opener outerHeight outerWidth pageXOffset pageYOffset parent screen screenLeft screenTop screenX screenY status top window length'.split(' '); // iterated window in opera and removed expected ones
+var log = '';
+for (var i = 0; i < unexpected.length; ++i) {
+ if (unexpected[i] in self)
+ log += unexpected[i] + ' ';
+}
+onconnect = function(e) {
+ e.ports[0].postMessage(log);
+}; \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.html b/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.html
index c40424d656d..b27f278bff8 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.html
@@ -1,11 +1,3 @@
-<!--
-for (;) // should cause onerror to be invoked, but onerror is null, so
- // the error is "not handled". should fire an ErrorEvent on the
- // worker.
- break;
-postMessage(1); // shouldn't do anything since the script doesn't compile
-/*
--->
<!doctype html>
<title>AbstractWorker.onerror</title>
<link rel=help href="https://html.spec.whatwg.org/multipage/#runtime-script-errors-2">
@@ -17,14 +9,14 @@ postMessage(1); // shouldn't do anything since the script doesn't compile
<script>
setup({allow_uncaught_exception:true});
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('AbstractWorker.onerror.js');
var error;
worker.onerror = this.step_func(function(a, b, c) {
error = a;
assert_equals('' + a, '[object ErrorEvent]');
assert_true("message" in a, 'ErrorEvent.message');
assert_equals(typeof a.message, "string", 'ErrorEvent.message');
- assert_equals(a.filename, document.URL + '#', 'ErrorEvent.filename');
+ assert_equals(a.filename, document.URL.replace('.html', '.js'), 'ErrorEvent.filename');
assert_true("lineno" in a, 'ErrorEvent.lineno');
assert_equals(typeof a.lineno, "number", 'ErrorEvent.lineno');
assert_equals(b, undefined, 'unexpected second argument to onerror');
@@ -42,7 +34,4 @@ async_test(function() {
assert_equals(f, undefined, 'unexpected sixth argument to onerror');
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.js b/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.js
new file mode 100644
index 00000000000..e0bc5076371
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/Worker/AbstractWorker.onerror.js
@@ -0,0 +1,5 @@
+for (;) // should cause onerror to be invoked, but onerror is null, so
+ // the error is "not handled". should fire an ErrorEvent on the
+ // worker.
+ break;
+postMessage(1); // shouldn't do anything since the script doesn't compile \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.html b/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.html
index 52f9707dfed..b9af76e2fb1 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.html
+++ b/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.html
@@ -1,10 +1,3 @@
-<!--
-(function f() {
- postMessage(1);
- setTimeout(f, 0);
-})();
-/*
--->
<!doctype html>
<title>terminate()</title>
<link rel=help href="http://www.whatwg.org/html/#dom-worker-terminate">
@@ -14,7 +7,7 @@
<script>
var t = async_test();
t.step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('terminate.js');
var i = 0;
var expected;
@@ -38,7 +31,4 @@ t.step(function() {
}), 100);
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.js b/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.js
new file mode 100644
index 00000000000..e6349c3320e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/constructors/Worker/terminate.js
@@ -0,0 +1,4 @@
+(function f() {
+ postMessage(1);
+ setTimeout(f, 0);
+})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html
index 7ae4b070474..be89478786b 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html
@@ -1,9 +1,3 @@
-<!--
-onmessage = function(e) {
- postMessage(e.ports instanceof Array && e.ports.length === 0);
-}
-/*
--->
<!doctype html>
<title>e.ports in dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -11,15 +5,11 @@ onmessage = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('event-ports-dedicated.js');
worker.postMessage(1);
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js
new file mode 100644
index 00000000000..c5cc9f8d9f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.js
@@ -0,0 +1,3 @@
+onmessage = function(e) {
+ postMessage(e.ports instanceof Array && e.ports.length === 0);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html
index 20413015418..7c019a99934 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.html
@@ -1,17 +1,3 @@
-<!--
-onmessage = function(e) {
- function processPixels(imagedata) {
- var pixeldata = imagedata.data;
- for (var i = 0; i < pixeldata.length; i = i+4) {
- pixeldata[i] = 128;
- }
- postMessage(imagedata);
- }
- processPixels(e.data[0]);
-}
-
-/*
--->
<!doctype html>
<title>posting an imagedata (from a cloned canvas) in an array</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +5,7 @@ onmessage = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('imagedata-cloned-canvas-in-array.js');
var canvas = document.createElement('canvas');
var clone = canvas.cloneNode(true);
var ctx = clone.getContext('2d');
@@ -33,7 +19,4 @@ onmessage = function(e) {
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js
new file mode 100644
index 00000000000..76eaee366c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/imagedata-cloned-canvas-in-array.js
@@ -0,0 +1,10 @@
+onmessage = function(e) {
+ function processPixels(imagedata) {
+ var pixeldata = imagedata.data;
+ for (var i = 0; i < pixeldata.length; i = i+4) {
+ pixeldata[i] = 128;
+ }
+ postMessage(imagedata);
+ }
+ processPixels(e.data[0]);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html
index e086dc13db6..1749644908f 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.html
@@ -1,13 +1,3 @@
-<!--
-onmessage = (event) => {
- try {
- postMessage(event.data, {transfer: [event.data]});
- } catch(e) {
- postMessage(''+e);
- }
-}
-/*
--->
<!doctype html>
<title>Using dictionary as postMessage's second argument</title>
<script src="/resources/testharness.js"></script>
@@ -15,7 +5,7 @@ onmessage = (event) => {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('second-argument-dictionary.js');
var ab = new ArrayBuffer(1);
worker.postMessage(ab, {transfer: [ab]});
worker.onmessage = this.step_func(function(e) {
@@ -23,7 +13,4 @@ onmessage = (event) => {
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js
new file mode 100644
index 00000000000..0cb80f8faeb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-dictionary.js
@@ -0,0 +1,7 @@
+onmessage = (event) => {
+ try {
+ postMessage(event.data, {transfer: [event.data]});
+ } catch(e) {
+ postMessage(''+e);
+ }
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html
index df4c9f83e6f..8db06b41164 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html
@@ -1,11 +1,3 @@
-<!--
-try {
- postMessage(false, [null]);
-} catch(e) {
- postMessage(e instanceof TypeError);
-}
-/*
--->
<!doctype html>
<title>Using [null] in postMessage's second argument</title>
<script src="/resources/testharness.js"></script>
@@ -13,14 +5,10 @@ try {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('second-argument-null-in-array.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js
new file mode 100644
index 00000000000..95a094234b7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.js
@@ -0,0 +1,5 @@
+try {
+ postMessage(false, [null]);
+} catch(e) {
+ postMessage(e instanceof TypeError);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html
index 4a03c830a29..68d9caabc50 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html
@@ -1,11 +1,3 @@
-<!--
-try {
- postMessage(1, null);
-} catch(e) {
- postMessage(e instanceof TypeError);
-}
-/*
--->
<!doctype html>
<title>Using null in postMessage's second argument</title>
<script src="/resources/testharness.js"></script>
@@ -13,13 +5,10 @@ try {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('second-argument-null.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(1, e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js
new file mode 100644
index 00000000000..6f6f9e799ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.js
@@ -0,0 +1,5 @@
+try {
+ postMessage(1, null);
+} catch(e) {
+ postMessage(e instanceof TypeError);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html
index 7d01eba7aff..c7dcb3c5c0f 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.html
@@ -1,11 +1,3 @@
-<!--
-try {
- postMessage(1, undefined);
-} catch(e) {
- postMessage(''+e);
-}
-/*
--->
<!doctype html>
<title>Using undefined in postMessage's second argument</title>
<script src="/resources/testharness.js"></script>
@@ -13,13 +5,10 @@ try {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('second-argument-undefined.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 1);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js
new file mode 100644
index 00000000000..6f11443c4a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-undefined.js
@@ -0,0 +1,5 @@
+try {
+ postMessage(1, undefined);
+} catch(e) {
+ postMessage(''+e);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html
index d1a3f0f5c70..5b3e014e1e0 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html
@@ -1,10 +1,3 @@
-<!--
-var x = postMessage;
-postMessage = 1;
-x(postMessage == 1);
-
-/*
--->
<!doctype html>
<title>setting postMessage</title>
<script src="/resources/testharness.js"></script>
@@ -12,13 +5,10 @@ x(postMessage == 1);
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('setting-postMessage.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js
new file mode 100644
index 00000000000..5426ebde0d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.js
@@ -0,0 +1,3 @@
+var x = postMessage;
+postMessage = 1;
+x(postMessage == 1); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html
index c0ded6a2805..c7fbb0f9560 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.html
@@ -1,12 +1,3 @@
-<!--
-onmessage = function(e) {
- var imagedata = e.data;
- imagedata.data[0] = 128;
- postMessage(imagedata);
-}
-
-/*
--->
<!doctype html>
<title>structured clone of ImageData</title>
<script src="/resources/testharness.js"></script>
@@ -14,7 +5,7 @@ onmessage = function(e) {
<div id="log"></div>
<script>
(async_test()).step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('structured-clone-imagedata.js');
var ctx = document.createElement('canvas').getContext('2d');
var imagedata = ctx.getImageData(0, 0, 300, 150);
worker.postMessage(imagedata);
@@ -24,7 +15,4 @@ onmessage = function(e) {
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js
new file mode 100644
index 00000000000..04cd7eea5ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-imagedata.js
@@ -0,0 +1,5 @@
+onmessage = function(e) {
+ var imagedata = e.data;
+ imagedata.data[0] = 128;
+ postMessage(imagedata);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html
index ba357421f99..edf4fb7e0e5 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html
@@ -1,20 +1,3 @@
-<!--
-var err = new Error('foo');
-var date = new Date();
-// commented out bits are either tested elsewhere or not supported yet. or uncloneable.
-var tests = [undefined, null, false, true, 1, NaN, Infinity, 'foo', date, /foo/, /* ImageData, File, FileData, FileList,*/ null/*self*/,
- [undefined, null, false, true, 1, NaN, Infinity, 'foo', /*date, /foo/,*/ null/*self*/, /*[], {},*/ null/*err*/],
- {a:undefined, b:null, c:false, d:true, e:1, f:NaN, g:Infinity, h:'foo', /*i:date, j:/foo/,*/ k:null/*self*/, /*l:[], m:{},*/ n:null/*err*/},
- null/*err*/];
-for (var i = 0; i < tests.length; ++i) {
- try {
- postMessage(tests[i]);
- } catch(e) {
- postMessage(''+e);
- }
-}
-/*
--->
<!doctype html>
<title>structured clone of message</title>
<script src="/resources/testharness.js"></script>
@@ -45,14 +28,11 @@ setTimeout(tests[tests.length-1].test.step_func(function() {
}), 500);
wrapper_test.step(function() {
- var worker = new Worker('#');
+ var worker = new Worker('structured-clone-message.js');
var i = 0;
worker.onmessage = function(e) {
tests[i].test.step(function() { tests[i].check(e); this.done(); });
i++;
};
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js
new file mode 100644
index 00000000000..db456e1fbae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.js
@@ -0,0 +1,14 @@
+var err = new Error('foo');
+var date = new Date();
+// commented out bits are either tested elsewhere or not supported yet. or uncloneable.
+var tests = [undefined, null, false, true, 1, NaN, Infinity, 'foo', date, /foo/, /* ImageData, File, FileData, FileList,*/ null/*self*/,
+ [undefined, null, false, true, 1, NaN, Infinity, 'foo', /*date, /foo/,*/ null/*self*/, /*[], {},*/ null/*err*/],
+ {a:undefined, b:null, c:false, d:true, e:1, f:NaN, g:Infinity, h:'foo', /*i:date, j:/foo/,*/ k:null/*self*/, /*l:[], m:{},*/ n:null/*err*/},
+ null/*err*/];
+for (var i = 0; i < tests.length; ++i) {
+ try {
+ postMessage(tests[i]);
+ } catch(e) {
+ postMessage(''+e);
+ }
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.html b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.html
index bfe81a8a9c0..c3a52d12e8a 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.html
@@ -1,22 +1,10 @@
-<!--
-addEventListener('connect', function(e) {
- var passed;
- switch (location.hash) {
- case '#1': passed = name == ''; break;
- case '#2': passed = name == 'a'; break;
- case '#3': passed = name == '0'; break;
- }
- e.ports[0].postMessage(passed);
-}, false);
-/*
--->
<!doctype html>
<title>getting name</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
-var tests = [['#1', ''], ['#2', 'a'], ['#3', -0]];
+var tests = [['getting.js#1', ''], ['getting.js#2', 'a'], ['getting.js#3', -0]];
tests.forEach(function(t) {
async_test(function() {
var w = new SharedWorker(t[0], t[1]);
@@ -27,8 +15,3 @@ tests.forEach(function(t) {
});
});
</script>
-<!--
-*/
-//-->
-
-
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.js b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.js
new file mode 100644
index 00000000000..acf89ca6f67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/getting.js
@@ -0,0 +1,9 @@
+addEventListener('connect', function(e) {
+ var passed;
+ switch (location.hash) {
+ case '#1': passed = name == ''; break;
+ case '#2': passed = name == 'a'; break;
+ case '#3': passed = name == '0'; break;
+ }
+ e.ports[0].postMessage(passed);
+}, false);
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.html b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.html
index a3511263d5e..ddd85697101 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.html
@@ -1,10 +1,3 @@
-<!--
-addEventListener('connect', function(e) {
- name = 1;
- e.ports[0].postMessage(name);
-}, false);
-/*
--->
<!doctype html>
<title>setting name</title>
<script src="/resources/testharness.js"></script>
@@ -12,7 +5,7 @@ addEventListener('connect', function(e) {
<div id="log"></div>
<script>
async_test(function() {
- var w1 = new SharedWorker('#1', 'x');
+ var w1 = new SharedWorker('setting.js#1', 'x');
w1.port.addEventListener('message', this.step_func(function(e) {
assert_equals(e.data, 1);
this.done();
@@ -20,6 +13,3 @@ async_test(function() {
w1.port.start();
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.js b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.js
new file mode 100644
index 00000000000..c705e9c40a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/name/setting.js
@@ -0,0 +1,4 @@
+addEventListener('connect', function(e) {
+ name = 1;
+ e.ports[0].postMessage(name);
+}, false);
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.html b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.html
index 2ad155bf7a9..8a0f103d40e 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.html
@@ -1,25 +1,3 @@
-<!--
-var results = [];
-try {
- self.onconnect = 1;
- results.push(String(onconnect));
-} catch(e) {
- results.push(''+e);
-}
-try {
- self.onconnect = {handleEvent:function(){}};
- results.push(String(onconnect));
-} catch(e) {
- results.push(''+e);
-}
-var f = function(e) {
- results.push(e.data);
- e.ports[0].postMessage(results);
-};
-onconnect = f;
-results.push(typeof onconnect);
-/*
--->
<!doctype html>
<title>onconnect</title>
<script src="/resources/testharness.js"></script>
@@ -27,13 +5,10 @@ results.push(typeof onconnect);
<div id="log"></div>
<script>
async_test(function() {
- var w1 = new SharedWorker('#', '');
+ var w1 = new SharedWorker('onconnect.js', '');
w1.port.addEventListener('message', this.step_func(function(e) {
assert_array_equals(e.data, ['null', 'null', 'function', '']);
}), false);
w1.port.start();
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.js b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.js
new file mode 100644
index 00000000000..34a2be51fc4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/SharedWorkerGlobalScope/onconnect.js
@@ -0,0 +1,19 @@
+var results = [];
+try {
+ self.onconnect = 1;
+ results.push(String(onconnect));
+} catch(e) {
+ results.push(''+e);
+}
+try {
+ self.onconnect = {handleEvent:function(){}};
+ results.push(String(onconnect));
+} catch(e) {
+ results.push(''+e);
+}
+var f = function(e) {
+ results.push(e.data);
+ e.ports[0].postMessage(results);
+};
+onconnect = f;
+results.push(typeof onconnect);
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.html
index d65695632bc..eb8e69c2b05 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.html
@@ -1,18 +1,10 @@
-<!--
-onmessage = function(e) {
- postMessage(1);
- throw new Error();
-}
-close();
-/*
--->
<!doctype html>
<title>close() and incoming message</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
-var worker = new Worker('#');
+var worker = new Worker('incoming-message.js');
worker.onmessage = function(e) {
assert_unreached("Got message");
};
@@ -21,9 +13,4 @@ worker.onerror = function(e) {
};
worker.postMessage(1);
setTimeout(done, 2000);
-</script>
-<!--
-*/
-//-->
-
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.js
new file mode 100644
index 00000000000..b4f7e7fc055
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/incoming-message.js
@@ -0,0 +1,5 @@
+onmessage = function(e) {
+ postMessage(1);
+ throw new Error();
+}
+close(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.html
index 983c422cc55..da7da66d25b 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.html
@@ -1,9 +1,3 @@
-<!--
-postMessage(1);
-close();
-postMessage(2);
-/*
--->
<!doctype html>
<title>close() and sending messages</title>
<script src="/resources/testharness.js"></script>
@@ -11,7 +5,7 @@ postMessage(2);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('sending-messages.js');
var i = 0;
worker.onmessage = this.step_func(function(e) {
i++;
@@ -21,7 +15,4 @@ async_test(function() {
}
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.js
new file mode 100644
index 00000000000..2e0a8982888
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/sending-messages.js
@@ -0,0 +1,3 @@
+postMessage(1);
+close();
+postMessage(2); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.html
index 1d7d178d22e..690f067cffc 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.html
@@ -1,24 +1,10 @@
-<!--
-var interval1 = setInterval(function() {
- clearInterval(interval1);
- postMessage(1);
- throw new Error();
-}, 10);
-close();
-var interval2 = setInterval(function() {
- clearInterval(interval2);
- postMessage(1);
- throw new Error();
-}, 10);
-/*
--->
<!doctype html>
<title>close() and setInterval</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
-var worker = new Worker('#');
+var worker = new Worker('setInterval.js');
worker.onmessage = function(e) {
assert_unreached("Got message");
};
@@ -26,9 +12,4 @@ worker.onerror = function(e) {
assert_unreached("Got error");
};
setTimeout(done, 2000);
-</script>
-<!--
-*/
-//-->
-
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.js
new file mode 100644
index 00000000000..d165d20eab4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setInterval.js
@@ -0,0 +1,11 @@
+var interval1 = setInterval(function() {
+ clearInterval(interval1);
+ postMessage(1);
+ throw new Error();
+}, 10);
+close();
+var interval2 = setInterval(function() {
+ clearInterval(interval2);
+ postMessage(1);
+ throw new Error();
+}, 10); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.html
index c2fa10dfc97..777a03c013d 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.html
@@ -1,20 +1,10 @@
-<!--
-function x() {
- postMessage(1);
- throw new Error();
-}
-setTimeout(x, 0);
-close();
-setTimeout(x, 0);
-/*
--->
<!doctype html>
<title>close() and setTimeout</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
-var worker = new Worker('#');
+var worker = new Worker('setTimeout.js');
worker.onmessage = function(e) {
assert_unreached("Got message");
};
@@ -22,7 +12,4 @@ worker.onerror = function(e) {
assert_unreached("Got error");
};
setTimeout(done, 2000);
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.js
new file mode 100644
index 00000000000..55eecb05570
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/close/setTimeout.js
@@ -0,0 +1,7 @@
+function x() {
+ postMessage(1);
+ throw new Error();
+}
+setTimeout(x, 0);
+close();
+setTimeout(x, 0); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.html
index 31ddf37a1b0..3da6b7484d8 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.html
@@ -1,9 +1,3 @@
-<!--
-postMessage([null, location.href, location.protocol, location.host,
- location.hostname, location.port, location.pathname,
- location.search, location.hash]);
-/*
--->
<!doctype html>
<title>members of WorkerLocation</title>
<script src="/resources/testharness.js"></script>
@@ -11,21 +5,18 @@ postMessage([null, location.href, location.protocol, location.host,
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('members.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data[0], null);
- assert_equals(e.data[1], location.href + '#', 'href');
+ assert_equals(e.data[1], location.href.replace('.html', '.js'), 'href');
assert_equals(e.data[2], location.protocol, 'protocol');
assert_equals(e.data[3], location.host, 'host');
assert_equals(e.data[4], location.hostname, 'hostname');
assert_equals(e.data[5], location.port, 'port');
- assert_equals(e.data[6], location.pathname, 'pathname');
+ assert_equals(e.data[6], location.pathname.replace('.html', '.js'), 'pathname');
assert_equals(e.data[7], location.search, 'search');
assert_equals(e.data[8], '', 'hash');
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.js
new file mode 100644
index 00000000000..37235eac831
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/members.js
@@ -0,0 +1,3 @@
+postMessage([null, location.href, location.protocol, location.host,
+ location.hostname, location.port, location.pathname,
+ location.search, location.hash]); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html
index 40559c1660c..b69ea3aa058 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(location === location);
-/*
--->
<!doctype html>
<title>location === location</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(location === location);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('returns-same-object.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.js
new file mode 100644
index 00000000000..c004d8f7e56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/returns-same-object.js
@@ -0,0 +1 @@
+postMessage(location === location); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.html
index d2f470ffcb4..7ea79b68970 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.html
@@ -1,19 +1,3 @@
-<!--
-var exceptions = [];
-try { location.href = 1; } catch(e) { exceptions.push('href'); }
-try { location.protocol = 1; } catch(e) { exceptions.push('protocol'); }
-try { location.host = 1; } catch(e) { exceptions.push('host'); }
-try { location.hostname = 1; } catch(e) { exceptions.push('hostname');}
-try { location.port = 1; } catch(e) { exceptions.push('port'); }
-try { location.pathname = 1; } catch(e) { exceptions.push('pathname'); }
-try { location.search = 1; } catch(e) { exceptions.push('search'); }
-try { location.hash = 1; } catch(e) { exceptions.push('hash'); }
-
-postMessage([null, location.href, location.protocol, location.host,
- location.hostname, location.port, location.pathname,
- location.search, location.hash, exceptions]);
-/*
--->
<!doctype html>
<title>setting members of WorkerLocation</title>
<script src="/resources/testharness.js"></script>
@@ -21,23 +5,19 @@ postMessage([null, location.href, location.protocol, location.host,
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('setting-members.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data[0], null);
- assert_equals(e.data[1], location.href + '#', 'href');
+ assert_equals(e.data[1], location.href.replace('.html', '.js'), 'href');
assert_equals(e.data[2], location.protocol, 'protocol');
assert_equals(e.data[3], location.host, 'host');
assert_equals(e.data[4], location.hostname, 'hostname');
assert_equals(e.data[5], location.port, 'port');
- assert_equals(e.data[6], location.pathname, 'pathname');
+ assert_equals(e.data[6], location.pathname.replace('.html', '.js'), 'pathname');
assert_equals(e.data[7], location.search, 'search');
assert_equals(e.data[8], '', 'hash');
assert_array_equals(e.data[9], [], 'number of exceptions');
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.js
new file mode 100644
index 00000000000..4c5c8a35ae8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/location/setting-members.js
@@ -0,0 +1,13 @@
+var exceptions = [];
+try { location.href = 1; } catch(e) { exceptions.push('href'); }
+try { location.protocol = 1; } catch(e) { exceptions.push('protocol'); }
+try { location.host = 1; } catch(e) { exceptions.push('host'); }
+try { location.hostname = 1; } catch(e) { exceptions.push('hostname');}
+try { location.port = 1; } catch(e) { exceptions.push('port'); }
+try { location.pathname = 1; } catch(e) { exceptions.push('pathname'); }
+try { location.search = 1; } catch(e) { exceptions.push('search'); }
+try { location.hash = 1; } catch(e) { exceptions.push('hash'); }
+
+postMessage([null, location.href, location.protocol, location.host,
+ location.hostname, location.port, location.pathname,
+ location.search, location.hash, exceptions]); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
index 4b5af71d516..840433d3d89 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html
@@ -1,13 +1,3 @@
-<!--
-onerror = function(a, b, c, d) {
- y(); // the error is "not handled"
-}
-function x() {
- y();
-}
-x();
-/*
--->
<!doctype html>
<title>onerror, "not handled" with an error in the onerror function</title>
<script src="/resources/testharness.js"></script>
@@ -15,18 +5,15 @@ x();
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('exception-in-onerror.js');
worker.onerror = this.step_func(function(e) {
assert_true(e instanceof ErrorEvent, 'e instanceof ErrorEvent');
assert_equals(typeof e.message, 'string', 'typeof e.message');
- assert_equals(e.filename, document.URL+'#', 'e.filename');
+ assert_equals(e.filename, document.URL.replace('.html', '.js'), 'e.filename');
assert_equals(typeof e.lineno, 'number', 'typeof e.lineno');
assert_equals(typeof e.colno, 'number', 'typeof e.column');
e.preventDefault(); // "handled"
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js
new file mode 100644
index 00000000000..2bf4124cb74
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/exception-in-onerror.js
@@ -0,0 +1,7 @@
+onerror = function(a, b, c, d) {
+ y(); // the error is "not handled"
+}
+function x() {
+ y();
+}
+x(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.html
index 56fee8e0635..7d4b03c6cd3 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.html
@@ -1,14 +1,3 @@
-<!--
-onerror = function(a, b, c, d) {
- postMessage([a, b, c, d]);
- return true; // the error is "handled"
-}
-function x() {
- y();
-}
-x();
-/*
--->
<!doctype html>
<title>onerror, "handled"</title>
<script src="/resources/testharness.js"></script>
@@ -16,10 +5,10 @@ x();
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('handled.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(typeof e.data[0], 'string', 'first argument');
- assert_equals(e.data[1], document.URL+'#', 'second argument');
+ assert_equals(e.data[1], document.URL.replace('.html', '.js'), 'second argument');
assert_equals(typeof e.data[2], 'number', 'third argument');
assert_equals(typeof e.data[3], 'number', 'fourth argument');
setTimeout(this.step_func(function() {
@@ -30,7 +19,4 @@ async_test(function() {
assert_unreached();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.js
new file mode 100644
index 00000000000..e58fa4a5152
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/handled.js
@@ -0,0 +1,8 @@
+onerror = function(a, b, c, d) {
+ postMessage([a, b, c, d]);
+ return true; // the error is "handled"
+}
+function x() {
+ y();
+}
+x(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
index f6107ada433..96fdb4a6f11 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.html
@@ -1,13 +1,3 @@
-<!--
-onerror = function(a, b, c, d) {
- return false; // the error is "not handled"
-}
-function x() {
- y();
-}
-x();
-/*
--->
<!doctype html>
<title>onerror, "not handled"</title>
<script src="/resources/testharness.js"></script>
@@ -15,18 +5,15 @@ x();
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('not-handled.js');
worker.onerror = this.step_func(function(e) {
assert_true(e instanceof ErrorEvent, 'e instanceof ErrorEvent');
assert_equals(typeof e.message, 'string', 'typeof e.message');
- assert_equals(e.filename, document.URL+'#', 'e.filename');
+ assert_equals(e.filename, document.URL.replace('.html', '.js'), 'e.filename');
assert_equals(typeof e.lineno, 'number', 'typeof e.lineno');
assert_equals(typeof e.colno, 'number', 'typeof e.column');
e.preventDefault(); // "handled"
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.js
new file mode 100644
index 00000000000..c3254b0ba7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/not-handled.js
@@ -0,0 +1,7 @@
+onerror = function(a, b, c, d) {
+ return false; // the error is "not handled"
+}
+function x() {
+ y();
+}
+x(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
index b6a61e2355c..b3be7726797 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html
@@ -1,10 +1,3 @@
-<!--
-function x() {
- y();
-}
-x();
-/*
--->
<!doctype html>
<title>onerror, "not handled" with only window.onerror defined</title>
<script src="/resources/testharness.js"></script>
@@ -15,17 +8,14 @@ setup({
allow_uncaught_exception: true,
});
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('propagate-to-window-onerror.js');
window.onerror = this.step_func(function(a, b, c, d) {
assert_equals(typeof a, 'string', 'first argument');
- assert_equals(b, document.URL+'#', 'second argument');
+ assert_equals(b, document.URL.replace('.html', '.js'), 'second argument');
assert_equals(typeof c, 'number', 'third argument');
assert_equals(typeof d, 'number', 'fourth argument');
this.done();
return true; // "handled"
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js
new file mode 100644
index 00000000000..0daf488d6f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.js
@@ -0,0 +1,4 @@
+function x() {
+ y();
+}
+x(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.html
index 39c2c36c00d..41522dfdd53 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.html
@@ -1,23 +1,3 @@
-<!--
-var results = [];
-function check(func, msg) {
- try {
- results.push([func(), msg]);
- } catch(ex) {
- results.push([String(ex), msg]);
- }
-}
-check(function() { return self === self; }, 'self === self');
-check(function() { return self instanceof WorkerGlobalScope; }, 'self instanceof WorkerGlobalScope');
-check(function() { return 'self' in self; }, '\'self\' in self');
-check(function() {
- var x = self;
- self = 1;
- return x === self;
-}, 'self = 1');
-postMessage(results);
-/*
--->
<!doctype html>
<title>self</title>
<script src="/resources/testharness.js"></script>
@@ -25,7 +5,7 @@ postMessage(results);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('self.js');
worker.onmessage = this.step_func(function(e) {
for (var i = 0; i < e.data.length; ++i) {
assert_true(e.data[i][0], e.data[i][1]);
@@ -33,7 +13,4 @@ async_test(function() {
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.js
new file mode 100644
index 00000000000..5d3c560d49b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerGlobalScope/self.js
@@ -0,0 +1,17 @@
+var results = [];
+function check(func, msg) {
+ try {
+ results.push([func(), msg]);
+ } catch(ex) {
+ results.push([String(ex), msg]);
+ }
+}
+check(function() { return self === self; }, 'self === self');
+check(function() { return self instanceof WorkerGlobalScope; }, 'self instanceof WorkerGlobalScope');
+check(function() { return 'self' in self; }, '\'self\' in self');
+check(function() {
+ var x = self;
+ self = 1;
+ return x === self;
+}, 'self = 1');
+postMessage(results); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.html
index a80897518a1..9fe5e2b1bc7 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.html
@@ -1,7 +1,3 @@
-<!--
-setTimeout(function() { postMessage(1) }, 10);
-/*
--->
<!doctype html>
<title>setTimeout</title>
<script src="/resources/testharness.js"></script>
@@ -9,15 +5,10 @@ setTimeout(function() { postMessage(1) }, 10);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('001.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 1);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.js
new file mode 100644
index 00000000000..bd5b7c4071c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/001.js
@@ -0,0 +1 @@
+setTimeout(function() { postMessage(1) }, 10); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.html
index 06685a9056a..1a10b3d0bb8 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.html
@@ -1,8 +1,3 @@
-<!--
-var t = setTimeout(function() { postMessage(1); }, 10);
-clearTimeout(t);
-/*
--->
<!doctype html>
<title>clearTimeout</title>
<script src="/resources/testharness.js"></script>
@@ -10,12 +5,9 @@ clearTimeout(t);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('002.js');
var gotMessage = false;
worker.onmessage = function() { gotMessage = true; };
setTimeout(this.step_func(function() { assert_false(gotMessage); this.done(); }), 100);
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.js
new file mode 100644
index 00000000000..a96c0884420
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/002.js
@@ -0,0 +1,2 @@
+var t = setTimeout(function() { postMessage(1); }, 10);
+clearTimeout(t); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.html
index 942f139fa52..119d109b5fd 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.html
@@ -1,7 +1,3 @@
-<!--
-setInterval(function() { postMessage(1); }, 10);
-/*
--->
<!doctype html>
<title>setInterval</title>
<script src="/resources/testharness.js"></script>
@@ -9,14 +5,10 @@ setInterval(function() { postMessage(1); }, 10);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('003.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 1);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.js
new file mode 100644
index 00000000000..e64e4e2179f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/003.js
@@ -0,0 +1 @@
+setInterval(function() { postMessage(1); }, 10); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.html
index 5548eec4ab4..83d7bf915fb 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.html
@@ -1,10 +1,3 @@
-<!--
-var t = setInterval(function() {
- postMessage(1);
-}, 10);
-clearInterval(t);
-/*
--->
<!doctype html>
<title>clearInterval</title>
<script src="/resources/testharness.js"></script>
@@ -12,12 +5,9 @@ clearInterval(t);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('004.js');
var i = 0;
worker.onmessage = function() { i++; }
setTimeout(this.step_func(function() { assert_equals(i, 0); this.done(); }), 100);
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.js
new file mode 100644
index 00000000000..e80d79a8e51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/004.js
@@ -0,0 +1,4 @@
+var t = setInterval(function() {
+ postMessage(1);
+}, 10);
+clearInterval(t); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.html
index b86eff1fbdd..2a181d55d0d 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.html
@@ -1,9 +1,3 @@
-<!--
-self.close();
-var t = setInterval(function() {}, 10);
-postMessage(t);
-/*
--->
<!doctype html>
<title>setInterval when closing</title>
<script src="/resources/testharness.js"></script>
@@ -11,13 +5,10 @@ postMessage(t);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('005.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 1);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.js
new file mode 100644
index 00000000000..125c224e7bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/WindowTimers/005.js
@@ -0,0 +1,3 @@
+self.close();
+var t = setInterval(function() {}, 10);
+postMessage(t); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.html
index 7ff30ae2a61..5dcd08aa154 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.html
@@ -1,14 +1,3 @@
-<!--
-var x = 'a';
-try {
- importScripts('data:text/javascript,x+="b"',
- 'data:text/javascript,x+="c"');
-} catch(e) {
- x += "d"
-}
-postMessage(x);
-/*
--->
<!doctype html>
<title>importScripts running scripts</title>
<script src="/resources/testharness.js"></script>
@@ -16,13 +5,10 @@ postMessage(x);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('003.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, "abc");
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.js
new file mode 100644
index 00000000000..6e378ef20ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/003.js
@@ -0,0 +1,8 @@
+var x = 'a';
+try {
+ importScripts('data:text/javascript,x+="b"',
+ 'data:text/javascript,x+="c"');
+} catch(e) {
+ x += "d"
+}
+postMessage(x); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.html
index 2d39d3ce72e..62537e08881 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.html
@@ -1,19 +1,3 @@
-<!--
-var x = '';
-var exception;
-try {
- importScripts('data:text/javascript,x+="first script successful. "',
- 'data:text/javascript,x+="FAIL (second script). "; for(;) break;', // doesn't compile
- 'data:text/javascript,x+="FAIL (third script)"');
-} catch(ex) {
- if (ex instanceof SyntaxError)
- exception = true;
- else
- exception = String(ex);
-}
-postMessage([x, exception]);
-/*
--->
<!doctype html>
<title>importScripts broken script</title>
<script src="/resources/testharness.js"></script>
@@ -21,14 +5,11 @@ postMessage([x, exception]);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('004.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data[0], "first script successful. ");
assert_true(e.data[1], 'expected SyntaxError');
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.js
new file mode 100644
index 00000000000..98040d0d48d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/004.js
@@ -0,0 +1,13 @@
+var x = '';
+var exception;
+try {
+ importScripts('data:text/javascript,x+="first script successful. "',
+ 'data:text/javascript,x+="FAIL (second script). "; for(;) break;', // doesn't compile
+ 'data:text/javascript,x+="FAIL (third script)"');
+} catch(ex) {
+ if (ex instanceof SyntaxError)
+ exception = true;
+ else
+ exception = String(ex);
+}
+postMessage([x, exception]); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.html
index f8abe14c23e..7ebbc1be559 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.html
@@ -1,15 +1,3 @@
-<!--
-var x;
-var y;
-try {
- importScripts('data:text/javascript,x={',
- 'data:text/javascript,}');
-} catch(e) {
- y = true;
-}
-postMessage([x, y]);
-/*
--->
<!doctype html>
<title>importScripts separate scripts</title>
<script src="/resources/testharness.js"></script>
@@ -17,14 +5,11 @@ postMessage([x, y]);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('005.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data[0], undefined);
assert_true(e.data[1]);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.js
new file mode 100644
index 00000000000..18c534efa9c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/005.js
@@ -0,0 +1,9 @@
+var x;
+var y;
+try {
+ importScripts('data:text/javascript,x={',
+ 'data:text/javascript,}');
+} catch(e) {
+ y = true;
+}
+postMessage([x, y]); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.html
index f311ccfb0d8..aec2fb14833 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.html
@@ -1,17 +1,3 @@
-<!--
-var x;
-var y;
-var z;
-try {
- importScripts('data:text/javascript,x=1',
- 'data:text/javascript,throw 2',
- 'data:text/javascript,z=3');
-} catch(e) {
- y = e;
-}
-postMessage([x, y, z]);
-/*
--->
<!doctype html>
<title>importScripts uncaught exception</title>
<meta name="timeout" content="long">
@@ -20,7 +6,7 @@ postMessage([x, y, z]);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('006.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data[0], 1);
assert_equals(e.data[1], 2);
@@ -28,7 +14,4 @@ async_test(function() {
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.js
new file mode 100644
index 00000000000..fc170f790c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/006.js
@@ -0,0 +1,11 @@
+var x;
+var y;
+var z;
+try {
+ importScripts('data:text/javascript,x=1',
+ 'data:text/javascript,throw 2',
+ 'data:text/javascript,z=3');
+} catch(e) {
+ y = e;
+}
+postMessage([x, y, z]); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.html
index 128fb1b64f7..37e888365f7 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.html
@@ -1,8 +1,3 @@
-<!--
-importScripts('data:text/javascript,postMessage(1)');
-postMessage(2);
-/*
--->
<!doctype html>
<title>postMessage in importScripts</title>
<script src="/resources/testharness.js"></script>
@@ -10,7 +5,7 @@ postMessage(2);
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('007.js');
var i = 0;
worker.onmessage = this.step_func(function(e) {
i++;
@@ -19,7 +14,4 @@ async_test(function() {
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.js
new file mode 100644
index 00000000000..dc85216f3df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/007.js
@@ -0,0 +1,2 @@
+importScripts('data:text/javascript,postMessage(1)');
+postMessage(2); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.html
index 07b800ebb89..f72b79939c0 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.html
@@ -1,9 +1,3 @@
-<!--
-var log = postMessage;
-importScripts('data:text/javascript,function run() { log(true) }');
-run();
-/*
--->
<!doctype html>
<title>variables and functions crossing importScripts boundary</title>
<script src="/resources/testharness.js"></script>
@@ -11,13 +5,10 @@ run();
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('008.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.js
new file mode 100644
index 00000000000..c957fcd6353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/008.js
@@ -0,0 +1,3 @@
+var log = postMessage;
+importScripts('data:text/javascript,function run() { log(true) }');
+run(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.html
index 95d3839dc23..e0eb5488c2e 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.html
@@ -1,9 +1,3 @@
-<!--
-var log = postMessage;
-importScripts('data:text/javascript,function run() { for(var i = 0; i < 1000; ++i) { if (i == 500) log(true); } return 1; }');
-postMessage(run());
-/*
--->
<!doctype html>
<title>variables and functions crossing importScripts boundary, take 2</title>
<script src="/resources/testharness.js"></script>
@@ -11,7 +5,7 @@ postMessage(run());
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('009.js');
var i = 0;
worker.onmessage = this.step_func(function(e) {
i++;
@@ -23,7 +17,4 @@ async_test(function() {
}
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.js
new file mode 100644
index 00000000000..4b86f8c3030
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/009.js
@@ -0,0 +1,3 @@
+var log = postMessage;
+importScripts('data:text/javascript,function run() { for(var i = 0; i < 1000; ++i) { if (i == 500) log(true); } return 1; }');
+postMessage(run()); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.html
index 9c76e7d4daa..a6db49c4be9 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.html
@@ -1,17 +1,3 @@
-<!--
-// prevent recursion
-if ('beenThere' in self) {
- throw 'undefined stringified to the empty string';
-}
-beenThere = true;
-try {
- importScripts(undefined);
- postMessage(got);
-} catch(ex) {
- postMessage(String(ex));
-}
-/*
--->
<!doctype html>
<title>importScripts(undefined)</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +5,7 @@ try {
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('010.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'undefined');
this.done();
@@ -28,7 +14,4 @@ async_test(function() {
assert_unreached(e.message);
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.js
new file mode 100644
index 00000000000..4ec4a3b8c75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/010.js
@@ -0,0 +1,11 @@
+// prevent recursion
+if ('beenThere' in self) {
+ throw 'undefined stringified to the empty string';
+}
+beenThere = true;
+try {
+ importScripts(undefined);
+ postMessage(got);
+} catch(ex) {
+ postMessage(String(ex));
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.html
index 46499318fb3..1bfb2334975 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.html
@@ -1,17 +1,3 @@
-<!--
-// prevent recursion
-if ('beenThere' in self) {
- throw 'null stringified to the empty string';
-}
-beenThere = true;
-try {
- importScripts(null);
- postMessage(got);
-} catch(ex) {
- postMessage(String(ex));
-}
-/*
--->
<!doctype html>
<title>importScripts(null)</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +5,7 @@ try {
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('011.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'null');
this.done();
@@ -28,7 +14,4 @@ async_test(function() {
assert_unreached(e.message);
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.js
new file mode 100644
index 00000000000..bd6fed5c0a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/011.js
@@ -0,0 +1,11 @@
+// prevent recursion
+if ('beenThere' in self) {
+ throw 'null stringified to the empty string';
+}
+beenThere = true;
+try {
+ importScripts(null);
+ postMessage(got);
+} catch(ex) {
+ postMessage(String(ex));
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.html
index f7622bdc9df..ab0778d0c71 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.html
@@ -1,17 +1,3 @@
-<!--
-// prevent recursion
-if ('beenThere' in self) {
- throw '1 stringified to the empty string';
-}
-beenThere = true;
-try {
- importScripts(1);
- postMessage(got);
-} catch(ex) {
- postMessage(String(ex));
-}
-/*
--->
<!doctype html>
<title>importScripts(1)</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +5,7 @@ try {
<div id="log"></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('012.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '1');
this.done();
@@ -28,7 +14,4 @@ async_test(function() {
assert_unreached(e.message);
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.js
new file mode 100644
index 00000000000..f4c887f7df4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/012.js
@@ -0,0 +1,11 @@
+// prevent recursion
+if ('beenThere' in self) {
+ throw '1 stringified to the empty string';
+}
+beenThere = true;
+try {
+ importScripts(1);
+ postMessage(got);
+} catch(ex) {
+ postMessage(String(ex));
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.html
index d3aa2ec658d..4c76e2b6990 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.appName);
-/*
--->
<!doctype html>
<title>navigator.appName</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.appName);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('002.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.appName);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.js
new file mode 100644
index 00000000000..a5af348ef10
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/002.js
@@ -0,0 +1 @@
+postMessage(navigator.appName); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.html
index a2e5c948791..86ab5aee489 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.appVersion);
-/*
--->
<!doctype html>
<title>navigator.appVersion</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.appVersion);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('003.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.appVersion);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.js
new file mode 100644
index 00000000000..ff92f8aadb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/003.js
@@ -0,0 +1 @@
+postMessage(navigator.appVersion); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.html
index 2231c4ab821..93eee009571 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.platform);
-/*
--->
<!doctype html>
<title>navigator.platform</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.platform);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('004.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.platform);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.js
new file mode 100644
index 00000000000..c1b575e43c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/004.js
@@ -0,0 +1 @@
+postMessage(navigator.platform); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.html
index b3d99588f75..ad2899e62ea 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.userAgent);
-/*
--->
<!doctype html>
<title>navigator.userAgent</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.userAgent);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('005.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.userAgent);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.js
new file mode 100644
index 00000000000..d62252d39b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/005.js
@@ -0,0 +1 @@
+postMessage(navigator.userAgent); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.html
index c027d630d4c..e0f7386af31 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.onLine);
-/*
--->
<!doctype html>
<title>navigator.onLine</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.onLine);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('006.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.onLine);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.js
new file mode 100644
index 00000000000..325fd0fbdec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/006.js
@@ -0,0 +1 @@
+postMessage(navigator.onLine); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.html
index a6afc563710..8f9d38dd857 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.html
@@ -1,15 +1,3 @@
-<!--
-var log = [];
-var neverEncounteredValue = "This is not the value you are looking for.";
-for (x in navigator) {
- // this should silently fail and not throw per webidl
- navigator[x] = neverEncounteredValue;
- if (navigator[x] === neverEncounteredValue)
- log.push(x);
-}
-postMessage(log.join(', '));
-/*
--->
<!doctype html>
<title>readonlyness of members of Navigator</title>
<script src="/resources/testharness.js"></script>
@@ -17,14 +5,10 @@ postMessage(log.join(', '));
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('007.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.js
new file mode 100644
index 00000000000..d0879da9088
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/007.js
@@ -0,0 +1,9 @@
+var log = [];
+var neverEncounteredValue = "This is not the value you are looking for.";
+for (x in navigator) {
+ // this should silently fail and not throw per webidl
+ navigator[x] = neverEncounteredValue;
+ if (navigator[x] === neverEncounteredValue)
+ log.push(x);
+}
+postMessage(log.join(', ')); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.html b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.html
index f1aa446cb9a..535ab3a7cb9 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.html
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(navigator.language);
-/*
--->
<!doctype html>
<title>navigator.language</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage(navigator.language);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('language.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, navigator.language);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.js
new file mode 100644
index 00000000000..e94ba4dfcf1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/language.js
@@ -0,0 +1 @@
+postMessage(navigator.language); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.html b/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.html
index d71aeaf0a88..5f2746b5463 100644
--- a/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.html
+++ b/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.html
@@ -1,17 +1,3 @@
-<!--
-if ('onmessage' in self) { // dedicated worker
- onmessage = function(e) {
- postMessage(navigator.onLine);
- }
-} else { // shared worker
- onconnect = function(e) {
- e.ports[0].onmessage = function(e) {
- this.postMessage(navigator.onLine);
- }
- }
-}
-/*
--->
<!doctype html>
<title>navigator.onLine in dedicated worker</title>
<pre>Log:
@@ -19,7 +5,7 @@ if ('onmessage' in self) { // dedicated worker
<script>
var pre = document.querySelector('pre');
var worker, shared;
-try { worker = new Worker('#'); } catch(e) { pre.textContent += '\nnew Worker threw: ' + e.message; }
+try { worker = new Worker('navigator-onLine.js'); } catch(e) { pre.textContent += '\nnew Worker threw: ' + e.message; }
try { shared = new SharedWorker('#', ''); } catch(e) { pre.textContent += '\nnew SharedWorker threw: ' + e.message; }
if (worker) {
worker.onmessage = function(e) {
@@ -40,7 +26,4 @@ update();
ononline = onoffline = update;
</script>
<p>As you go online and offline, the log should be filled with the correct status of navigator.onLine.</p>
-<p><button onclick="update()">Check navigator.onLine status</button></p>
-<!--
-*/
-//-->
+<p><button onclick="update()">Check navigator.onLine status</button></p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.js b/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.js
new file mode 100644
index 00000000000..592b286bb35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/non-automated/navigator-onLine.js
@@ -0,0 +1,11 @@
+if ('onmessage' in self) { // dedicated worker
+ onmessage = function(e) {
+ postMessage(navigator.onLine);
+ }
+} else { // shared worker
+ onconnect = function(e) {
+ e.ports[0].onmessage = function(e) {
+ this.postMessage(navigator.onLine);
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html
index 0ebec0b0338..05ee5e006b4 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html
@@ -1,7 +1,3 @@
-<!--
-postMessage('å');
-/*
--->
<!doctype html>
<title>encoding, dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -9,13 +5,10 @@ postMessage('å');
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('001.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '\u00e5');
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html.headers b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html.headers
deleted file mode 100644
index 2340a89c93c..00000000000
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Content-Type: text/html; charset=windows-1252
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js
new file mode 100644
index 00000000000..03bc557c33c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js
@@ -0,0 +1 @@
+postMessage('å'); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js.headers b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js.headers
new file mode 100644
index 00000000000..5614aaa7f0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/001.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=windows-1252
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html
index fdcc4f0a21c..fecbffc18da 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html
@@ -1,9 +1,3 @@
-<!--
-onconnect = function(e) {
- e.ports[0].postMessage('å');
-}
-/*
--->
<!doctype html>
<title>encoding, shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -11,13 +5,10 @@ onconnect = function(e) {
<div id=log></div>
<script>
async_test(function() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('002.js', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '\u00e5');
this.done();
});
});
</script>
-<!--
-*/
-//--> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html.headers b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html.headers
deleted file mode 100644
index 2340a89c93c..00000000000
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Content-Type: text/html; charset=windows-1252
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js
new file mode 100644
index 00000000000..9dde7bbda92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js
@@ -0,0 +1,3 @@
+onconnect = function(e) {
+ e.ports[0].postMessage('å');
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js.headers b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js.headers
new file mode 100644
index 00000000000..5614aaa7f0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/002.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=windows-1252
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/003.html b/tests/wpt/web-platform-tests/workers/semantics/encodings/003.html
index a0f964c3c4d..095320e4d14 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/003.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/003.html
@@ -1,12 +1,3 @@
-<!--
-var xhr = new XMLHttpRequest();
-xhr.open('GET', '003-1.py?x=å', false);
-xhr.send();
-var passed = xhr.responseText == 'PASS';
-postMessage(passed);
-
-/*
--->
<!doctype html>
<title>URL encoding, dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -14,13 +5,10 @@ postMessage(passed);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('003.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/003.js b/tests/wpt/web-platform-tests/workers/semantics/encodings/003.js
new file mode 100644
index 00000000000..35bda8bba88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/003.js
@@ -0,0 +1,5 @@
+var xhr = new XMLHttpRequest();
+xhr.open('GET', '003-1.py?x=å', false);
+xhr.send();
+var passed = xhr.responseText == 'PASS';
+postMessage(passed); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/004.html b/tests/wpt/web-platform-tests/workers/semantics/encodings/004.html
index bb144263310..cd556b8190e 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/encodings/004.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/004.html
@@ -1,13 +1,3 @@
-<!--
-onconnect = function(e) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', '003-1.py?x=å', false);
- xhr.send();
- var passed = xhr.responseText == 'PASS';
- e.ports[0].postMessage(passed);
-}
-/*
--->
<!doctype html>
<title>URL encoding, shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -15,13 +5,10 @@ onconnect = function(e) {
<div id=log></div>
<script>
async_test(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('004.js');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/encodings/004.js b/tests/wpt/web-platform-tests/workers/semantics/encodings/004.js
new file mode 100644
index 00000000000..5146929a73b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/encodings/004.js
@@ -0,0 +1,7 @@
+onconnect = function(e) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', '003-1.py?x=å', false);
+ xhr.send();
+ var passed = xhr.responseText == 'PASS';
+ e.ports[0].postMessage(passed);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.html b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.html
index 1ed257ff880..99e8b3a0f3d 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.html
@@ -1,88 +1,3 @@
-<!--
-onconnect = function(e) {
- var expected = [
- // https://html.spec.whatwg.org/
- "ApplicationCache",
- "WorkerGlobalScope",
- "SharedWorkerGlobalScope",
- "Worker",
- "SharedWorker",
- "MessagePort",
- "MessageEvent",
- "WorkerNavigator",
- "MessageChannel",
- "WorkerLocation",
- "ImageData",
- "ImageBitmap",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasPath",
- "Path2D",
- "PromiseRejectionEvent",
- "EventSource",
- "WebSocket",
- "CloseEvent",
- "BroadcastChannel",
- // https://tc39.github.io/ecma262/
- "ArrayBuffer",
- "Int8Array",
- "Uint8Array",
- "Uint8ClampedArray",
- "Int16Array",
- "Uint16Array",
- "Int32Array",
- "Uint32Array",
- "Float32Array",
- "Float64Array",
- "DataView",
- // https://xhr.spec.whatwg.org/
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLHttpRequest",
- "ProgressEvent",
- "FormData",
- // https://url.spec.whatwg.org/
- "URL",
- "URLSearchParams",
- // https://w3c.github.io/FileAPI/
- "File",
- "Blob",
- "FileList",
- "FileReader",
- "FileReaderSync",
- // https://dom.spec.whatwg.org/
- "EventTarget",
- "ErrorEvent",
- "Event",
- "CustomEvent",
- // http://heycam.github.io/webidl/
- "DOMException",
- // https://streams.spec.whatwg.org/
- "ReadableStream",
- "WritableStream",
- "ByteLengthQueuingStrategy",
- "CountQueuingStrategy",
- // http://w3c.github.io/IndexedDB/
- "IDBRequest",
- "IDBOpenDBRequest",
- "IDBVersionChangeEvent",
- "IDBFactory",
- "IDBDatabase",
- "IDBObjectStore",
- "IDBIndex",
- "IDBKeyRange",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBTransaction",
- ];
- var result = [];
- for (var i = 0; i < expected.length; ++i) {
- result.push([expected[i], expected[i] in self]);
- }
- e.ports[0].postMessage(result);
-}
-/*
--->
<!doctype html>
<title>available interface objects in shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -90,7 +5,7 @@ onconnect = function(e) {
<div id=log></div>
<script>
setup(function() {
- window.worker = new SharedWorker('#');
+ window.worker = new SharedWorker('003.js');
worker.port.onmessage = function(e) {
var result = e.data;
for (var i = 0; i < result.length; ++i) {
@@ -101,8 +16,4 @@ setup(function() {
done();
}
}, {explicit_done: true});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.js b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.js
new file mode 100644
index 00000000000..a91e7c38759
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/003.js
@@ -0,0 +1,82 @@
+onconnect = function(e) {
+ var expected = [
+ // https://html.spec.whatwg.org/
+ "ApplicationCache",
+ "WorkerGlobalScope",
+ "SharedWorkerGlobalScope",
+ "Worker",
+ "SharedWorker",
+ "MessagePort",
+ "MessageEvent",
+ "WorkerNavigator",
+ "MessageChannel",
+ "WorkerLocation",
+ "ImageData",
+ "ImageBitmap",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasPath",
+ "Path2D",
+ "PromiseRejectionEvent",
+ "EventSource",
+ "WebSocket",
+ "CloseEvent",
+ "BroadcastChannel",
+ // https://tc39.github.io/ecma262/
+ "ArrayBuffer",
+ "Int8Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "Int16Array",
+ "Uint16Array",
+ "Int32Array",
+ "Uint32Array",
+ "Float32Array",
+ "Float64Array",
+ "DataView",
+ // https://xhr.spec.whatwg.org/
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLHttpRequest",
+ "ProgressEvent",
+ "FormData",
+ // https://url.spec.whatwg.org/
+ "URL",
+ "URLSearchParams",
+ // https://w3c.github.io/FileAPI/
+ "File",
+ "Blob",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ // https://dom.spec.whatwg.org/
+ "EventTarget",
+ "ErrorEvent",
+ "Event",
+ "CustomEvent",
+ // http://heycam.github.io/webidl/
+ "DOMException",
+ // https://streams.spec.whatwg.org/
+ "ReadableStream",
+ "WritableStream",
+ "ByteLengthQueuingStrategy",
+ "CountQueuingStrategy",
+ // http://w3c.github.io/IndexedDB/
+ "IDBRequest",
+ "IDBOpenDBRequest",
+ "IDBVersionChangeEvent",
+ "IDBFactory",
+ "IDBDatabase",
+ "IDBObjectStore",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBTransaction",
+ ];
+ var result = [];
+ for (var i = 0; i < expected.length; ++i) {
+ result.push([expected[i], expected[i] in self]);
+ }
+ e.ports[0].postMessage(result);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.html b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.html
index 0c3a3d824c9..b4a09c50e4e 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.html
@@ -1,51 +1,3 @@
-<!--
-onconnect = function(e) {
- var unexpected = [
- // https://html.spec.whatwg.org/
- "DedicatedWorkerGlobalScope",
- "AbstractView",
- "AbstractWorker",
- "Location",
- "Navigator",
- "DOMImplementation",
- "Audio",
- "HTMLCanvasElement",
- "Path",
- "TextMetrics",
- "CanvasProxy",
- "CanvasRenderingContext2D",
- "DrawingStyle",
- "PopStateEvent",
- "HashChangeEvent",
- "PageTransitionEvent",
- // https://streams.spec.whatwg.org/
- "ReadableStreamDefaultReader",
- "ReadableStreamBYOBReader",
- "ReadableStreamDefaultController",
- "ReadableByteStreamController",
- "WritableStreamDefaultWriter",
- "WritableStreamDefaultController",
- // http://w3c.github.io/IndexedDB/
- "IDBEnvironment",
- // https://www.w3.org/TR/2010/NOTE-webdatabase-20101118/
- "Database",
- // https://w3c.github.io/uievents/
- "UIEvent",
- "FocusEvent",
- "MouseEvent",
- "WheelEvent",
- "InputEvent",
- "KeyboardEvent",
- "CompositionEvent",
- ];
- var result = [];
- for (var i = 0; i < unexpected.length; ++i) {
- result.push([unexpected[i], unexpected[i] in self]);
- }
- e.ports[0].postMessage(result);
-}
-/*
--->
<!doctype html>
<title>unavailable interface objects in shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -53,7 +5,7 @@ onconnect = function(e) {
<div id=log></div>
<script>
setup(function() {
- window.worker = new SharedWorker('#');
+ window.worker = new SharedWorker('004.js');
worker.port.onmessage = function(e) {
var result = e.data;
for (var i = 0; i < result.length; ++i) {
@@ -64,8 +16,4 @@ setup(function() {
done();
}
}, {explicit_done: true});
-</script>
-<!--
-*/
-//-->
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.js b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.js
new file mode 100644
index 00000000000..00e50d19cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/004.js
@@ -0,0 +1,45 @@
+onconnect = function(e) {
+ var unexpected = [
+ // https://html.spec.whatwg.org/
+ "DedicatedWorkerGlobalScope",
+ "AbstractView",
+ "AbstractWorker",
+ "Location",
+ "Navigator",
+ "DOMImplementation",
+ "Audio",
+ "HTMLCanvasElement",
+ "Path",
+ "TextMetrics",
+ "CanvasProxy",
+ "CanvasRenderingContext2D",
+ "DrawingStyle",
+ "PopStateEvent",
+ "HashChangeEvent",
+ "PageTransitionEvent",
+ // https://streams.spec.whatwg.org/
+ "ReadableStreamDefaultReader",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamDefaultController",
+ "ReadableByteStreamController",
+ "WritableStreamDefaultWriter",
+ "WritableStreamDefaultController",
+ // http://w3c.github.io/IndexedDB/
+ "IDBEnvironment",
+ // https://www.w3.org/TR/2010/NOTE-webdatabase-20101118/
+ "Database",
+ // https://w3c.github.io/uievents/
+ "UIEvent",
+ "FocusEvent",
+ "MouseEvent",
+ "WheelEvent",
+ "InputEvent",
+ "KeyboardEvent",
+ "CompositionEvent",
+ ];
+ var result = [];
+ for (var i = 0; i < unexpected.length; ++i) {
+ result.push([unexpected[i], unexpected[i] in self]);
+ }
+ e.ports[0].postMessage(result);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.html b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.html
index 65e7917ad7a..f9e2bbeabab 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.html
@@ -1,17 +1,3 @@
-<!--
-if ('onmessage' in self) { // dedicated worker
- onmessage = function(e) {
- postMessage(e.data);
- }
-} else { // shared worker
- onconnect = function(e) {
- e.ports[0].onmessage = function(e) {
- this.postMessage(e.data);
- }
- }
-}
-/*
--->
<!doctype html>
<title>dedicated and shared worker in same page</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +5,7 @@ if ('onmessage' in self) { // dedicated worker
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('001.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'dedicated');
this.done();
@@ -27,14 +13,11 @@ async_test(function() {
worker.postMessage('dedicated');
}, 'dedicated');
async_test(function() {
- var shared = new SharedWorker('#', '');
+ var shared = new SharedWorker('001.js', '');
shared.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, 'shared');
this.done();
});
shared.port.postMessage('shared');
}, 'shared');
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.js b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.js
new file mode 100644
index 00000000000..6d51169dea0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/001.js
@@ -0,0 +1,11 @@
+if ('onmessage' in self) { // dedicated worker
+ onmessage = function(e) {
+ postMessage(e.data);
+ }
+} else { // shared worker
+ onconnect = function(e) {
+ e.ports[0].onmessage = function(e) {
+ this.postMessage(e.data);
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.html b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.html
index 9ab1f54f4c5..aa01e361d80 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.html
@@ -1,7 +1,3 @@
-<!--
-postMessage(1);
-/*
--->
<!doctype html>
<title>creating 3 sibling dedicated workers</title>
<script src="/resources/testharness.js"></script>
@@ -9,9 +5,9 @@ postMessage(1);
<div id=log></div>
<script>
async_test(function(t) {
- var w1 = new Worker('#');
- var w2 = new Worker('#');
- var w3 = new Worker('#');
+ var w1 = new Worker('002.js');
+ var w2 = new Worker('002.js');
+ var w3 = new Worker('002.js');
var got = [false, false, false];
var check_done = t.step_func(function() {
if (got.every(function(x) {return x})) {
@@ -22,7 +18,4 @@ async_test(function(t) {
w2.onmessage = t.step_func(function(e) {got[1] = true; check_done()});
w3.onmessage = t.step_func(function(e) {got[2] = true; check_done()});
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.js b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.js
new file mode 100644
index 00000000000..2318c2e267d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/002.js
@@ -0,0 +1 @@
+postMessage(1); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.html b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.html
index 3e094ad6a30..f6e03c75f78 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.html
@@ -1,20 +1,3 @@
-<!--
-if (location.hash == '#1') {
- var w2 = new Worker('#2');
- w2.onmessage = function(e) {
- postMessage('1'+e.data);
- }
-} else if (location.hash == '#2') {
- var w3 = new Worker('#3');
- w3.onmessage = function(e) {
- postMessage('2'+e.data);
- }
-} else {
- postMessage('3');
-}
-
-/*
--->
<!doctype html>
<title>creating 3 nested dedicated workers</title>
<meta name="timeout" content="long">
@@ -23,7 +6,7 @@ if (location.hash == '#1') {
<div id=log></div>
<script>
async_test(function() {
- var w1 = new Worker('#1');
+ var w1 = new Worker('003.js#1');
w1.onmessage = this.step_func(function(e) {
assert_equals(e.data, '123');
this.done();
@@ -31,6 +14,3 @@ async_test(function() {
w1.onerror = this.unreached_func("error");
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.js b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.js
new file mode 100644
index 00000000000..14a5a614b3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/003.js
@@ -0,0 +1,13 @@
+if (location.hash == '#1') {
+ var w2 = new Worker('003.js#2');
+ w2.onmessage = function(e) {
+ postMessage('1'+e.data);
+ }
+} else if (location.hash == '#2') {
+ var w3 = new Worker('003.js#3');
+ w3.onmessage = function(e) {
+ postMessage('2'+e.data);
+ }
+} else {
+ postMessage('3');
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008-1.html b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008-1.html
index 82a8a383507..d19d7fa3369 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008-1.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008-1.html
@@ -1,7 +1,7 @@
<!doctype html>
<title>008-1</title>
<script>
-var w1 = new SharedWorker('008.html#');
+var w1 = new SharedWorker('008.js');
w1.port.onmessage = function(e) {
e.ports[0].postMessage(2);
}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.html b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.html
index e8554a438a5..ee38d80866e 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.html
@@ -1,13 +1,3 @@
-<!--
-var channel = new MessageChannel();
-var i = 0;
-onconnect = function(e) {
- i++;
- e.ports[0].postMessage(1, [channel['port' + i]]);
-}
-
-/*
--->
<!doctype html>
<title>messagechannel in shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -17,7 +7,7 @@ onconnect = function(e) {
<script>
var t = async_test();
onload = t.step_func(function() {
- var w1 = new SharedWorker('#');
+ var w1 = new SharedWorker('008.js');
w1.port.onmessage = this.step_func(function(e) {
e.ports[0].onmessage = this.step_func(function(e) {
assert_equals(e.data, 2);
@@ -26,7 +16,4 @@ onload = t.step_func(function() {
});
w1.onerror = this.unreached_func("error");
});
-</script>
-<!--
-*/
-//-->
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.js b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.js
new file mode 100644
index 00000000000..92593ebb865
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/multiple-workers/008.js
@@ -0,0 +1,6 @@
+var channel = new MessageChannel();
+var i = 0;
+onconnect = function(e) {
+ i++;
+ e.ports[0].postMessage(1, [channel['port' + i]]);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
index 8f619484f4d..c259c2c839f 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
@@ -1,12 +1,8 @@
-<!--
-setInterval(function() { postMessage(new Date()) }, 10)
-/*
--->
<!doctype html>
<title>001-1</title>
<script>
onload = function() {
- var worker = new Worker('#');
+ var worker = new Worker('001-1.js');
worker.onmessage = function(e) {
var started = !!parent.date;
parent.date = e.data;
@@ -16,8 +12,4 @@ onload = function() {
}
}
</script>
-<a href='data:text/html,<title>foo</title><script>onload=function(){window.parent.postMessage({title: window.document.title}, "*")}</script>'>link</a>
-<!--
-*/
-//-->
-
+<a href='data:text/html,<title>foo</title><script>onload=function(){window.parent.postMessage({title: window.document.title}, "*")}</script>'>link</a> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.js b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.js
new file mode 100644
index 00000000000..f62c365e322
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.js
@@ -0,0 +1 @@
+setInterval(function() { postMessage(new Date()) }, 10) \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.html b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.html
index adba81f6353..d8b17289fe2 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.html
@@ -1,36 +1,3 @@
-<!--
-var port;
-var timeout;
-onerror = function(a,b,c,d,e) {
- // will return undefined, thus the error is "not handled"
- // so error should be reported to the user, but this test doesn't check
- // that.
- // just make sure that this method is invoked with five arguments
- clearTimeout(timeout);
- var log = '';
- if (arguments.length != 5)
- log += 'got ' + arguments.length + ' arguments, expected 5. ';
- if (typeof a != 'string')
- log += 'first argument wasn\'t a string. ';
- if (b != location.href)
- log += 'second argument was ' + b + ', expected ' + location.href + '. ';
- if (typeof c != 'number')
- log += 'third argument wasn\'t a number. ';
- if (typeof d != 'number')
- log += 'fourth argument wasn\'t a number. ';
- if (e != 42)
- log += 'fifth argument wasn\'t the thrown exception. ';
- port.postMessage(log);
-}
-onconnect = function (e) {
- port = e.ports[0];
- timeout = setTimeout(function() { port.postMessage('self.onerror was not invoked'); }, 250);
- throw 42; // will "report the error"
-}
-
-
-/*
--->
<!doctype html>
<title>shared worker, not handled</title>
<script src="/resources/testharness.js"></script>
@@ -42,12 +9,9 @@ async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('001.js', '');
worker.port.onmessage = this.step_func_done(function(e) {
assert_equals(e.data, '');
});
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.js b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.js
new file mode 100644
index 00000000000..5736666cc3b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/001.js
@@ -0,0 +1,28 @@
+var port;
+var timeout;
+onerror = function(a,b,c,d,e) {
+ // will return undefined, thus the error is "not handled"
+ // so error should be reported to the user, but this test doesn't check
+ // that.
+ // just make sure that this method is invoked with five arguments
+ clearTimeout(timeout);
+ var log = '';
+ if (arguments.length != 5)
+ log += 'got ' + arguments.length + ' arguments, expected 5. ';
+ if (typeof a != 'string')
+ log += 'first argument wasn\'t a string. ';
+ if (b != location.href)
+ log += 'second argument was ' + b + ', expected ' + location.href + '. ';
+ if (typeof c != 'number')
+ log += 'third argument wasn\'t a number. ';
+ if (typeof d != 'number')
+ log += 'fourth argument wasn\'t a number. ';
+ if (e != 42)
+ log += 'fifth argument wasn\'t the thrown exception. ';
+ port.postMessage(log);
+}
+onconnect = function (e) {
+ port = e.ports[0];
+ timeout = setTimeout(function() { port.postMessage('self.onerror was not invoked'); }, 250);
+ throw 42; // will "report the error"
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.html b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.html
index c2cd377b435..4b322a5f07d 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.html
@@ -1,42 +1,3 @@
-<!--
-var port;
-var timeout;
-addEventListener('error', function(e) {
- // event is not canceled, thus the error is "not handled"
- // so error should be reported to the user, but this test doesn't check
- // that.
- // just make sure that this event has the right properties
- clearTimeout(timeout);
- var log = '';
- if (!self.ErrorEvent || Object.getPrototypeOf(e) != ErrorEvent.prototype)
- log += 'event should be an ErrorEvent. ';
- if (e.bubbles)
- log += 'event should not bubble. ';
- if (!e.cancelable)
- log += 'event should be cancelable. ';
- if (!e.isTrusted)
- log += 'event should be trusted. ';
- if (typeof e.message != 'string')
- log += 'message wasn\'t a string. ';
- if (e.filename != location.href)
- log += 'filename was ' + e.filename + ', expected ' + location.href + '. ';
- if (typeof e.lineno != 'number')
- log += 'lineno wasn\'t a number. ';
- if (typeof e.colno != 'number')
- log += 'colno argument wasn\'t a number. ';
- if (e.error != 42)
- log += 'fifth argument wasn\'t the thrown exception. ';
- port.postMessage(log);
-}, false);
-onconnect = function (e) {
- port = e.ports[0];
- timeout = setTimeout(function() { port.postMessage('No error event fired'); }, 250);
- throw 42; // will "report the error"
-}
-
-
-/*
--->
<!doctype html>
<title>shared worker, addEventListener</title>
<script src="/resources/testharness.js"></script>
@@ -48,12 +9,9 @@ async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('002.js', '');
worker.port.onmessage = this.step_func_done(function(e) {
assert_equals(e.data, '');
});
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.js b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.js
new file mode 100644
index 00000000000..ff96922634f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/002.js
@@ -0,0 +1,34 @@
+var port;
+var timeout;
+addEventListener('error', function(e) {
+ // event is not canceled, thus the error is "not handled"
+ // so error should be reported to the user, but this test doesn't check
+ // that.
+ // just make sure that this event has the right properties
+ clearTimeout(timeout);
+ var log = '';
+ if (!self.ErrorEvent || Object.getPrototypeOf(e) != ErrorEvent.prototype)
+ log += 'event should be an ErrorEvent. ';
+ if (e.bubbles)
+ log += 'event should not bubble. ';
+ if (!e.cancelable)
+ log += 'event should be cancelable. ';
+ if (!e.isTrusted)
+ log += 'event should be trusted. ';
+ if (typeof e.message != 'string')
+ log += 'message wasn\'t a string. ';
+ if (e.filename != location.href)
+ log += 'filename was ' + e.filename + ', expected ' + location.href + '. ';
+ if (typeof e.lineno != 'number')
+ log += 'lineno wasn\'t a number. ';
+ if (typeof e.colno != 'number')
+ log += 'colno argument wasn\'t a number. ';
+ if (e.error != 42)
+ log += 'fifth argument wasn\'t the thrown exception. ';
+ port.postMessage(log);
+}, false);
+onconnect = function (e) {
+ port = e.ports[0];
+ timeout = setTimeout(function() { port.postMessage('No error event fired'); }, 250);
+ throw 42; // will "report the error"
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.html b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.html
index 1b01c7cafc0..8ea59b81061 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.html
@@ -1,16 +1,3 @@
-<!--
-onconnect = function (e) {
- setTimeout(function() { e.ports[0].postMessage(''); }, 250);
- y(); // will "report the error"
- // onerror is null so it'll be "not handled", and the error should be
- // reported to the user, although we don't test that here
- // make sure we don't fire an error event on the message port or the
- // SharedWorker object
-}
-
-
-/*
--->
<!doctype html>
<title>shared worker, no error event on worker or port</title>
<script src="/resources/testharness.js"></script>
@@ -22,7 +9,7 @@ async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('window.onerror invoked: ' + a);
});
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('003.js', '');
worker.addEventListener('error', this.step_func(function(e) {
assert_unreached('error on worker');
}), false);
@@ -34,6 +21,3 @@ async_test(function() {
});
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.js b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.js
new file mode 100644
index 00000000000..8a3390bb249
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/003.js
@@ -0,0 +1,8 @@
+onconnect = function (e) {
+ setTimeout(function() { e.ports[0].postMessage(''); }, 250);
+ y(); // will "report the error"
+ // onerror is null so it'll be "not handled", and the error should be
+ // reported to the user, although we don't test that here
+ // make sure we don't fire an error event on the message port or the
+ // SharedWorker object
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004-1.html b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004-1.html
index 676c21e6068..326e1399ec5 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004-1.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004-1.html
@@ -4,7 +4,7 @@ parent.t.step(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('(inner) window.onerror invoked: ' + a);
});
- var worker = new SharedWorker('004.html#', '');
+ var worker = new SharedWorker('004.js', '');
worker.addEventListener('error', this.step_func(function(e) {
parent.assert_unreached('(inner) error on worker');
}), false);
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.html b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.html
index 1dd1eb3b52a..8516e52c6fe 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.html
@@ -1,13 +1,3 @@
-<!--
-var i = 0;
-onconnect = function (e) {
- i++;
- setTimeout(function() { e.ports[0].postMessage(i); }, 250);
- y(); // will "report the error"
-}
-
-/*
--->
<!doctype html>
<title>shared worker in two documents and window.onerror</title>
<script src="/resources/testharness.js"></script>
@@ -19,7 +9,7 @@ var t = async_test(function() {
window.onerror = this.step_func(function(a) {
assert_unreached('(outer) window.onerror invoked: ' + a);
});
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('004.js', '');
worker.addEventListener('error', this.step_func(function(e) {
assert_unreached('(outer) error on worker');
}), false);
@@ -34,6 +24,3 @@ var t = async_test(function() {
});
});
</script>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.js b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.js
new file mode 100644
index 00000000000..a68d2ab01de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/reporting-errors/004.js
@@ -0,0 +1,6 @@
+var i = 0;
+onconnect = function (e) {
+ i++;
+ setTimeout(function() { e.ports[0].postMessage(i); }, 250);
+ y(); // will "report the error"
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.html b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.html
index aa0fc67efc7..71e48c27711 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.html
@@ -1,8 +1,3 @@
-<!--
-postMessage(this === self);
-
-/*
--->
<!doctype html>
<title>worker global scope, dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -10,13 +5,10 @@ postMessage(this === self);
<div id=log></div>
<script>
async_test(function() {
- var worker = new Worker('#');
+ var worker = new Worker('001.js');
worker.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.js b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.js
new file mode 100644
index 00000000000..33ed47f1b44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/001.js
@@ -0,0 +1 @@
+postMessage(this === self); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.html b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.html
index 3617ad7272a..9487d886a67 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.html
@@ -1,10 +1,3 @@
-<!--
-var passed = this === self;
-onconnect = function(e) {
- e.ports[0].postMessage(passed);
-}
-/*
--->
<!doctype html>
<title>worker global scope, shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -12,13 +5,10 @@ onconnect = function(e) {
<div id=log></div>
<script>
async_test(function() {
- var worker = new SharedWorker('#');
+ var worker = new SharedWorker('002.js');
worker.port.onmessage = this.step_func(function(e) {
assert_true(e.data);
this.done();
});
});
-</script>
-<!--
-*/
-//--> \ No newline at end of file
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.js b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.js
new file mode 100644
index 00000000000..627272aaefa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/002.js
@@ -0,0 +1,4 @@
+var passed = this === self;
+onconnect = function(e) {
+ e.ports[0].postMessage(passed);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/001.html b/tests/wpt/web-platform-tests/workers/semantics/xhr/001.html
index e26e21c62f8..da59f5ac2d1 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/xhr/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/001.html
@@ -1,19 +1,3 @@
-<!--
-var xhr = new XMLHttpRequest();
-var log = '';
-xhr.onreadystatechange = function(e) {
- if (this.readyState == 4) {
- if (this.responseXML != null)
- log += 'responseXML was not null. ';
- if (this.responseText != '<x>foo</x>')
- log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
- postMessage(log);
- }
-}
-xhr.open('GET', '001-1.xml', true);
-xhr.send();
-/*
--->
<!doctype html>
<title>async XMLHttpRequest in dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -22,14 +6,11 @@ xhr.send();
<script>
var t = async_test();
function runtest() {
- var worker = new Worker('#');
+ var worker = new Worker('001.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
-<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
-<!--
-*/
-//--> \ No newline at end of file
+<iframe src=001-1.xml onload="t.step(runtest);"></iframe> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/001.js b/tests/wpt/web-platform-tests/workers/semantics/xhr/001.js
new file mode 100644
index 00000000000..1cbe98ba470
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/001.js
@@ -0,0 +1,13 @@
+var xhr = new XMLHttpRequest();
+var log = '';
+xhr.onreadystatechange = function(e) {
+ if (this.readyState == 4) {
+ if (this.responseXML != null)
+ log += 'responseXML was not null. ';
+ if (this.responseText != '<x>foo</x>')
+ log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
+ postMessage(log);
+ }
+}
+xhr.open('GET', '001-1.xml', true);
+xhr.send(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/002.html b/tests/wpt/web-platform-tests/workers/semantics/xhr/002.html
index 0d3386e982f..60c0e161cc8 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/xhr/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/002.html
@@ -1,16 +1,3 @@
-<!--
-var xhr = new XMLHttpRequest();
-var log = '';
-xhr.open('GET', '001-1.xml', false);
-xhr.send();
-if (xhr.responseXML != null)
- log += 'responseXML was not null. ';
-if (xhr.responseText != '<x>foo</x>')
- log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
-postMessage(log);
-
-/*
--->
<!doctype html>
<title>sync XMLHttpRequest in dedicated worker</title>
<script src="/resources/testharness.js"></script>
@@ -19,14 +6,11 @@ postMessage(log);
<script>
var t = async_test();
function runtest() {
- var worker = new Worker('#');
+ var worker = new Worker('002.js');
worker.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
});
}
</script>
-<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
-<!--
-*/
-//--> \ No newline at end of file
+<iframe src=001-1.xml onload="t.step(runtest);"></iframe> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/002.js b/tests/wpt/web-platform-tests/workers/semantics/xhr/002.js
new file mode 100644
index 00000000000..68d7e91d451
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/002.js
@@ -0,0 +1,9 @@
+var xhr = new XMLHttpRequest();
+var log = '';
+xhr.open('GET', '001-1.xml', false);
+xhr.send();
+if (xhr.responseXML != null)
+ log += 'responseXML was not null. ';
+if (xhr.responseText != '<x>foo</x>')
+ log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
+postMessage(log); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/003.html b/tests/wpt/web-platform-tests/workers/semantics/xhr/003.html
index 70edaf41702..e3ce36b82cf 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/xhr/003.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/003.html
@@ -1,24 +1,3 @@
-<!--
-onconnect = function(e) {
- var xhr = new XMLHttpRequest();
- var log = '';
- var port = e.ports[0];
- var postMessage = port.postMessage;
- xhr.onreadystatechange = function(e) {
- if (this.readyState == 4) {
- if (this.responseXML != null)
- log += 'responseXML was not null. ';
- if (this.responseText && this.responseText != '<x>foo</x>')
- log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
- postMessage.call(port, log);
- }
- }
- xhr.open('GET', '001-1.xml', true);
- xhr.send();
-}
-
-/*
--->
<!doctype html>
<title>async XMLHttpRequest in shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -27,7 +6,7 @@ onconnect = function(e) {
<script>
var t = async_test();
function runtest() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('003.js', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
@@ -35,7 +14,3 @@ function runtest() {
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
-<!--
-*/
-//-->
-
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/003.js b/tests/wpt/web-platform-tests/workers/semantics/xhr/003.js
new file mode 100644
index 00000000000..1a9c5a7ee81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/003.js
@@ -0,0 +1,17 @@
+onconnect = function(e) {
+ var xhr = new XMLHttpRequest();
+ var log = '';
+ var port = e.ports[0];
+ var postMessage = port.postMessage;
+ xhr.onreadystatechange = function(e) {
+ if (this.readyState == 4) {
+ if (this.responseXML != null)
+ log += 'responseXML was not null. ';
+ if (this.responseText && this.responseText != '<x>foo</x>')
+ log += 'responseText was ' + this.responseText + ', expected <x>foo</x>. ';
+ postMessage.call(port, log);
+ }
+ }
+ xhr.open('GET', '001-1.xml', true);
+ xhr.send();
+}
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/004.html b/tests/wpt/web-platform-tests/workers/semantics/xhr/004.html
index d0d82f2e82e..d11e3dbc1b9 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/xhr/004.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/004.html
@@ -1,18 +1,3 @@
-<!--
-onconnect = function(e) {
- var xhr = new XMLHttpRequest();
- var log = '';
- xhr.open('GET', '001-1.xml', false);
- xhr.send();
- if (xhr.responseXML != null)
- log += 'responseXML was not null. ';
- if (xhr.responseText != '<x>foo</x>')
- log += 'responseText was ' + xhr.responseText + ', expected <x>foo</x>. ';
- e.ports[0].postMessage(log);
-}
-
-/*
--->
<!doctype html>
<title>sync XMLHttpRequest in shared worker</title>
<script src="/resources/testharness.js"></script>
@@ -21,7 +6,7 @@ onconnect = function(e) {
<script>
var t = async_test();
function runtest() {
- var worker = new SharedWorker('#', '');
+ var worker = new SharedWorker('004.js', '');
worker.port.onmessage = this.step_func(function(e) {
assert_equals(e.data, '');
this.done();
@@ -29,6 +14,3 @@ function runtest() {
}
</script>
<iframe src=001-1.xml onload="t.step(runtest);"></iframe>
-<!--
-*/
-//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/xhr/004.js b/tests/wpt/web-platform-tests/workers/semantics/xhr/004.js
new file mode 100644
index 00000000000..1741c8d36a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/semantics/xhr/004.js
@@ -0,0 +1,11 @@
+onconnect = function(e) {
+ var xhr = new XMLHttpRequest();
+ var log = '';
+ xhr.open('GET', '001-1.xml', false);
+ xhr.send();
+ if (xhr.responseXML != null)
+ log += 'responseXML was not null. ';
+ if (xhr.responseText != '<x>foo</x>')
+ log += 'responseText was ' + xhr.responseText + ', expected <x>foo</x>. ';
+ e.ports[0].postMessage(log);
+}