aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini6
-rw-r--r--tests/wpt/metadata/MANIFEST.json1401
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-001.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-002.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-003.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-004.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-005.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-006.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-003.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-004.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-005.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-006.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transforms/parsing/perspective-origin-computed.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-transforms/parsing/transform-origin-computed.html.ini67
-rw-r--r--tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/scrollLeftTop.html.ini19
-rw-r--r--tests/wpt/metadata/css/cssom/interfaces.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini12
-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.ini2
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini (renamed from tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini)2
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.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.ini5
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.https.html.ini90
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini4
-rw-r--r--tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini4
-rw-r--r--tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini3
-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/set_window_rect/set.py.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini3
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/common.js9
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html87
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html6
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieListItem_attributes.tentative.https.window.js71
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_delete_arguments.tentative.https.window.js53
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_event_basic.tentative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_event_delete.tenative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_event_overwrite.tentative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_arguments.tentative.https.window.js79
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_multiple.tentative.https.window.js23
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_get_arguments.tentative.https.window.js55
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_get_delete_basic.tentative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html8
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html14
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_basic.tentative.https.window.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/cookieStore_set_arguments.tentative.https.window.js108
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js21
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js10
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js15
-rw-r--r--tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js21
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/parsing/margin-computed.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/block-size-computed.html44
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/inline-size-computed.html44
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/background-image-alpha.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/background-image-multiple.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/background-image-tiled.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-001.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-002.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-001.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-002.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-003.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-001.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-002.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-003.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-004.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/geometry-with-float-size.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/hidpi/canvas-transform.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/idlharness.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-constructor-error.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-paint-error.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-pending-script.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/overdraw.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint-arguments.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint-function-arguments.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-composite.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-filter.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-gradient.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-paths.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-rects.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-shadows.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/paint2d-transform.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-001.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-002.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-003.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-004.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-005.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-006.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-007.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-008.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-009.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-010.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-011.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-012.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-013.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-014.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-015.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-016.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-017.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-018.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-019.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-020.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-021.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-022.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-001.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-002.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-003.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-004.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-005.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-006.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-007.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-008.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-009.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-010.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-001.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-002.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-stylemap.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-001.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-002.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-003.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-004.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-005.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-006.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-007.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-008.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-009.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-010.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-011.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-012.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-013.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-014.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-015.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-016.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-017.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-018.https.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/style-background-image.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/style-before-pseudo.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/style-first-letter-pseudo.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/valid-image-after-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-paint-api/valid-image-before-load.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/conditional-rules.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-properties-values-api/unit-cycles.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables/percent-width-cell-dynamic.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/reference/text-decoration-thickness-001-notref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-001-notref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-002-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-002.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html119
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-005.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-006.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-007.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-008.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-009.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-010.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-011.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-012.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-013.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-014.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-015.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-016.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-006.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-007.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-001.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-003.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-004.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-005.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-006.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-007.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-001.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-003.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-004.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-005.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-006.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-003-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-005-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-computed.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-invalid.html (renamed from tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-invalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-valid.html (renamed from tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-valid.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-computed.html49
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-invalid.html4
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/scrollLeftTop.html136
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity.html31
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/width-equals-window-inner-width.html22
-rw-r--r--tests/wpt/web-platform-tests/element-timing/images-repeated-resource.html57
-rw-r--r--tests/wpt/web-platform-tests/element-timing/resources/element-timing-helpers.js9
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html2
-rw-r--r--tests/wpt/web-platform-tests/html/dom/interfaces.https.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt4
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html42
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-properties-values-api.idl16
-rw-r--r--tests/wpt/web-platform-tests/interfaces/geometry.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/longtasks.idl2
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/cross-origin-image.sub.html5
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/loadTime-after-appendChild.html39
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/observe-image.html8
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/observe-text.html4
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/repeated-image.html61
-rw-r--r--tests/wpt/web-platform-tests/largest-contentful-paint/supported-lcp-type.html17
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/supported-layout-type.html2
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist4
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/common.js13
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/original-base-url-applied-tentative.html40
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/original-referrer-policy-applied-tentative.sub.html41
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/picture-loading-lazy.tentative.html68
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/idlharness.window.js4
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js2
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_touch-action-keyboard.html1
-rw-r--r--tests/wpt/web-platform-tests/resources/idlharness.js63
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html5
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-after-update-worker.js1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-before-update-worker.js2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-worker-from-file.py31
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/update.https.html68
-rw-r--r--tests/wpt/web-platform-tests/sms/interceptor.https.html17
-rw-r--r--tests/wpt/web-platform-tests/sms/sms_provider.js1
-rw-r--r--tests/wpt/web-platform-tests/std-toast/attributes.html18
-rw-r--r--tests/wpt/web-platform-tests/std-toast/reflection.html24
-rw-r--r--tests/wpt/web-platform-tests/std-toast/styles.html38
-rw-r--r--tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.any.js23
-rw-r--r--tests/wpt/web-platform-tests/streams/count-queuing-strategy.any.js23
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py (renamed from tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/fennec.py)22
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html31
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html71
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NFCReadingEvent_constructor.https.html20
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js17
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/perform_actions/pointer_contextmenu.py2
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html19
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html97
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js102
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_util.js7
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrWebGLLayer_framebuffer.https.html27
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html25
-rw-r--r--tests/wpt/web-platform-tests/xhr/getallresponseheaders.htm2
-rw-r--r--tests/wpt/web-platform-tests/xhr/resources/headers.asis1
310 files changed, 8134 insertions, 895 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
index 3b874fc1748..6a3af4e2ece 100644
--- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
@@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
+ [Revoke blob URL after calling fetch, fetch should succeed]
+ expected: FAIL
+
[url-with-fetch.any.html]
[Untitled]
@@ -34,6 +37,3 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
- [Revoke blob URL after calling fetch, fetch should succeed]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 8268ec48c71..c6fc3b65f77 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -142007,6 +142007,18 @@
{}
]
],
+ "css/css-tables/percent-width-cell-dynamic.html": [
+ [
+ "css/css-tables/percent-width-cell-dynamic.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-tables/percentages-grandchildren-quirks-mode-001.html": [
[
"css/css-tables/percentages-grandchildren-quirks-mode-001.html",
@@ -148087,6 +148099,30 @@
{}
]
],
+ "css/css-text/text-transform/text-transform-fullwidth-006.html": [
+ [
+ "css/css-text/text-transform/text-transform-fullwidth-006.html",
+ [
+ [
+ "/css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/text-transform/text-transform-fullwidth-007.html": [
+ [
+ "css/css-text/text-transform/text-transform-fullwidth-007.html",
+ [
+ [
+ "/css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text/text-transform/text-transform-lowercase-001.xht": [
[
"css/css-text/text-transform/text-transform-lowercase-001.xht",
@@ -149071,6 +149107,78 @@
{}
]
],
+ "css/css-text/white-space/break-spaces-tab-001.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-001.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/break-spaces-tab-002.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-002.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/break-spaces-tab-003.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-003.html",
+ [
+ [
+ "/css/css-text/white-space/reference/break-spaces-tab-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/break-spaces-tab-004.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-004.html",
+ [
+ [
+ "/css/css-text/white-space/reference/break-spaces-tab-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/break-spaces-tab-005.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-005.html",
+ [
+ [
+ "/css/css-text/white-space/reference/break-spaces-tab-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/break-spaces-tab-006.html": [
+ [
+ "css/css-text/white-space/break-spaces-tab-006.html",
+ [
+ [
+ "/css/css-text/white-space/reference/break-spaces-tab-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text/white-space/control-chars-000.html": [
[
"css/css-text/white-space/control-chars-000.html",
@@ -150211,6 +150319,78 @@
{}
]
],
+ "css/css-text/white-space/pre-wrap-tab-001.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-001.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/pre-wrap-tab-002.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-002.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/pre-wrap-tab-003.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-003.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/pre-wrap-tab-004.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-004.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/pre-wrap-tab-005.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-005.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text/white-space/pre-wrap-tab-006.html": [
+ [
+ "css/css-text/white-space/pre-wrap-tab-006.html",
+ [
+ [
+ "/css/css-text/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text/white-space/tab-stop-threshold-001.html": [
[
"css/css-text/white-space/tab-stop-threshold-001.html",
@@ -150663,18 +150843,6 @@
{}
]
],
- "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html": [
- [
- "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html",
- [
- [
- "/css/css-text/white-space/reference/white-space-pre-wrap-trailing-spaces-004-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-text/white-space/white-space-wrap-after-nowrap-001.html": [
[
"css/css-text/white-space/white-space-wrap-after-nowrap-001.html",
@@ -178601,6 +178769,18 @@
{}
]
],
+ "css/filter-effects/backdrop-filter-plus-opacity.html": [
+ [
+ "css/filter-effects/backdrop-filter-plus-opacity.html",
+ [
+ [
+ "/css/filter-effects/backdrop-filter-plus-opacity-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/filter-effects/backdrop-filter-reference-filter.html": [
[
"css/filter-effects/backdrop-filter-reference-filter.html",
@@ -254411,6 +254591,12 @@
"css/css-text/text-transform/reference/text-transform-fullwidth-001-ref.xht": [
[]
],
+ "css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html": [
+ []
+ ],
+ "css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html": [
+ []
+ ],
"css/css-text/text-transform/reference/text-transform-lowercase-001-ref.xht": [
[]
],
@@ -254594,6 +254780,12 @@
"css/css-text/text-transform/text-transform-lowercase-002-ref.xht": [
[]
],
+ "css/css-text/white-space/reference/break-spaces-tab-003-ref.html": [
+ []
+ ],
+ "css/css-text/white-space/reference/break-spaces-tab-005-ref.html": [
+ []
+ ],
"css/css-text/white-space/reference/control-chars-000-ref.html": [
[]
],
@@ -258977,6 +259169,9 @@
"css/filter-effects/backdrop-filter-plus-filter-ref.html": [
[]
],
+ "css/filter-effects/backdrop-filter-plus-opacity-ref.html": [
+ []
+ ],
"css/filter-effects/backdrop-filter-update-ref.html": [
[]
],
@@ -272825,6 +273020,9 @@
"lint.whitelist": [
[]
],
+ "loading/lazyload/common.js": [
+ []
+ ],
"loading/lazyload/resources/image.png": [
[]
],
@@ -278723,6 +278921,15 @@
"service-workers/service-worker/resources/update-registration-with-type.py": [
[]
],
+ "service-workers/service-worker/resources/update-smaller-body-after-update-worker.js": [
+ []
+ ],
+ "service-workers/service-worker/resources/update-smaller-body-before-update-worker.js": [
+ []
+ ],
+ "service-workers/service-worker/resources/update-worker-from-file.py": [
+ []
+ ],
"service-workers/service-worker/resources/update-worker.py": [
[]
],
@@ -283640,10 +283847,10 @@
"tools/wptrunner/wptrunner/browsers/epiphany.py": [
[]
],
- "tools/wptrunner/wptrunner/browsers/fennec.py": [
+ "tools/wptrunner/wptrunner/browsers/firefox.py": [
[]
],
- "tools/wptrunner/wptrunner/browsers/firefox.py": [
+ "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
[]
],
"tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -302543,6 +302750,12 @@
{}
]
],
+ "animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html": [
+ [
+ "animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html",
+ {}
+ ]
+ ],
"animation-worklet/worklet-animation-pause.https.html": [
[
"animation-worklet/worklet-animation-pause.https.html",
@@ -310255,6 +310468,12 @@
{}
]
],
+ "css/css-box/parsing/margin-computed.html": [
+ [
+ "css/css-box/parsing/margin-computed.html",
+ {}
+ ]
+ ],
"css/css-box/parsing/margin-invalid.html": [
[
"css/css-box/parsing/margin-invalid.html",
@@ -314491,6 +314710,12 @@
{}
]
],
+ "css/css-logical/parsing/block-size-computed.html": [
+ [
+ "css/css-logical/parsing/block-size-computed.html",
+ {}
+ ]
+ ],
"css/css-logical/parsing/block-size-invalid.html": [
[
"css/css-logical/parsing/block-size-invalid.html",
@@ -314623,6 +314848,12 @@
{}
]
],
+ "css/css-logical/parsing/inline-size-computed.html": [
+ [
+ "css/css-logical/parsing/inline-size-computed.html",
+ {}
+ ]
+ ],
"css/css-logical/parsing/inline-size-invalid.html": [
[
"css/css-logical/parsing/inline-size-invalid.html",
@@ -319213,6 +319444,294 @@
{}
]
],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html": [
+ [
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html": [
+ [
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html": [
+ [
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html": [
+ [
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html": [
+ [
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html",
+ {}
+ ]
+ ],
"css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html": [
[
"css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html",
@@ -319303,6 +319822,24 @@
{}
]
],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html",
+ {}
+ ]
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html": [
+ [
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html",
+ {}
+ ]
+ ],
"css/css-text/inheritance.html": [
[
"css/css-text/inheritance.html",
@@ -319843,15 +320380,21 @@
{}
]
],
- "css/css-transforms/parsing/perspective-origin-parsing-invalid.html": [
+ "css/css-transforms/parsing/perspective-origin-computed.html": [
+ [
+ "css/css-transforms/parsing/perspective-origin-computed.html",
+ {}
+ ]
+ ],
+ "css/css-transforms/parsing/perspective-origin-invalid.html": [
[
- "css/css-transforms/parsing/perspective-origin-parsing-invalid.html",
+ "css/css-transforms/parsing/perspective-origin-invalid.html",
{}
]
],
- "css/css-transforms/parsing/perspective-origin-parsing-valid.html": [
+ "css/css-transforms/parsing/perspective-origin-valid.html": [
[
- "css/css-transforms/parsing/perspective-origin-parsing-valid.html",
+ "css/css-transforms/parsing/perspective-origin-valid.html",
{}
]
],
@@ -319903,6 +320446,12 @@
{}
]
],
+ "css/css-transforms/parsing/transform-origin-computed.html": [
+ [
+ "css/css-transforms/parsing/transform-origin-computed.html",
+ {}
+ ]
+ ],
"css/css-transforms/parsing/transform-origin-invalid.html": [
[
"css/css-transforms/parsing/transform-origin-invalid.html",
@@ -324221,6 +324770,12 @@
{}
]
],
+ "css/cssom-view/scrollLeftTop.html": [
+ [
+ "css/cssom-view/scrollLeftTop.html",
+ {}
+ ]
+ ],
"css/cssom-view/scrollWidthHeight.xht": [
[
"css/cssom-view/scrollWidthHeight.xht",
@@ -325309,6 +325864,12 @@
{}
]
],
+ "css/mediaqueries/width-equals-window-inner-width.html": [
+ [
+ "css/mediaqueries/width-equals-window-inner-width.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-anchor-interpolation.html": [
[
"css/motion/animation/offset-anchor-interpolation.html",
@@ -359814,6 +360375,12 @@
{}
]
],
+ "largest-contentful-paint/loadTime-after-appendChild.html": [
+ [
+ "largest-contentful-paint/loadTime-after-appendChild.html",
+ {}
+ ]
+ ],
"largest-contentful-paint/observe-image.html": [
[
"largest-contentful-paint/observe-image.html",
@@ -359826,6 +360393,18 @@
{}
]
],
+ "largest-contentful-paint/repeated-image.html": [
+ [
+ "largest-contentful-paint/repeated-image.html",
+ {}
+ ]
+ ],
+ "largest-contentful-paint/supported-lcp-type.html": [
+ [
+ "largest-contentful-paint/supported-lcp-type.html",
+ {}
+ ]
+ ],
"layout-instability/buffer-layout-shift.html": [
[
"layout-instability/buffer-layout-shift.html",
@@ -359900,6 +360479,24 @@
{}
]
],
+ "loading/lazyload/original-base-url-applied-tentative.html": [
+ [
+ "loading/lazyload/original-base-url-applied-tentative.html",
+ {}
+ ]
+ ],
+ "loading/lazyload/original-referrer-policy-applied-tentative.sub.html": [
+ [
+ "loading/lazyload/original-referrer-policy-applied-tentative.sub.html",
+ {}
+ ]
+ ],
+ "loading/lazyload/picture-loading-lazy.tentative.html": [
+ [
+ "loading/lazyload/picture-loading-lazy.tentative.html",
+ {}
+ ]
+ ],
"loading/preloader-css-import-no-quote.tentative.html": [
[
"loading/preloader-css-import-no-quote.tentative.html",
@@ -390884,6 +391481,14 @@
}
]
],
+ "std-toast/reflection.html": [
+ [
+ "std-toast/reflection.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"std-toast/show-toast.html": [
[
"std-toast/show-toast.html",
@@ -402791,6 +403396,18 @@
{}
]
],
+ "web-nfc/NDEFMessage_constructor.https.html": [
+ [
+ "web-nfc/NDEFMessage_constructor.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/NDEFRecord_constructor.https.html": [
+ [
+ "web-nfc/NDEFRecord_constructor.https.html",
+ {}
+ ]
+ ],
"web-nfc/NFCErrorEvent_constructor.https.html": [
[
"web-nfc/NFCErrorEvent_constructor.https.html",
@@ -444207,7 +444824,7 @@
"testharness"
],
"animation-worklet/common.js": [
- "3e542e02efceb5073a08a243855b3ac309b2e3b6",
+ "ceb430b718b8438c933071b1dd24240ab13bf562",
"support"
],
"animation-worklet/current-time.https.html": [
@@ -444270,6 +444887,10 @@
"1a8afc1e89278d06572e337965a6d1ff1572d0d9",
"testharness"
],
+ "animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html": [
+ "a66a4b9156cd9ee0283928feaf89a782a058998e",
+ "testharness"
+ ],
"animation-worklet/worklet-animation-get-timing-on-worklet-thread-ref.html": [
"aad07d5f6f26692dc47ce0219a78d3c1a50c608a",
"support"
@@ -467847,19 +468468,19 @@
"testharness"
],
"content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html": [
- "65311c32ad6e27a744764800e43d5ddb47160e97",
+ "4c86845f4dbb1a4d56474b6aa2884dcc4a20c3f3",
"testharness"
],
"content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html": [
- "03829fe8a3686f9ce9c484b1e3fb2bdd328cc12f",
+ "dcf52aa187c7fea6d94dd11ed002e3b924d26e56",
"testharness"
],
"content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html": [
- "0a7c2b43bff372ee4c1b9935306554068f07829f",
+ "978096f14f641907029d0198cac45ad6a7a9d4ef",
"testharness"
],
"content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html": [
- "5dd82e6ddca482bdf6be75f53753465fad166c5b",
+ "6e0e6ddbede1aff3b1521cfad1aa789d9b80858f",
"testharness"
],
"content-security-policy/securitypolicyviolation/style-sample-no-opt-in.html": [
@@ -468515,11 +469136,11 @@
"support"
],
"cookie-store/cookieListItem_attributes.tentative.https.window.js": [
- "3e7b02b1085ba3c7fe301a410129ba227bce7f8b",
+ "bf8f845f2b183202efc6405c510eb348db189894",
"testharness"
],
"cookie-store/cookieStore_delete_arguments.tentative.https.window.js": [
- "8cfa03dd0540cdd46d144292279e557d257dd9c2",
+ "dc073d8eb60321bdf5b15d67af6989dc672f21b1",
"testharness"
],
"cookie-store/cookieStore_delete_basic.tentative.https.window.js": [
@@ -468531,47 +469152,47 @@
"testharness"
],
"cookie-store/cookieStore_event_basic.tentative.https.window.js": [
- "7f6d2d919d496be7135bae0536841611d208afea",
+ "5f20947dbf1051bd14ce23f45e632290da2ed7c9",
"testharness"
],
"cookie-store/cookieStore_event_delete.tenative.https.window.js": [
- "f84b2e067451d883b5819ae4d4b8648a38aba3b1",
+ "e8c6fc036a76863acf2d8b2b3660550715f1dc0d",
"testharness"
],
"cookie-store/cookieStore_event_overwrite.tentative.https.window.js": [
- "2a5cb5d064f912eb8d6583427360afd280bb7a23",
+ "3acffea41c1d6a08e5aaf1ca944567347d174de0",
"testharness"
],
"cookie-store/cookieStore_getAll_arguments.tentative.https.window.js": [
- "5106a6270cd9239cd34cd9f6a96c29a24dccab5b",
+ "a04aa8cd7ad65a56a56d3de53fa4d92192c7f05a",
"testharness"
],
"cookie-store/cookieStore_getAll_multiple.tentative.https.window.js": [
- "78b3c56fdd38925d9c2da17454b5f1b8b969d999",
+ "c09f4fc5f5794d44b61159f6a18de85cd0c57da7",
"testharness"
],
"cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js": [
- "aa0a4ea9a03eaa96144ed62a6458ffbb183a97c6",
+ "dd2adabd22835d135198d7b5c3cdb5d18b7e27a5",
"testharness"
],
"cookie-store/cookieStore_get_arguments.tentative.https.window.js": [
- "bb126864ff7623a4c51988834e24a3894dc8a5ee",
+ "e338dd1bdbd098373765dcc048425899c5cbe490",
"testharness"
],
"cookie-store/cookieStore_get_delete_basic.tentative.https.window.js": [
- "fc9645d3e2e98063da8cf03ef50823af363c6b9c",
+ "5ebf09d34463250d2eeec80606b89a6ce46298e0",
"testharness"
],
"cookie-store/cookieStore_get_set_across_frames.tentative.https.html": [
- "c2ef184940390348020aa7e8cdfd24b4a8b9d335",
+ "f7c737b422e559107bb210d0cea9267829e10ba7",
"testharness"
],
"cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html": [
- "e8792612c4352dc1697a2d4efc8dbe6ab7092a7e",
+ "c67ef98bcc944dbfb815993734dcfae7dbd3eb9d",
"testharness"
],
"cookie-store/cookieStore_get_set_basic.tentative.https.window.js": [
- "2a082de9d30927ec5ee152acdd76cde04ed730d5",
+ "deb7405f2ff0ddc29214a51b80878f7b17ce66fa",
"testharness"
],
"cookie-store/cookieStore_in_detached_frame.tentative.https.html": [
@@ -468579,7 +469200,7 @@
"testharness"
],
"cookie-store/cookieStore_set_arguments.tentative.https.window.js": [
- "18f60ad974e1570365cc0d92c36cd55330d5b721",
+ "ddc9981c92ddf5d3b149249db1accd16dc476ec1",
"testharness"
],
"cookie-store/cookieStore_special_names.tentative.https.window.js": [
@@ -468691,11 +469312,11 @@
"support"
],
"cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html": [
- "abc431a4d628e28adc40d7c9636766c53c16cf4e",
+ "6879c5da926384b2be6969b5585c8e2a75539f75",
"testharness"
],
"cookie-store/serviceworker_cookieStore_subscriptions.js": [
- "225e58266e2e0210299f9defef1d28eaeeb9403c",
+ "441573d20e9100943a33efa0e3bb8143e76491fa",
"support"
],
"cookie-store/serviceworker_cookieStore_subscriptions.tentative.https.html": [
@@ -468703,7 +469324,7 @@
"testharness"
],
"cookie-store/serviceworker_cookieStore_subscriptions_basic.js": [
- "4a5ee5eed962f65c21ad794d02e7452ff56046a0",
+ "c48ad8bb98b02d572edf5080af877302527454a1",
"support"
],
"cookie-store/serviceworker_cookieStore_subscriptions_basic.tentative.https.html": [
@@ -468711,7 +469332,7 @@
"testharness"
],
"cookie-store/serviceworker_cookieStore_subscriptions_empty.js": [
- "de521caddd8763b1d30e1c0bfcf2feea98e7bc06",
+ "b62318699740938134fc51ab4c42670ce8878aca",
"support"
],
"cookie-store/serviceworker_cookieStore_subscriptions_empty.tentative.https.html": [
@@ -468719,7 +469340,7 @@
"testharness"
],
"cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js": [
- "8784af7e6e80824711a9e20e39af33617b0a87b7",
+ "228b528985615f8b73d2f5e11452e591873fecbe",
"support"
],
"cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.tentative.https.html": [
@@ -468727,7 +469348,7 @@
"testharness"
],
"cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js": [
- "12759a2e3ae9c40cb301482f093fb5b30b63cfbc",
+ "43edadd7bb86946400fcb707b2e76eada088b8a1",
"support"
],
"cookie-store/serviceworker_cookieStore_subscriptions_mismatch.tentative.https.html": [
@@ -535758,6 +536379,10 @@
"7cc09a594ed17648ec29b9bdc2615fa6dbcbd3a7",
"testharness"
],
+ "css/css-box/parsing/margin-computed.html": [
+ "f22f6cdc0f503488418b7741f12ec5554f213477",
+ "testharness"
+ ],
"css/css-box/parsing/margin-invalid.html": [
"77009170938d9634497f73bc21501ced502c7008",
"testharness"
@@ -556070,6 +556695,10 @@
"3e133db880cd32d963d701bb184d28faae959aa5",
"testharness"
],
+ "css/css-logical/parsing/block-size-computed.html": [
+ "de3a3c2a0c5c80b5f0f4225a5904b81797afb34e",
+ "testharness"
+ ],
"css/css-logical/parsing/block-size-invalid.html": [
"37d88907735ff58ab4bebb9073f626e14d864955",
"testharness"
@@ -556158,6 +556787,10 @@
"81c7049c5e94c891b72f953356fadac0aeb3ae5c",
"testharness"
],
+ "css/css-logical/parsing/inline-size-computed.html": [
+ "0f60165a347e1ad8e67715d03d1b46c9a27b146c",
+ "testharness"
+ ],
"css/css-logical/parsing/inline-size-invalid.html": [
"d3d5d3f84d9d01392533e787b9e6755d592ec96e",
"testharness"
@@ -559787,7 +560420,7 @@
"support"
],
"css/css-paint-api/background-image-alpha.https.html": [
- "53d869d06079717637cc432cdcf46e35170c2216",
+ "7f1e31bf39bbc98bd6f37a99f7e660cda3590de0",
"reftest"
],
"css/css-paint-api/background-image-multiple-ref.html": [
@@ -559795,7 +560428,7 @@
"support"
],
"css/css-paint-api/background-image-multiple.https.html": [
- "79ff8836c15c372155badcc4013d3d33dc039d18",
+ "51c928d2a67c74e173a9f815b3c97a8ec8a21059",
"reftest"
],
"css/css-paint-api/background-image-tiled-ref.html": [
@@ -559803,7 +560436,7 @@
"support"
],
"css/css-paint-api/background-image-tiled.https.html": [
- "8498c82a355e41513c1b2521dfb489dcd4f6cd75",
+ "11647c9228c8fb2f10bf5e3aeb25967b40478c45",
"reftest"
],
"css/css-paint-api/geometry-background-image-001-ref.html": [
@@ -559811,7 +560444,7 @@
"support"
],
"css/css-paint-api/geometry-background-image-001.https.html": [
- "601d4187b091aa08be5e133a56ffe24bcbb1f8df",
+ "eb7f6716ada1bdea3761b4d164e9b2ca7ea35f98",
"reftest"
],
"css/css-paint-api/geometry-background-image-002-ref.html": [
@@ -559819,7 +560452,7 @@
"support"
],
"css/css-paint-api/geometry-background-image-002.https.html": [
- "1d57073bf20660f2cc7faab9184ace78967e097e",
+ "e636aa73b3b2e519c2a6c12457a6434b38036ea0",
"reftest"
],
"css/css-paint-api/geometry-background-image-tiled-001-ref.html": [
@@ -559827,7 +560460,7 @@
"support"
],
"css/css-paint-api/geometry-background-image-tiled-001.https.html": [
- "8e28b54b36df37845bb4a6dc95b27872ddbe2ee3",
+ "51373a528e4ca46b0adcf665e28cc3dc1aa793bc",
"reftest"
],
"css/css-paint-api/geometry-background-image-tiled-002-ref.html": [
@@ -559835,7 +560468,7 @@
"support"
],
"css/css-paint-api/geometry-background-image-tiled-002.https.html": [
- "9248e38641eb80efb5566b5750616fda8527aa34",
+ "d55761b47cd362827bf828e03d6a8f94dd309431",
"reftest"
],
"css/css-paint-api/geometry-background-image-tiled-003-ref.html": [
@@ -559843,7 +560476,7 @@
"support"
],
"css/css-paint-api/geometry-background-image-tiled-003.https.html": [
- "5b6b6c7c65a1bcea71ae8bc69f171d0e22b1e1d6",
+ "6d5bdd2fa539979f4069e42cd9582c2d13fba445",
"reftest"
],
"css/css-paint-api/geometry-border-image-001-ref.html": [
@@ -559851,7 +560484,7 @@
"support"
],
"css/css-paint-api/geometry-border-image-001.https.html": [
- "3fb4643cd472dd7e1beaee5cf32c75499a1d02bb",
+ "ff7f56e299ddd2a0206d7a25d0d930afb616c0f0",
"reftest"
],
"css/css-paint-api/geometry-border-image-002-ref.html": [
@@ -559859,7 +560492,7 @@
"support"
],
"css/css-paint-api/geometry-border-image-002.https.html": [
- "26e24bb0146b015a84dae57db5d4a2398ce00a8e",
+ "d6e47f049071416302a250c019b110d7dcaa8071",
"reftest"
],
"css/css-paint-api/geometry-border-image-003-ref.html": [
@@ -559867,7 +560500,7 @@
"support"
],
"css/css-paint-api/geometry-border-image-003.https.html": [
- "a26f2b7d10980b5f6d7d709c131b37cbc61add0d",
+ "36af043cc5fe9e2ebe0dc94855b3b1def55f28aa",
"reftest"
],
"css/css-paint-api/geometry-border-image-004-ref.html": [
@@ -559875,7 +560508,7 @@
"support"
],
"css/css-paint-api/geometry-border-image-004.https.html": [
- "60db7ff4bc59abd8133a38a1f92f8cc2e9054b7d",
+ "0f483cd5d19acf4923e60a9f59f55b2bd1e2d0d0",
"reftest"
],
"css/css-paint-api/geometry-with-float-size-ref.html": [
@@ -559883,7 +560516,7 @@
"support"
],
"css/css-paint-api/geometry-with-float-size.https.html": [
- "65477e4b3bf369d511113cbe81d04531281edc4c",
+ "8cd90c84318dff22e3099af7ef042f92f5b96506",
"reftest"
],
"css/css-paint-api/hidpi/canvas-transform-ref.html": [
@@ -559891,7 +560524,7 @@
"support"
],
"css/css-paint-api/hidpi/canvas-transform.https.html": [
- "d160a8673c21d17e58ca20eb437c22cd76c97104",
+ "6dc57abaf777c15ca3a868c03eee9e3c0559677c",
"reftest"
],
"css/css-paint-api/hidpi/device-pixel-ratio-ref.html": [
@@ -559899,11 +560532,11 @@
"support"
],
"css/css-paint-api/hidpi/device-pixel-ratio.https.html": [
- "46a9aa28f2f8876a06751fcdd26399c915dd1c1c",
+ "f9516e5ccf95dd96f32e770bd132cdc9ebe1e6f4",
"reftest"
],
"css/css-paint-api/idlharness.html": [
- "c9675ab0412bb955d7a8653e7d28884a6953800b",
+ "aad04a17cc4c660084fa196cb85da5d88b8560d4",
"testharness"
],
"css/css-paint-api/invalid-image-constructor-error-ref.html": [
@@ -559911,7 +560544,7 @@
"support"
],
"css/css-paint-api/invalid-image-constructor-error.https.html": [
- "439ff8b4e5a3c050a350349b37aad5c350dd2bbd",
+ "8facde43f57cec2bcd75efe25fee58d4c70ead62",
"reftest"
],
"css/css-paint-api/invalid-image-paint-error-ref.html": [
@@ -559919,7 +560552,7 @@
"support"
],
"css/css-paint-api/invalid-image-paint-error.https.html": [
- "2806ad9204853ab67cf90bd664382bb2cf2a8e67",
+ "17c283e35caae2a69e9c748fe19a8dd53b894e35",
"reftest"
],
"css/css-paint-api/invalid-image-pending-script-ref.html": [
@@ -559927,7 +560560,7 @@
"support"
],
"css/css-paint-api/invalid-image-pending-script.https.html": [
- "4347a00a499ff49d96051bb3fcfdcc42ba41999f",
+ "20a61eff41b68e8f756de2f3fe81bd20e736c92c",
"reftest"
],
"css/css-paint-api/overdraw-ref.html": [
@@ -559935,7 +560568,7 @@
"support"
],
"css/css-paint-api/overdraw.https.html": [
- "5be26f7e0a877e9835cd11563c28392281c84cc1",
+ "8d3dc72f9315884c342013d50f3936804a0747fe",
"reftest"
],
"css/css-paint-api/paint-arguments-ref.html": [
@@ -559943,7 +560576,7 @@
"support"
],
"css/css-paint-api/paint-arguments.https.html": [
- "abfb2a68e4be069055336585b4573dcfee1dd121",
+ "615027c8fe393c2109bb99bc6bb1c2f36d104f9e",
"reftest"
],
"css/css-paint-api/paint-function-arguments-ref.html": [
@@ -559951,7 +560584,7 @@
"support"
],
"css/css-paint-api/paint-function-arguments.https.html": [
- "d87b0b80a61d2f5edcd5e5d7227dfecd9f580ae3",
+ "3a1e579f5ecbe324d48a6e0cb4d94a77cb4361d3",
"reftest"
],
"css/css-paint-api/paint2d-composite-ref.html": [
@@ -559959,7 +560592,7 @@
"support"
],
"css/css-paint-api/paint2d-composite.https.html": [
- "80e94e45a8cddafe8b81a9a48ef16b4e0a03f586",
+ "edf8a766fabedaac61f2de9607ebde01e0d86c5b",
"reftest"
],
"css/css-paint-api/paint2d-filter-ref.html": [
@@ -559967,7 +560600,7 @@
"support"
],
"css/css-paint-api/paint2d-filter.https.html": [
- "d0c45395757c971c9a6c1c0895b7599191596c95",
+ "9d598c7a9689fccd3fcf140f912f58233f734b14",
"reftest"
],
"css/css-paint-api/paint2d-gradient-ref.html": [
@@ -559975,7 +560608,7 @@
"support"
],
"css/css-paint-api/paint2d-gradient.https.html": [
- "892a7919f1f73b65992e1ffbd5a0654de715075d",
+ "1887f52b06b1033d183ef6506f92cf9fe0d69773",
"reftest"
],
"css/css-paint-api/paint2d-image-ref.html": [
@@ -559983,7 +560616,7 @@
"support"
],
"css/css-paint-api/paint2d-image.https.html": [
- "6fce4b6898b86d4b4eeddf9c3d3660941ebc5512",
+ "71074df796d36a1d97a4598b62cdcc04fff390a3",
"reftest"
],
"css/css-paint-api/paint2d-paths-ref.html": [
@@ -559991,7 +560624,7 @@
"support"
],
"css/css-paint-api/paint2d-paths.https.html": [
- "091f548cb30fd84e5af3dc22c310a4d165e6bccc",
+ "0e04168fcb1aae5bc555873b795dc448d476551b",
"reftest"
],
"css/css-paint-api/paint2d-rects-ref.html": [
@@ -559999,7 +560632,7 @@
"support"
],
"css/css-paint-api/paint2d-rects.https.html": [
- "24942727d5ab14da8895587c9e0120ec9d0a6a14",
+ "9279aa2a870b81052360a9feadab4e406070bd3d",
"reftest"
],
"css/css-paint-api/paint2d-shadows-ref.html": [
@@ -560007,7 +560640,7 @@
"support"
],
"css/css-paint-api/paint2d-shadows.https.html": [
- "98dcfbce2997598d371481c422d412ad403f794f",
+ "b641dab8860f87264cd7b23f170ba693d894af62",
"reftest"
],
"css/css-paint-api/paint2d-transform-ref.html": [
@@ -560015,75 +560648,75 @@
"support"
],
"css/css-paint-api/paint2d-transform.https.html": [
- "c91b500a46f1d30e7a717ec9542462180e3de20f",
+ "d052b8c5543344ba3629c4723e5d05912cfc86dd",
"reftest"
],
"css/css-paint-api/parse-input-arguments-001.https.html": [
- "4356ce61f4aa5b277c6caf228e44dcbf3e6245c8",
+ "486f379dd7b27e70fd734d62e7de45fd8ca9ab5e",
"reftest"
],
"css/css-paint-api/parse-input-arguments-002.https.html": [
- "b1b50e04045fb05ad7f967a7db26f86dcf5d36b7",
+ "5c7b3aca048d05f8535e6d182b9c5350595464ea",
"reftest"
],
"css/css-paint-api/parse-input-arguments-003.https.html": [
- "3b1b0014f78a3ed0908273f0dc72b714f32c9aab",
+ "81904ee6f7b132fe6a58cd12d84e43b95cee625b",
"reftest"
],
"css/css-paint-api/parse-input-arguments-004.https.html": [
- "138a7908682a348b3a76f1244a68cae42cf3f2f2",
+ "9bf264b0d5fc21225c9f7ae8c887b61237b3f882",
"reftest"
],
"css/css-paint-api/parse-input-arguments-005.https.html": [
- "0c5e539381bd8bc9295bfa54db070c2e6b9e2ac2",
+ "24769f472c5b88b3b311a8d5e46e13ca3aaf6609",
"reftest"
],
"css/css-paint-api/parse-input-arguments-006.https.html": [
- "e99ab05a88d9fb6d8dff1a8a7dff880bc6bf0728",
+ "a6fcc16c5da9e135eebe3b4f53194f7fbe867fd2",
"reftest"
],
"css/css-paint-api/parse-input-arguments-007.https.html": [
- "53f245bce483e2074266793cec6d17c4f26ebadb",
+ "462cfb601069597977dabe25c806ee1af095a554",
"reftest"
],
"css/css-paint-api/parse-input-arguments-008.https.html": [
- "e6b863c641c0a201851c1910da158db377292217",
+ "d5c18b0905d76948428a3e874eccf7bda6ac944e",
"reftest"
],
"css/css-paint-api/parse-input-arguments-009.https.html": [
- "b23191ae34015c9a4fb7b3a4f711228b57b98b34",
+ "7cfdf91eb02a2d2f293f52cc3a8256243757557f",
"reftest"
],
"css/css-paint-api/parse-input-arguments-010.https.html": [
- "e98b431648932559400e721a0414a3955403b50a",
+ "142ca0c5d5d6b291f126d83554aa9ccec6aaa194",
"reftest"
],
"css/css-paint-api/parse-input-arguments-011.https.html": [
- "b9d54bf413d79a13b89decb578d17834a7649799",
+ "23eb9d3c9f98f4e2a67728be32897bf59b87a1aa",
"reftest"
],
"css/css-paint-api/parse-input-arguments-012.https.html": [
- "14eebeb635a73feb7303c178818f1e02df3d854d",
+ "fa2c6b5f56053373e3be5d48e8ca0840b090ee8f",
"reftest"
],
"css/css-paint-api/parse-input-arguments-013.https.html": [
- "37e3eb435ec38d8204b1c194a5da23f447aced5c",
+ "adc1c03cfe66f4ce6fe75c4a59ca4708f7115059",
"reftest"
],
"css/css-paint-api/parse-input-arguments-014.https.html": [
- "690e488b9177a2a482becc4ce38b48a264a1d6c8",
+ "d041ae316f7a3ea2c853828d6845716c36c13c85",
"reftest"
],
"css/css-paint-api/parse-input-arguments-015.https.html": [
- "fba76712466694e70e1a14c6ccd8e7f273ab981f",
+ "8ebe3e7c4d15fb653d890127eece81e1049df38f",
"reftest"
],
"css/css-paint-api/parse-input-arguments-016.https.html": [
- "31cca45facab4fb2c312f57f0c42b3e361d4baef",
+ "ccd0595faa514a877eb2ff0f7d9a8980b9a5b971",
"reftest"
],
"css/css-paint-api/parse-input-arguments-017.https.html": [
- "0d14fe74c21f4223e183f70cc95704945a0c8828",
+ "476e29ff12f0d75940ee5dfb5ac4079e43a7ae04",
"reftest"
],
"css/css-paint-api/parse-input-arguments-018-ref.html": [
@@ -560091,23 +560724,23 @@
"support"
],
"css/css-paint-api/parse-input-arguments-018.https.html": [
- "541332ae777c330431f6712570fd99d9707230b6",
+ "e6a31cbdd41899f2d4a548a7af39e97c44140380",
"reftest"
],
"css/css-paint-api/parse-input-arguments-019.https.html": [
- "707a0c6ebe05ea32a9ced7bf24b62dc7fb5e9dfe",
+ "309ec800eacfde6302add112ecd94275f394dc1a",
"reftest"
],
"css/css-paint-api/parse-input-arguments-020.https.html": [
- "fe8dbad27bdf56eeb10a51f259e00d44062945e1",
+ "7e00b64123d5621c226b104ccec133b83f10fa6e",
"reftest"
],
"css/css-paint-api/parse-input-arguments-021.https.html": [
- "0c3a596236fc3c7a8dd1bb72d0bd62efa2f80f14",
+ "8fa043a8cdead2ebbbb83f69fe708acac05127b1",
"reftest"
],
"css/css-paint-api/parse-input-arguments-022.https.html": [
- "50aaa6b3c9420f1220d38c407aec84be46afaafe",
+ "2ff27d7a4af5d4905a76ca53228b3cc619c05ecf",
"reftest"
],
"css/css-paint-api/parse-input-arguments-ref.html": [
@@ -560115,127 +560748,127 @@
"support"
],
"css/css-paint-api/registered-property-interpolation-001.https.html": [
- "c6e93029f101625de917394b314aecc3138ce1ec",
+ "5aaed62542f1231ab866b8c245424f8b676b0aeb",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-002.https.html": [
- "cfa9a618a1f10146fd61f357d6be3367e07b2cb6",
+ "80b2c9339d70772bbf0468e2ff1e14c3ec088279",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-003.https.html": [
- "314d0c082efca3073dc2d69e37f010e01f6d83b2",
+ "683ed403fb8b7a519b06c0b2c6d8564cb5830053",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-004.https.html": [
- "430326a0663281678dc6133a9d0b7cf6889352e3",
+ "9602e902eca44eb704a8f3977c9f4416ad7aab7e",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-005.https.html": [
- "807a0509289f3bea13ad8021f6e06c33c1552736",
+ "35d6ccbf3d4bc3d9278a733f7e21ab44734b2d08",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-006.https.html": [
- "45859a514a339231bf515546e494f1de5ce127bb",
+ "a8cfdead0f7b6d4d358c56f4126780452e827e4e",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-007.https.html": [
- "b3f4f1f1bba24ccdc265fb6e6c8f1a375ee8803e",
+ "77b80b51e67ac275aeff76baf93d0c0e8fca6ef8",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-008.https.html": [
- "45eb90960812cb1adb2537beb3068b90e5dbfd8e",
+ "1ec166614e13ccda26fd066cd1ed3c5134792e48",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-009.https.html": [
- "e45881244b2a211d2f5e5d9dfe867c13b55fac3d",
+ "e7a5e37c641f060458b128a4bb53e00f2ca63532",
"reftest"
],
"css/css-paint-api/registered-property-interpolation-010.https.html": [
- "d4d1b038e24d45e5f6941e3f7a7eb1facefe58f0",
+ "ee3a0f1b3217677a5a6d7049d0b85939ed271174",
"reftest"
],
"css/css-paint-api/registered-property-invalidation-001.https.html": [
- "26da7e2eeffac331266d8c5c8fc1754884b06d72",
+ "133b9238e6ceef161f99b99711839cf791c908b8",
"reftest"
],
"css/css-paint-api/registered-property-invalidation-002.https.html": [
- "0aab051a4c492cd25b4b96fbee78029c2f12921a",
+ "aadbfec42c8c89a9fa9b9a77d86f36fd36b0cbe3",
"reftest"
],
"css/css-paint-api/registered-property-stylemap.https.html": [
- "2305afb37df44abf4b9807bbe08c1ce0f7a1631c",
+ "4a6b4db521af8ddff57dd4ecaf9f9c35c5a4cc6b",
"reftest"
],
"css/css-paint-api/registered-property-value-001.https.html": [
- "f915dacb168a6252ace394cbe64426614b4fae16",
+ "970e1f3e5ed9ec422d50a9f71d935d5970b3eb12",
"reftest"
],
"css/css-paint-api/registered-property-value-002.https.html": [
- "7d62b0b2f65d3c7169ac0ccd338eb16ca9566e1a",
+ "6019151b10575afda778fc27117877d879c8839a",
"reftest"
],
"css/css-paint-api/registered-property-value-003.https.html": [
- "b22f18dde7c1281dea657bd89321a305e955b89d",
+ "b9c3bf3fd90422d3293dd30e4074c5b1dd66ee52",
"reftest"
],
"css/css-paint-api/registered-property-value-004.https.html": [
- "d67603f9fe8e0cd0969836d5c0748c304fdc6375",
+ "e04be69f80c27ee8ad83acdb5b4c0c4f23efaa0d",
"reftest"
],
"css/css-paint-api/registered-property-value-005.https.html": [
- "71cda9a3766f50aee0995f9bd37cb410c1919b95",
+ "bfecd0c56b8d538671540b9c229c7df585df1d31",
"reftest"
],
"css/css-paint-api/registered-property-value-006.https.html": [
- "aa03edf25f77907ef38b2320b51b535cf40985dd",
+ "7176b67d4bb8bf99a8bc3bfc559912424b449826",
"reftest"
],
"css/css-paint-api/registered-property-value-007.https.html": [
- "61256cd11cff21c31b95aeb31e8807d84b804b88",
+ "309fe969b6bd31a9f1c3212d92dedca8203b0942",
"reftest"
],
"css/css-paint-api/registered-property-value-008.https.html": [
- "06a18bd022cb7fc0dd47163ba5fdfeec6aab0b6d",
+ "db72408d77b9c7fe10142b1f83c9e98f38b219f3",
"reftest"
],
"css/css-paint-api/registered-property-value-009.https.html": [
- "2ce2a0d56bd6a8bf230c5bae4790c633c34643c6",
+ "a2c2e9a8cd561ef588f98a08031ad50961f59c07",
"reftest"
],
"css/css-paint-api/registered-property-value-010.https.html": [
- "53aef81e8e85c5aba8d88dbbee69689807735ffd",
+ "332a22a1b9d9d1c3c0f117c4804e19ff73b2c670",
"reftest"
],
"css/css-paint-api/registered-property-value-011.https.html": [
- "d5dc351f7fafcfe7636b426fb3cc262128826ed5",
+ "a596a5d55fd936921edc4661cdd9680950e2eebb",
"reftest"
],
"css/css-paint-api/registered-property-value-012.https.html": [
- "827877a51c4dd60c69056acfc0235a53a01fd91d",
+ "80c1e6ed37c5b8d4c611d534dbe4e4c6cbaf286c",
"reftest"
],
"css/css-paint-api/registered-property-value-013.https.html": [
- "e37cd556f80c4c02bdbcf5dc7905189b9e7265c3",
+ "7af03929d843cf5a201ff33bd3f57b1f790bd2e0",
"reftest"
],
"css/css-paint-api/registered-property-value-014.https.html": [
- "f42160fabe108b1d2238f5514d535be14c943d92",
+ "0ca1eca13ed3d4b1e2da165e827799f6ef968925",
"reftest"
],
"css/css-paint-api/registered-property-value-015.https.html": [
- "5b00b53c2a09a98dd762deb5f550ff26882c939b",
+ "d7ba26b852c15a2e4df11a071e042b7f1c523aa0",
"reftest"
],
"css/css-paint-api/registered-property-value-016.https.html": [
- "1ec2e1b5ab031a4c5842c190a081a7c4de14091f",
+ "609f00f6d0067efb6fdc44a9b54b104375303924",
"reftest"
],
"css/css-paint-api/registered-property-value-017.https.html": [
- "1ec2e1b5ab031a4c5842c190a081a7c4de14091f",
+ "609f00f6d0067efb6fdc44a9b54b104375303924",
"reftest"
],
"css/css-paint-api/registered-property-value-018.https.html": [
- "6be2cb8a228e34c0771c9e59b69409edf402feee",
+ "1f9876b6b502484c1821e559fc038d1050718d0b",
"reftest"
],
"css/css-paint-api/resources/html5.png": [
@@ -560251,7 +560884,7 @@
"support"
],
"css/css-paint-api/style-background-image.https.html": [
- "13204cf709f284920428bbc73f55b746597e0dc2",
+ "8e5f2f81547f0305ff230198f1b0300c838adfde",
"reftest"
],
"css/css-paint-api/style-before-pseudo-ref.html": [
@@ -560259,7 +560892,7 @@
"support"
],
"css/css-paint-api/style-before-pseudo.https.html": [
- "f7e2a164f177afb60baf72ef14e74b4c331c1f39",
+ "017b23a6caf66219a2b5912ce6eb9316cd0adfe5",
"reftest"
],
"css/css-paint-api/style-first-letter-pseudo-ref.html": [
@@ -560267,7 +560900,7 @@
"support"
],
"css/css-paint-api/style-first-letter-pseudo.https.html": [
- "02b114560fd894eaacb9387d517de1bad7665423",
+ "d3c31a0508dc86aa0da95815ff2448bc2e074caf",
"reftest"
],
"css/css-paint-api/valid-image-after-load-ref.html": [
@@ -560275,7 +560908,7 @@
"support"
],
"css/css-paint-api/valid-image-after-load.https.html": [
- "44612f98ffd50d0c2431662e6a325297dfc387a7",
+ "c1bf8e85548656b60145c4d54437b10a2f07880e",
"reftest"
],
"css/css-paint-api/valid-image-before-load-ref.html": [
@@ -560283,7 +560916,7 @@
"support"
],
"css/css-paint-api/valid-image-before-load.https.html": [
- "7738d9dd115d1a3bdcd922c797d5aee65e06bf84",
+ "b58dfa114ea8327dbce264b44c87a4c92d2b3eb9",
"reftest"
],
"css/css-parser-api/META.yml": [
@@ -561051,7 +561684,7 @@
"support"
],
"css/css-properties-values-api/conditional-rules.html": [
- "b4de63045f339d163830921e4e201e698edae47c",
+ "0bff879856c91047bb84575faf31917fd73ba049",
"testharness"
],
"css/css-properties-values-api/idlharness.html": [
@@ -561119,7 +561752,7 @@
"testharness"
],
"css/css-properties-values-api/unit-cycles.html": [
- "c26e1cda1f6842655e7e0158d6a934e470f486ae",
+ "5301b6fcc77b1b7885ef7602410e4f4586391b4f",
"testharness"
],
"css/css-properties-values-api/url-resolution.html": [
@@ -566950,6 +567583,10 @@
"ffbb796b6afe0fe9fa93e15de3586bef96174d8b",
"reftest"
],
+ "css/css-tables/percent-width-cell-dynamic.html": [
+ "5c7ef3bf8a2b7eac7371c7d86594f52cfb42815d",
+ "reftest"
+ ],
"css/css-tables/percent-width-ignored-001.tentative.html": [
"214eee7152b66a4198a2e81d7d62da9a295b5d98",
"testharness"
@@ -567375,7 +568012,7 @@
"support"
],
"css/css-text-decor/reference/text-decoration-thickness-001-notref.html": [
- "f876afa68c655535017fe5a6e6feff0ce1df4045",
+ "4e7db88ce5b41e28aa43fc339c35438855abb928",
"support"
],
"css/css-text-decor/reference/text-decoration-thickness-green-rect-ref.html": [
@@ -567495,11 +568132,11 @@
"support"
],
"css/css-text-decor/reference/text-underline-offset-001-notref.html": [
- "c56078a32ae26647c8aece448ce1d6b268f38abd",
+ "8b1dacfbf48a68b88e4ae47a852c810b3bc4becf",
"support"
],
"css/css-text-decor/reference/text-underline-offset-002-ref.html": [
- "ed2e3cefff82a120c3d33f504fd8d6ee78d9fe8c",
+ "6e7d5a65f0373ae49452daaa0ad401bed3f1af3e",
"support"
],
"css/css-text-decor/reference/text-underline-offset-scroll-001-notref.html": [
@@ -567803,7 +568440,7 @@
"testharness"
],
"css/css-text-decor/text-decoration-thickness-linethrough-001.html": [
- "37e954b2b8769e882420a49ef0adf42a8b4b096e",
+ "6fd8383d062960e5056a1e755eafdd95e23e0f88",
"reftest"
],
"css/css-text-decor/text-decoration-thickness-overline-001.html": [
@@ -567987,11 +568624,11 @@
"testharness"
],
"css/css-text-decor/text-underline-offset-001.html": [
- "bd9a29c7fdeeee9eeb30f226c1a3e8abfa0eac30",
+ "f7aeb543df3a77d277b1a8e99d1e50c3bd9a87ea",
"reftest"
],
"css/css-text-decor/text-underline-offset-002.html": [
- "7441ff9d9325a689f79991511b02c601f9a91701",
+ "dc65db7723fb31cfaa6c00b4af7e37f5b23affb2",
"reftest"
],
"css/css-text-decor/text-underline-offset-computed.html": [
@@ -569422,6 +570059,102 @@
"08e16f26321bab7ca03f2cfe6eddd0c324d765dc",
"testharness"
],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html": [
+ "fde2a3d086b16ee1817e5928015d19c5016340c6",
+ "testharness"
+ ],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html": [
+ "d6f58cb88c1d0b81351eedb3830568fa7a7713b2",
+ "testharness"
+ ],
+ "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html": [
+ "8265f917225e247538c9fa2f3b28cf7e0382b2ed",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html": [
+ "c902bf7bddb23db69a23ad70cc4ef5f3c85e4aa0",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html": [
+ "e98d4a20cb1f80111b22fc7cb30d079ac3f12009",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html": [
+ "29810f2a3502c9b24364c626af22d591c0f0406a",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html": [
+ "9dffd854891a195c8d590ade08ea29e0ff2a585a",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html": [
+ "9c0af13806ca8b612700856f8007152449e3a5a8",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html": [
+ "d573bac7d6b69b2fbf702aabfc656a151b15171a",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html": [
+ "80b5bb0c72c7a36649678e421ea26795aeb0228d",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html": [
+ "6d6043031e008e3cf01be5cb367edfa1edf8bab6",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html": [
+ "e0f60cd36fe0e2c87325feac0aaf0fb96e1ff205",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html": [
+ "fff23f36df8f22161c841ae93b637426315c9552",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html": [
+ "d000d8eb16d55e53eab708eabec21d6d95a22fe7",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html": [
+ "79d6e12cc8eb3d2dfcd0544f2a4cc89a80f4223b",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html": [
+ "ff8ef05b14c8abac40ea2ac6c8c667a7062b97fe",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html": [
+ "c5913821e5bd37d706f98818524df6c74b7519b0",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html": [
+ "46c0fe3caacc6a7dec51fe75d9186385937ec901",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html": [
+ "0eec96857fd6bb8f2b812dc91c42cebf422ec2f7",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html": [
+ "6043912cded98d4a37087f2bca85f7dfa4c8c7f4",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html": [
+ "8c9387fa044ae0cb5c95be33737395cf020a4cde",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html": [
+ "8b2fd1c038cb909665d957b29a0a1953db02f1b0",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html": [
+ "2da6d3b0af66f37640dda46d5dbc3cf639fa0a06",
+ "testharness"
+ ],
+ "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html": [
+ "99cf5c5fbef0c51848a631ac76cfec5497fc0faa",
+ "testharness"
+ ],
"css/css-text/i18n/reference/css3-text-line-break-opclns-001-ref.html": [
"d3827a52989d4d5f0f7f5f8bb625be19c5ace3a0",
"support"
@@ -570138,6 +570871,102 @@
"577500e2426523a3cd29ba26ae7f5686cadfdb84",
"support"
],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html": [
+ "d6d0a1b3493af9a5f06b296cc0545e29cf1bf29f",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html": [
+ "548fa17398287e4e3c8c210f1bb0e72a43d87af1",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html": [
+ "a4e871789a30ff001b6bf278a87edb54b4ebe733",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html": [
+ "3d4cb261289599df2141a534620654cd995eccaf",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html": [
+ "417973b0bbf1ce2730765d5ad5087b2f894c4db9",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html": [
+ "c6685dfe79d875034b8bdc4d4a8de70a09e33948",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html": [
+ "f15f2632ebeb8fef879a4e7a455e813beb964384",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html": [
+ "4e9dc5607b4c7887244d032dcfe89133718dacb9",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html": [
+ "595cd5df2b632c471cf3003f66545c10e2fe2aa0",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html": [
+ "c507f78e6e403b7d1f386299a34f12fcf613e3e8",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html": [
+ "4e8d9617baf1a66ff15fb7dc8d6d4767aa62da97",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html": [
+ "a1c3a855041d589ea47d90c636e69f215bc27b1c",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html": [
+ "420a7b6f07c2a4dbd06f7361d37d1f2cb1a26a88",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html": [
+ "9d7b2c032d54b693b3fd343a44089e27d70d3963",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html": [
+ "54c7559d109b5591e722fe8290e2c11f1da97d08",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html": [
+ "e635075a4151604e7a9b59900cde690e90c84e87",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html": [
+ "46e7472208e295d53bdd7c114bbd6f10dd354d2c",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html": [
+ "61fd7b7ec5ca51d0ce6eddc8392c58a6281e2e74",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html": [
+ "b21853f386e4c7759f465ff3f3caafb00942c2a6",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html": [
+ "337cf8f85dba5c08b7649da26c1d2a91369721fe",
+ "testharness"
+ ],
+ "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html": [
+ "d25fa6857d8bb1bb4f0b366dae17a1ac783ddcab",
+ "testharness"
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html": [
+ "a131395e1daff855eaf3f787fddeb60f73318dc1",
+ "testharness"
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html": [
+ "ff7456b82148c8c780e700185e11d8cda97bb51c",
+ "testharness"
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html": [
+ "dc752f1086c1346404766372d268f6c2be3c5979",
+ "testharness"
+ ],
"css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html": [
"4044e10666d15573fa4d7b3d455b956895eae19e",
"testharness"
@@ -570198,6 +571027,18 @@
"d85b74a54056166cedbf04f694d681ef95fff9b4",
"testharness"
],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html": [
+ "b56cd28c84037387634ab0b91311fedf11522136",
+ "testharness"
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html": [
+ "198bf28cd7e5d49e57912db6637048a1f506d887",
+ "testharness"
+ ],
+ "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html": [
+ "c71014b42f90e1ca21b0df9f7184b94bfc282bbb",
+ "testharness"
+ ],
"css/css-text/inheritance.html": [
"ef3270651c3df4ae6112fdfeec0e7fea4b9d6ccf",
"testharness"
@@ -570263,55 +571104,55 @@
"reftest"
],
"css/css-text/line-break/line-break-anywhere-004.html": [
- "daf8420b3930efaecd6f579794105def64dcc75c",
+ "19b98417b0ffc1e0d9c18873408376cd534084f4",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-005.html": [
- "47f675eda6ecc6fdaba17cbc06f6df960db87b75",
+ "5e286a0d769b25816390297851d9ff85a9e60db0",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-006.html": [
- "de5a43eab444bf440ce44402972e575d2c70f967",
+ "207cf84f756d608a9e494fa0386dc64468ad8bb7",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-007.html": [
- "300d9bd92981eca6e87d19caf973d59df847638d",
+ "b8e4627e7bc93abc79be473b7bdaadebf2d8fd8a",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-008.html": [
- "a7590a2ee278b218c5e93f90fdf2e3837f4db2c2",
+ "6b7fb14f5cf2300981b2123a130467eccc4634eb",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-009.html": [
- "4cc3f4ee392bde3b0cfd4a52fb6af06d3696bcb2",
+ "6a0ab913330877453233a3aa14aac2aed5a70c6d",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-010.html": [
- "6554bf68ce13d0f3a3f3d020c01a749aca4228dd",
+ "19cc7966028841b6b7aa0a8e890f83623e2429a4",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-011.html": [
- "6cbec13008edd1fadb022f0e8f50f63c6f0a1642",
+ "70d9628a6f01b3e792ab27b0b2e1cd9740a67080",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-012.html": [
- "2dfe6071fdfe2a2993812a28c7e1408d59da763c",
+ "0c01a0c28ba634db6fb1143beb554e62c2d882cb",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-013.html": [
- "2b60ff5c622e0d7e8e96e1207e7113f14043f9bf",
+ "9aef864c9219caadc3cda6d67ee01f8d42b099a1",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-014.html": [
- "04969bb65a9b84c033e40e38f2ccc0165a0cc36d",
+ "ddbeddf12fe21a462c4d32a49b621fa623097e01",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-015.html": [
- "34c261e437241516b7d5060a037d8ea10493b0e5",
+ "b0edd4e298208661acc66b952c2e823f2c65c799",
"reftest"
],
"css/css-text/line-break/line-break-anywhere-016.html": [
- "81b565209c6317113d5a138375b0249b4a22342a",
+ "5f80f52c6ea0c5c9c7577896b9bc5d309093c90e",
"reftest"
],
"css/css-text/line-break/line-break-loose-011.xht": [
@@ -572458,6 +573299,14 @@
"9525b994a8f0c296bc703b19baf91bef4f84c686",
"support"
],
+ "css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html": [
+ "3d2f9c7be2236666bd680a09c834668616fde44d",
+ "support"
+ ],
+ "css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html": [
+ "b8fc5662bd83d9f29aabadbd4eb973e91621f1ed",
+ "support"
+ ],
"css/css-text/text-transform/reference/text-transform-lowercase-001-ref.xht": [
"3d6eb4af8ac5aeb7fd54e1b2e2aec325886ddca0",
"support"
@@ -572822,6 +573671,14 @@
"13c0c42a5e7dcbdbbc6df216f3815eb73cb085a4",
"reftest"
],
+ "css/css-text/text-transform/text-transform-fullwidth-006.html": [
+ "b0a509758ed56ca4051e1df079c4d758352764c3",
+ "reftest"
+ ],
+ "css/css-text/text-transform/text-transform-fullwidth-007.html": [
+ "6e081544a193949b217530b49f71eadfe2800be4",
+ "reftest"
+ ],
"css/css-text/text-transform/text-transform-lowercase-001.xht": [
"dc3fadf64caf5786123250da2cc50187ec693d2b",
"reftest"
@@ -573158,6 +574015,30 @@
"828058f53dd811d4dbea0b7e0d56ab5a940725c6",
"reftest"
],
+ "css/css-text/white-space/break-spaces-tab-001.html": [
+ "4b01a60395a6c1133c7af8af957dd70859db4823",
+ "reftest"
+ ],
+ "css/css-text/white-space/break-spaces-tab-002.html": [
+ "d86918b75fbef27e6cee5d11c844fd971bee595f",
+ "reftest"
+ ],
+ "css/css-text/white-space/break-spaces-tab-003.html": [
+ "0d762a426aa323547c5e18daa36b1f55a715e7fc",
+ "reftest"
+ ],
+ "css/css-text/white-space/break-spaces-tab-004.html": [
+ "4ccbdd0f21ae4232effc200784dcbe4f3373ea21",
+ "reftest"
+ ],
+ "css/css-text/white-space/break-spaces-tab-005.html": [
+ "b5cf3f33ec2bb582bb3f322eeed7c45b426f0936",
+ "reftest"
+ ],
+ "css/css-text/white-space/break-spaces-tab-006.html": [
+ "85d821a3e4d476e6fdfe74a7a2f9134ffb2629a3",
+ "reftest"
+ ],
"css/css-text/white-space/control-chars-000.html": [
"b038fe9a90d3b8b9cb3bde7fd46396c7121688c9",
"reftest"
@@ -573507,19 +574388,19 @@
"reftest"
],
"css/css-text/white-space/pre-wrap-leading-spaces-006.html": [
- "cff928c2fd537b4f2db6ed282882c9a14f795452",
+ "de1c0de11c67871c5ce8df1dd7e1ee268182c8c6",
"reftest"
],
"css/css-text/white-space/pre-wrap-leading-spaces-007.html": [
- "ca27b98c2f68940287fc61d4f24709af196ced10",
+ "9089466338f9dba6c60b8e786ff905d4856488fc",
"reftest"
],
"css/css-text/white-space/pre-wrap-leading-spaces-008.html": [
- "7331142c2ea0cf56441bd98504610b6ae3150f79",
+ "f112a0c20b9586f365345227e926ac03cc2edf8a",
"reftest"
],
"css/css-text/white-space/pre-wrap-leading-spaces-009.html": [
- "e2786419c1a56466fc3850fd371bdac45203fdf3",
+ "2fe58aa5ceb5abc19d00db01d01452c7cf3ec1d5",
"reftest"
],
"css/css-text/white-space/pre-wrap-leading-spaces-010.html": [
@@ -573542,6 +574423,38 @@
"ab2759fdc7b094fa9f4012b557abc27fb6bf8ffd",
"reftest"
],
+ "css/css-text/white-space/pre-wrap-tab-001.html": [
+ "e57da83e9fb7e28e7ddba5a091be1331eb804c7a",
+ "reftest"
+ ],
+ "css/css-text/white-space/pre-wrap-tab-002.html": [
+ "11ec850940856258d6b5f96b5d6bed05181910b3",
+ "reftest"
+ ],
+ "css/css-text/white-space/pre-wrap-tab-003.html": [
+ "a54debe80a24b6a1ac660a1c131494a7f4c6b2bd",
+ "reftest"
+ ],
+ "css/css-text/white-space/pre-wrap-tab-004.html": [
+ "22c3ec45c68d5cf508fe326b1395cef22a4f1e23",
+ "reftest"
+ ],
+ "css/css-text/white-space/pre-wrap-tab-005.html": [
+ "993aa92e370b708855aa883591e13251f9015364",
+ "reftest"
+ ],
+ "css/css-text/white-space/pre-wrap-tab-006.html": [
+ "a4c7f3d3ebd9ae73a494769b18f046185672030c",
+ "reftest"
+ ],
+ "css/css-text/white-space/reference/break-spaces-tab-003-ref.html": [
+ "52a8c491cca2da9426e318d2e36786d05fe74e06",
+ "support"
+ ],
+ "css/css-text/white-space/reference/break-spaces-tab-005-ref.html": [
+ "798e35fd660b9d1e9681c7de01cb0efc923e6aa6",
+ "support"
+ ],
"css/css-text/white-space/reference/control-chars-000-ref.html": [
"9d5fcb27147a8c53e410d08511cb5035b612f80c",
"support"
@@ -573894,10 +574807,6 @@
"f62e2e5c005d4043c02894eed87422fa6c59b824",
"reftest"
],
- "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html": [
- "820012e6ca10dec9065f7c5869c47b065b426033",
- "reftest"
- ],
"css/css-text/white-space/white-space-wrap-after-nowrap-001.html": [
"a484f1cf9167e468063cf2205493b8e71a254470",
"reftest"
@@ -575522,11 +576431,15 @@
"eb7431078c42e08dbfe07e6de2e154ba9ecb2297",
"testharness"
],
- "css/css-transforms/parsing/perspective-origin-parsing-invalid.html": [
+ "css/css-transforms/parsing/perspective-origin-computed.html": [
+ "effeb2974e136831a646318e7fabf30cf27183a6",
+ "testharness"
+ ],
+ "css/css-transforms/parsing/perspective-origin-invalid.html": [
"2ed6721e091702a436217086eebd81172f359339",
"testharness"
],
- "css/css-transforms/parsing/perspective-origin-parsing-valid.html": [
+ "css/css-transforms/parsing/perspective-origin-valid.html": [
"79f4e0df12e84e880e8c501856a977e1a2c468b8",
"testharness"
],
@@ -575562,8 +576475,12 @@
"7fb8367ecb2f6e2f151a1ee6afaab9896f07f8c8",
"testharness"
],
+ "css/css-transforms/parsing/transform-origin-computed.html": [
+ "696d89db67fc9dd611fa0c09fccbe0408134e744",
+ "testharness"
+ ],
"css/css-transforms/parsing/transform-origin-invalid.html": [
- "19a7c963a708912d347a4c708dc848a7e580966b",
+ "0dd1eeaf592b94fe65d0ccfb731c826b5dfcb3dc",
"testharness"
],
"css/css-transforms/parsing/transform-origin-valid.html": [
@@ -592962,6 +593879,10 @@
"cec27f412c926ab087f2cd736e4c6a7d4efb4c99",
"testharness"
],
+ "css/cssom-view/scrollLeftTop.html": [
+ "55b4013600727a3dcae0ab2c286a38801cdd8426",
+ "testharness"
+ ],
"css/cssom-view/scrollTop-display-change-ref.html": [
"9f1259787bbb33e8f8be6d8fc415738bffee6590",
"support"
@@ -594034,6 +594955,14 @@
"3a2d8feaeefc82c20afd3de2c2cf9ce9bf6aed11",
"reftest"
],
+ "css/filter-effects/backdrop-filter-plus-opacity-ref.html": [
+ "347b7a684cac002562314b8e8af57fb919667bec",
+ "support"
+ ],
+ "css/filter-effects/backdrop-filter-plus-opacity.html": [
+ "cb189f9f3e9375c1f5ae1c2abf8433f4d13f39fc",
+ "reftest"
+ ],
"css/filter-effects/backdrop-filter-reference-filter.html": [
"6c61a9620aa82d23375fd31900d87bcfd873a5e1",
"reftest"
@@ -595258,6 +596187,10 @@
"7433877972b09b3a03cd9f8a11dcd3efd1aa01d6",
"reftest"
],
+ "css/mediaqueries/width-equals-window-inner-width.html": [
+ "775c1112de75e7703c28c2241b533e29e13ba5c5",
+ "testharness"
+ ],
"css/motion/META.yml": [
"20835b48397f136a30b82a62654d389cad326315",
"support"
@@ -610195,7 +611128,7 @@
"testharness"
],
"element-timing/images-repeated-resource.html": [
- "9bc8b5f45e4add4c384160d43649e13eebc1a563",
+ "a6ad7acefcbef2891d50b6993457a2026b12f604",
"testharness"
],
"element-timing/invisible-images.html": [
@@ -610259,7 +611192,7 @@
"support"
],
"element-timing/resources/element-timing-helpers.js": [
- "f98f9b21134e334e46510bb419a12291d23817bc",
+ "8933732616c116f1617c64f07182c9cbeb9f59fe",
"support"
],
"element-timing/resources/iframe-with-square-sends-entry.html": [
@@ -614403,7 +615336,7 @@
"testharness"
],
"fetch/api/response/response-consume-empty.html": [
- "6e51ff8b59a6f2d80f407d0cca0e99d8642f71b1",
+ "4bfcfbc8f44617190e9469f7ce85ce6dc91d2df9",
"testharness"
],
"fetch/api/response/response-consume-stream.html": [
@@ -620455,7 +621388,7 @@
"testharness"
],
"html/dom/interfaces.https.html": [
- "47254a4361c46ad5fdc46efd2165da1bbab4c9b5",
+ "6ca7721253200d4511758f5ba15a61f756509370",
"testharness"
],
"html/dom/interfaces.worker.js": [
@@ -627331,7 +628264,7 @@
"support"
],
"html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt": [
- "cd138fd32af8056e968e7571cd0ab2fe6f02c68d",
+ "7fe5b1241a2261a001b3b903528eb275ae5cb0c3",
"support"
],
"html/semantics/embedded-content/media-elements/track/track-element/resources/captions-gaps.vtt": [
@@ -635967,7 +636900,7 @@
"testharness"
],
"imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html": [
- "6a555fe25aad6b823a87282472345acb7d9dbf78",
+ "81d0c900650ea3b489549b7977cd9922a35bcca6",
"testharness"
],
"imagebitmap-renderingcontext/tranferFromImageBitmap-TransferToImageBitmap-offscreen.html": [
@@ -636583,7 +637516,7 @@
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini": [
- "c83e8ff9261b78084f75fb584a8b5236cc28c3fd",
+ "e34c73f1ba984ed27b5ced8ad99a3f673cd109cf",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini": [
@@ -637031,7 +637964,7 @@
"support"
],
"interfaces/css-properties-values-api.idl": [
- "4ba38970e30ac2610e35c266e07f381e3a6b4ec5",
+ "ee444ebb29d8b5b15c96d259bb8a1f2bdd280d5f",
"support"
],
"interfaces/css-pseudo.idl": [
@@ -637119,7 +638052,7 @@
"support"
],
"interfaces/geometry.idl": [
- "5d5fe4fc2c48305c0ea7e9ce0859af3700d9b14c",
+ "1b83959465cf5f76bf52d2f8db51426281c07470",
"support"
],
"interfaces/gyroscope.idl": [
@@ -637159,7 +638092,7 @@
"support"
],
"interfaces/longtasks.idl": [
- "21bb1dd117ba7b35965c8cd42fdefded94e101b1",
+ "333b842f86e5d41f6f1aab8827cf086356c5a782",
"support"
],
"interfaces/magnetometer.idl": [
@@ -637927,7 +638860,7 @@
"testharness"
],
"largest-contentful-paint/cross-origin-image.sub.html": [
- "6e86f13b9ccccf5cecd1ca4bd02b6d0cd2007845",
+ "88775b861a6b98b1af0fb5163222a1025a6df02e",
"testharness"
],
"largest-contentful-paint/expanded-image.html": [
@@ -637938,12 +638871,24 @@
"3e083625bdc1812a2c344b8eefaaa10d3b31e623",
"testharness"
],
+ "largest-contentful-paint/loadTime-after-appendChild.html": [
+ "fb0eddb220ec660d529a43b112c576bf146a87e8",
+ "testharness"
+ ],
"largest-contentful-paint/observe-image.html": [
- "4d56cc2d8386e41e220097836755d1936185b41c",
+ "16b3502eb340cbce179bf440c245cafafe4beea4",
"testharness"
],
"largest-contentful-paint/observe-text.html": [
- "7dbfbe52f3dadf01524025a80fdcce4b64a60e19",
+ "2cf1344f2557d5bddd22eaf4ae4fed99d89267a1",
+ "testharness"
+ ],
+ "largest-contentful-paint/repeated-image.html": [
+ "94406b20d62b417a690ce6a96d909bb29c791081",
+ "testharness"
+ ],
+ "largest-contentful-paint/supported-lcp-type.html": [
+ "25d4eaa0367f45440d286c6c1c14de4458465d7b",
"testharness"
],
"layout-instability/buffer-layout-shift.html": [
@@ -637963,7 +638908,7 @@
"support"
],
"layout-instability/supported-layout-type.html": [
- "9bc537016581274e03b09e677f3fe8c36f3c613e",
+ "8679a2de7388c5e43a8d784cb3a986d4e23ca568",
"testharness"
],
"lifecycle/META.yml": [
@@ -638019,7 +638964,11 @@
"testharness"
],
"lint.whitelist": [
- "02b1bb0c78f9765257a35aed076701e2f0aa757e",
+ "c344c3a834444db4be24db1d0132c85a4b14395c",
+ "support"
+ ],
+ "loading/lazyload/common.js": [
+ "f5013fc288f58b71a14d01269db14385dd80c8a5",
"support"
],
"loading/lazyload/iframe-loading-eager.tentative.html": [
@@ -638038,6 +638987,18 @@
"5920eb1882df0a69e0d23c26433bf1b28b9275e9",
"testharness"
],
+ "loading/lazyload/original-base-url-applied-tentative.html": [
+ "06f9c257ee9e1b10c626e4a36c826a41506dea89",
+ "testharness"
+ ],
+ "loading/lazyload/original-referrer-policy-applied-tentative.sub.html": [
+ "2ffbc821c66a256765f00773afcef5ed94ac5a44",
+ "testharness"
+ ],
+ "loading/lazyload/picture-loading-lazy.tentative.html": [
+ "58f8c3a4d5a1e21ce2afd9def3ab9b5870cc272f",
+ "testharness"
+ ],
"loading/lazyload/resources/image.png": [
"b712825093805d1052b01047b1dbb102f0af8f0f",
"support"
@@ -638079,7 +639040,7 @@
"testharness"
],
"longtask-timing/idlharness.window.js": [
- "0ef7e85440ee1fc99c05ef5be0fc1fe61f818118",
+ "fd9a3f042f6c9fc3ac605fc0dd4e23edfa5d683b",
"testharness"
],
"longtask-timing/longtask-attributes.html": [
@@ -650847,7 +651808,7 @@
"support"
],
"pointerevents/pointerevent_support.js": [
- "3b37f48889f27ca00ddc1229e6f67ba292722736",
+ "29d48e03b0a9154ea2fb1fac3467e80b0f74bcc6",
"support"
],
"pointerevents/pointerevent_suppress_compat_events_on_click.html": [
@@ -650895,7 +651856,7 @@
"testharness"
],
"pointerevents/pointerevent_touch-action-keyboard.html": [
- "fdddd3313f498abb89a0958fd302b3949abab355",
+ "aeff71331dd61ec5e7da5c0e67e241e9e4bdd941",
"testharness"
],
"pointerevents/pointerevent_touch-action-mouse-manual.html": [
@@ -661575,7 +662536,7 @@
"support"
],
"resources/idlharness.js": [
- "cb294c072de2af61b2a4c7c8e4588d05a8186109",
+ "9be554d96b6e29cb43576f5ac8c1f8209e89fd62",
"support"
],
"resources/idlharness.js.headers": [
@@ -663859,7 +664820,7 @@
"testharness"
],
"service-workers/service-worker/interfaces-window.https.html": [
- "f70cf40931db88350c5fb0f5ebb1fbd10f917dba",
+ "cc3bdaf11fc7bc174eef555a60263e192efdc539",
"testharness"
],
"service-workers/service-worker/invalid-blobtype.https.html": [
@@ -665310,6 +666271,18 @@
"4f6d5ae28200e09cba0e25c2769168bc1622a360",
"support"
],
+ "service-workers/service-worker/resources/update-smaller-body-after-update-worker.js": [
+ "d43f6b2f5c3d64156ae68970eab3a65511c5c960",
+ "support"
+ ],
+ "service-workers/service-worker/resources/update-smaller-body-before-update-worker.js": [
+ "30c8783a70255012e5763403d15467d148b249b0",
+ "support"
+ ],
+ "service-workers/service-worker/resources/update-worker-from-file.py": [
+ "7604719c8e0c5dacd216bf96921d825dd0211aea",
+ "support"
+ ],
"service-workers/service-worker/resources/update-worker.py": [
"446d547ca78277c69795233f0d7c0f64125059d8",
"support"
@@ -665523,7 +666496,7 @@
"testharness"
],
"service-workers/service-worker/update.https.html": [
- "7232419cd0acc33515113363540b332e397025d7",
+ "f7fae35ed28d7c82c261752c22cd091e473801b0",
"testharness"
],
"service-workers/service-worker/waiting.https.html": [
@@ -666847,7 +667820,7 @@
"testharness"
],
"sms/interceptor.https.html": [
- "b7e8fd53bff98c6c64554149e0cd71c5f1f45686",
+ "86b21922284f946a16bcd295a87851bee7569f9a",
"testharness"
],
"sms/resources/iframe.html": [
@@ -666859,7 +667832,7 @@
"testharness"
],
"sms/sms_provider.js": [
- "6a54e47b24111f075cb88262a5ffd3dea75a994d",
+ "4506135551c771d056dc202f06a4c00a7c31089f",
"support"
],
"sms/sms_receiver.idl": [
@@ -666947,7 +667920,7 @@
"testharness"
],
"std-toast/attributes.html": [
- "97bab585c7045350b873db9683ce680452ba4451",
+ "9b87280b6688b3847401ea7b97ed63f6164bf70a",
"testharness"
],
"std-toast/closebutton.html": [
@@ -666978,6 +667951,10 @@
"4d6f5038f2d6ffa80ebdfa12798c8c4202b39670",
"reftest"
],
+ "std-toast/reflection.html": [
+ "36cbaf652287dbbde5a871b398d313cf70d1b275",
+ "testharness"
+ ],
"std-toast/resources/helpers.js": [
"256f0c880408c3343d36392f8b4cf64d9bbbfbe6",
"support"
@@ -666987,7 +667964,7 @@
"testharness"
],
"std-toast/styles.html": [
- "98e6723c3c8b16fd71d388ad3947627194c76436",
+ "1db8620485dc459577649e0c2689194d106dcc51",
"testharness"
],
"storage/META.yml": [
@@ -667083,11 +668060,11 @@
"support"
],
"streams/byte-length-queuing-strategy.any.js": [
- "d47e7cd4faa787933920c48d99a75eea98eaefe7",
+ "6a61adcdc96cf1f002e70642a87e8e1218e52c06",
"testharness"
],
"streams/count-queuing-strategy.any.js": [
- "20bb4c1842d258f2de7ff3261c4a93c9d427707e",
+ "5aae61eda3394e3017d51d241159112f5ef9883f",
"testharness"
],
"streams/piping/abort.any.js": [
@@ -676479,7 +677456,7 @@
"support"
],
"tools/wpt/browser.py": [
- "fe794a59a887a224ad52eb64cac9bd3ca8ea3e83",
+ "1f0134153169703b897f70849193d4076c64673b",
"support"
],
"tools/wpt/commands.json": [
@@ -676507,7 +677484,7 @@
"support"
],
"tools/wpt/run.py": [
- "4693bb7f11f94cd1747133bc1935fd38f206489d",
+ "6acc5b8e7400f5726538657239de5710ecea396d",
"support"
],
"tools/wpt/testfiles.py": [
@@ -676783,7 +677760,7 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/__init__.py": [
- "8698e816305a694e31447fdd09d6caff5aaa42d3",
+ "18434e499dc2276d6b23157b854dcc116c664901",
"support"
],
"tools/wptrunner/wptrunner/browsers/base.py": [
@@ -676818,14 +677795,14 @@
"599ec9f3110f89f5d64effe98130ede930f1fb7c",
"support"
],
- "tools/wptrunner/wptrunner/browsers/fennec.py": [
- "b1f535a85401a39b6ff58cd631bafcc42ce32e9a",
- "support"
- ],
"tools/wptrunner/wptrunner/browsers/firefox.py": [
"2f58022d238742ac97e4d898830cfe48801718fe",
"support"
],
+ "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
+ "d8d5c7f728451a97b4f93fb80bfb6c56a3c2a595",
+ "support"
+ ],
"tools/wptrunner/wptrunner/browsers/ie.py": [
"78c22b909acf410038ff06769366662ab0c589a0",
"support"
@@ -680538,6 +681515,14 @@
"32c24570db165422a60a18b767c828dab10c5b9c",
"support"
],
+ "web-nfc/NDEFMessage_constructor.https.html": [
+ "73bbb4f8ab5182995fd66459148e3399be1361a4",
+ "testharness"
+ ],
+ "web-nfc/NDEFRecord_constructor.https.html": [
+ "81148856473c4823422f59511a5e9de8bbfc4771",
+ "testharness"
+ ],
"web-nfc/NFCErrorEvent_constructor.https.html": [
"1cc9ce160be46955a9b15485ee4c040605722961",
"testharness"
@@ -680579,7 +681564,7 @@
"manual"
],
"web-nfc/NFCReadingEvent_constructor.https.html": [
- "3c4242943d6c44540676c6e12acb83a51e2d11f0",
+ "172b0a619c2b27b9c8d0f04101094f7969aa11e9",
"testharness"
],
"web-nfc/NFCWriter_push.https.html": [
@@ -680611,7 +681596,7 @@
"manual"
],
"web-nfc/resources/nfc_help.js": [
- "812d0f071183f53cef973c58fdbbc260e3154296",
+ "67fd5af381c9fa96c921b9fd6a2d6559562f4066",
"support"
],
"web-share/META.yml": [
@@ -682555,7 +683540,7 @@
"wdspec"
],
"webdriver/tests/perform_actions/pointer_contextmenu.py": [
- "c64c51252a5a4a5be3464fe92e0ced0a81a486a1",
+ "fda3f18bbc1c9cdcede30abe74f6d4e2f297d48f",
"wdspec"
],
"webdriver/tests/perform_actions/pointer_dblclick.py": [
@@ -683555,7 +684540,7 @@
"testharness"
],
"webrtc/RTCPeerConnection-getStats.https.html": [
- "c2c4e8e37176ce13447c1c8238aa6243f9aea130",
+ "a42086a3733c2f46d85d8659059d9b18cef9845f",
"testharness"
],
"webrtc/RTCPeerConnection-getTransceivers.html": [
@@ -683647,7 +684632,7 @@
"testharness"
],
"webrtc/RTCPeerConnection-setRemoteDescription-offer.html": [
- "cae62b24b6c180c06be87dd48ffac364427624db",
+ "2315c12f6c846dccadb0edf0cd9e5220564aa1d6",
"testharness"
],
"webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html": [
@@ -688399,7 +689384,7 @@
"support"
],
"webxr/resources/webxr_test_asserts.js": [
- "36524211d01980283124c0e2c7fcefd67a7b8b04",
+ "24b5274bc23d4e601e94eebd93968d9c30942b08",
"support"
],
"webxr/resources/webxr_test_constants.js": [
@@ -688407,7 +689392,7 @@
"support"
],
"webxr/resources/webxr_util.js": [
- "baf1d66b00daa98c07b9bfc91436018d12eef097",
+ "d75e5c7bd2e26cf79794a01b8bed637c165926e6",
"support"
],
"webxr/webGLCanvasContext_create_xrcompatible.https.html": [
@@ -688575,11 +689560,11 @@
"testharness"
],
"webxr/xrWebGLLayer_framebuffer.https.html": [
- "7c4ff17c2547995afbf561850faaf92b6aa5e56f",
+ "ba6b7dc0b922ae45aa714de8d3ca6f4ffbaf414c",
"testharness"
],
"webxr/xrWebGLLayer_viewports.https.html": [
- "8cfccff3c01dedb41db4f26563824ce0cdb65ad3",
+ "94a23dcdb427298722a989987a02f35a8d98d055",
"testharness"
],
"workers/META.yml": [
@@ -690791,7 +691776,7 @@
"testharness"
],
"xhr/getallresponseheaders.htm": [
- "72e27a5947c1e00ce1edeedf21a9db83c42832fa",
+ "759d6b68a1f337cac59aed0e9a800e433b68d1b6",
"testharness"
],
"xhr/getresponseheader-case-insensitive.htm": [
@@ -691283,7 +692268,7 @@
"support"
],
"xhr/resources/headers.asis": [
- "d25fe52efeb5427b126c3b375b4bb00090836382",
+ "69273ac87fea6974688d610910899e077a377b0f",
"support"
],
"xhr/resources/headers.py": [
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-001.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-001.html.ini
new file mode 100644
index 00000000000..60df723fea1
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-001.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-002.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-002.html.ini
new file mode 100644
index 00000000000..abd0c320782
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-002.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-003.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-003.html.ini
new file mode 100644
index 00000000000..89e35aacba2
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-003.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-003.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-004.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-004.html.ini
new file mode 100644
index 00000000000..ee3821915a7
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-004.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-005.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-005.html.ini
new file mode 100644
index 00000000000..565ab24b816
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-005.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-005.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-006.html.ini b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-006.html.ini
new file mode 100644
index 00000000000..4318f34445a
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/break-spaces-tab-006.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-tab-006.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-003.html.ini b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-003.html.ini
new file mode 100644
index 00000000000..1e1ad3d26d9
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-003.html.ini
@@ -0,0 +1,2 @@
+[pre-wrap-tab-003.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-004.html.ini b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-004.html.ini
new file mode 100644
index 00000000000..be41d949134
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-004.html.ini
@@ -0,0 +1,2 @@
+[pre-wrap-tab-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-005.html.ini b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-005.html.ini
new file mode 100644
index 00000000000..94cb1f1692c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-005.html.ini
@@ -0,0 +1,2 @@
+[pre-wrap-tab-005.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-006.html.ini b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-006.html.ini
new file mode 100644
index 00000000000..c19ca42771b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/white-space/pre-wrap-tab-006.html.ini
@@ -0,0 +1,2 @@
+[pre-wrap-tab-006.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/parsing/perspective-origin-computed.html.ini b/tests/wpt/metadata/css/css-transforms/parsing/perspective-origin-computed.html.ini
new file mode 100644
index 00000000000..60c6c1751e9
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/parsing/perspective-origin-computed.html.ini
@@ -0,0 +1,64 @@
+[perspective-origin-computed.html]
+ [Property perspective-origin value '40px top' computes to '40px 0px']
+ expected: FAIL
+
+ [Property perspective-origin value 'right 30% top -60px' computes to '140px -60px']
+ expected: FAIL
+
+ [Property perspective-origin value '10%' computes to '20px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value '30px center' computes to '30px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'center bottom' computes to '100px 300px']
+ expected: FAIL
+
+ [Property perspective-origin value 'left 10px' computes to '0px 10px']
+ expected: FAIL
+
+ [Property perspective-origin value '20% 30px' computes to '40px 30px']
+ expected: FAIL
+
+ [Property perspective-origin value 'top' computes to '100px 0px']
+ expected: FAIL
+
+ [Property perspective-origin value 'center' computes to '100px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'center 50px' computes to '100px 50px']
+ expected: FAIL
+
+ [Property perspective-origin value '10% center' computes to '20px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'left' computes to '0px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'bottom 10% right 20%' computes to '160px 270px']
+ expected: FAIL
+
+ [Property perspective-origin value 'center left' computes to '0px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'right 20px bottom 30px' computes to '180px 270px']
+ expected: FAIL
+
+ [Property perspective-origin value 'right calc(10px - 0.5em) top calc(10px - 0.5em)' computes to '210px -10px']
+ expected: FAIL
+
+ [Property perspective-origin value 'left bottom' computes to '0px 300px']
+ expected: FAIL
+
+ [Property perspective-origin value 'bottom right' computes to '200px 300px']
+ expected: FAIL
+
+ [Property perspective-origin value 'right 40%' computes to '200px 120px']
+ expected: FAIL
+
+ [Property perspective-origin value 'left center' computes to '0px 150px']
+ expected: FAIL
+
+ [Property perspective-origin value 'center center' computes to '100px 150px']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/parsing/transform-origin-computed.html.ini b/tests/wpt/metadata/css/css-transforms/parsing/transform-origin-computed.html.ini
new file mode 100644
index 00000000000..04aff3c9216
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/parsing/transform-origin-computed.html.ini
@@ -0,0 +1,67 @@
+[transform-origin-computed.html]
+ [Property transform-origin value 'center bottom' computes to '100px 300px']
+ expected: FAIL
+
+ [Property transform-origin value 'center top' computes to '100px 0px']
+ expected: FAIL
+
+ [Property transform-origin value 'left 10px' computes to '0px 10px']
+ expected: FAIL
+
+ [Property transform-origin value 'right 40%' computes to '200px 120px']
+ expected: FAIL
+
+ [Property transform-origin value '10% center' computes to '20px 150px']
+ expected: FAIL
+
+ [Property transform-origin value '40px top' computes to '40px 0px']
+ expected: FAIL
+
+ [Property transform-origin value 'left bottom' computes to '0px 300px']
+ expected: FAIL
+
+ [Property transform-origin value '-1px bottom 5px' computes to '-1px 300px 5px']
+ expected: FAIL
+
+ [Property transform-origin value '10%' computes to '20px 150px']
+ expected: FAIL
+
+ [Property transform-origin value 'top' computes to '100px 0px']
+ expected: FAIL
+
+ [Property transform-origin value 'bottom right' computes to '200px 300px']
+ expected: FAIL
+
+ [Property transform-origin value 'right bottom 7px' computes to '200px 300px 7px']
+ expected: FAIL
+
+ [Property transform-origin value '20% 30px' computes to '40px 30px']
+ expected: FAIL
+
+ [Property transform-origin value 'calc(-100% + 10px - 0.5em) calc(10px - 0.5em) calc(10px - 0.5em)' computes to '-210px -10px -10px']
+ expected: FAIL
+
+ [Property transform-origin value 'center center' computes to '100px 150px']
+ expected: FAIL
+
+ [Property transform-origin value 'center 50px' computes to '100px 50px']
+ expected: FAIL
+
+ [Property transform-origin value 'left center' computes to '0px 150px']
+ expected: FAIL
+
+ [Property transform-origin value 'center left' computes to '0px 150px']
+ expected: FAIL
+
+ [Property transform-origin value 'center' computes to '100px 150px']
+ expected: FAIL
+
+ [Property transform-origin value '30px center' computes to '30px 150px']
+ expected: FAIL
+
+ [Property transform-origin value 'left center 6px' computes to '0px 150px 6px']
+ expected: FAIL
+
+ [Property transform-origin value 'left' computes to '0px 150px']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini
index 24c66214652..130c0181e43 100644
--- a/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini
+++ b/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini
@@ -1079,6 +1079,3 @@
[text-indent percentage(%) / values]
expected: FAIL
- [padding-bottom length(ex) / values]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/cssom-view/scrollLeftTop.html.ini b/tests/wpt/metadata/css/cssom-view/scrollLeftTop.html.ini
new file mode 100644
index 00000000000..384599d83f8
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/scrollLeftTop.html.ini
@@ -0,0 +1,19 @@
+[scrollLeftTop.html]
+ [writing-mode:vertical-lr; direction:ltr]
+ expected: FAIL
+
+ [writing-mode:vertical-rl; direction:rtl]
+ expected: FAIL
+
+ [writing-mode:vertical-lr; direction:rtl]
+ expected: FAIL
+
+ [writing-mode:vertical-rl; direction:ltr]
+ expected: FAIL
+
+ [writing-mode:horizontal-tb; direction:ltr]
+ expected: FAIL
+
+ [writing-mode:horizontal-tb; direction:rtl]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/interfaces.html.ini b/tests/wpt/metadata/css/cssom/interfaces.html.ini
index fd3f3735070..e51b8c75e85 100644
--- a/tests/wpt/metadata/css/cssom/interfaces.html.ini
+++ b/tests/wpt/metadata/css/cssom/interfaces.html.ini
@@ -1296,3 +1296,6 @@
[CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError]
expected: FAIL
+ [SVGStyleElement interface: attribute sheet]
+ 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 228cc1d76a4..66a90b0d890 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -315,12 +315,18 @@
[<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*]
+ [<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;x=" text/plain]
+ [<iframe>: combined response Content-Type: text/html;" text/plain]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/html */*]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
+ [<iframe>: separate response Content-Type: text/html;" \\" 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 5c001592859..646a46c0cbb 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -59,3 +59,6 @@
[separate text/javascript;charset=windows-1252 error text/javascript]
expected: FAIL
+ [separate text/javascript error]
+ 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 a639f15230c..d4ba399b762 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
- [Content-Type-Options%3A%20nosniff]
+ [X-Content-Type-Options%3A%20'NosniFF']
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- 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_2.html.ini
index 385376c7321..75d75b4cda2 100644
--- 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_2.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_4.html]
+[traverse_the_history_2.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
new file mode 100644
index 00000000000..dc2e45516de
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_5.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
new file mode 100644
index 00000000000..dec4c579137
--- /dev/null
+++ 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
@@ -0,0 +1,5 @@
+[creating_browsing_context_test_01.html]
+ expected: TIMEOUT
+ [first argument: absolute url]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/dom/interfaces.https.html.ini b/tests/wpt/metadata/html/dom/interfaces.https.html.ini
index 3dca62fda1f..a537311d2d1 100644
--- a/tests/wpt/metadata/html/dom/interfaces.https.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.https.html.ini
@@ -10556,3 +10556,93 @@
[ElementInternals interface: attribute validity]
expected: FAIL
+ [SVGSVGElement interface: attribute onstorage]
+ expected: FAIL
+
+ [SVGAElement interface: attribute hash]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onbeforeprint]
+ expected: FAIL
+
+ [SVGAElement interface: attribute protocol]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onoffline]
+ expected: FAIL
+
+ [SVGAElement interface: stringifier]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpageshow]
+ expected: FAIL
+
+ [SVGAElement interface: attribute search]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onunload]
+ expected: FAIL
+
+ [SVGAElement interface: attribute port]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onbeforeunload]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onmessageerror]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onmessage]
+ expected: FAIL
+
+ [SVGAElement interface: attribute hostname]
+ expected: FAIL
+
+ [SVGAElement interface: attribute pathname]
+ expected: FAIL
+
+ [SVGAElement interface: attribute host]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onlanguagechange]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onunhandledrejection]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onrejectionhandled]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onhashchange]
+ expected: FAIL
+
+ [SVGAElement interface: attribute origin]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpopstate]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpagehide]
+ expected: FAIL
+
+ [WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onafterprint]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute ononline]
+ expected: FAIL
+
+ [SVGAElement interface: attribute href]
+ expected: FAIL
+
+ [SVGAElement interface: attribute password]
+ expected: FAIL
+
+ [SVGAElement interface: attribute username]
+ expected: FAIL
+
+ [SVGElement interface: attribute onformdata]
+ 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/syntax/parsing/DOMContentLoaded-defer.html.ini b/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini
new file mode 100644
index 00000000000..a9677391662
--- /dev/null
+++ b/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini
@@ -0,0 +1,4 @@
+[DOMContentLoaded-defer.html]
+ [The end: DOMContentLoaded and defer scripts]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
index 496bad988c6..034d9baebfa 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
@@ -1,4 +1,5 @@
[promise-rejection-events.html]
+ expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
expected: FAIL
@@ -8,3 +9,6 @@
[no unhandledrejection/rejectionhandled: rejection handler attached synchronously to a promise created from createImageBitmap]
expected: FAIL
+ [rejectionhandled is dispatched from a queued task, and not immediately]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
index aa36a14c6a6..494f0d4a752 100644
--- a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
+++ b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini
@@ -20,6 +20,3 @@
[domainLookupStart should be 0 in cross-origin request.]
expected: FAIL
- [responseEnd should be greater than 0 in cross-origin request.]
- expected: FAIL
-
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 a56bad443a2..66bd350083b 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,5 +1,4 @@
[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 036692e72bf..881cbd9301b 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
@@ -122,3 +122,9 @@
[X SNR (21.35658911509222 dB) is not greater than or equal to 65.737. Got 21.35658911509222.]
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.8276454366209975e-1 at index of 39267.\n\t[39267\]\t1.5592860336255399e-9\t-9.8276454210281372e-1\t9.8276454366209975e-1\t1.0000000015866324e+0\t3.8985999999999999e-3\n\tMax RelError of 3.3137802965303198e+0 at index of 1253.\n\t[1253\]\t-4.3022233992815018e-2\t-9.9732093513011932e-3\t3.3049024641513824e-2\t3.3137802965303198e+0\t3.8985999999999999e-3\n]
+ expected: FAIL
+
+ [X SNR (21.440582478520547 dB) is not greater than or equal to 65.737. Got 21.440582478520547.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webdriver/tests/set_window_rect/set.py.ini b/tests/wpt/metadata/webdriver/tests/set_window_rect/set.py.ini
index 3d9deb34a25..3b9d2fd022d 100644
--- a/tests/wpt/metadata/webdriver/tests/set_window_rect/set.py.ini
+++ b/tests/wpt/metadata/webdriver/tests/set_window_rect/set.py.ini
@@ -41,3 +41,6 @@
[test_height_width_larger_than_max]
expected: FAIL
+ [test_negative_x_y]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini b/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini
index d97e34090f9..7987d965e4c 100644
--- a/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini
@@ -1,4 +1,5 @@
[xrSession_prevent_multiple_exclusive.https.html]
+ expected: TIMEOUT
[Test prevention of multiple simultaneous immersive sessions]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/web-platform-tests/animation-worklet/common.js b/tests/wpt/web-platform-tests/animation-worklet/common.js
index 3e542e02efc..ceb430b718b 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/common.js
+++ b/tests/wpt/web-platform-tests/animation-worklet/common.js
@@ -18,13 +18,20 @@ function registerConstantLocalTimeAnimator(localTime) {
`);
}
-
function runInAnimationWorklet(code) {
return CSS.animationWorklet.addModule(
URL.createObjectURL(new Blob([code], {type: 'text/javascript'}))
);
}
+function approxEquals(actual, expected){
+ // precision in ms
+ const epsilon = 0.005;
+ const lowerBound = (expected - epsilon) < actual;
+ const upperBound = (expected + epsilon) > actual;
+ return lowerBound && upperBound;
+}
+
function waitForAsyncAnimationFrames(count) {
// In Chrome, waiting for N+1 main thread frames guarantees that compositor has produced
// at least N frames.
diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html
new file mode 100644
index 00000000000..a66a4b9156c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html
@@ -0,0 +1,87 @@
+<html>
+<title>Animation Worklet should update calculated timing whenever localTime changes</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<script src="common.js"></script>
+
+<div id="box"></div>
+
+<script id="get_computed_timing_animator" type="text/worklet">
+ registerAnimator('get_computed_timing', class {
+ constructor(options, state) {
+ this.step = state ? state.step : 0;
+ }
+ state() {
+ return {
+ step: 0
+ }
+ }
+ animate(currentTime, effect){
+ if (this.step === 0){
+ // check calculated timing values before ever setting effect.localTime
+ effect.localTime = (effect.getComputedTiming().currentIteration * 100) + (effect.getComputedTiming().progress * 100);
+ this.step = 1;
+ }
+ else if (this.step === 1){
+ // set effect.localTime, this should be the first time calculated timing values are computed
+ effect.localTime = 420; // 20% of the way through the last iteration
+
+ // using the calculated timing of effect, set effect.localTime.
+ effect.localTime = (effect.getComputedTiming().currentIteration * 100) + (effect.getComputedTiming().progress * 100);
+ this.step = 2;
+ }
+ else if (this.step === 2){
+ // set effect.localTime to null
+ effect.localTime = null;
+ effect.localTime = (effect.getComputedTiming().currentIteration * 100) + (effect.getComputedTiming().progress * 100);
+ this.step = 3;
+ }
+ else if (this.step === 3){
+ // Check to make sure we can go from null to a valid localTime and that calculated timing values are computed
+ effect.localTime = 350; // 50% of the way through second iteration
+ effect.localTime = (effect.getComputedTiming().currentIteration * 100) + (effect.getComputedTiming().progress * 100);
+ this.step = 4;
+ }
+ }
+ });
+</script>
+
+<script>
+ promise_test(async t => {
+ await runInAnimationWorklet(document.getElementById('get_computed_timing_animator').textContent);
+
+ const box = document.getElementById("box");
+ const effect = new KeyframeEffect(
+ box,
+ [
+ { opacity: 0 },
+ { opacity: 1 }
+ ], {
+ delay: 200,
+ duration: 100,
+ iterations: 3
+ }
+ );
+
+ const animation = new WorkletAnimation('get_computed_timing', effect);
+ animation.play();
+
+ // check calculated timing values before ever setting effect.localTime
+ await waitForAnimationFrameWithCondition(() => {return approxEquals(effect.getComputedTiming().localTime, 0)});
+
+ // Check to make sure initial values can be set for computed timing
+ await waitForAnimationFrameWithCondition(() => {return approxEquals(effect.getComputedTiming().localTime, 220)});
+
+ // Make sure setting effect.localTime to null causes calculated timing values to be computed
+ await waitForAnimationFrameWithCondition(() => {return approxEquals(effect.getComputedTiming().localTime, 0)});
+
+ // Make sure we can go from null to a valid localTime and that calculated timing values are computed
+ await waitForAnimationFrameWithCondition(() => {return approxEquals(effect.getComputedTiming().localTime, 150)});
+
+ // Passes if it doesn't timeout
+ animation.cancel();
+ }, "WorkletAnimation effect should recompute its calculated timing if its local time changes");
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html
index 65311c32ad6..4c86845f4db 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html
@@ -15,8 +15,8 @@
assert_equals(e.effectiveDirective, "img-src");
assert_equals(e.originalPolicy, "img-src \'none\'");
assert_equals(e.disposition, "enforce");
- assert_equals(e.sourceFile, "");
- assert_equals(e.lineNumber, 0);
+ assert_equals(new URL(e.sourceFile).pathname, "/content-security-policy/support/inject-image.sub.js");
+ assert_equals(e.lineNumber, 2);
assert_equals(e.columnNumber, 0);
assert_equals(e.statusCode, 200);
}));
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html
index 03829fe8a36..dcf52aa187c 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html
@@ -15,9 +15,9 @@
assert_equals(e.effectiveDirective, "img-src");
assert_equals(e.originalPolicy, "img-src \'none\'");
assert_equals(e.disposition, "enforce");
- assert_equals(e.sourceFile, "");
- assert_equals(e.lineNumber, 0);
- assert_equals(e.columnNumber, 0);
+ assert_equals(new URL(e.sourceFile).pathname, "/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image.sub.html");
+ assert_equals(e.lineNumber, 25);
+ assert_equals(e.columnNumber, 4);
assert_equals(e.statusCode, 200);
}));
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html
index 0a7c2b43bff..978096f14f6 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image-from-script.sub.html
@@ -15,8 +15,8 @@
assert_equals(e.effectiveDirective, "img-src");
assert_equals(e.originalPolicy, "img-src \'none\'");
assert_equals(e.disposition, "enforce");
- assert_equals(e.sourceFile, "");
- assert_equals(e.lineNumber, 0);
+ assert_equals(new URL(e.sourceFile).pathname, "/content-security-policy/support/inject-image.sub.js");
+ assert_equals(e.lineNumber, 2);
assert_equals(e.columnNumber, 0);
assert_equals(e.statusCode, 200);
}));
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html
index 5dd82e6ddca..6e0e6ddbede 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html
@@ -15,9 +15,9 @@
assert_equals(e.effectiveDirective, "img-src");
assert_equals(e.originalPolicy, "img-src \'none\'");
assert_equals(e.disposition, "enforce");
- assert_equals(e.sourceFile, "");
- assert_equals(e.lineNumber, 0);
- assert_equals(e.columnNumber, 0);
+ assert_equals(new URL(e.sourceFile).pathname, "/content-security-policy/securitypolicyviolation/securitypolicyviolation-block-image.sub.html");
+ assert_equals(e.lineNumber, 25);
+ assert_equals(e.columnNumber, 4);
assert_equals(e.statusCode, 200);
}));
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieListItem_attributes.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieListItem_attributes.tentative.https.window.js
index 3e7b02b1085..bf8f845f2b1 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieListItem_attributes.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieListItem_attributes.tentative.https.window.js
@@ -1,15 +1,5 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
const kCurrentHostname = (new URL(self.location.href)).hostname;
const kOneDay = 24 * 60 * 60 * 1000;
@@ -23,6 +13,9 @@ promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
@@ -33,14 +26,15 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set defaults with positional name and value');
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set({ name: 'cookie-name', value: 'cookie-value' });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -50,8 +44,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set defaults with name and value in options');
promise_test(async testCase => {
@@ -59,6 +51,9 @@ promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value',
{ expires: kTenYearsFromNow });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -68,8 +63,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with expires set to a timestamp 10 ' +
'years in the future');
@@ -78,6 +71,9 @@ promise_test(async testCase => {
await cookieStore.set({ name: 'cookie-name', value: 'cookie-value',
expires: kTenYearsFromNow });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -87,8 +83,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with name and value in options and ' +
'expires set to a future timestamp');
@@ -97,6 +91,9 @@ promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value',
{ expires: new Date(kTenYearsFromNow) });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -104,8 +101,6 @@ promise_test(async testCase => {
assert_equals(cookie.path, '/');
assert_approx_equals(cookie.expires, kTenYearsFromNow, kOneDay);
assert_equals(cookie.secure, true);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with expires set to a Date 10 ' +
'years in the future');
@@ -114,6 +109,9 @@ promise_test(async testCase => {
await cookieStore.set({ name: 'cookie-name', value: 'cookie-value',
expires: new Date(kTenYearsFromNow) });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -123,8 +121,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with name and value in options and ' +
'expires set to a future Date');
@@ -133,6 +129,9 @@ promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value',
{ domain: kCurrentHostname });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: kCurrentHostname });
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -142,10 +141,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', domain: kCurrentHostname });
- });
}, 'CookieListItem - cookieStore.set with domain set to the current hostname');
promise_test(async testCase => {
@@ -157,6 +152,9 @@ promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value',
{ path: currentDirectory });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -166,16 +164,15 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
- });
}, 'CookieListItem - cookieStore.set with path set to the current directory');
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set('cookie-name', 'cookie-value', { secure: false });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -185,8 +182,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, false);
assert_equals(cookie.sameSite, 'strict');
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with secure set to false');
['strict', 'lax', 'unrestricted'].forEach(sameSiteValue => {
@@ -195,6 +190,9 @@ promise_test(async testCase => {
await cookieStore.set({
name: 'cookie-name', value: 'cookie-value', sameSite: sameSiteValue });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -204,8 +202,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, sameSiteValue);
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, `CookieListItem - cookieStore.set with sameSite set to ${sameSiteValue}`);
promise_test(async testCase => {
@@ -213,6 +209,9 @@ promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value',
{ sameSite: sameSiteValue });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
@@ -222,8 +221,6 @@ promise_test(async testCase => {
assert_equals(cookie.secure, true);
assert_equals(cookie.sameSite, sameSiteValue);
assert_array_equals(Object.keys(cookie).sort(), kCookieListItemKeys);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'CookieListItem - cookieStore.set with positional name and value and ' +
`sameSite set to ${sameSiteValue}`);
-});
+}); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_delete_arguments.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_delete_arguments.tentative.https.window.js
index 8cfa03dd054..dc073d8eb60 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_delete_arguments.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_delete_arguments.tentative.https.window.js
@@ -1,15 +1,5 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
@@ -20,22 +10,24 @@ promise_test(async testCase => {
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.delete({ name: 'cookie-name' });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.delete with name in options');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.delete('cookie-name', { name: 'wrong-cookie-name' });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.delete with name in both positional arguments and options');
promise_test(async testCase => {
@@ -43,14 +35,13 @@ promise_test(async testCase => {
const currentDomain = currentUrl.hostname;
await cookieStore.set(
'cookie-name', 'cookie-value', { domain: currentDomain });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
+ });
await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
- });
}, 'cookieStore.delete with domain set to the current hostname');
promise_test(async testCase => {
@@ -79,14 +70,13 @@ promise_test(async testCase => {
const currentDomain = currentUrl.hostname;
await cookieStore.set(
'cookie-name', 'cookie-value', { domain: currentDomain });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
+ });
await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
- });
}, 'cookieStore.delete with name in options and domain set to the current ' +
'hostname');
@@ -119,14 +109,13 @@ promise_test(async testCase => {
currentPath.substr(0, currentPath.lastIndexOf('/') + 1);
await cookieStore.set(
'cookie-name', 'cookie-value', { path: currentDirectory });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
+ });
await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
- });
}, 'cookieStore.delete with path set to the current directory');
promise_test(async testCase => {
@@ -137,19 +126,21 @@ promise_test(async testCase => {
const subDirectory = currentDirectory + "subdir/";
await cookieStore.set(
'cookie-name', 'cookie-value', { path: currentDirectory });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
+ });
await cookieStore.delete({ name: 'cookie-name', path: subDirectory });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
- });
}, 'cookieStore.delete with path set to subdirectory of the current directory');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie_attributes = await cookieStore.get('cookie-name');
assert_equals(cookie_attributes.name, 'cookie-name');
@@ -158,6 +149,4 @@ promise_test(async testCase => {
await cookieStore.delete(cookie_attributes);
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.delete with get result');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_basic.tentative.https.window.js
index 7f6d2d919d4..5f20947dbf1 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_basic.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_basic.tentative.https.window.js
@@ -1,21 +1,14 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
const eventPromise = new Promise((resolve) => {
cookieStore.onchange = resolve;
});
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const event = await eventPromise;
assert_true(event instanceof CookieChangeEvent);
@@ -24,6 +17,4 @@ promise_test(async testCase => {
assert_equals(event.changed[0].name, 'cookie-name');
assert_equals(event.changed[0].value, 'cookie-value');
assert_equals(event.deleted.length, 0);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore fires change event for cookie set by cookieStore.set()');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_delete.tenative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_delete.tenative.https.window.js
index f84b2e06745..e8c6fc036a7 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_delete.tenative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_delete.tenative.https.window.js
@@ -1,17 +1,10 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const eventPromise = new Promise((resolve) => {
cookieStore.onchange = resolve;
@@ -26,6 +19,4 @@ promise_test(async testCase => {
event.deleted[0].value, undefined,
'Cookie change events for deletions should not have cookie values');
assert_equals(event.changed.length, 0);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore fires change event for cookie deleted by cookieStore.delete()'); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_overwrite.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_overwrite.tentative.https.window.js
index 2a5cb5d064f..3acffea41c1 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_overwrite.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_event_overwrite.tentative.https.window.js
@@ -1,17 +1,10 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const eventPromise = new Promise((resolve) => {
cookieStore.onchange = resolve;
@@ -26,6 +19,4 @@ promise_test(async testCase => {
assert_equals(event.changed[0].name, 'cookie-name');
assert_equals(event.changed[0].value, 'new-cookie-value');
assert_equals(event.deleted.length, 0);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore fires change event for cookie overwritten by cookieStore.set()');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_arguments.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_arguments.tentative.https.window.js
index 5106a6270cd..a04aa8cd7ad 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_arguments.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_arguments.tentative.https.window.js
@@ -1,18 +1,14 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
const cookies = await cookieStore.getAll();
cookies.sort((a, b) => a.name.localeCompare(b.name));
@@ -21,53 +17,62 @@ promise_test(async testCase => {
assert_equals(cookies[0].value, 'cookie-value');
assert_equals(cookies[1].name, 'cookie-name-2');
assert_equals(cookies[1].value, 'cookie-value-2');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with no arguments');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
const cookies = await cookieStore.getAll('cookie-name');
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with positional name');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
const cookies = await cookieStore.getAll({ name: 'cookie-name' });
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with name in options');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
const cookies = await cookieStore.getAll('cookie-name',
{ name: 'wrong-cookie-name' });
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with name in both positional arguments and options');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookies = await cookieStore.getAll({ name: 'cookie-name',
matchType: 'equals' });
@@ -78,53 +83,59 @@ promise_test(async testCase => {
const no_cookies = await cookieStore.getAll(
'cookie-na', { matchType: 'equals' });
assert_equals(no_cookies.length, 0);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.getAll with matchType explicitly set to equals');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
const cookies = await cookieStore.getAll({ name: 'cookie-name-',
matchType: 'starts-with' });
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name-2');
assert_equals(cookies[0].value, 'cookie-value-2');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with matchType set to starts-with');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
await promise_rejects(testCase, new TypeError(), cookieStore.getAll(
{ name: 'cookie-name', matchType: 'invalid' }));
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
}, 'cookieStore.getAll with invalid matchType');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookies = await cookieStore.getAll({ matchType: 'equals' });
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.getAll with matchType set to equals and missing name');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookies = await cookieStore.getAll({ matchType: 'starts-with' });
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.getAll with matchType set to starts-with and missing name');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_multiple.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_multiple.tentative.https.window.js
index 78b3c56fdd3..c09f4fc5f57 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_multiple.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_multiple.tentative.https.window.js
@@ -1,19 +1,18 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name-2', 'cookie-value-2');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-2');
+ });
await cookieStore.set('cookie-name-3', 'cookie-value-3');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name-3');
+ });
const cookies = await cookieStore.getAll();
cookies.sort((a, b) => a.name.localeCompare(b.name));
@@ -24,8 +23,4 @@ promise_test(async testCase => {
assert_equals(cookies[1].value, 'cookie-value-2');
assert_equals(cookies[2].name, 'cookie-name-3');
assert_equals(cookies[2].value, 'cookie-value-3');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
- await async_cleanup(() => cookieStore.delete('cookie-name-2'));
- await async_cleanup(() => cookieStore.delete('cookie-name-3'));
}, 'cookieStore.getAll returns multiple cookies written by cookieStore.set');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js
index aa0a4ea9a03..dd2adabd228 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_getAll_set_basic.tentative.https.window.js
@@ -1,22 +1,13 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookies = await cookieStore.getAll('cookie-name');
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.getAll returns the cookie written by cookieStore.set');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_arguments.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_arguments.tentative.https.window.js
index bb126864ff7..e338dd1bdbd 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_arguments.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_arguments.tentative.https.window.js
@@ -1,56 +1,53 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get();
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with no arguments');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with positional name');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get({ name: 'cookie-name' });
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with name in options');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name',
{ name: 'wrong-cookie-name' });
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with name in both positional arguments and options');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get(
'cookie-name', { matchType: 'equals' });
@@ -60,46 +57,48 @@ promise_test(async testCase => {
const no_cookie = await cookieStore.get({ name: 'cookie-na',
matchType: 'equals' });
assert_equals(no_cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with matchType explicitly set to equals');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get({ name: 'cookie-na',
matchType: 'starts-with' });
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with matchType set to starts-with');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await promise_rejects(testCase, new TypeError(), cookieStore.get(
{ name: 'cookie-name', matchType: 'invalid' }));
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with invalid matchType');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get({ matchType: 'equals' });
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with matchType set to equals and missing name');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get({ matchType: 'starts-with' });
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get with matchType set to starts-with and missing name');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_delete_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_delete_basic.tentative.https.window.js
index fc9645d3e2e..5ebf09d3446 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_delete_basic.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_delete_basic.tentative.https.window.js
@@ -1,20 +1,11 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.delete('cookie-name');
const cookie = await cookieStore.get();
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get returns null for a cookie deleted by cookieStore.delete'); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html
index c2ef1849403..f7c737b422e 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html
@@ -19,7 +19,9 @@ promise_test(async t => {
'Precondition not met: cookie store should be empty');
await cookieStore.set('cookie-name', 'cookie-value');
- t.add_cleanup(() => cookieStore.delete('cookie-name'));
+ t.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const frameCookie = await frameCookieStore.get('cookie-name');
assert_equals(frameCookie.value, 'cookie-value');
@@ -34,7 +36,9 @@ promise_test(async t => {
'Precondition not met: cookie store should be empty');
await frameCookieStore.set('cookie-name', 'cookie-value');
- t.add_cleanup(() => frameCookieStore.delete('cookie-name'));
+ t.add_cleanup(async () => {
+ await frameCookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.value, 'cookie-value');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html
index e8792612c43..c67ef98bcc9 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html
@@ -24,10 +24,9 @@ promise_test(async t => {
name: 'cookie-name',
value: 'cookie-value',
}, kCorsBase);
- t.add_cleanup(() => cookieStore.delete({
- name: 'cookie-name',
- domain: '{{host}}',
- }));
+ t.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: '{{host}}' });
+ });
await waitForMessage();
const cookies = await cookieStore.getAll();
@@ -53,10 +52,9 @@ promise_test(async t => {
opname: 'get-cookie',
name: 'cookie-name',
}, kCorsBase);
- t.add_cleanup(() => cookieStore.delete({
- name: 'cookie-name',
- domain: '{{host}}',
- }));
+ t.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: '{{host}}' });
+ });
const message = await waitForMessage();
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_basic.tentative.https.window.js
index 2a082de9d30..deb7405f2ff 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_basic.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_get_set_basic.tentative.https.window.js
@@ -1,21 +1,12 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.get returns the cookie written by cookieStore.set');
diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_set_arguments.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_set_arguments.tentative.https.window.js
index 18f60ad974e..ddc9981c92d 100644
--- a/tests/wpt/web-platform-tests/cookie-store/cookieStore_set_arguments.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_set_arguments.tentative.https.window.js
@@ -1,47 +1,40 @@
'use strict';
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with positional name and value');
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set({ name: 'cookie-name', value: 'cookie-value' });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with name and value in options');
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
cookieStore.set('cookie-name', 'cookie-value', { name: 'wrong-cookie-name' });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with name in both positional arguments and options');
promise_test(async testCase => {
@@ -49,11 +42,12 @@ promise_test(async testCase => {
cookieStore.set('cookie-name', 'cookie-value',
{ value: 'wrong-cookie-value' });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with value in both positional arguments and options');
promise_test(async testCase => {
@@ -63,11 +57,12 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { expires: tenYearsFromNow });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with expires set to a future timestamp');
promise_test(async testCase => {
@@ -77,10 +72,11 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { expires: tenYearsAgo });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with expires set to a past timestamp');
promise_test(async testCase => {
@@ -90,11 +86,12 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { expires: new Date(tenYearsFromNow) });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with expires set to a future Date');
promise_test(async testCase => {
@@ -104,10 +101,11 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { expires: new Date(tenYearsAgo) });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with expires set to a past Date');
promise_test(async testCase => {
@@ -117,11 +115,12 @@ promise_test(async testCase => {
await cookieStore.set(
{ name: 'cookie-name', value: 'cookie-value', expires: tenYearsFromNow });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with name and value in options and expires in the future');
promise_test(async testCase => {
@@ -131,10 +130,11 @@ promise_test(async testCase => {
await cookieStore.set(
{ name: 'cookie-name', value: 'cookie-value', expires: tenYearsAgo });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie, null);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with name and value in options and expires in the past');
promise_test(async testCase => {
@@ -144,13 +144,12 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { domain: currentDomain });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
- });
}, 'cookieStore.set with domain set to the current hostname');
promise_test(async testCase => {
@@ -184,8 +183,14 @@ promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set('cookie-name', 'cookie-value1');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name', 'cookie-value2',
{ domain: currentDomain });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
+ });
const cookies = await cookieStore.getAll('cookie-name');
assert_equals(cookies.length, 2);
@@ -196,11 +201,6 @@ promise_test(async testCase => {
const values = cookies.map((cookie) => cookie.value);
values.sort();
assert_array_equals(values, ['cookie-value1', 'cookie-value2']);
-
- await async_cleanup(async () => {
- await cookieStore.delete('cookie-name');
- await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
- });
}, 'cookieStore.set default domain is null and differs from current hostname');
promise_test(async testCase => {
@@ -212,13 +212,12 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { path: currentDirectory });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
+ });
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'cookie-value');
-
- await async_cleanup(async () => {
- await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
- });
}, 'cookieStore.set with path set to the current directory');
promise_test(async testCase => {
@@ -232,33 +231,36 @@ promise_test(async testCase => {
await cookieStore.set(
'cookie-name', 'cookie-value', { path: subDirectory });
- const cookie = await cookieStore.get('cookie-name');
- assert_equals(cookie, null);
-
- await async_cleanup(async () => {
+ testCase.add_cleanup(async () => {
await cookieStore.delete({ name: 'cookie-name', path: subDirectory });
});
+ const cookie = await cookieStore.get('cookie-name');
+ assert_equals(cookie, null);
}, 'cookieStore.set with path set to a subdirectory of the current directory');
promise_test(async testCase => {
await cookieStore.delete('cookie-name');
await cookieStore.set('cookie-name', 'cookie-old-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
await cookieStore.set('cookie-name', 'cookie-new-value', { path: '/' });
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete({ name: 'cookie-name', path: '/' });
+ });
const cookies = await cookieStore.getAll('cookie-name');
assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-new-value');
-
- await async_cleanup(async () => {
- await cookieStore.delete('cookie-name');
- await cookieStore.delete({ name: 'cookie-name', path: '/' });
- });
}, 'cookieStore.set default path is /');
promise_test(async testCase => {
await cookieStore.set('cookie-name', 'old-cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const cookie_attributes = await cookieStore.get('cookie-name');
assert_equals(cookie_attributes.name, 'cookie-name');
@@ -269,6 +271,4 @@ promise_test(async testCase => {
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.name, 'cookie-name');
assert_equals(cookie.value, 'new-cookie-value');
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookieStore.set with get result');
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html
index abc431a4d62..6879c5da926 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_cross_origin.tentative.https.sub.html
@@ -27,9 +27,7 @@ promise_test(async t => {
name: 'cookie-name',
value: 'cookie-value',
}, kCorsBase);
- t.add_cleanup(() => {
- cookieStore.delete('cookie-name');
- });
+ t.add_cleanup(async () => { await cookieStore.delete('cookie-name'); });
await waitForMessage();
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js
index 225e58266e2..441573d20e9 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js
@@ -24,16 +24,6 @@ self.addEventListener('install', (event) => {
})());
});
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
// Resolves when the service worker receives the 'activate' event.
const kServiceWorkerActivatedPromise = new Promise(resolve => {
self.addEventListener('activate', event => { resolve(); });
@@ -96,8 +86,13 @@ promise_test(async testCase => {
await kServiceWorkerActivatedPromise;
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
+ testCase.add_cleanup(() => { g_cookie_changes = []; });
await g_cookie_change_received_promise;
+ testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
assert_equals(g_cookie_changes.length, 1);
const event = g_cookie_changes[0]
@@ -108,12 +103,6 @@ promise_test(async testCase => {
assert_equals(event.deleted.length, 0);
assert_true(event instanceof ExtendableCookieChangeEvent);
assert_true(event instanceof ExtendableEvent);
-
- await async_cleanup(async () => {
- await cookieStore.delete('cookie-name');
- g_cookie_changes = [];
- RearmCookieChangeReceivedPromise();
- });
}, 'cookiechange dispatched with cookie change that matches subscription');
done();
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js
index 4a5ee5eed96..c48ad8bb98b 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js
@@ -17,16 +17,6 @@ self.addEventListener('install', (event) => {
})());
});
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
// Resolves when the service worker receives the 'activate' event.
const kServiceWorkerActivatedPromise = new Promise(resolve => {
self.addEventListener('activate', event => { resolve(); });
@@ -53,6 +43,9 @@ promise_test(async testCase => {
});
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const event = await cookie_change_received_promise;
assert_equals(event.type, 'cookiechange');
@@ -62,8 +55,6 @@ promise_test(async testCase => {
assert_equals(event.deleted.length, 0);
assert_true(event instanceof ExtendableCookieChangeEvent);
assert_true(event instanceof ExtendableEvent);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookiechange dispatched with cookie change that matches subscription ' +
'to event handler registered with addEventListener');
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js
index de521caddd8..b6231869974 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js
@@ -16,16 +16,6 @@ self.addEventListener('install', (event) => {
})());
});
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/w3c/web-platform-tests/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
// Resolves when the service worker receives the 'activate' event.
const kServiceWorkerActivatedPromise = new Promise(resolve => {
self.addEventListener('activate', event => { resolve(); });
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js
index 8784af7e6e8..228b5289856 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js
@@ -17,16 +17,6 @@ self.addEventListener('install', (event) => {
})());
});
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/web-platform-tests/wpt/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
// Resolves when the service worker receives the 'activate' event.
const kServiceWorkerActivatedPromise = new Promise(resolve => {
self.addEventListener('activate', event => { resolve(); });
@@ -40,6 +30,9 @@ promise_test(async testCase => {
});
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const event = await cookie_change_received_promise;
assert_equals(event.type, 'cookiechange');
@@ -49,8 +42,6 @@ promise_test(async testCase => {
assert_equals(event.deleted.length, 0);
assert_true(event instanceof ExtendableCookieChangeEvent);
assert_true(event instanceof ExtendableEvent);
-
- await async_cleanup(() => cookieStore.delete('cookie-name'));
}, 'cookiechange dispatched with cookie change that matches subscription ' +
'to event handler registered with oncookiechange');
diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js
index 12759a2e3ae..43edadd7bb8 100644
--- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js
+++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js
@@ -17,16 +17,6 @@ self.addEventListener('install', (event) => {
})());
});
-// Workaround because add_cleanup doesn't support async functions yet.
-// See https://github.com/w3c/web-platform-tests/issues/6075
-async function async_cleanup(cleanup_function) {
- try {
- await cleanup_function();
- } catch (e) {
- // Errors in cleanup functions shouldn't result in test failures.
- }
-}
-
// Resolves when the service worker receives the 'activate' event.
const kServiceWorkerActivatedPromise = new Promise(resolve => {
self.addEventListener('activate', event => { resolve(); });
@@ -42,18 +32,19 @@ promise_test(async testCase => {
});
await cookieStore.set('another-cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('another-cookie-name');
+ });
await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
const event = await cookie_change_received_promise;
assert_equals(event.type, 'cookiechange');
assert_equals(event.changed.length, 1);
assert_equals(event.changed[0].name, 'cookie-name');
assert_equals(event.changed[0].value, 'cookie-value');
-
- await async_cleanup(async () => {
- await cookieStore.delete('another-cookie-name');
- await cookieStore.delete('cookie-name');
- });
}, 'cookiechange not dispatched for change that does not match subscription');
done();
diff --git a/tests/wpt/web-platform-tests/css/css-box/parsing/margin-computed.html b/tests/wpt/web-platform-tests/css/css-box/parsing/margin-computed.html
new file mode 100644
index 00000000000..f22f6cdc0f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/parsing/margin-computed.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().margin</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#propdef-margin">
+<meta name="assert" content="margin computed value has absolute lengths.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #parent {
+ width: 200px;
+ }
+ #target {
+ width: 0px;
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="parent">
+ <div id="target"></div>
+</div>
+<script>
+test_computed_value("margin", "10px");
+test_computed_value("margin", "10px 20px 30px 40px");
+test_computed_value("margin", "calc(0.5em + 10px)", "30px");
+test_computed_value("margin", "30%", "60px");
+
+test_computed_value("margin-top", "10px");
+test_computed_value("margin-right", "20px");
+test_computed_value("margin-bottom", "30px");
+test_computed_value("margin-left", "40px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/block-size-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/block-size-computed.html
new file mode 100644
index 00000000000..de3a3c2a0c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/block-size-computed.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedStyle().blockSize</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical-1/#dimension-properties">
+<meta name="assert" content="block-size computed value is an absolute length.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #parent {
+ height: 300px;
+ }
+ #target {
+ width: 0px;
+ height: 0px;
+ font-size: 40px;
+ }
+ #child {
+ height: 80px;
+ }
+</style>
+</head>
+<body>
+<div id="parent">
+ <div id="target">
+ <div id="child">
+ </div>
+ </div>
+</div>
+<script>
+test_computed_value("block-size", "auto", "80px"); // child height
+
+test_computed_value("block-size", "10px");
+test_computed_value("block-size", "20%", "60px");
+test_computed_value("block-size", "calc(0.5em + 10px)", "30px");
+test_computed_value("block-size", "calc(-0.5em + 10px)", "0px");
+
+test_computed_value("block-size", "min-content", "80px"); // child height
+test_computed_value("block-size", "max-content", "80px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/inline-size-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/inline-size-computed.html
new file mode 100644
index 00000000000..0f60165a347
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/inline-size-computed.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedStyle().inlineSize</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical-1/#dimension-properties">
+<meta name="assert" content="inline-size computed value is an absolute length.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #parent {
+ width: 200px;
+ }
+ #target {
+ width: 0px;
+ height: 0px;
+ font-size: 40px;
+ }
+ #child {
+ width: 60px;
+ }
+</style>
+</head>
+<body>
+<div id="parent">
+ <div id="target">
+ <div id="child">
+ </div>
+ </div>
+</div>
+<script>
+test_computed_value("inline-size", "auto", "200px"); // parent width
+
+test_computed_value("inline-size", "10px");
+test_computed_value("inline-size", "20%", "40px");
+test_computed_value("inline-size", "calc(0.5em + 10px)", "30px");
+test_computed_value("inline-size", "calc(-0.5em + 10px)", "0px");
+
+test_computed_value("inline-size", "min-content", "60px"); // child width
+test_computed_value("inline-size", "max-content", "60px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-alpha.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-alpha.https.html
index 53d869d0607..7f1e31bf39b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-alpha.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-alpha.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="background-image-alpha-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-multiple.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-multiple.https.html
index 79ff8836c15..51c928d2a67 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-multiple.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-multiple.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="background-image-multiple-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-tiled.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-tiled.https.html
index 8498c82a355..11647c9228c 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/background-image-tiled.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/background-image-tiled.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="background-image-tiled-ref.html">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-001.https.html
index 601d4187b09..eb7f6716ada 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-001.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-background-image-001-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-002.https.html
index 1d57073bf20..e636aa73b3b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-002.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-background-image-002-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
index 8e28b54b36d..51373a528e4 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-background-image-tiled-001-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
index 9248e38641e..d55761b47cd 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-background-image-tiled-002-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-003.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
index 5b6b6c7c65a..6d5bdd2fa53 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-background-image-tiled-003-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-001.https.html
index 3fb4643cd47..ff7f56e299d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-001.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-border-image-001-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-002.https.html
index 26e24bb0146..d6e47f04907 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-002.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-border-image-002-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-003.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-003.https.html
index a26f2b7d109..36af043cc5f 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-003.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-003.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-border-image-003-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-004.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-004.https.html
index 60db7ff4bc5..0f483cd5d19 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-004.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-border-image-004.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-border-image-004-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-with-float-size.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-with-float-size.https.html
index 65477e4b3bf..8cd90c84318 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/geometry-with-float-size.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/geometry-with-float-size.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="geometry-with-float-size-ref.html">
-<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/#dom-css-paintworklet">
<style>
.container {
width: 100.5px;
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/canvas-transform.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/canvas-transform.https.html
index d160a8673c2..6dc57abaf77 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/canvas-transform.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/canvas-transform.https.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
-<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/#dom-css-paintworklet">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="canvas-transform-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
index 46a9aa28f2f..f9516e5ccf9 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="device-pixel-ratio-ref.html">
<style>
html, body { margin: 0; padding: 0; }
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/idlharness.html b/tests/wpt/web-platform-tests/css/css-paint-api/idlharness.html
index c9675ab0412..aad04a17cc4 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/idlharness.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/idlharness.html
@@ -1,6 +1,6 @@
<!doctype html>
<title>CSS Painting API IDL tests</title>
-<link rel="help" href="https://drafts.css-houdini.org/css-paint-api-1/">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-constructor-error.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-constructor-error.https.html
index 439ff8b4e5a..8facde43f57 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-constructor-error.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-constructor-error.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="invalid-image-constructor-error-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-paint-error.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-paint-error.https.html
index 2806ad92048..17c283e35ca 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-paint-error.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-paint-error.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="invalid-image-paint-error-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-pending-script.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-pending-script.https.html
index 4347a00a499..20a61eff41b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-pending-script.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/invalid-image-pending-script.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="invalid-image-pending-script-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/overdraw.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/overdraw.https.html
index 5be26f7e0a8..8d3dc72f931 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/overdraw.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/overdraw.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="overdraw-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint-arguments.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint-arguments.https.html
index abfb2a68e4b..615027c8fe3 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint-arguments.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint-arguments.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint-function-arguments.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint-function-arguments.https.html
index d87b0b80a61..3a1e579f5ec 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint-function-arguments.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint-function-arguments.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint-function-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-composite.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-composite.https.html
index 80e94e45a8c..edf8a766fab 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-composite.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-composite.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-composite-ref.html">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-filter.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-filter.https.html
index d0c45395757..9d598c7a968 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-filter.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-filter.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-filter-ref.html">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-gradient.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-gradient.https.html
index 892a7919f1f..1887f52b06b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-gradient.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-gradient.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-gradient-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
index 6fce4b6898b..71074df796d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-image.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-image-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-paths.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-paths.https.html
index 091f548cb30..0e04168fcb1 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-paths.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-paths.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-paths-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-rects.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-rects.https.html
index 24942727d5a..9279aa2a870 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-rects.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-rects.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-rects-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-shadows.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-shadows.https.html
index 98dcfbce299..b641dab8860 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-shadows.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-shadows.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-shadows-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-transform.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-transform.https.html
index c91b500a46f..d052b8c5543 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-transform.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/paint2d-transform.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="paint2d-transform-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-001.https.html
index 4356ce61f4a..486f379dd7b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-001.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-002.https.html
index b1b50e04045..5c7b3aca048 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-002.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-003.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-003.https.html
index 3b1b0014f78..81904ee6f7b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-003.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-003.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-004.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-004.https.html
index 138a7908682..9bf264b0d5f 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-004.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-004.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-005.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-005.https.html
index 0c5e539381b..24769f472c5 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-005.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-005.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-006.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-006.https.html
index e99ab05a88d..a6fcc16c5da 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-006.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-006.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-007.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-007.https.html
index 53f245bce48..462cfb60106 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-007.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-007.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-008.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-008.https.html
index e6b863c641c..d5c18b0905d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-008.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-008.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-009.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-009.https.html
index b23191ae340..7cfdf91eb02 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-009.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-009.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-010.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-010.https.html
index e98b4316489..142ca0c5d5d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-010.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-010.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-011.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-011.https.html
index b9d54bf413d..23eb9d3c9f9 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-011.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-011.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-012.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-012.https.html
index 14eebeb635a..fa2c6b5f560 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-012.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-012.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-013.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-013.https.html
index 37e3eb435ec..adc1c03cfe6 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-013.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-013.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-014.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-014.https.html
index 690e488b917..d041ae316f7 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-014.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-014.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-015.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-015.https.html
index fba76712466..8ebe3e7c4d1 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-015.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-015.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-016.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-016.https.html
index 31cca45faca..ccd0595faa5 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-016.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-016.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-017.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-017.https.html
index 0d14fe74c21..476e29ff12f 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-017.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-017.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-018.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-018.https.html
index 541332ae777..e6a31cbdd41 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-018.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-018.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-018-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-019.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-019.https.html
index 707a0c6ebe0..309ec800eac 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-019.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-019.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-020.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-020.https.html
index fe8dbad27bd..7e00b64123d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-020.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-020.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-021.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-021.https.html
index 0c3a596236f..8fa043a8cde 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-021.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-021.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-022.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-022.https.html
index 50aaa6b3c94..2ff27d7a4af 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-022.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/parse-input-arguments-022.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-001.https.html
index c6e93029f10..5aaed62542f 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-001.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;angle&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-002.https.html
index cfa9a618a1f..80b2c9339d7 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-002.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;color&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-003.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-003.https.html
index 314d0c082ef..683ed403fb8 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-003.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-003.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;integer&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-004.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-004.https.html
index 430326a0663..9602e902eca 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-004.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-004.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;length-percentage&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-005.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-005.https.html
index 807a0509289..35d6ccbf3d4 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-005.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-005.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;length&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-006.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-006.https.html
index 45859a514a3..a8cfdead0f7 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-006.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-006.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;number&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-007.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-007.https.html
index b3f4f1f1bba..77b80b51e67 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-007.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-007.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;percentage&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-008.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-008.https.html
index 45eb9096081..1ec166614e1 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-008.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-008.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;resolution&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-009.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-009.https.html
index e45881244b2..e7a5e37c641 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-009.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-009.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated &lt;time&gt; values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-010.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-010.https.html
index d4d1b038e24..ee3a0f1b321 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-010.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-interpolation-010.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Interpolated list values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-001.https.html
index 26da7e2eeff..133b9238e6c 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-001.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Registering a property causes invalidation for initial value</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-002.https.html
index 0aab051a4c4..aadbfec42c8 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-invalidation-002.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Registering a property causes invalidation for applied value</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-stylemap.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-stylemap.https.html
index 2305afb37df..4a6b4db521a 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-stylemap.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-stylemap.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Test styleMap functions</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-001.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-001.https.html
index f915dacb168..970e1f3e5ed 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-001.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-001.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Initial values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-002.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-002.https.html
index 7d62b0b2f65..6019151b105 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-002.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-002.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Inherited values reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-003.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-003.https.html
index b22f18dde7c..b9c3bf3fd90 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-003.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-003.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of *-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-004.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-004.https.html
index d67603f9fe8..e04be69f80c 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-004.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-004.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;angle&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-005.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-005.https.html
index 71cda9a3766..bfecd0c56b8 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-005.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-005.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;color&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-006.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-006.https.html
index aa03edf25f7..7176b67d4bb 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-006.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-006.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;custom-ident&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-007.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-007.https.html
index 61256cd11cf..309fe969b6b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-007.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-007.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;image&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-008.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-008.https.html
index 06a18bd022c..db72408d77b 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-008.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-008.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;integer&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-009.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-009.https.html
index 2ce2a0d56bd..a2c2e9a8cd5 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-009.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-009.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;length-percentage&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-010.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-010.https.html
index 53aef81e8e8..332a22a1b9d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-010.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-010.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;length&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-011.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-011.https.html
index d5dc351f7fa..a596a5d55fd 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-011.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-011.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;number&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-012.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-012.https.html
index 827877a51c4..80c1e6ed37c 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-012.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-012.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;percentage&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-013.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-013.https.html
index e37cd556f80..7af03929d84 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-013.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-013.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;resolution&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-014.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-014.https.html
index f42160fabe1..0ca1eca13ed 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-014.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-014.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;time&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-015.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-015.https.html
index 5b00b53c2a0..d7ba26b852c 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-015.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-015.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of &lt;url&gt;-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-016.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-016.https.html
index 1ec2e1b5ab0..609f00f6d00 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-016.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-016.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of ident-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-017.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-017.https.html
index 1ec2e1b5ab0..609f00f6d00 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-017.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-017.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of ident-properties reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-018.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-018.https.html
index 6be2cb8a228..1f9876b6b50 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-018.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/registered-property-value-018.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>Values of lists reach worklet</title>
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="parse-input-arguments-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/style-background-image.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/style-background-image.https.html
index 13204cf709f..8e5f2f81547 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/style-background-image.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/style-background-image.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="style-background-image-ref.html">
<style>
.container {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/style-before-pseudo.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/style-before-pseudo.https.html
index f7e2a164f17..017b23a6caf 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/style-before-pseudo.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/style-before-pseudo.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="style-before-pseudo-ref.html">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/style-first-letter-pseudo.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/style-first-letter-pseudo.https.html
index 02b114560fd..d3c31a0508d 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/style-first-letter-pseudo.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/style-first-letter-pseudo.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="style-first-letter-pseudo-ref.html">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-after-load.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-after-load.https.html
index 44612f98ffd..c1bf8e85548 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-after-load.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-after-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="valid-image-after-load-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-before-load.https.html b/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-before-load.https.html
index 7738d9dd115..b58dfa114ea 100644
--- a/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-before-load.https.html
+++ b/tests/wpt/web-platform-tests/css/css-paint-api/valid-image-before-load.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
+<link rel="help" href="https://drafts.css-houdini.org/css-paint-api/">
<link rel="match" href="valid-image-before-load-ref.html">
<style>
#output {
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/conditional-rules.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/conditional-rules.html
index b4de63045f3..0bff879856c 100644
--- a/tests/wpt/web-platform-tests/css/css-properties-values-api/conditional-rules.html
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/conditional-rules.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#conditional-rules" />
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#conditional-rules">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -35,8 +35,9 @@ test(function() {
}, 'CSS.supports(conditionText) should ignore registered syntax');
test(function() {
- assert_false(CSS.supports('--length', 'red'));
+ assert_true(CSS.supports('--length', 'red'));
assert_true(CSS.supports('--length', '10px'));
-}, 'CSS.supports(property, value) should parse against registered syntax');
+ assert_true(CSS.supports('--length', ' anything, really'));
+}, 'CSS.supports(property, value) should ignore registered syntax');
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/unit-cycles.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/unit-cycles.html
index c26e1cda1f6..5301b6fcc77 100644
--- a/tests/wpt/web-platform-tests/css/css-properties-values-api/unit-cycles.html
+++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/unit-cycles.html
@@ -96,19 +96,19 @@
test(function() {
target.style = 'font-size: var(--font-size-em);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-em', compute_dimension('2em', 'unset'));
+ assert_property_equals('--font-size-em', '');
}, 'Lengths with em units may not be referenced from font-size');
test(function() {
target.style = 'font-size: var(--font-size-ex);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-ex', compute_dimension('2ex', 'unset'));
+ assert_property_equals('--font-size-ex', '');
}, 'Lengths with ex units may not be referenced from font-size');
test(function() {
target.style = 'font-size: var(--font-size-ch);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-ch', compute_dimension('2ch', 'unset'));
+ assert_property_equals('--font-size-ch', '');
}, 'Lengths with ch units may not be referenced from font-size');
test(function() {
@@ -120,11 +120,9 @@
test(function() {
let root = document.documentElement;
- let expected1rem = compute_dimension('1rem', 'unset', root);
- let expected2rem = compute_dimension('2rem', 'unset', root);
root.style = 'font-size: var(--font-size-rem);';
- assert_property_equals('font-size', expected1rem, root);
- assert_property_equals('--font-size-rem', expected2rem, root);
+ assert_property_equals('font-size', unsetFontSize, root);
+ assert_property_equals('--font-size-rem', '', root);
}, 'Lengths with rem units may not be referenced from font-size on root element');
test(function() {
@@ -134,51 +132,50 @@
test(function() {
target.style = 'font-size: var(--font-size-em, 42px);';
- assert_property_equals('font-size', '42px');
- }, 'Fallback triggered when em unit cycle is detected');
+ assert_property_equals('font-size', unsetFontSize);
+ }, 'Fallback not triggered while inside em unit cycle');
test(function() {
target.style = 'font-size: var(--font-size-ex, 42px);';
- assert_property_equals('font-size', '42px');
- }, 'Fallback triggered when ex unit cycle is detected');
+ assert_property_equals('font-size', unsetFontSize);
+ }, 'Fallback not triggered while inside ex unit cycle');
test(function() {
target.style = 'font-size: var(--font-size-ch, 42px);';
- assert_property_equals('font-size', '42px');
- }, 'Fallback triggered when ch unit cycle is detected');
+ assert_property_equals('font-size', unsetFontSize);
+ }, 'Fallback not triggered while inside ch unit cycle');
test(function() {
let root = document.documentElement;
root.style = 'font-size: var(--font-size-rem, 42px);';
- assert_property_equals('font-size', '42px', root);
+ assert_property_equals('font-size', unsetFontSize, root);
root.style = 'font-size: unset;';
- }, 'Fallback triggered when rem unit cycle is detected on root element');
+ }, 'Fallback not triggered while inside rem unit cycle on root element');
test(function() {
target.style = 'font-size: var(--font-size-em-via-var);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-em-via-var', compute_dimension('10em', 'unset'));
+ assert_property_equals('--font-size-em-via-var', '');
}, 'Lengths with em units are detected via var references');
test(function() {
target.style = 'font-size: var(--font-size-ex-via-var);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-ex-via-var', compute_dimension('10ex', 'unset'));
+ assert_property_equals('--font-size-ex-via-var', '');
}, 'Lengths with ex units are detected via var references');
test(function() {
target.style = 'font-size: var(--font-size-ch-via-var);';
assert_property_equals('font-size', unsetFontSize);
- assert_property_equals('--font-size-ch-via-var', compute_dimension('10ch', 'unset'));
+ assert_property_equals('--font-size-ch-via-var', '');
}, 'Lengths with ch units are detected via var references');
test(function() {
let root = document.documentElement;
- let expected1rem = compute_dimension('1rem', 'unset', root);
- let expected10rem = compute_dimension('10rem', 'unset', root);
root.style = 'font-size: var(--font-size-rem-via-var);';
- assert_property_equals('font-size', expected1rem, root);
- assert_property_equals('--font-size-rem-via-var', expected10rem, root);
+ assert_property_equals('font-size', unsetFontSize, root);
+ assert_property_equals('--font-size-rem-via-var', '', root);
+ root.style = 'font-size: unset';
}, 'Lengths with rem units are detected via var references');
test(function() {
diff --git a/tests/wpt/web-platform-tests/css/css-tables/percent-width-cell-dynamic.html b/tests/wpt/web-platform-tests/css/css-tables/percent-width-cell-dynamic.html
new file mode 100644
index 00000000000..5c7ef3bf8a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables/percent-width-cell-dynamic.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/984642" />
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<style>
+html { overflow: hidden; }
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div id="target">
+ <div style="width: 10%;">
+ <div style="display: inline-table;">
+ <div style="display: table-cell; width: 100%;">
+ <span style="display: inline-block; width: 100%; height: 100px; background: green;"></span>
+ </div>
+ <div style="display: table-cell;">
+ <span style="display: inline-block; width: 10px; height: 100px; background: green;"></span>
+ </div>
+ </div>
+ </div>
+</div>
+<script>
+document.body.offsetTop;
+document.getElementById('target').style.width = '1000px';
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-decoration-thickness-001-notref.html b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
index f876afa68c6..4e7db88ce5b 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
@@ -10,6 +10,7 @@
}
div span {
text-decoration: green underline;
+ text-decoration-skip-ink: none;
font: 20px/1 Ahem;
color: transparent;
padding-right: 1em;
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-001-notref.html b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-001-notref.html
index c56078a32ae..8b1dacfbf48 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-001-notref.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-001-notref.html
@@ -10,6 +10,7 @@
}
div span {
text-decoration: green underline;
+ text-decoration-skip-ink: none;
font: 20px/1 Ahem;
color: transparent;
padding-bottom: 20px;
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-002-ref.html b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-002-ref.html
index ed2e3cefff8..6e7d5a65f03 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-002-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/reference/text-underline-offset-002-ref.html
@@ -10,6 +10,7 @@
}
#text, #norm{
text-decoration: green underline;
+ text-decoration-skip-ink: none;
text-underline-offset: 0px;
font: 20px/1 Ahem;
color: transparent;
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html
index 37e954b2b87..6fd8383d062 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-thickness-linethrough-001.html
@@ -18,6 +18,7 @@
font: 20px/1 Ahem;
color: transparent;
text-decoration: green line-through;
+ text-decoration-skip-ink: none;
/* We make the text decoration just a bit thicker than the div's height, so that
* it will entirely cover the div's content-box (making it fully green) as long
* as the line-through is approximately centered, vertically.
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-001.html b/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-001.html
index bd9a29c7fde..f7aeb543df3 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-001.html
@@ -15,6 +15,7 @@
}
div span {
text-decoration: green underline;
+ text-decoration-skip-ink: none;
font: 20px/1 Ahem;
color: transparent;
padding-bottom: 20px;
diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-002.html b/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-002.html
index 7441ff9d932..dc65db7723f 100644
--- a/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-002.html
+++ b/tests/wpt/web-platform-tests/css/css-text-decor/text-underline-offset-002.html
@@ -14,6 +14,7 @@
}
#text, #norm{
text-decoration: green underline;
+ text-decoration-skip-ink: none;
font: 20px/1 Ahem;
color: transparent;
position: relative;
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html
new file mode 100644
index 00000000000..fde2a3d086b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:loose, a browser allows a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="ja">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if ja and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html
new file mode 100644
index 00000000000..d6f58cb88c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="ja">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if ja and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html
new file mode 100644
index 00000000000..8265f917225
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="ja">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if ja and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html
new file mode 100644
index 00000000000..c902bf7bddb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html
new file mode 100644
index 00000000000..e98d4a20cb1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html
new file mode 100644
index 00000000000..29810f2a350
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html
new file mode 100644
index 00000000000..9dffd854891
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html
new file mode 100644
index 00000000000..9c0af13806c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html
new file mode 100644
index 00000000000..d573bac7d6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html
new file mode 100644
index 00000000000..80b5bb0c72c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html
new file mode 100644
index 00000000000..6d6043031e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html
new file mode 100644
index 00000000000..e0f60cd36fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html
new file mode 100644
index 00000000000..fff23f36df8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser allows a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html
new file mode 100644
index 00000000000..d000d8eb16d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html
new file mode 100644
index 00000000000..79d6e12cc8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html
new file mode 100644
index 00000000000..ff8ef05b14c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser allows a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html
new file mode 100644
index 00000000000..c5913821e5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html
new file mode 100644
index 00000000000..46c0fe3caac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html
new file mode 100644
index 00000000000..0eec96857fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser wll NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html
new file mode 100644
index 00000000000..6043912cded
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html
new file mode 100644
index 00000000000..8c9387fa044
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html
new file mode 100644
index 00000000000..8b2fd1c038c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser wll NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html
new file mode 100644
index 00000000000..2da6d3b0af6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html
new file mode 100644
index 00000000000..99cf5c5fbef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if de and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html
new file mode 100644
index 00000000000..d6d0a1b3493
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (unknown lang)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being unkonwn makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html
new file mode 100644
index 00000000000..548fa173982
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (unknown lang)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being unknown makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html
new file mode 100644
index 00000000000..a4e871789a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (language unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge being unknown makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html
new file mode 100644
index 00000000000..3d4cb261289
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknonw loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html
new file mode 100644
index 00000000000..417973b0bbf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html
new file mode 100644
index 00000000000..c6685dfe79d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:strict, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html
new file mode 100644
index 00000000000..f15f2632ebe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (loose,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html
new file mode 100644
index 00000000000..4e9dc5607b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unkonwn and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html
new file mode 100644
index 00000000000..595cd5df2b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:strict, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html
new file mode 100644
index 00000000000..c507f78e6e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser allows a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html
new file mode 100644
index 00000000000..4e8d9617baf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html
new file mode 100644
index 00000000000..a1c3a855041
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html
new file mode 100644
index 00000000000..420a7b6f07c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is uknown, and line-break:loose, a browser allows a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if lang unknown and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html
new file mode 100644
index 00000000000..9d7b2c032d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html
new file mode 100644
index 00000000000..54c7559d109
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html
new file mode 100644
index 00000000000..e635075a415
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html
new file mode 100644
index 00000000000..46e7472208e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html
new file mode 100644
index 00000000000..61fd7b7ec5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (strict,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html
new file mode 100644
index 00000000000..b21853f386e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html
new file mode 100644
index 00000000000..337cf8f85db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html
new file mode 100644
index 00000000000..d25fa6857d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
new file mode 100644
index 00000000000..a131395e1da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if zh and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
new file mode 100644
index 00000000000..ff7456b8214
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if zh and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
new file mode 100644
index 00000000000..dc752f1086c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
new file mode 100644
index 00000000000..b56cd28c840
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may appear at line start if zh and loose');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
new file mode 100644
index 00000000000..198bf28cd7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
new file mode 100644
index 00000000000..c71014b42f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+function spansNearEnough(counter) {
+ return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+ - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_true(spansNearEnough(i));
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ // Hide successful tests.
+ if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-004.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-004.html
index daf8420b393..19b98417b0f 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-004.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-004.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-005.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-005.html
index 47f675eda6e..5e286a0d769 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-005.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-005.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: overflow-wrap:break-word + white-space:break-spaces</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
<link rel="help" title="3. White Space and Wrapping: the white-space property" href="https://www.w3.org/TR/css-text-3/#white-space-property">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-006.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-006.html
index de5a43eab44..207cf84f756 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-006.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-006.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-007.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-007.html
index 300d9bd9298..b8e4627e7bc 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-007.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-007.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-008.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-008.html
index a7590a2ee27..6b7fb14f5cf 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-008.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-008.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="3. White Space and Wrapping: the white-space property" href="https://www.w3.org/TR/css-text-3/#white-space-property">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-009.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-009.html
index 4cc3f4ee392..6a0ab913330 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-009.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-009.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-010.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-010.html
index 6554bf68ce1..19cc7966028 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-010.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-010.html
@@ -1,4 +1,5 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-011.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-011.html
index 6cbec13008e..70d9628a6f0 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-011.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-011.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-012.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-012.html
index 2dfe6071fdf..0c01a0c28ba 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-012.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-012.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-013.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-013.html
index 2b60ff5c622..9aef864c921 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-013.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-013.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-014.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-014.html
index 04969bb65a9..ddbeddf12fe 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-014.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-014.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-015.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-015.html
index 34c261e4372..b0edd4e2982 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-015.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-015.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-016.html b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-016.html
index 81b565209c6..5f80f52c6ea 100644
--- a/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-016.html
+++ b/tests/wpt/web-platform-tests/css/css-text/line-break/line-break-anywhere-016.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
+<html lang=en>
<meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
<link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html b/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html
new file mode 100644
index 00000000000..3d2f9c7be22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-006-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 50px/1 Ahem;
+ color: green;
+}
+</style>
+
+<p>Test passes if there are two green squares and no red.
+<div>x&#x3000;x</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html b/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html
new file mode 100644
index 00000000000..b8fc5662bd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/text-transform/reference/text-transform-fullwidth-007-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 50px/1 Ahem;
+ color: green;
+}
+</style>
+
+<p>Test passes if there are two green squares and no red.
+<div>x&#x3000;&#x3000;&#x3000;x</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-006.html b/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-006.html
new file mode 100644
index 00000000000..b0a509758ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-006.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: text-transform:fullwidth and collapsed spaces</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://www.w3.org/TR/css-text-3/#text-transform-property">
+<link rel="match" href="reference/text-transform-fullwidth-006-ref.html">
+<meta name="assert" content="full-width does not transform collapsed U+0020 spaces to U+3000, only the remaining one after collapsing.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div { font: 50px/1 Ahem; }
+#test {
+ text-transform: fullwidth;
+ color: green;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there are two green squares and no red.
+<div id=ref>x&#x3000;x</div>
+<div id=test>x x</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-007.html b/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-007.html
new file mode 100644
index 00000000000..6e081544a19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/text-transform/text-transform-fullwidth-007.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: text-transform:fullwidth and preserved spaces</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://www.w3.org/TR/css-text-3/#text-transform-property">
+<link rel="match" href="reference/text-transform-fullwidth-007-ref.html">
+<meta name="assert" content="full-width does transforms U+0020 spaces to U+3000 within preserved white space.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div { font: 50px/1 Ahem; }
+#test {
+ text-transform: fullwidth;
+ color: green;
+ white-space: pre-wrap;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index: -1;
+}
+</style>
+
+<p>Test passes if there are two green squares and no red.
+<div id=ref>x&#x3000;&#x3000;&#x3000;x</div>
+<div id=test>x x</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-001.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-001.html
new file mode 100644
index 00000000000..4b01a60395a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after break-spaces tabs</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs with white-space:break-spaces">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: break-spaces;
+ color: green;
+ width: 16ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX&#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-002.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-002.html
new file mode 100644
index 00000000000..d86918b75fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after break-spaces tabs and space</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs and spaces with white-space:break-spaces">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: break-spaces;
+ color: green;
+ width: 16ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX &#x09; &#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-003.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-003.html
new file mode 100644
index 00000000000..0d762a426aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-003.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after each break-spaces tab</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/break-spaces-tab-003-ref.html">
+<meta name="assert" content="There is a wrapping opportunity after each tab in a sequence with white-space:break-spaces.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: break-spaces;
+ color: green;
+ width: 1ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there are two <strong>filled green squares</strong> and <strong>no red</strong>.</p>
+<div id=ref>X<br><br><br><br><br>X</div>
+<div id=test>X&#x09;&#x09;&#x09;&#x09;&#x09;X</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-004.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-004.html
new file mode 100644
index 00000000000..4ccbdd0f21a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-004.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after each break-spaces space and tab</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/break-spaces-tab-003-ref.html">
+<meta name="assert" content="There is a wrapping opportunity after each tab and space in a sequence with white-space:break-spaces.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there are two <strong>filled green squares</strong> and <strong>no red</strong>.</p>
+<div id=ref>X<br><br><br><br><br>X</div>
+<div id=test>X&#x09; &#x09;&#x09;X</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-005.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-005.html
new file mode 100644
index 00000000000..b5cf3f33ec2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-005.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: break-space tabs don't hang</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-3">
+<link rel="match" href="reference/break-spaces-tab-005-ref.html">
+<meta name="assert" content="a sequence of break-spaces tabs at the end of a line does not hang.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: break-spaces;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ white-space: pre;
+ width: 2ch;
+ background: red;
+ color: green;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a green rectangle and no red.
+<div id=ref> X<br> X<br>XX<br>XX<br>XX<br>XX<br> </div>
+<div id=test>X<wbr>X&#x09;&#x09;&#x09;&#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-006.html b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-006.html
new file mode 100644
index 00000000000..85d821a3e4d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/break-spaces-tab-006.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: break-spaces tabs and spaces don't hang</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-3">
+<link rel="match" href="reference/break-spaces-tab-005-ref.html">
+<meta name="assert" content="a sequence of break-spaces tabs and spaces at the end of a line does not hang, and can wrap after each tab or space.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: break-spaces;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ white-space: pre;
+ width: 2ch;
+ background: red;
+ color: green;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a green rectangle and no red.
+<div id=ref> X<br> X<br>XX<br>XX<br>XX<br>XX<br> </div>
+<div id=test>X<wbr>X&#x09; &#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-006.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-006.html
index cff928c2fd5..de1c0de11c6 100644
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-006.html
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-006.html
@@ -28,5 +28,5 @@ span { color: green; }
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div class="ref">XXX<span>XX<br>XXX</span>XX<br><span>XXXXX<br>XXXXX<br>XXXXX</span></div>
-<div class="test">XXX
+<div class="test">XXX <!--end of line space intentional-->
XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-007.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-007.html
index ca27b98c2f6..9089466338f 100644
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-007.html
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-007.html
@@ -28,5 +28,5 @@ span { color: green; }
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div class="ref">XXX<span>XX<br>XXX</span>XX<br><span>XXXXX<br>XXXXX<br>XXXXX</span></div>
-<div class="test">XXX
+<div class="test">XXX <!--end of line spaces intentional-->
XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-008.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-008.html
index 7331142c2ea..f112a0c20b9 100644
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-008.html
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-008.html
@@ -28,5 +28,5 @@ span { color: green; }
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div class="ref">XX<span>XXX<br>XXX</span>XX<br><span>XXXXX<br>XXXXX<br>XXXXX</span></div>
-<div class="test">XX
+<div class="test">XX <!--end of line spaces intentional-->
XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-009.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-009.html
index e2786419c1a..2fe58aa5ceb 100644
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-009.html
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-leading-spaces-009.html
@@ -28,5 +28,5 @@ span { color: green; }
<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
<div class="ref">X<span>XXXX<br>XXX</span>XX<br><span>XXXXX<br>XXXXX<br>XXXXX</span></div>
-<div class="test">X
+<div class="test">X <!--end of line spaces intentional-->
XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-001.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-001.html
new file mode 100644
index 00000000000..e57da83e9fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after pre-wrap tabs</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs with white-space:pre-wrap">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 16ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX&#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-002.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-002.html
new file mode 100644
index 00000000000..11ec8509408
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: wrapping opportunity after pre-wrap tabs and spaces</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs and spaces with white-space:pre-wrap">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 16ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX &#x09; &#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-003.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-003.html
new file mode 100644
index 00000000000..a54debe80a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-003.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: no wrapping opportunity between pre-wrap tabs</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs with white-space:pre-wrap, but not between or before each tab.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX&#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-004.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-004.html
new file mode 100644
index 00000000000..22c3ec45c68
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-004.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: no wrapping opportunity between pre-wrap tabs and spaces</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-1">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="There is a wrapping opportunity at the end of a sequence of tabs and spaces with white-space:pre-wrap, but not between or before each.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>XX &#x09; &#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-005.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-005.html
new file mode 100644
index 00000000000..993aa92e370
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-005.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: pre-wrap tabs hang</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-3">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="a sequence of pre-wrap tabs at the end of a line hangs.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>X<wbr>X&#x09;&#x09;XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-006.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-006.html
new file mode 100644
index 00000000000..a4c7f3d3ebd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-tab-006.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: pre-wrap tabs and spaces hang</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-3">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="a sequence of pre-wrap tabs and spaces at the end of a line hangs.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+}
+#test {
+ white-space: pre-wrap;
+ color: green;
+ width: 2ch;
+}
+#ref {
+ color: red;
+ position: absolute;
+ z-index:-1;
+}
+</style>
+
+<p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+<div id=ref>XX<br>XX</div>
+<div id=test>X<wbr>X&#x09; &#x09;&#x09; XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-003-ref.html b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-003-ref.html
new file mode 100644
index 00000000000..52a8c491cca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-003-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+ color: green;
+}
+</style>
+
+<p>Test passes if there are two <strong>filled green squares</strong> and <strong>no red</strong>.</p>
+<div>X<br><br><br><br><br>X</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-005-ref.html b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-005-ref.html
new file mode 100644
index 00000000000..798e35fd660
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/break-spaces-tab-005-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+div {
+ font: 20px/1 Ahem;
+ white-space: break-spaces;
+ color: green;
+ white-space: pre;
+}
+</style>
+
+<p>Test passes if there is a green rectangle and no red.
+<div>XX<br>XX<br>XX<br>XX<br>XX<br>XX<br>XX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html b/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html
deleted file mode 100644
index 820012e6ca1..00000000000
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>CSS Text test: hanging trailing spaces with white-space:pre-wrap</title>
-<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
-<link rel="match" href="reference/white-space-pre-wrap-trailing-spaces-004-ref.html">
-<meta name="assert" content="Preserved white space at the end of the line is hanged when white-space is pre-wrap and any overflowing space is removed.">
-<style>
-div {
- font: 25px/1 Ahem;
-}
-.ref {
- position: absolute;
- color: red;
- z-index: -1;
-}
-.test span { background: red; }
-.test {
- color: green;
- width: 2ch;
- white-space: pre-wrap;
-}
-.test span { background: green; }
-</style>
-
-<p>This test passes if there is a green square and no red.
-<div class="ref">X<span>X</span><br>XX</div>
-<div class="test">X<span>&#x0020;&#x0020;</span><span>&#x0020;XX</span></div>
-
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-computed.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-computed.html
new file mode 100644
index 00000000000..effeb2974e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-computed.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transform Module Level 2: getComputedStyle().perspectiveOrigin</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property">
+<meta name="assert" content="perspective-origin computed value is a pair of absolute lengths">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ width: 200px;
+ height: 300px;
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("perspective-origin", "10%", "20px 150px");
+test_computed_value("perspective-origin", "10% center", "20px 150px");
+test_computed_value("perspective-origin", "20% 30px", "40px 30px");
+test_computed_value("perspective-origin", "30px center", "30px 150px");
+test_computed_value("perspective-origin", "40px top", "40px 0px");
+test_computed_value("perspective-origin", "bottom 10% right 20%", "160px 270px");
+test_computed_value("perspective-origin", "bottom right", "200px 300px");
+test_computed_value("perspective-origin", "center", "100px 150px");
+test_computed_value("perspective-origin", "center 50px", "100px 50px");
+test_computed_value("perspective-origin", "center bottom", "100px 300px");
+test_computed_value("perspective-origin", "center center", "100px 150px");
+test_computed_value("perspective-origin", "center left", "0px 150px");
+test_computed_value("perspective-origin", "left", "0px 150px");
+test_computed_value("perspective-origin", "left 10px", "0px 10px");
+test_computed_value("perspective-origin", "left bottom", "0px 300px");
+test_computed_value("perspective-origin", "left center", "0px 150px");
+test_computed_value("perspective-origin", "right 40%", "200px 120px");
+test_computed_value("perspective-origin", "right 30% top -60px", "140px -60px");
+test_computed_value("perspective-origin", "top", "100px 0px");
+test_computed_value("perspective-origin", "right 20px bottom 30px", "180px 270px");
+
+test_computed_value("perspective-origin", "right calc(10px - 0.5em) top calc(10px - 0.5em)", "210px -10px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-invalid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-invalid.html
index 2ed6721e091..2ed6721e091 100644
--- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-invalid.html
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-invalid.html
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-valid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-valid.html
index 79f4e0df12e..79f4e0df12e 100644
--- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-parsing-valid.html
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/perspective-origin-valid.html
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-computed.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-computed.html
new file mode 100644
index 00000000000..696d89db67f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-computed.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transform Module Level 2: getComputedStyle().transformOrigin</title>
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-origin-property">
+<meta name="assert" content="transform-origin computed value is two or three absolute lengths">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ width: 200px;
+ height: 300px;
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("transform-origin", "10%", "20px 150px");
+test_computed_value("transform-origin", "10% center", "20px 150px");
+test_computed_value("transform-origin", "20% 30px", "40px 30px");
+test_computed_value("transform-origin", "30px center", "30px 150px");
+test_computed_value("transform-origin", "40px top", "40px 0px");
+test_computed_value("transform-origin", "bottom right", "200px 300px");
+test_computed_value("transform-origin", "center", "100px 150px");
+test_computed_value("transform-origin", "center 50px", "100px 50px");
+test_computed_value("transform-origin", "center bottom", "100px 300px");
+test_computed_value("transform-origin", "center center", "100px 150px");
+test_computed_value("transform-origin", "center left", "0px 150px");
+test_computed_value("transform-origin", "left", "0px 150px");
+test_computed_value("transform-origin", "left 10px", "0px 10px");
+test_computed_value("transform-origin", "left bottom", "0px 300px");
+test_computed_value("transform-origin", "left center", "0px 150px");
+test_computed_value("transform-origin", "right 40%", "200px 120px");
+test_computed_value("transform-origin", "top", "100px 0px");
+
+test_computed_value("transform-origin", "-1px bottom 5px", "-1px 300px 5px");
+test_computed_value("transform-origin", "left center 6px", "0px 150px 6px");
+test_computed_value("transform-origin", "center top", "100px 0px");
+test_computed_value("transform-origin", "right bottom 7px", "200px 300px 7px");
+test_computed_value("transform-origin", "-1px -2px -3px");
+
+test_computed_value("transform-origin", "calc(-100% + 10px - 0.5em) calc(10px - 0.5em) calc(10px - 0.5em)", "-210px -10px -10px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-invalid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-invalid.html
index 19a7c963a70..0dd1eeaf592 100644
--- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-invalid.html
+++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-origin-invalid.html
@@ -19,6 +19,10 @@ test_invalid_value("transform-origin", "1px left");
test_invalid_value("transform-origin", "top 1px"); // Blink fails.
test_invalid_value("transform-origin", "right left");
test_invalid_value("transform-origin", "top bottom");
+
+test_invalid_value("transform-origin", "bottom 10% right 20%");
+test_invalid_value("transform-origin", "right 30% top -60px");
+test_invalid_value("transform-origin", "right 20px bottom 30px");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/scrollLeftTop.html b/tests/wpt/web-platform-tests/css/cssom-view/scrollLeftTop.html
new file mode 100644
index 00000000000..55b40136007
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/scrollLeftTop.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<title>CSSOM View - scrollLeft/scrollTop considers writing-mode and css direction</title>
+<meta charset="utf-8">
+<link rel="author" title="Cathie Chen" href="mailto:cathiechen@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-area-origin">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#scroll-an-element">
+<meta name="assert" content="This test verifies the assigned and extreme values of the scroll positions of an element.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<head>
+ <style>
+ .scroller {
+ overflow: scroll;
+ width: 150px;
+ height: 100px;
+ }
+ .content {
+ width: 300px;
+ height: 400px;
+ }
+ .horizontal-tb {
+ writing-mode: horizontal-tb;
+ }
+ .vertical-lr {
+ writing-mode: vertical-lr;
+ }
+ .vertical-rl {
+ writing-mode: vertical-rl;
+ }
+ .rtl {
+ direction: rtl;
+ }
+ </style>
+</head>
+
+<body>
+ <h1>scrollLeft/scrollTop</h1>
+ <h2>writing-mode: horizontal-tb;</h2>
+ <div id="target_scroller" class="scroller horizontal-tb ltr">
+ <div id="target_content" class="content"></div>
+ </div>
+ <div class="scroller horizontal-tb rtl">
+ <div class="content"></div>
+ </div>
+ <h2>writing-mode: vertical-lr;</h2>
+ <div class="scroller vertical-lr ltr">
+ <div class="content"></div>
+ </div>
+ <div class="scroller vertical-lr rtl">
+ <div class="content"></div>
+ </div>
+ <h2>writing-mode: vertical-rl;</h2>
+ <div class="scroller vertical-rl ltr">
+ <div class="content"></div>
+ </div>
+ <div class="scroller vertical-rl rtl">
+ <div class="content"></div>
+ </div>
+
+ <script>
+ var scroller = document.querySelector("#target_scroller");
+ var content = document.querySelector("#target_content");
+ var scrollbar_width = scroller.offsetWidth - scroller.clientWidth;
+ var scroller_width = scroller.offsetWidth;
+ var scroller_height = scroller.offsetHeight;
+ var content_width = content.offsetWidth;
+ var content_height = content.offsetHeight;
+
+ expectedScrollTop = content_height - scroller_height + scrollbar_width;
+ expectedScrollLeft = content_width - scroller_width + scrollbar_width;
+
+ const epsilon = 0.5;
+ test(() => {
+ var scroller = document.querySelector(".horizontal-tb.ltr");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = 2*content_width;
+ scroller.scrollTop = 2*content_height;
+ assert_approx_equals(scroller.scrollLeft, expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:horizontal-tb; direction:ltr`);
+
+ test(() => {
+ var scroller = document.querySelector(".horizontal-tb.rtl");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = -2*content_width;
+ scroller.scrollTop = 2*content_height;
+ assert_approx_equals(scroller.scrollLeft, -expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:horizontal-tb; direction:rtl`);
+
+ test(() => {
+ var scroller = document.querySelector(".vertical-lr.ltr");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = 2*content_width;
+ scroller.scrollTop = 2*content_height;
+ assert_approx_equals(scroller.scrollLeft, expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:vertical-lr; direction:ltr`);
+
+ test(() => {
+ var scroller = document.querySelector(".vertical-lr.rtl");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = 2*content_width;
+ scroller.scrollTop = -2*content_height;
+ assert_approx_equals(scroller.scrollLeft, expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, -expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:vertical-lr; direction:rtl`);
+
+ test(() => {
+ var scroller = document.querySelector(".vertical-rl.ltr");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = -2*content_width;
+ scroller.scrollTop = 2*content_height;
+ assert_approx_equals(scroller.scrollLeft, -expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:vertical-rl; direction:ltr`);
+
+ test(() => {
+ var scroller = document.querySelector(".vertical-rl.rtl");
+ assert_approx_equals(scroller.scrollLeft, 0, epsilon, "initial scrollLeft");
+ assert_approx_equals(scroller.scrollTop, 0, epsilon, "initial scrollTop");
+ scroller.scrollLeft = -2*content_width;
+ scroller.scrollTop = -2*content_height;
+ assert_approx_equals(scroller.scrollLeft, -expectedScrollLeft, epsilon, "ending scrollLeft");
+ assert_approx_equals(scroller.scrollTop, -expectedScrollTop, epsilon, "ending scrollTop");
+ }, `writing-mode:vertical-rl; direction:rtl`);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity-ref.html
new file mode 100644
index 00000000000..347b7a684ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>backdrop-filter: Correctly apply backdrop-filter with opacity</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+
+<p>Expected: A green box.</p>
+
+<div class="greenbox"></div>
+
+
+<style>
+.greenbox {
+ position: absolute;
+ background: green;
+ width: 100px;
+ height: 100px;
+ top: 100px;
+ left: 60px;
+}
+</style>
diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity.html
new file mode 100644
index 00000000000..cb189f9f3e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-plus-opacity.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>backdrop-filter: Correctly apply backdrop-filter with opacity</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filter-plus-opacity-ref.html">
+
+<p>Expected: A green box.</p>
+
+<div class="greenbox"></div>
+<div class="filter"></div>
+
+<style>
+.greenbox {
+ position: absolute;
+ background: green;
+ width: 100px;
+ height: 100px;
+ top: 100px;
+ left: 60px;
+}
+.filter {
+ position: absolute;
+ width: 200px;
+ height: 200px;
+ top: 50px;
+ left: 10px;
+ backdrop-filter: invert(1);
+ opacity: 0;
+}
+</style>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/width-equals-window-inner-width.html b/tests/wpt/web-platform-tests/css/mediaqueries/width-equals-window-inner-width.html
new file mode 100644
index 00000000000..775c1112de7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/width-equals-window-inner-width.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>CSS Test: CSS media query width equals window innerWidth</title>
+
+<link rel="author" title="Jinfeng Ma" href="mailto:majinfeng1@xiaomi.org">
+<link rel="help" href="https://www.w3.org/TR/css3-mediaqueries/#width">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-window-innerwidth">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!--
+It'd be best to programmatically change device scale factor so that the document
+width becomes non integral but for now this test is only effective when run on
+devices with a fractional device scale factor.
+-->
+<script type="text/javascript">
+ 'use strict';
+ test(() => {
+ assert_true(window.matchMedia('(width: ' + window.innerWidth + 'px)').matches);
+ }, 'CSS media query width equals window innerWidth.');
+</script>
diff --git a/tests/wpt/web-platform-tests/element-timing/images-repeated-resource.html b/tests/wpt/web-platform-tests/element-timing/images-repeated-resource.html
index 9bc8b5f45e4..a6ad7acefcb 100644
--- a/tests/wpt/web-platform-tests/element-timing/images-repeated-resource.html
+++ b/tests/wpt/web-platform-tests/element-timing/images-repeated-resource.html
@@ -13,8 +13,10 @@ body {
<script>
let beforeRender;
let numEntries = 0;
- let responseEnd1;
- let responseEnd2;
+ let loadTime1;
+ let loadTime2;
+ let renderTime1;
+ let renderTime2;
let img;
let img2;
const index = window.location.href.lastIndexOf('/');
@@ -26,23 +28,33 @@ body {
}
const observer = new PerformanceObserver(
t.step_func(function(entryList) {
- entryList.getEntries().forEach(entry => {
- // Easier to check the |element| attribute here since element ID is the same for both images.
- checkElement(entry, pathname, entry.identifier, 'image_id', beforeRender, null);
- checkNaturalSize(entry, 100, 100);
- if (entry.identifier === 'my_image') {
- ++numEntries;
- responseEnd1 = entry.responseEnd;
- assert_equals(entry.element, img);
- }
- else if (entry.identifier === 'my_image2') {
- ++numEntries;
- responseEnd2 = entry.responseEnd;
- assert_equals(entry.element, img2);
- }
- });
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ // Easier to check the |element| attribute here since element ID is the same for both images.
+ checkElement(entry, pathname, entry.identifier, 'image_id', beforeRender, null);
+ checkNaturalSize(entry, 100, 100);
+ if (entry.identifier === 'my_image') {
+ ++numEntries;
+ loadTime1 = entry.loadTime;
+ renderTime1 = entry.renderTime;
+ assert_equals(entry.element, img);
+
+ img2 = document.createElement('img');
+ img2.src = 'resources/square100.png';
+ img2.setAttribute('elementtiming', 'my_image2');
+ img2.setAttribute('id', 'image_id');
+ document.body.appendChild(img2);
+ beforeRender = performance.now();
+ }
+ else if (entry.identifier === 'my_image2') {
+ ++numEntries;
+ loadTime2 = entry.loadTime;
+ renderTime2 = entry.renderTime;
+ assert_equals(entry.element, img2);
+ }
if (numEntries == 2) {
- assert_equals(responseEnd1, responseEnd2);
+ assert_greater_than(loadTime2, loadTime1, 'Second image loads after first.');
+ assert_greater_than(renderTime2, renderTime1, 'Second image renders after first');
t.done();
}
})
@@ -57,16 +69,9 @@ body {
img.setAttribute('elementtiming', 'my_image');
img.setAttribute('id', 'image_id');
document.body.appendChild(img);
-
- img2 = document.createElement('img');
- img2.src = 'resources/square100.png';
- img2.setAttribute('elementtiming', 'my_image2');
- img2.setAttribute('id', 'image_id');
- document.body.appendChild(img2);
-
beforeRender = performance.now();
};
- }, 'Element with elementtiming attribute is observable.');
+ }, 'Elements with elementtiming and same src are observable.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/element-timing/resources/element-timing-helpers.js b/tests/wpt/web-platform-tests/element-timing/resources/element-timing-helpers.js
index f98f9b21134..8933732616c 100644
--- a/tests/wpt/web-platform-tests/element-timing/resources/element-timing-helpers.js
+++ b/tests/wpt/web-platform-tests/element-timing/resources/element-timing-helpers.js
@@ -22,7 +22,8 @@ function checkElement(entry, expectedUrl, expectedIdentifier, expectedID, before
assert_equals(entry.name, 'image-paint');
const rt_entries = performance.getEntriesByName(expectedUrl, 'resource');
assert_equals(rt_entries.length, 1);
- assert_equals(rt_entries[0].responseEnd, entry.responseEnd);
+ assert_greater_than_equal(entry.loadTime, rt_entries[0].responseEnd,
+ 'Image loadTime is after the resource responseEnd');
}
function checkElementWithoutResourceTiming(entry, expectedUrl, expectedIdentifier,
@@ -30,8 +31,8 @@ function checkElementWithoutResourceTiming(entry, expectedUrl, expectedIdentifie
checkElementInternal(entry, expectedUrl, expectedIdentifier, expectedID, beforeRender,
expectedElement);
assert_equals(entry.name, 'image-paint');
- // No associated resource from ResourceTiming, so the responseEnd should be 0.
- assert_equals(entry.responseEnd, 0);
+ // No associated resource from ResourceTiming, so not much to compare loadTime with.
+ assert_greater_than(entry.loadTime, 0);
}
// Checks that the rect matches the desired values [left right top bottom].
@@ -57,5 +58,5 @@ function checkTextElement(entry, expectedIdentifier, expectedID, beforeRender,
checkElementInternal(entry, '', expectedIdentifier, expectedID, beforeRender,
expectedElement);
assert_equals(entry.name, 'text-paint');
- assert_equals(entry.responseEnd, 0);
+ assert_equals(entry.loadTime, 0);
}
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
index 6e51ff8b59a..4bfcfbc8f44 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
@@ -89,7 +89,7 @@
assert_false(response.bodyUsed, "bodyUsed is false at init");
if (asText) {
return response.text().then(function(bodyAsString) {
- assert_equals(bodyAsString, "", "Resolved value should be empty");
+ assert_equals(bodyAsString.length, 0, "Resolved value should be empty");
assert_true(response.bodyUsed, "bodyUsed is true after being consumed");
});
}
diff --git a/tests/wpt/web-platform-tests/html/dom/interfaces.https.html b/tests/wpt/web-platform-tests/html/dom/interfaces.https.html
index 47254a4361c..6ca77212532 100644
--- a/tests/wpt/web-platform-tests/html/dom/interfaces.https.html
+++ b/tests/wpt/web-platform-tests/html/dom/interfaces.https.html
@@ -8,6 +8,7 @@
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/subset-tests-by-key.js></script>
+<script src=/common/get-host-info.sub.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
@@ -200,7 +201,8 @@ idl_test(
PeerConnection: [],
MediaStreamEvent: [],
ErrorEvent: [],
- WebSocket: ['new WebSocket("wss://foo")'],
+ // https://web-platform-tests.org/writing-tests/server-features.html?tests-involving-multiple-origins
+ WebSocket: ['new WebSocket("wss://nonexistent.' + get_host_info().ORIGINAL_HOST + '")'],
CloseEvent: ['new CloseEvent("close")'],
AbstractWorker: [],
Worker: [],
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt
index cd138fd32af..7fe5b1241a2 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/resources/captions-fast.vtt
@@ -5,9 +5,9 @@
Lorem
2
-00:00:00.300 --> 00:00:00.700
+00:00:00.300 --> 00:00:01.300
ipsum
3
-00:00:01.200 --> 00:00:01.500
+00:00:01.800 --> 00:00:02.800
dolor
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
index 6a555fe25aa..81d0c900650 100644
--- a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
@@ -15,21 +15,29 @@ function testCanvas(ctx, r, g, b, a)
}
promise_test(function() {
- function testTransferFromImageBitmapNullability(greenImage) {
+ function transferFromImageBitmapToBlobOffscreen(greenImage) {
var bitmapCanvas = new OffscreenCanvas(width,height);
var bitmapCtx = bitmapCanvas.getContext('bitmaprenderer');
bitmapCtx.transferFromImageBitmap(greenImage);
+ return bitmapCanvas.convertToBlob();
+ }
+
+ function drawBlobToCanvas(blob) {
// Make sure the bitmap renderer canvas is filled correctly.
- var pngImage = document.getElementById("img");
- bitmapCanvas.convertToBlob().then(function(blob){
- pngImage.src = URL.createObjectURL(blob);
- var myCanvasToTest = document.createElement('canvas');
- myCanvasToTest.width = width;
- myCanvasToTest.height = height;
- var myCtxToTest = myCanvasToTest.getContext('2d');
- myCtxToTest.drawImage(pngImage, 0, 0);
- testCanvas(myCtxToTest, 0, 255, 0, 255);
+ var pngImage = new Image();
+ var myCanvasToTest = document.createElement('canvas');
+ myCanvasToTest.width = width;
+ myCanvasToTest.height = height;
+
+ // Wait for the blob img to load.
+ return new Promise(function(resolve) {
+ pngImage.src = URL.createObjectURL(blob);
+ pngImage.onload = function() {
+ var myCtxToTest = myCanvasToTest.getContext('2d');
+ myCtxToTest.drawImage(pngImage, 0, 0);
+ resolve(myCtxToTest);
+ };
});
}
@@ -40,11 +48,13 @@ promise_test(function() {
greenCtx.fillStyle = '#0f0';
greenCtx.fillRect(0, 0, width, height);
- return Promise.all([
- createImageBitmap(greenCanvas),
- ]).then(([greenImage]) => {
- testTransferFromImageBitmapNullability(greenImage);
- });
-},'Test that transferToBlob works and produce the expected image');
+ return createImageBitmap(greenCanvas).then(
+ greenImage => transferFromImageBitmapToBlobOffscreen(greenImage)
+ ).then(
+ blob => drawBlobToCanvas(blob)
+ ).then(
+ ctx => testCanvas(ctx, 0, 255, 0, 255)
+ );
+},'Test that convertToBlob works and produce the expected image');
</script>
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
index c83e8ff9261..e34c73f1ba9 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
@@ -4,5 +4,4 @@
[TestDriver actions: actions with key pressed]
expected:
- if product == "firefox": FAIL
if os == "mac" and product == "chrome": FAIL
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 4ba38970e30..ee444ebb29d 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
@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports)
// Source: CSS Properties and Values API Level 1 (https://drafts.css-houdini.org/css-properties-values-api-1/)
-dictionary PropertyDescriptor {
+dictionary PropertyDefinition {
required DOMString name;
DOMString syntax = "*";
required boolean inherits;
@@ -11,5 +11,17 @@ dictionary PropertyDescriptor {
};
partial namespace CSS {
- void registerProperty(PropertyDescriptor descriptor);
+ void registerProperty(PropertyDefinition definition);
+};
+
+partial interface CSSRule {
+ const unsigned short PROPERTY_RULE = 18;
+};
+
+[Exposed=Window]
+interface CSSPropertyRule : CSSRule {
+ readonly attribute CSSOMString name;
+ readonly attribute CSSOMString syntax;
+ readonly attribute boolean inherits;
+ readonly attribute CSSOMString? initialValue;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/geometry.idl b/tests/wpt/web-platform-tests/interfaces/geometry.idl
index 5d5fe4fc2c4..1b83959465c 100644
--- a/tests/wpt/web-platform-tests/interfaces/geometry.idl
+++ b/tests/wpt/web-platform-tests/interfaces/geometry.idl
@@ -15,7 +15,7 @@ interface DOMPointReadOnly {
readonly attribute unrestricted double z;
readonly attribute unrestricted double w;
- DOMPoint matrixTransform(optional DOMMatrixInit matrix);
+ [NewObject] DOMPoint matrixTransform(optional DOMMatrixInit matrix);
[Default] object toJSON();
};
diff --git a/tests/wpt/web-platform-tests/interfaces/longtasks.idl b/tests/wpt/web-platform-tests/interfaces/longtasks.idl
index 21bb1dd117b..333b842f86e 100644
--- a/tests/wpt/web-platform-tests/interfaces/longtasks.idl
+++ b/tests/wpt/web-platform-tests/interfaces/longtasks.idl
@@ -5,6 +5,7 @@
interface PerformanceLongTaskTiming : PerformanceEntry {
readonly attribute FrozenArray<TaskAttributionTiming> attribution;
+ [Default] object toJSON();
};
interface TaskAttributionTiming : PerformanceEntry {
@@ -12,4 +13,5 @@ interface TaskAttributionTiming : PerformanceEntry {
readonly attribute DOMString containerSrc;
readonly attribute DOMString containerId;
readonly attribute DOMString containerName;
+ [Default] object toJSON();
};
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/cross-origin-image.sub.html b/tests/wpt/web-platform-tests/largest-contentful-paint/cross-origin-image.sub.html
index 6e86f13b9cc..88775b861a6 100644
--- a/tests/wpt/web-platform-tests/largest-contentful-paint/cross-origin-image.sub.html
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/cross-origin-image.sub.html
@@ -9,6 +9,7 @@
if (!window.LargestContentfulPaint) {
assert_unreached("LargestContentfulPaint is not implemented");
}
+ const beforeLoad = performance.now();
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
@@ -22,8 +23,8 @@
assert_equals(entry.id, 'image_id');
const pathname = 'http://{{domains[www]}}:{{ports[http][1]}}/images/blue.png';
assert_equals(entry.url, pathname);
- assert_equals(entry.responseEnd,
- performance.getEntriesByName(pathname, 'resource')[0].responseEnd);
+ assert_greater_than_equal(entry.loadTime, beforeLoad);
+ assert_less_than(entry.loadTime, performance.now());
assert_equals(entry.element, document.getElementById('image_id'));
})
);
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/loadTime-after-appendChild.html b/tests/wpt/web-platform-tests/largest-contentful-paint/loadTime-after-appendChild.html
new file mode 100644
index 00000000000..fb0eddb220e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/loadTime-after-appendChild.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Largest Contentful Paint: delayed appended image.</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ async_test(function (t) {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ let beforeLoad;
+ const observer = new PerformanceObserver(
+ t.step_func_done(entryList => {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ assert_equals(entry.entryType, 'largest-contentful-paint');
+ assert_equals(entry.startTime, 0);
+ assert_equals(entry.duration, 0);
+ assert_equals(entry.url, window.location.origin + '/images/black-rectangle.png');
+ assert_greater_than(entry.renderTime, entry.loadTime,
+ 'The image render time should occur after it is appended to the div.');
+ assert_greater_than(entry.loadTime, beforeLoad,
+ 'The image load timestamp should occur after script starts running.');
+ assert_less_than(entry.renderTime, performance.now(),
+ 'Image render time should be before the observer callback is executed.')
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ const img = document.createElement('img');
+ img.src = '/images/black-rectangle.png';
+ t.step_timeout(() => {
+ beforeLoad = performance.now();
+ document.getElementById('image_div').appendChild(img);
+ }, 200)
+ }, 'Image loadTime occurs after appendChild is called.');
+</script>
+<div id='image_div'></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/observe-image.html b/tests/wpt/web-platform-tests/largest-contentful-paint/observe-image.html
index 4d56cc2d838..16b3502eb34 100644
--- a/tests/wpt/web-platform-tests/largest-contentful-paint/observe-image.html
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/observe-image.html
@@ -9,7 +9,7 @@
if (!window.LargestContentfulPaint) {
assert_unreached("LargestContentfulPaint is not implemented");
}
- let beforeRender = performance.now();
+ const beforeRender = performance.now();
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
@@ -28,8 +28,10 @@
const index = window.location.href.lastIndexOf('/') - 25;
const pathname = window.location.href.substring(0, index) + '/images/blue.png';
assert_equals(entry.url, pathname);
- assert_equals(entry.responseEnd,
- performance.getEntriesByName(pathname, 'resource')[0].responseEnd);
+ assert_greater_than(entry.loadTime, beforeRender,
+ 'The load timestamp should occur after script starts running.');
+ assert_less_than(entry.loadTime, entry.renderTime,
+ 'The load timestamp should occur before the render timestamp.')
assert_equals(entry.element, document.getElementById('image_id'));
})
);
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/observe-text.html b/tests/wpt/web-platform-tests/largest-contentful-paint/observe-text.html
index 7dbfbe52f3d..2cf1344f255 100644
--- a/tests/wpt/web-platform-tests/largest-contentful-paint/observe-text.html
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/observe-text.html
@@ -10,11 +10,11 @@ p {
}
</style>
<script>
- let beforeRender;
async_test(function (t) {
if (!window.LargestContentfulPaint) {
assert_unreached("LargestContentfulPaint is not implemented");
}
+ let beforeRender;
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
@@ -28,7 +28,7 @@ p {
// Width of at least 100 px.
// TODO: find a good way to bound text width.
assert_greater_than_equal(entry.size, 1200);
- assert_equals(entry.responseEnd, 0);
+ assert_equals(entry.loadTime, 0);
assert_equals(entry.id, 'my_text');
assert_equals(entry.url, '');
assert_equals(entry.element, document.getElementById('my_text'));
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/repeated-image.html b/tests/wpt/web-platform-tests/largest-contentful-paint/repeated-image.html
new file mode 100644
index 00000000000..94406b20d62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/repeated-image.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Largest Contentful Paint: repeated image.</title>
+<style>
+ #image_id {
+ width: 10px;
+ height: 10px;
+ }
+</style>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ async_test(function (t) {
+ if (!window.LargestContentfulPaint) {
+ assert_unreached("LargestContentfulPaint is not implemented");
+ }
+ const beforeFirstLoad = performance.now();
+ let firstCallback = true;
+ const path = window.location.origin + '/images/black-rectangle.png';
+ let beforeSecondLoad;
+ const observer = new PerformanceObserver(
+ t.step_func(entryList => {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ assert_equals(entry.entryType, 'largest-contentful-paint');
+ assert_equals(entry.startTime, 0);
+ assert_equals(entry.duration, 0);
+ assert_equals(entry.url, path);
+ assert_less_than(entry.renderTime, performance.now(),
+ 'Image render time should be before the observer callback is executed.')
+ if (firstCallback) {
+ assert_equals(entry.id, 'image_id');
+ assert_greater_than(entry.renderTime, entry.loadTime,
+ 'The first image render time should occur after its load time.');
+ assert_greater_than(entry.loadTime, beforeFirstLoad,
+ 'The first image load timestamp should occur after script starts running.');
+ // Image is shrunk to be 10 x 10.
+ assert_equals(entry.size, 100);
+ const img = document.createElement('img');
+ img.src = '/images/black-rectangle.png';
+ beforeSecondLoad = performance.now();
+ document.getElementById('image_div').appendChild(img);
+ firstCallback = false;
+ return;
+ }
+ // The second image is added at its natural size: 100 x 50.
+ assert_equals(entry.size, 5000);
+ assert_greater_than(entry.loadTime, beforeSecondLoad,
+ 'The second image load time should occur after adding it to the document body.');
+ assert_greater_than(entry.renderTime, entry.loadTime,
+ 'The second image render time should occur after its load time.');
+ t.done();
+ })
+ );
+ observer.observe({type: 'largest-contentful-paint', buffered: true});
+ }, 'Repeated image produces different timestamps.');
+</script>
+<img src='/images/black-rectangle.png' id='image_id'/>
+<div id='image_div'></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/supported-lcp-type.html b/tests/wpt/web-platform-tests/largest-contentful-paint/supported-lcp-type.html
new file mode 100644
index 00000000000..25d4eaa0367
--- /dev/null
+++ b/tests/wpt/web-platform-tests/largest-contentful-paint/supported-lcp-type.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<head>
+<title>PerformanceObserver.supportedEntryTypes contains "largest-contentful-paint"</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+ if (typeof PerformanceObserver.supportedEntryTypes === "undefined")
+ assert_unreached("supportedEntryTypes is not supported.");
+ assert_greater_than(PerformanceObserver.supportedEntryTypes.indexOf("largest-contentful-paint"), -1,
+ "There should be an entry 'largest-contentful-paint' in PerformanceObserver.supportedEntryTypes");
+}, "supportedEntryTypes contains 'largest-contentful-paint'.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/layout-instability/supported-layout-type.html b/tests/wpt/web-platform-tests/layout-instability/supported-layout-type.html
index 9bc53701658..8679a2de738 100644
--- a/tests/wpt/web-platform-tests/layout-instability/supported-layout-type.html
+++ b/tests/wpt/web-platform-tests/layout-instability/supported-layout-type.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<head>
-<title>PerformanceObserver.supportedEntryTypes contains "layoutShift"</title>
+<title>PerformanceObserver.supportedEntryTypes contains "layout-shift"</title>
</head>
<body>
<script src="/resources/testharness.js"></script>
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index 02b1bb0c78f..c344c3a8344 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -28,10 +28,6 @@ TRAILING WHITESPACE: webaudio/*
TRAILING WHITESPACE: WebIDL/*
TRAILING WHITESPACE: webvtt/*
TRAILING WHITESPACE: server-timing/resources/parsing/*.sub.headers
-TRAILING WHITESPACE: css/css-text/white-space/pre-wrap-leading-spaces-006.html
-TRAILING WHITESPACE: css/css-text/white-space/pre-wrap-leading-spaces-007.html
-TRAILING WHITESPACE: css/css-text/white-space/pre-wrap-leading-spaces-008.html
-TRAILING WHITESPACE: css/css-text/white-space/pre-wrap-leading-spaces-009.html
## File types that should never be checked ##
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/common.js b/tests/wpt/web-platform-tests/loading/lazyload/common.js
new file mode 100644
index 00000000000..f5013fc288f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/common.js
@@ -0,0 +1,13 @@
+// Helper to access the element, its associated loading promise, and also to
+// resolve the promise.
+class ElementLoadPromise {
+ constructor(element_id) {
+ this.element_id = element_id;
+ this.promise = new Promise(resolve => {
+ this.resolve = resolve
+ });
+ }
+ element() {
+ return document.getElementById(this.element_id);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/original-base-url-applied-tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/original-base-url-applied-tentative.html
new file mode 100644
index 00000000000..06f9c257ee9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/original-base-url-applied-tentative.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<head>
+ <title>Deferred iframes and images with loading='lazy' use the original base URL specified at the parse time</title>
+ <link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<script>
+ const below_viewport_iframe = new ElementLoadPromise("below_viewport_iframe");
+
+ // Change the base URL and scroll down to load the deferred elements.
+ window.addEventListener("load", () => {
+ window.history.pushState(1, document.title, '/invalid-url-where-no-subresources-exist/')
+ below_viewport_iframe.element().scrollIntoView();
+ });
+
+ async_test(function(t) {
+ below_viewport_iframe.promise.then(
+ t.step_func_done(function() {
+ assert_true(below_viewport_iframe.element().contentDocument.body.innerHTML.includes("<p>Subframe</p>"));
+ }));
+ }, "Test that when deferred iframe is loaded, it uses the base URL computed at parse time.");
+</script>
+
+<body>
+ <div style="height:10000px;"></div>
+ <script>
+ // Change the base URL so that the iframe makes use of that in its relative
+ // URL to absolute URL computation at parse time.
+ window.history.pushState(1, document.title, 'resources/')
+ </script>
+ <iframe id="below_viewport_iframe" src="subframe.html" loading="lazy" width="200px" height="100px" onload="below_viewport_iframe.resolve();">
+ </iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/original-referrer-policy-applied-tentative.sub.html b/tests/wpt/web-platform-tests/loading/lazyload/original-referrer-policy-applied-tentative.sub.html
new file mode 100644
index 00000000000..2ffbc821c66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/original-referrer-policy-applied-tentative.sub.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<head>
+ <title>Deferred iframes and images with loading='lazy' use the original referrer-policy specified at the parse time</title>
+ <link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
+ <link rel="help" href="https://github.com/scott-little/lazyload">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<script>
+ const below_viewport_iframe = new ElementLoadPromise("below_viewport_iframe");
+
+ // Change the referrer-policy and scroll down to load the deferred elements.
+ window.addEventListener("load", () => {
+ below_viewport_iframe.element().referrerPolicy = "no-referrer";
+ document.getElementById("below_viewport_iframe").scrollIntoView();
+ });
+
+ async_test(function(t) {
+ below_viewport_iframe.promise.then(
+ t.step_func_done(function() {
+ // The referer header should be the full URL (as specified in the iframe
+ // at parse time), and not the origin (as specified in meta referrer
+ // tag) or null (as overridden by iframe referrerpolicy=no-referrer).
+ assert_true(below_viewport_iframe.element().contentDocument.body.innerHTML
+ .includes("Referer: http://{{host}}:{{ports[http][0]}}/loading/lazyload/"));
+ }));
+ }, "Test that when deferred iframe is loaded, it uses the referrer-policy specified at parse time.");
+</script>
+
+<body>
+ <meta name="referrer" content="origin">
+ <div style="height:10000px;"></div>
+ <iframe id="below_viewport_iframe" src="/xhr/resources/echo-headers.py" loading="lazy" width="200px" height="100px" referrerpolicy="unsafe-url" onload="below_viewport_iframe.resolve();">
+ </iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/picture-loading-lazy.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/picture-loading-lazy.tentative.html
new file mode 100644
index 00000000000..58f8c3a4d5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/picture-loading-lazy.tentative.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<head>
+ <title>Images with loading='lazy' in picture elements load when near the viewport</title>
+ <link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
+ <link rel="help" href="https://github.com/scott-little/lazyload">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<script>
+const in_viewport_img = new ElementLoadPromise("in_viewport_img");
+const lazy_attribute_img = new ElementLoadPromise("lazy_attribute_img");
+const eager_attribute_img = new ElementLoadPromise("eager_attribute_img");
+
+const document_load_promise = new Promise(resolve => {
+ window.addEventListener("load", resolve);
+});
+
+async_test(function(t) {
+ document_load_promise.then(t.step_func_done(function() {
+ assert_false(lazy_attribute_img.element().complete);
+ lazy_attribute_img.element().scrollIntoView();
+ }));
+}, "Test that the loading=lazy <picture> element below viewport was deferred, on document load.");
+
+async_test(function(t) {
+ in_viewport_img.promise.then(t.step_func_done());
+}, "Test that in viewport <picture> element was loaded");
+
+async_test(function(t) {
+ eager_attribute_img.promise.then(t.step_func_done());
+}, "Test that eager <picture> element was loaded");
+
+async_test(function(t) {
+ lazy_attribute_img.promise.then(t.step_func_done());
+}, "Test that deferred <picture> element was loaded-in as well, after scrolled down");
+
+</script>
+
+<body>
+<picture>
+ <source sizes='50vw' srcset='resources/image.png?in_viewport_img'>
+ <img id='in_viewport_img' src='img-not-loaded.png' loading="lazy" onload="in_viewport_img.resolve();">
+</picture>
+<div style="height:10000px;"></div>
+<picture>
+ <source sizes='50vw' srcset='resources/image.png?lazy_attribute_img'>
+ <img id='lazy_attribute_img' src='img-not-loaded.png' loading="lazy" onload="lazy_attribute_img.resolve();">
+</picture>
+<picture>
+ <source sizes='50vw' srcset='resources/image.png?eager_attribute_img'>
+ <img id='eager_attribute_img' src='img-not-loaded.png' loading="eager" onload="eager_attribute_img.resolve();">
+</picture>
+
+<!--
+ This async script loads very slowly in order to ensure that, if the
+ below_viewport image has started loading, it has a chance to finish
+ loading before window.load() happens, so that the test will dependably fail
+ in that case instead of potentially passing depending on how long different
+ resource fetches take.
+-->
+<script async src="/common/slow.py"></script>
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/idlharness.window.js b/tests/wpt/web-platform-tests/longtask-timing/idlharness.window.js
index 0ef7e85440e..fd9a3f042f6 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/longtask-timing/idlharness.window.js
@@ -7,8 +7,10 @@
idl_test(
['longtasks'],
- ['performance-timeline'],
+ ['performance-timeline', 'hr-time'],
(idl_array, t) => new Promise((resolve, reject) => {
+
+
const longTask = () => {
const begin = self.performance.now();
while (self.performance.now() < begin + 100);
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
index 3b37f48889f..29d48e03b0a 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
@@ -272,7 +272,7 @@ function touchScrollInTarget(target, direction) {
throw("scroll direction '" + direction + "' is not expected, direction should be 'down', 'up', 'left' or 'right'");
}
return new test_driver.Actions()
- .addPointer("pointer1", "touch")
+ .addPointer("touchPointer1", "touch")
.pointerMove(0, 0, {origin: target})
.pointerDown()
.pointerMove(x_delta, y_delta, {origin: target})
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_touch-action-keyboard.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_touch-action-keyboard.html
index fdddd3313f4..aeff71331dd 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_touch-action-keyboard.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_touch-action-keyboard.html
@@ -121,6 +121,7 @@
// Inject keyboard scroll inputs.
actions_promise = new test_driver.Actions()
+ .addPointer("mousePointer1", "mouse")
.pointerMove(0, 0, {origin: target0})
.pointerDown()
.pointerUp()
diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js
index cb294c072de..9be554d96b6 100644
--- a/tests/wpt/web-platform-tests/resources/idlharness.js
+++ b/tests/wpt/web-platform-tests/resources/idlharness.js
@@ -193,6 +193,12 @@ self.IdlArray = function()
this["implements"] = {};
this["includes"] = {};
this["inheritance"] = {};
+
+ /**
+ * Record of skipped IDL items, in case we later realize that they are a
+ * dependency (to retroactively process them).
+ */
+ this.skipped = new Map();
};
IdlArray.prototype.add_idls = function(raw_idls, options)
@@ -244,22 +250,41 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
all_deps.add(k);
this.includes[k].forEach(v => all_deps.add(v));
});
- this.partials.map(p => p.name).forEach(v => all_deps.add(v));
- // Add the attribute idlTypes of all the nested members of all tested idls.
- for (const obj of [this.members, this.partials]) {
- const tested = Object.values(obj).filter(m => !m.untested && m.members);
- for (const parsed of tested) {
- for (const attr of Object.values(parsed.members).filter(m => !m.untested && m.type === 'attribute')) {
- all_deps.add(attr.idlType.idlType);
+ this.partials.forEach(p => all_deps.add(p.name));
+
+ // Add the attribute idlTypes of all the nested members of idls.
+ const attrDeps = parsedIdls => {
+ return parsedIdls.reduce((deps, parsed) => {
+ if (parsed.members) {
+ for (const attr of Object.values(parsed.members).filter(m => m.type === 'attribute')) {
+ let attrType = attr.idlType;
+ // Check for generic members (e.g. FrozenArray<MyType>)
+ if (attrType.generic) {
+ deps.add(attrType.generic);
+ attrType = attrType.idlType;
+ }
+ deps.add(attrType.idlType);
+ }
}
- }
- }
+ if (parsed.base in this.members) {
+ attrDeps([this.members[parsed.base]]).forEach(dep => deps.add(dep));
+ }
+ return deps;
+ }, new Set());
+ };
+
+ const testedMembers = Object.values(this.members).filter(m => !m.untested && m.members);
+ attrDeps(testedMembers).forEach(dep => all_deps.add(dep));
+
+ const testedPartials = this.partials.filter(m => !m.untested && m.members);
+ attrDeps(testedPartials).forEach(dep => all_deps.add(dep));
+
if (options && options.except && options.only) {
throw new IdlHarnessError("The only and except options can't be used together.");
}
- const should_skip = name => {
+ const defined_or_untested = name => {
// NOTE: Deps are untested, so we're lenient, and skip re-encountered definitions.
// e.g. for 'idl' containing A:B, B:C, C:D
// array.add_idls(idl, {only: ['A','B']}).
@@ -268,9 +293,7 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
return name in this.members
|| this.is_excluded_by_options(name, options);
}
- // Record of skipped items, in case we later determine they are a dependency.
// Maps name -> [parsed_idl, ...]
- const skipped = new Map();
const process = function(parsed) {
var deps = [];
if (parsed.name) {
@@ -284,13 +307,15 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
}
deps = deps.filter(function(name) {
- if (!name || should_skip(name) || !all_deps.has(name)) {
+ if (!name
+ || name === parsed.name && defined_or_untested(name)
+ || !all_deps.has(name)) {
// Flag as skipped, if it's not already processed, so we can
// come back to it later if we retrospectively call it a dep.
if (name && !(name in this.members)) {
- skipped.has(name)
- ? skipped.get(name).push(parsed)
- : skipped.set(name, [parsed]);
+ this.skipped.has(name)
+ ? this.skipped.get(name).push(parsed)
+ : this.skipped.set(name, [parsed]);
}
return false;
}
@@ -328,9 +353,9 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options)
}
for (const deferred of follow_up) {
- if (skipped.has(deferred)) {
- const next = skipped.get(deferred);
- skipped.delete(deferred);
+ if (this.skipped.has(deferred)) {
+ const next = this.skipped.get(deferred);
+ this.skipped.delete(deferred);
next.forEach(process);
}
}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html
index f70cf40931d..cc3bdaf11fc 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html
@@ -10,8 +10,8 @@
'use strict';
promise_test(async (t) => {
- const srcs = ['dom', 'html', 'service-workers', 'dedicated-workers'];
- const [dom, html, serviceWorkerIdl, dedicated] = await Promise.all(
+ const srcs = ['dom', 'html', 'service-workers'];
+ const [dom, html, serviceWorkerIdl] = await Promise.all(
srcs.map(i => fetch(`/interfaces/${i}.idl`).then(r => r.text())));
var idlArray = new IdlArray();
@@ -29,7 +29,6 @@ promise_test(async (t) => {
'Cache',
'CacheStorage',
]});
- idlArray.add_dependency_idls(dedicated);
idlArray.add_dependency_idls(dom);
idlArray.add_dependency_idls(html);
idlArray.add_objects({
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-after-update-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-after-update-worker.js
new file mode 100644
index 00000000000..d43f6b2f5c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-after-update-worker.js
@@ -0,0 +1 @@
+// Hello world!
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-before-update-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-before-update-worker.js
new file mode 100644
index 00000000000..30c8783a702
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-smaller-body-before-update-worker.js
@@ -0,0 +1,2 @@
+// Hello world!
+// **with extra body**
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-worker-from-file.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-worker-from-file.py
new file mode 100644
index 00000000000..7604719c8e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-worker-from-file.py
@@ -0,0 +1,31 @@
+import os
+
+def serve_js_from_file(request, response, filename):
+ body = ''
+ path = os.path.join(os.path.dirname(__file__), filename)
+ with open(path, 'rb') as f:
+ body = f.read()
+ return (
+ [
+ ('Cache-Control', 'no-cache, must-revalidate'),
+ ('Pragma', 'no-cache'),
+ ('Content-Type', 'application/javascript')
+ ], body)
+
+def main(request, response):
+ key = request.GET["Key"]
+
+ visited_count = request.server.stash.take(key)
+ if visited_count is None:
+ visited_count = 0
+
+ # Keep how many times the test requested this resource.
+ visited_count += 1
+ request.server.stash.put(key, visited_count)
+
+ # Serve a file based on how many times it's requested.
+ if visited_count == 1:
+ return serve_js_from_file(request, response, request.GET["First"])
+ if visited_count == 2:
+ return serve_js_from_file(request, response, request.GET["Second"])
+ raise "Unknown state"
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/update.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/update.https.html
index 7232419cd0a..f7fae35ed28 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/update.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/update.https.html
@@ -10,11 +10,12 @@
'use strict';
const SCOPE = 'resources/simple.txt';
-const WORKER_URL_BASE = 'resources/update-worker.py';
-async function prepare_ready_registration(t, mode) {
+// Create a service worker (update-worker.py). The response to update() will be
+// different based on the mode.
+async function prepare_ready_registration_with_mode(t, mode) {
const key = token();
- const worker_url = `${WORKER_URL_BASE}?Key=${key}&Mode=${mode}`;
+ const worker_url = `resources/update-worker.py?Key=${key}&Mode=${mode}`;
const expected_url = normalizeURL(worker_url);
const registration = await service_worker_unregister_and_register(
t, worker_url, SCOPE);
@@ -28,6 +29,27 @@ async function prepare_ready_registration(t, mode) {
return [registration, expected_url];
}
+// Create a service worker (update-worker-from-file.py), which is initially
+// |initial_worker| and |updated_worker| later.
+async function prepare_ready_registration_with_file(
+ t, initial_worker, updated_worker) {
+ const key = token();
+ const worker_url = `resources/update-worker-from-file.py?` +
+ `First=${initial_worker}&Second=${updated_worker}&Key=${key}`;
+ const expected_url = normalizeURL(worker_url);
+
+ const registration = await service_worker_unregister_and_register(
+ t, worker_url, SCOPE);
+ await wait_for_state(t, registration.installing, 'activated');
+ assert_equals(registration.installing, null,
+ 'prepare_ready: installing');
+ assert_equals(registration.waiting, null,
+ 'prepare_ready: waiting');
+ assert_equals(registration.active.scriptURL, expected_url,
+ 'prepare_ready: active');
+ return [registration, expected_url];
+}
+
function assert_installing_and_active(registration, expected_url) {
assert_equals(registration.installing.scriptURL, expected_url,
'assert_installing_and_active: installing');
@@ -57,7 +79,7 @@ function assert_active_only(registration, expected_url) {
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'normal');
+ await prepare_ready_registration_with_mode(t, 'normal');
t.add_cleanup(() => registration.unregister());
await Promise.all([registration.update(), wait_for_update(t, registration)]);
@@ -72,34 +94,34 @@ promise_test(async t => {
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'bad_mime_type');
+ await prepare_ready_registration_with_mode(t, 'bad_mime_type');
t.add_cleanup(() => registration.unregister());
- promise_rejects(t, 'SecurityError', registration.update());
+ await promise_rejects(t, 'SecurityError', registration.update());
assert_active_only(registration, expected_url);
}, 'update() should fail when mime type is invalid.');
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'redirect');
+ await prepare_ready_registration_with_mode(t, 'redirect');
t.add_cleanup(() => registration.unregister());
- promise_rejects(t, new TypeError(), registration.update())
+ await promise_rejects(t, new TypeError(), registration.update());
assert_active_only(registration, expected_url);
}, 'update() should fail when a response for the main script is redirect.');
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'syntax_error');
+ await prepare_ready_registration_with_mode(t, 'syntax_error');
t.add_cleanup(() => registration.unregister());
- promise_rejects(t, new TypeError(), registration.update());
+ await promise_rejects(t, new TypeError(), registration.update());
assert_active_only(registration, expected_url);
}, 'update() should fail when a new script contains a syntax error.');
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'throw_install');
+ await prepare_ready_registration_with_mode(t, 'throw_install');
t.add_cleanup(() => registration.unregister());
await Promise.all([registration.update(), wait_for_update(t, registration)]);
@@ -108,7 +130,7 @@ promise_test(async t => {
promise_test(async t => {
const [registration, expected_url] =
- await prepare_ready_registration(t, 'normal');
+ await prepare_ready_registration_with_mode(t, 'normal');
t.add_cleanup(() => registration.unregister());
// We need to hold a client alive so that unregister() below doesn't remove
@@ -117,8 +139,26 @@ promise_test(async t => {
const frame = await with_iframe(SCOPE);
t.add_cleanup(() => frame.remove());
- promise_rejects(
+ await promise_rejects(
t, new TypeError(),
Promise.all([registration.unregister(), registration.update()]));
-}, 'update() should fail when the pending uninstall flag is set.')
+}, 'update() should fail when the pending uninstall flag is set.');
+
+promise_test(async t => {
+ const [registration, expected_url] =
+ await prepare_ready_registration_with_file(
+ t,
+ 'update-smaller-body-before-update-worker.js',
+ 'update-smaller-body-after-update-worker.js');
+ t.add_cleanup(() => registration.unregister());
+
+ await Promise.all([registration.update(), wait_for_update(t, registration)]);
+ assert_installing_and_active(registration, expected_url);
+
+ await wait_for_state(t, registration.installing, 'installed');
+ assert_waiting_and_active(registration, expected_url);
+
+ await wait_for_state(t, registration.waiting, 'activated');
+ assert_active_only(registration, expected_url);
+}, 'update() should succeed when the script shrinks.');
</script>
diff --git a/tests/wpt/web-platform-tests/sms/interceptor.https.html b/tests/wpt/web-platform-tests/sms/interceptor.https.html
index b7e8fd53bff..86b21922284 100644
--- a/tests/wpt/web-platform-tests/sms/interceptor.https.html
+++ b/tests/wpt/web-platform-tests/sms/interceptor.https.html
@@ -165,4 +165,21 @@ promise_test(async t => {
let sms = await navigator.sms.receive({timeout: undefined});
assert_equals(sms.content, "hello");
}, 'Should use default value for timeout (undefined)');
+
+promise_test(async t => {
+ await expect(receive).andReturn((timeout) => {
+ return Promise.resolve({
+ status: Status.kCancelled,
+ });
+ });
+
+ try {
+ await navigator.sms.receive();
+ assert_unreached('Expected CancelledError to be thrown.');
+ } catch (error) {
+ assert_equals(error.name, "AbortError");
+ assert_equals(error.message, "SMSReceiver was aborted.");
+ }
+}, 'Deal with cancelled requests');
+
</script>
diff --git a/tests/wpt/web-platform-tests/sms/sms_provider.js b/tests/wpt/web-platform-tests/sms/sms_provider.js
index 6a54e47b241..4506135551c 100644
--- a/tests/wpt/web-platform-tests/sms/sms_provider.js
+++ b/tests/wpt/web-platform-tests/sms/sms_provider.js
@@ -73,6 +73,7 @@ function intercept() {
Status.kSuccess = blink.mojom.SmsStatus.kSuccess;
Status.kTimeout = blink.mojom.SmsStatus.kTimeout;
+ Status.kCancelled = blink.mojom.SmsStatus.kCancelled;
return smsReceiverImpl;
}
diff --git a/tests/wpt/web-platform-tests/std-toast/attributes.html b/tests/wpt/web-platform-tests/std-toast/attributes.html
index 97bab585c70..9b87280b668 100644
--- a/tests/wpt/web-platform-tests/std-toast/attributes.html
+++ b/tests/wpt/web-platform-tests/std-toast/attributes.html
@@ -100,11 +100,6 @@ testToastElement((toast) => {
assertToastNotShown(toast);
}, 'setting `toast.open` to some falsy value on a shown toast will hide the toast');
-testToastElement((toast) => {
- toast.toggleAttribute('open');
- assert_true(toast.open);
-}, 'toggling `open` on a hidden toast sets `toast.open` to true');
-
testToastElementAsync((t, toast) => {
toast.toggleAttribute('open', true);
@@ -115,7 +110,18 @@ testToastElementAsync((t, toast) => {
}, 'toggling open attribute does not start timeout');
testToastElement((toast) => {
- const permitted_properties = ['constructor', 'show', 'hide', 'toggle', 'open', 'action', 'closeButton'];
+ const permitted_properties = ['constructor', 'show', 'hide', 'toggle', 'open', 'action', 'closeButton', 'type'];
assert_array_equals(permitted_properties.sort(), Object.getOwnPropertyNames(toast.__proto__).sort());
}, 'toast only exposes certain properties');
+
+testToastElement((toast) => {
+ assert_false(toast.hasAttribute('type'));
+ assert_equals(toast.type, '');
+}, 'default type is empty string without attribute present');
+
+testToastElement((toast) => {
+ toast.type = 'info';
+ assert_equals(toast.type, '');
+ assert_equals(toast.getAttribute('type'), 'info');
+}, 'info was briefly a valid type, but no longer is, so it will return empty string');
</script>
diff --git a/tests/wpt/web-platform-tests/std-toast/reflection.html b/tests/wpt/web-platform-tests/std-toast/reflection.html
new file mode 100644
index 00000000000..36cbaf65228
--- /dev/null
+++ b/tests/wpt/web-platform-tests/std-toast/reflection.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<title>HTML5 reflection tests: std-toast</title>
+<meta name=timeout content=long>
+
+<div id=log></div>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/dom/original-harness.js"></script>
+<script src="/html/dom/new-harness.js"></script>
+
+<script type="module">
+import 'std:elements/toast';
+
+const toastElement = {
+ 'std-toast': {
+ open: 'boolean',
+ type: {type: 'enum', keywords: ['success', 'error', 'warning']},
+ },
+};
+
+mergeElements(toastElement);
+</script>
+<script src="/html/dom/reflection.js" defer></script>
diff --git a/tests/wpt/web-platform-tests/std-toast/styles.html b/tests/wpt/web-platform-tests/std-toast/styles.html
index 98e6723c3c8..1db8620485d 100644
--- a/tests/wpt/web-platform-tests/std-toast/styles.html
+++ b/tests/wpt/web-platform-tests/std-toast/styles.html
@@ -61,4 +61,40 @@ testToastElement((toast) => {
assertComputedStyleMapsEqual(toast, mockToast);
}, 'the computed style map of a closed unstyled toast is the same as a span given toast defaults');
-</script> \ No newline at end of file
+
+testToastElement((toast) => {
+ toast.type = 'error';
+
+ const styles = window.getComputedStyle(toast);
+ assert_equals(styles.borderColor, 'rgb(255, 0, 0)');
+}, 'changing type to error changes the border color to red');
+
+testToastElement((toast) => {
+ toast.type = 'warning';
+
+ const styles = window.getComputedStyle(toast);
+ assert_equals(styles.borderColor, 'rgb(255, 165, 0)');
+}, 'changing type to warning changes the border color to orange');
+
+testToastElement((toast) => {
+ toast.type = 'success';
+
+ const styles = window.getComputedStyle(toast);
+ assert_equals(styles.borderColor, 'rgb(0, 128, 0)');
+}, 'changing type to success changes the border color to green');
+
+testToastElement((toast) => {
+ const styler = document.createElement('style');
+ styler.append(`
+ [type=error i] {
+ border-color: pink;
+ }
+ `);
+ document.querySelector('main').appendChild(styler);
+
+ toast.type = 'error';
+
+ const styles = window.getComputedStyle(toast);
+ assert_equals(styles.borderColor, 'rgb(255, 192, 203)');
+}, 'outside styles can set type styles');
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.any.js b/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.any.js
index d47e7cd4faa..6a61adcdc96 100644
--- a/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.any.js
+++ b/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.any.js
@@ -107,3 +107,26 @@ test(() => {
'ByteLengthQueuingStrategy.name must be "ByteLengthQueuingStrategy"');
}, 'ByteLengthQueuingStrategy.name is correct');
+
+class SubClass extends ByteLengthQueuingStrategy {
+ size() {
+ return 2;
+ }
+
+ subClassMethod() {
+ return true;
+ }
+}
+
+test(() => {
+
+ const sc = new SubClass({highWaterMark: 77});
+ assert_equals(sc.constructor.name, 'SubClass',
+ 'constructor.name should be correct');
+ assert_equals(sc.highWaterMark, 77,
+ 'highWaterMark should come from the parent class');
+ assert_equals(sc.size(), 2,
+ 'size() on the subclass should override the parent');
+ assert_true(sc.subClassMethod(), 'subClassMethod() should work');
+
+}, 'subclassing ByteLengthQueuingStrategy should work correctly');
diff --git a/tests/wpt/web-platform-tests/streams/count-queuing-strategy.any.js b/tests/wpt/web-platform-tests/streams/count-queuing-strategy.any.js
index 20bb4c1842d..5aae61eda33 100644
--- a/tests/wpt/web-platform-tests/streams/count-queuing-strategy.any.js
+++ b/tests/wpt/web-platform-tests/streams/count-queuing-strategy.any.js
@@ -106,3 +106,26 @@ test(() => {
'CountQueuingStrategy.name must be "CountQueuingStrategy"');
}, 'CountQueuingStrategy.name is correct');
+
+class SubClass extends CountQueuingStrategy {
+ size() {
+ return 2;
+ }
+
+ subClassMethod() {
+ return true;
+ }
+}
+
+test(() => {
+
+ const sc = new SubClass({highWaterMark: 77});
+ assert_equals(sc.constructor.name, 'SubClass',
+ 'constructor.name should be correct');
+ assert_equals(sc.highWaterMark, 77,
+ 'highWaterMark should come from the parent class');
+ assert_equals(sc.size(), 2,
+ 'size() on the subclass should override the parent');
+ assert_true(sc.subClassMethod(), 'subClassMethod() should work');
+
+}, 'subclassing CountQueuingStrategy should work correctly');
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index fe794a59a88..1f013415316 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -408,10 +408,10 @@ class Firefox(Browser):
return m.group(1)
-class Fennec(Browser):
- """Fennec-specific interface."""
+class FirefoxAndroid(Browser):
+ """Android-specific Firefox interface."""
- product = "fennec"
+ product = "firefox_android"
requirements = "requirements_firefox.txt"
def install(self, dest=None, channel=None):
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
index 4693bb7f11f..6acc5b8e740 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -251,9 +251,9 @@ Consider installing certutil via your OS package manager or directly.""")
kwargs["extra_prefs"].append("media.navigator.streams.fake=true")
-class Fennec(BrowserSetup):
- name = "fennec"
- browser_cls = browser.Fennec
+class FirefoxAndroid(BrowserSetup):
+ name = "firefox_android"
+ browser_cls = browser.FirefoxAndroid
def setup_kwargs(self, kwargs):
pass
@@ -510,8 +510,8 @@ class Epiphany(BrowserSetup):
product_setup = {
- "fennec": Fennec,
"firefox": Firefox,
+ "firefox_android": FirefoxAndroid,
"chrome": Chrome,
"chrome_android": ChromeAndroid,
"chrome_ios": ChromeiOS,
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
index 8698e816305..18434e499dc 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -28,8 +28,8 @@ product_list = ["chrome",
"edgechromium",
"edge",
"edge_webdriver",
- "fennec",
"firefox",
+ "firefox_android",
"ie",
"safari",
"sauce",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/fennec.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index b1f535a8540..d8d5c7f7284 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/fennec.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -20,9 +20,9 @@ from .firefox import (get_timeout_multiplier, # noqa: F401
FirefoxBrowser) # noqa: F401
-__wptrunner__ = {"product": "fennec",
+__wptrunner__ = {"product": "firefox_android",
"check_args": "check_args",
- "browser": "FennecBrowser",
+ "browser": "FirefoxAndroidBrowser",
"executor": {"testharness": "MarionetteTestharnessExecutor",
"reftest": "MarionetteRefTestExecutor"},
"browser_kwargs": "browser_kwargs",
@@ -100,31 +100,19 @@ def write_hosts_file(config, device):
os.remove(hosts_path)
-class FennecBrowser(FirefoxBrowser):
+class FirefoxAndroidBrowser(FirefoxBrowser):
init_timeout = 300
shutdown_timeout = 60
- def __init__(self, logger, prefs_root, test_type, package_name=None,
+ def __init__(self, logger, prefs_root, test_type, package_name="org.mozilla.geckoview.test",
device_serial="emulator-5444", **kwargs):
FirefoxBrowser.__init__(self, logger, None, prefs_root, test_type, **kwargs)
- self._package_name = package_name
+ self.package_name = package_name
self.device_serial = device_serial
self.tests_root = kwargs["tests_root"]
self.install_fonts = kwargs["install_fonts"]
self.stackwalk_binary = kwargs["stackwalk_binary"]
- @property
- def package_name(self):
- """
- Name of app to run on emulator.
- """
- if self._package_name is None:
- self._package_name = "org.mozilla.fennec"
- user = os.getenv("USER")
- if user:
- self._package_name += "_" + user
- return self._package_name
-
def start(self, **kwargs):
if self.marionette_port is None:
self.marionette_port = get_free_port()
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
new file mode 100644
index 00000000000..73bbb4f8ab5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>NDEFMessage constructor</title>
+<link rel="help" href="https://w3c.github.io/web-nfc/#dom-ndefmessage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<script>
+
+ test(() => {
+ assert_equals(NDEFMessage.length, 1);
+ assert_throws(new TypeError, () => new NDEFMessage());
+ }, 'NDEFMessage constructor without init dict');
+
+ test(() => {
+ const message = new NDEFMessage(null);
+ assert_equals(message.url.length, 0, 'empty url');
+ assert_equals(message.records.length, 0, 'empty records');
+ }, 'NDEFMessage constructor with null init dict');
+
+ test(() => {
+ const message = new NDEFMessage(
+ createMessage([createTextRecord(test_text_data)]));
+ assert_equals(message.records.length, 1, 'one text record');
+ assert_equals(message.records[0].recordType, 'text', 'messageType');
+ assert_equals(message.records[0].mediaType, 'text/plain', 'mediaType');
+ assert_true(typeof message.records[0].data() === 'string');
+ assert_equals(message.records[0].data(), test_text_data,
+ 'data() contains the same text content');
+ }, 'NDEFMessage constructor with a text record');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
new file mode 100644
index 00000000000..81148856473
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<title>NDEFRecord constructor</title>
+<link rel="help" href="https://w3c.github.io/web-nfc/#dom-ndefrecord">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<script>
+
+ test(() => {
+ assert_equals(NDEFRecord.length, 1);
+ assert_throws(new TypeError, () => new NDEFRecord());
+ }, 'NDEFRecord constructor without init dict');
+
+ test(() => {
+ const record = new NDEFRecord(null);
+ assert_equals(record.recordType.length, 0, 'empty recordType');
+ assert_equals(record.mediaType.length, 0, 'empty mediaType');
+ assert_equals(record.data(), null, 'null data');
+ }, 'NDEFRecord constructor with null init dict');
+
+ test(() => {
+ let buffer = new ArrayBuffer(4);
+ let buffer_view = new Uint8Array(buffer);
+ let original_data = new Uint8Array([1, 2, 3, 4]);
+ buffer_view.set(original_data);
+ const record = new NDEFRecord(createOpaqueRecord(buffer));
+ assert_equals(record.recordType, 'opaque', 'recordType');
+ assert_equals(record.mediaType, 'application/octet-stream', 'mediaType');
+
+ const data_1 = record.data();
+ assert_true(data_1 instanceof ArrayBuffer);
+ assert_not_equals(data_1, buffer, 'data() returns a new object');
+ assert_array_equals(new Uint8Array(data_1), original_data,
+ 'data() has the same content with the original buffer');
+
+ const data_2 = record.data();
+ assert_true(data_2 instanceof ArrayBuffer);
+ assert_not_equals(data_2, data_1, 'data() again returns another new object');
+ assert_array_equals(new Uint8Array(data_2), original_data,
+ 'data() has the same content with the original buffer');
+
+ buffer_view.set([4, 3, 2, 1]);
+ const data_3 = record.data();
+ assert_true(data_3 instanceof ArrayBuffer);
+ assert_array_equals(new Uint8Array(data_1), original_data,
+ 'Modifying the original buffer does not affect data() content');
+ assert_array_equals(new Uint8Array(data_2), original_data,
+ 'Modifying the original buffer does not affect data() content');
+ assert_array_equals(new Uint8Array(data_3), original_data,
+ 'Modifying the original buffer does not affect data() content');
+ }, 'NDEFRecord constructor with opaque data');
+
+ test(() => {
+ const record = new NDEFRecord(createJsonRecord(test_json_data));
+ assert_equals(record.recordType, 'json', 'recordType');
+ assert_equals(record.mediaType, 'application/json', 'mediaType');
+
+ const data_1 = record.data();
+ assert_true(typeof data_1 === 'object');
+ assert_not_equals(data_1, test_json_data, 'data() returns a new object');
+ assert_object_equals(data_1, test_json_data,
+ 'data() has the same content with the original dictionary');
+
+ const data_2 = record.data();
+ assert_true(typeof data_2 === 'object');
+ assert_not_equals(data_2, data_1, 'data() again returns another new object');
+ assert_object_equals(data_2, test_json_data,
+ 'data() has the same content with the original dictionary');
+ }, 'NDEFRecord constructor with json data');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/NFCReadingEvent_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NFCReadingEvent_constructor.https.html
index 3c4242943d6..172b0a619c2 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NFCReadingEvent_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NFCReadingEvent_constructor.https.html
@@ -13,10 +13,28 @@
test(() => {
const message = createMessage([createJsonRecord(test_json_data)]);
+ const event = new NFCReadingEvent('type', {serialNumber: null, message: message});
+ assert_equals(event.serialNumber, '', 'serialNumber');
+ }, 'NFCReadingEvent constructor with null serialNumber');
+
+ test(() => {
+ const message = createMessage([createJsonRecord(test_json_data)]);
+ const event = new NFCReadingEvent('type', {message: message});
+ assert_equals(event.serialNumber, '', 'serialNumber');
+ }, 'NFCReadingEvent constructor with serialNumber not present');
+
+ test(() => {
+ const event = new NFCReadingEvent('type', {serialNumber: '', message: null});
+ assert_equals(0, event.message.records.length, 'no records');
+ assert_equals(0, event.message.url.length, 'empty url');
+ }, 'NFCReadingEvent constructor with null message');
+
+ test(() => {
+ const message = createMessage([createJsonRecord(test_json_data)]);
const event = new NFCReadingEvent('type', {serialNumber: '', message: message});
assert_equals(event.type, 'type', 'type');
assert_equals(event.serialNumber, '', 'serialNumber');
- assertWebNDEFMessagesEqual(event.message, message, 'message');
+ assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message), 'message');
}, 'NFCReadingEvent constructor with valid parameters');
</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js b/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js
index 812d0f07118..67fd5af381c 100644
--- a/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js
+++ b/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js
@@ -6,6 +6,7 @@ const test_number_data = 42;
const test_json_data = {level: 1, score: 100, label: 'Game'};
const test_url_data = "https://w3c.github.io/web-nfc";
const test_buffer_data = new ArrayBuffer(test_text_byte_array.length);
+const test_buffer_view = new Uint8Array(test_buffer_data).set(test_text_byte_array);
function noop() {};
@@ -55,14 +56,14 @@ function assertWebNDEFMessagesEqual(a, b) {
let recordB = b.records[i];
assert_equals(recordA.recordType, recordB.recordType);
assert_equals(recordA.mediaType, recordB.mediaType);
- if (recordA.data instanceof ArrayBuffer) {
- assert_array_equals(new Uint8Array(recordA.data),
- new Uint8Array(recordB.data));
- } else if (typeof recordA.data === 'object') {
- assert_object_equals(recordA.data, recordB.data);
- } else if (typeof recordA.data === 'number'
- || typeof recordA.data === 'string') {
- assert_true(recordA.data == recordB.data);
+ if (recordA.data() instanceof ArrayBuffer) {
+ assert_array_equals(new Uint8Array(recordA.data()),
+ new Uint8Array(recordB.data()));
+ } else if (typeof recordA.data() === 'object') {
+ assert_object_equals(recordA.data(), recordB.data());
+ } else if (typeof recordA.data() === 'number'
+ || typeof recordA.data() === 'string') {
+ assert_true(recordA.data() == recordB.data());
}
}
}
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/pointer_contextmenu.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/pointer_contextmenu.py
index c64c51252a5..fda3f18bbc1 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/pointer_contextmenu.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/pointer_contextmenu.py
@@ -18,7 +18,7 @@ def test_control_click(session, test_actions_page, key_chain, mouse_chain, modif
outer = session.find.css("#outer", all=False)
mouse_chain.click(element=outer)
session.actions.perform([key_chain.dict, mouse_chain.dict])
- if os == "windows":
+ if os != "mac":
expected = [
{"type": "mousemove"},
{"type": "mousedown"},
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html
index c2c4e8e3717..a42086a3733 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html
@@ -172,14 +172,14 @@
- All RTCOutboundRTPStreamStats objects corresponding to selector.
- All stats objects referenced directly or indirectly by the RTCOutboundRTPStreamStats
objects added.
- */
+ */
promise_test(async t => {
const pc = createPeerConnectionWithCleanup(t);
const pc2 = createPeerConnectionWithCleanup(t);
let [track, mediaStream] = await getTrackFromUserMedia('audio');
pc.addTrack(track, mediaStream);
- exchangeIceCandidates(pc, pc2);
+ coupleIceCandidates(pc, pc2);
await doSignalingHandshake(pc, pc2);
await listenToIceConnected(pc);
const stats = await pc.getStats(track);
@@ -202,11 +202,16 @@
let [track, mediaStream] = await getTrackFromUserMedia('audio');
pc.addTrack(track, mediaStream);
- exchangeIceCandidates(pc, pc2);
+ coupleIceCandidates(pc, pc2);
await doSignalingHandshake(pc, pc2);
- await new Promise(resolve => {
- pc2.getReceivers()[0].track.addEventListener('unmute', resolve);
- });
+ // Wait for unmute if the track is not already unmuted.
+ // According to spec, it should be muted when being created, but this
+ // is not what this test is testing, so allow it to be unmuted.
+ if (pc2.getReceivers()[0].track.muted) {
+ await new Promise(resolve => {
+ pc2.getReceivers()[0].track.addEventListener('unmute', resolve);
+ });
+ }
const stats = await pc2.getStats(track);
validateStatsReport(stats);
assert_stats_report_has_stats(stats, ['inbound-rtp']);
@@ -335,7 +340,7 @@
}));
- exchangeIceCandidates(pc1, pc2);
+ coupleIceCandidates(pc1, pc2);
doSignalingHandshake(pc1, pc2);
}))
.catch(t.step_func(err => {
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
index cae62b24b6c..2315c12f6c8 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
@@ -7,9 +7,6 @@
<script>
'use strict';
- // Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
-
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_similar()
// generateAudioReceiveOnlyOffer
@@ -162,27 +159,77 @@
});
}, 'setRemoteDescription(offer) with invalid SDP should reject with RTCError');
- /*
- 4.3.1.6. Set the RTCSessionSessionDescription
- 2.1.3. If the description's type is invalid for the current signaling state of
- connection, then reject p with a newly created InvalidStateError and abort
- these steps.
-
- [JSEP]
- 5.6. If the type is "offer", the PeerConnection state MUST be either "stable" or
- "have-remote-offer".
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- t.add_cleanup(() => pc.close());
- return pc.createOffer()
- .then(offer => {
- return pc.setLocalDescription(offer)
- .then(() => {
- return promise_rejects(t, 'InvalidStateError',
- pc.setRemoteDescription(offer));
- });
- });
- }, 'setRemoteDescription(offer) from have-local-offer state should reject with InvalidStateError');
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ await pc1.setLocalDescription(await pc1.createOffer());
+ await pc1.setRemoteDescription(await pc2.createOffer());
+ assert_equals(pc1.signalingState, 'have-remote-offer');
+ }, 'setRemoteDescription(offer) from have-local-offer should roll back and succeed');
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ await pc1.setLocalDescription(await pc1.createOffer());
+ const p = pc1.setRemoteDescription(await pc2.createOffer());
+ await new Promise(r => pc1.onsignalingstatechange = r);
+ assert_equals(pc1.signalingState, 'stable');
+ assert_equals(pc1.pendingLocalDescription, null);
+ assert_equals(pc1.pendingRemoteDescription, null);
+ await new Promise(r => pc1.onsignalingstatechange = r);
+ assert_equals(pc1.signalingState, 'have-remote-offer');
+ assert_equals(pc1.pendingLocalDescription, null);
+ assert_equals(pc1.pendingRemoteDescription.type, 'answer');
+ await p;
+ }, 'setRemoteDescription(offer) from have-local-offer fires signalingstatechange twice');
+
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ await pc1.setLocalDescription(await pc1.createOffer());
+ const offer = await pc2.createOffer();
+ const p1 = pc1.setLocalDescription({type: 'rollback'});
+ await new Promise(r => pc1.onsignalingstatechange = r);
+ assert_equals(pc1.signalingState, 'stable');
+ const p2 = pc1.addIceCandidate();
+ const p3 = pc1.setRemoteDescription(offer);
+ await promise_rejects(t, 'InvalidStateError', p2);
+ await p1;
+ await p3;
+ assert_equals(pc1.signalingState, 'have-remote-offer');
+ }, 'Naive rollback approach is not glare-proof (control)');
+
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ await pc1.setLocalDescription(await pc1.createOffer());
+ const p = pc1.setRemoteDescription(await pc2.createOffer());
+ await new Promise(r => pc1.onsignalingstatechange = r);
+ assert_equals(pc1.signalingState, 'stable');
+ await pc1.addIceCandidate();
+ await p;
+ assert_equals(pc1.signalingState, 'have-remote-offer');
+ }, 'setRemoteDescription(offer) from have-local-offer is glare-proof');
+
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ await pc1.setLocalDescription(await pc1.createOffer());
+ const p = pc1.setRemoteDescription({type: 'offer', sdp: 'Invalid SDP'});
+ await new Promise(r => pc1.onsignalingstatechange = r);
+ assert_equals(pc1.signalingState, 'stable');
+ assert_equals(pc1.pendingLocalDescription, null);
+ assert_equals(pc1.pendingRemoteDescription, null);
+ await promise_rejects(t, 'RTCError', p);
+ }, 'setRemoteDescription(invalidOffer) from have-local-offer does not undo rollback');
</script>
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
index 36524211d01..24b5274bc23 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
@@ -6,19 +6,107 @@
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
- assert_approx_equals(p1.x, p2.x, epsilon, prefix + "xs must match");
- assert_approx_equals(p1.y, p2.y, epsilon, prefix + "ys must match");
- assert_approx_equals(p1.z, p2.z, epsilon, prefix + "zs must match");
- assert_approx_equals(p1.w, p2.w, epsilon, prefix + "ws must match");
+ if (p1 == null && p2 == null) {
+ return;
+ }
+
+ assert_not_equals(p1, null, prefix + "p1 must be non-null");
+ assert_not_equals(p2, null, prefix + "p2 must be non-null");
+
+ let mismatched_component = null;
+ for (const v of ['x', 'y', 'z', 'w']) {
+ if (Math.abs(p1[v] - p2[v]) > epsilon) {
+ mismatched_component = v;
+ break;
+ }
+ }
+
+ if (mismatched_component !== null) {
+ let error_message = prefix + ' Point comparison failed.\n';
+ error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`;
+ error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`;
+ error_message += ` Difference in component ${mismatched_component} exceeded the given epsilon.\n`;
+ assert_approx_equals(p2[mismatched_component], p1[mismatched_component], epsilon, error_message);
+ }
};
// |m1|, |m2| - arrays of floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
- assert_equals(m1.length, m2.length, prefix + "Matrix lengths should match");
- for(var i = 0; i < m1.length; ++i) {
- assert_approx_equals(m1[i], m2[i], epsilon, prefix + "Component number " + i + " should match");
+ if (m1 == null && m2 == null) {
+ return;
+ }
+
+ assert_not_equals(m1, null, prefix + "m1 must be non-null");
+ assert_not_equals(m2, null, prefix + "m2 must be non-null");
+
+ assert_equals(m1.length, 16, prefix + "m1 must have length of 16");
+ assert_equals(m2.length, 16, prefix + "m2 must have length of 16");
+
+ let mismatched_element = -1;
+ for (let i = 0; i < 16; ++i) {
+ if (Math.abs(m1[i] - m2[i]) > epsilon) {
+ mismatched_element = i;
+ break;
+ }
+ }
+
+ if (mismatched_element > -1) {
+ let error_message = prefix + 'Matrix comparison failed.\n';
+ error_message += ' Difference in element ' + mismatched_element +
+ ' exceeded the given epsilon.\n';
+
+ error_message += ' Matrix 1: [' + m1.join(',') + ']\n';
+ error_message += ' Matrix 2: [' + m2.join(',') + ']\n';
+
+ assert_approx_equals(
+ m1[mismatched_element], m2[mismatched_element], epsilon,
+ error_message);
+ }
+}
+
+
+// |m1|, |m2| - arrays of floating point numbers
+// |epsilon| - float specifying precision
+// |prefix| - string used as a prefix for logging
+let assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
+ if (m1 == null && m2 == null) {
+ return;
+ }
+
+ assert_not_equals(m1, null, prefix + "m1 must be non-null");
+ assert_not_equals(m2, null, prefix + "m2 must be non-null");
+
+ assert_equals(m1.length, 16, prefix + "m1 must have length of 16");
+ assert_equals(m2.length, 16, prefix + "m2 must have length of 16");
+
+ let mismatch = false;
+ for (let i = 0; i < 16; ++i) {
+ if (Math.abs(m1[i] - m2[i]) > epsilon) {
+ mismatch = true;
+ break;
+ }
+ }
+
+ if (!mismatch) {
+ let m1_str = '[';
+ let m2_str = '[';
+ for (let i = 0; i < 16; ++i) {
+ m1_str += m1[i] + (i < 15 ? ', ' : '');
+ m2_str += m2[i] + (i < 15 ? ', ' : '');
+ }
+ m1_str += ']';
+ m2_str += ']';
+
+ let error_message = prefix + 'Matrix comparison failed.\n';
+ error_message +=
+ ' No element exceeded the given epsilon ' + epsilon + '.\n';
+
+ error_message += ' Matrix A: ' + m1_str + '\n';
+ error_message += ' Matrix B: ' + m2_str + '\n';
+
+ assert_unreached(error_message);
}
}
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 baf1d66b00d..d75e5c7bd2e 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
@@ -28,14 +28,18 @@ function xr_session_promise_test(
name, func, fakeDeviceInit, sessionMode, sessionInit, properties) {
let testDeviceController;
let testSession;
+ let sessionObjects = {};
const webglCanvas = document.getElementsByTagName('canvas')[0];
+ // We can't use assert_true here because it causes the wpt testharness to treat
+ // this as a test page and not as a test.
if (!webglCanvas) {
promise_test(async (t) => {
Promise.reject('xr_session_promise_test requires a canvas on the page!');
}, name, properties);
}
let gl = webglCanvas.getContext('webgl', {alpha: false, antialias: false});
+ sessionObjects.gl = gl;
xr_promise_test(
name,
@@ -75,7 +79,8 @@ function xr_session_promise_test(
session.updateRenderState({
baseLayer: glLayer
});
- resolve(func(session, testDeviceController, t));
+ sessionObjects.glLayer = glLayer;
+ resolve(func(session, testDeviceController, t, sessionObjects));
})
.catch((err) => {
reject(
diff --git a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_framebuffer.https.html b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_framebuffer.https.html
index 7c4ff17c254..ba6b7dc0b92 100644
--- a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_framebuffer.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_framebuffer.https.html
@@ -20,26 +20,37 @@ let testFunction = function(session, fakeDeviceController, t) {
let gl = layer.context;
// The layer's framebuffer is a WebGL framebuffer
- assert_not_equals(layer.framebuffer, null);
- assert_true(layer.framebuffer instanceof WebGLFramebuffer);
+ t.step(() => {
+ assert_not_equals(layer.framebuffer, null);
+ assert_true(layer.framebuffer instanceof WebGLFramebuffer);
- // The XR framebuffer is not bound to the GL context by default.
- assert_not_equals(layer.framebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING));
+ // The XR framebuffer is not bound to the GL context by default.
+ assert_not_equals(layer.framebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING));
+ });
// The XR framebuffer can be bound to the GL context.
gl.bindFramebuffer(gl.FRAMEBUFFER, layer.framebuffer);
- assert_equals(layer.framebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING));
+
+ t.step(() => {
+ assert_equals(layer.framebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING));
+ });
// The XR framebuffer has a 2D texture
let attachment = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE);
- assert_equals(attachment, gl.TEXTURE);
+
+ t.step(() => {
+ assert_equals(attachment, gl.TEXTURE);
+ });
// Check that each viewport fits inside the framebuffer dimensions
let viewer_pose = xrFrame.getViewerPose(space);
for (view of viewer_pose.views) {
let viewport = layer.getViewport(view);
- assert_less_than_equal(viewport.x + viewport.width, layer.framebufferWidth);
- assert_less_than_equal(viewport.y + viewport.height, layer.framebufferHeight);
+
+ t.step(() => {
+ assert_less_than_equal(viewport.x + viewport.width, layer.framebufferWidth);
+ assert_less_than_equal(viewport.y + viewport.height, layer.framebufferHeight);
+ });
}
// Finished test.
diff --git a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html
index 8cfccff3c01..94a23dcdb42 100644
--- a/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html
@@ -22,18 +22,18 @@ let testFunction = function(session, fakeDeviceController, t) {
let layer = xrFrame.session.renderState.baseLayer;
for (view of viewer_pose.views) {
let viewport = layer.getViewport(view);
- let index = (view.eye === "right"? 1: 0);
- let params = fakeDeviceInitParams.views[index];
- // Ensure the returned object is an XRViewport object
- assert_not_equals(viewport, null);
- assert_true(viewport instanceof XRViewport);
+ t.step(() => {
+ // Ensure the returned object is an XRViewport object
+ assert_not_equals(viewport, null);
+ assert_true(viewport instanceof XRViewport);
- // Ensure the viewport dimensions are valid
- assert_greater_than_equal(viewport.x, 0);
- assert_greater_than_equal(viewport.y, 0);
- assert_equals(viewport.width, params.resolution.width);
- assert_equals(viewport.height, params.resolution.height);
+ // Ensure the viewport dimensions are valid
+ assert_greater_than_equal(viewport.x, 0);
+ assert_greater_than_equal(viewport.y, 0);
+ assert_greater_than_equal(viewport.width, 1);
+ assert_greater_than_equal(viewport.height, 1);
+ });
// Ensure none of the viewports overlap
for (other of viewer_pose.views) {
@@ -43,7 +43,10 @@ let testFunction = function(session, fakeDeviceController, t) {
(otherport.x + otherport.width <= viewport.x) ||
(viewport.y + viewport.height <= otherport.y) ||
(otherport.y + otherport.height <= viewport.y);
- assert_true(no_overlap, "Overlap between viewport " + view.eye + " and " + other.eye);
+
+ t.step(() => {
+ assert_true(no_overlap, "Overlap between viewport " + view.eye + " and " + other.eye);
+ });
}
}
}
diff --git a/tests/wpt/web-platform-tests/xhr/getallresponseheaders.htm b/tests/wpt/web-platform-tests/xhr/getallresponseheaders.htm
index 72e27a5947c..759d6b68a1f 100644
--- a/tests/wpt/web-platform-tests/xhr/getallresponseheaders.htm
+++ b/tests/wpt/web-platform-tests/xhr/getallresponseheaders.htm
@@ -7,7 +7,7 @@
async_test((t) => {
const client = new XMLHttpRequest()
client.onload = t.step_func_done(() => {
- assert_equals(client.getAllResponseHeaders(), "also-here: Mr. PB\r\newok: lego\r\nfoo-test: 1, 2\r\n")
+ assert_equals(client.getAllResponseHeaders(), "also-here: Mr. PB\r\newok: lego\r\nfoo-test: 1, 2\r\n__custom: token\r\n")
})
client.onerror = t.unreached_func("unexpected error")
client.open("GET", "resources/headers.asis")
diff --git a/tests/wpt/web-platform-tests/xhr/resources/headers.asis b/tests/wpt/web-platform-tests/xhr/resources/headers.asis
index d25fe52efeb..69273ac87fe 100644
--- a/tests/wpt/web-platform-tests/xhr/resources/headers.asis
+++ b/tests/wpt/web-platform-tests/xhr/resources/headers.asis
@@ -1,5 +1,6 @@
HTTP/1.1 200 YAYAYAYA
foo-TEST: 1
FOO-test: 2
+__Custom: token
ALSO-here: Mr. PB
ewok: lego