Skip to content

script: implement render-blocking option for script fetch and load events#43741

Open
elomscansio wants to merge 18 commits intoservo:mainfrom
elomscansio:delaying_the_load_event
Open

script: implement render-blocking option for script fetch and load events#43741
elomscansio wants to merge 18 commits intoservo:mainfrom
elomscansio:delaying_the_load_event

Conversation

@elomscansio
Copy link
Copy Markdown
Contributor

@elomscansio elomscansio commented Mar 29, 2026

Implement render-blocking option for script fetch and load events

Testing:

Test summary on main branch

  ▶ OK [expected CRASH] /html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-createHTMLDocument-success-external-module.html

Ran 470 tests finished in 217.9 seconds.
  • 453 ran as expected.
  • 4 tests crashed unexpectedly
  • 1 tests timed out unexpectedly
  • 11 tests unexpectedly okay
  • 2 tests had unexpected subtest results

/home/elomscansio/.local/share/uv/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/multiprocessing/resource_tracker.py:254: UserWarning: resource_tracker: There appear to be 3 leaked semaphore objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '

Test summary for this commits

Ran 470 tests finished in 488.0 seconds.
  • 397 ran as expected.
  • 15 tests crashed unexpectedly
  • 27 tests timed out unexpectedly
  • 11 tests unexpectedly okay
  • 28 tests had unexpected subtest results

Fixes: #43697
Fixes: #43354

@elomscansio elomscansio requested a review from gterzian as a code owner March 29, 2026 01:03
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Mar 29, 2026
@elomscansio
Copy link
Copy Markdown
Contributor Author

@elomscansio
Copy link
Copy Markdown
Contributor Author

@jdm
Should

// This does not delay the load event anymore.
be of concern

@TimvdLippe TimvdLippe added the T-linux-wpt Do a try run of the WPT label Mar 29, 2026
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Mar 29, 2026
@github-actions
Copy link
Copy Markdown

🔨 Triggering try run (#23703999107) for Linux (WPT)

@github-actions
Copy link
Copy Markdown

Test results for linux-wpt from try job (#23703999107):

Flaky unexpected result (39)
  • OK /_mozilla/css/offset_properties_inline.html (#40543)
    • FAIL [expected PASS] subtest: offsetTop

      assert_equals: offsetTop of #inline-1 should be 0. expected 0 but got -1
      

    • FAIL [expected PASS] subtest: offsetLeft

      assert_equals: offsetLeft of #inline-2 should be 40. expected 40 but got 25
      

  • OK /_webgl/conformance/textures/misc/texture-upload-size.html (#21770)
    • FAIL [expected PASS] subtest: WebGL test #45

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #47

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #49

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #51

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • PASS [expected FAIL] subtest: WebGL test #53
    • PASS [expected FAIL] subtest: WebGL test #55
    • PASS [expected FAIL] subtest: WebGL test #57
    • PASS [expected FAIL] subtest: WebGL test #59
    • FAIL [expected PASS] subtest: WebGL test #61

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #63

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • And 6 more unexpected results...
  • ERROR [expected CRASH] /_webgl/conformance2/textures/misc/tex-3d-size-limit.html (#42881)
    • PASS [expected FAIL] subtest: WebGL test #1
    • FAIL [expected PASS] subtest: WebGL test #3

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #4

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #5

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #6

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #7

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #8

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #9

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #10

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #11

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : texImage3D should fail for dimension out of range. expected true got false
      

    • And 27 more unexpected results...
  • CRASH [expected OK] /content-security-policy/meta/sandbox-iframe.html (#43478)
  • FAIL [expected PASS] /css/css-backgrounds/background-size-041.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-015.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-fixed.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-relative.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html
  • ERROR [expected TIMEOUT] /html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html (#40387)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/009.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url with document.write and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.html (#29049)
    • PASS [expected FAIL] subtest: Same-origin navigation started from unload handler must be ignored
  • OK /html/browsers/browsing-the-web/navigating-across-documents/refresh/same-document-refresh.html (#34597)
    • FAIL [expected PASS] subtest: Same-Document Referrer from Refresh

      assert_equals: original page loads expected "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section" but got "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section#section"
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html (#28697)
    • FAIL [expected PASS] subtest: aElement.click() before the load event must NOT replace

      assert_equals: expected "http://web-platform.test:8000/common/blank.html?thereplacement" but got "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/code-injector.html?pipe=sub(none)&code=%0A%20%20%20%20const%20a%20%3D%20document.createElement(%22a%22)%3B%0A%20%20%20%20a.href%20%3D%20%22%2Fcommon%2Fblank.html%3Fthereplacement%22%3B%0A%20%20%20%20document.currentScript.before(a)%3B%0A%20%20%20%20a.click()%3B%0A%20%20"
      

  • CRASH [expected OK] /html/browsers/history/the-history-interface/004.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/csp-sandbox-yes.https.html
  • OK /html/browsers/windows/embedded-opener-remove-frame.html (#23867)
    • FAIL [expected PASS] subtest: opener of discarded auxiliary browsing context

      assert_object_equals: property "get" expected function "function opener() {
          [native code]
      }" got function "function opener() {
          [native code]
      }"
      

  • OK /html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html (#39694)
    • PASS [expected FAIL] subtest: Meta refresh is blocked by the allow-scripts sandbox flag at its creation time, not when refresh comes due
  • OK /html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-2.html (#39703)
    • FAIL [expected PASS] subtest: Meta refresh of the original iframe is not blocked if moved into a sandboxed iframe

      uncaught exception: Error: assert_unreached: The iframe into which the meta was moved must not refresh Reached unreachable code
      

  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-type-only.html
  • OK [expected TIMEOUT] /html/semantics/embedded-content/media-elements/src_object_blob.html (#40340)
    • PASS [expected TIMEOUT] subtest: HTMLMediaElement.srcObject blob
  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_other_frame_popup.sub.html (#39702)
    • TIMEOUT [expected FAIL] subtest: Sandboxed iframe can not navigate other frame's popup

      Test timed out
      

  • OK /html/semantics/forms/form-submission-0/jsurl-form-submit.tentative.html (#36489)
    • PASS [expected FAIL] subtest: Verifies that form submissions scheduled inside javascript: urls take precedence over the javascript: url's return value.
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/input-untrusted-key-event.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/show-picker-user-gesture.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/charset-03.html
  • OK /html/semantics/scripting-1/the-script-element/module/credentials.sub.html
    • FAIL [expected PASS] subtest: Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute

      assert_equals: Descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin expected (string) "found" but got (undefined) undefined
      

  • TIMEOUT [expected OK] /html/user-activation/navigation-state-reset-sameorigin.html
    • TIMEOUT [expected PASS] subtest: Post-navigation state reset.

      Test timed out
      

  • FAIL [expected PASS] /png/apng/fcTL-dispose-before-region-background.html
  • FAIL [expected PASS] /png/apng/fcTL-dispose-in-region-previous.html (#41410)
  • FAIL [expected PASS] /png/apng/fcTL-dispose-previous.html (#41561)
  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
    • PASS [expected TIMEOUT] subtest: Navigate a frame via anchor with javascript:-urls w/ default policy in report-only mode.
    • FAIL [expected NOTRUN] subtest: Navigate a window via anchor with javascript:-urls w/ a default policy throwing an exception in enforcing mode.

      promise_test: Unhandled rejection with value: "Unexpected message received: \"No securitypolicyviolation reported!\""
      

    • FAIL [expected NOTRUN] subtest: Navigate a window via anchor with javascript:-urls w/ a default policy throwing an exception in report-only mode.

      promise_test: Unhandled rejection with value: "Unexpected message received: \"No securitypolicyviolation reported!\""
      

  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?26-30 (#38807)
    • PASS [expected TIMEOUT] subtest: Navigate a window via form-submission with javascript:-urls in report-only mode.
    • PASS [expected NOTRUN] subtest: Navigate a window via form-submission with javascript:-urls w/ default policy in report-only mode.
    • PASS [expected NOTRUN] subtest: Navigate a frame via form-submission with javascript:-urls in enforcing mode.
    • PASS [expected NOTRUN] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in enforcing mode.
  • TIMEOUT /trusted-types/trusted-types-navigation.html?31-35 (#38034)
    • TIMEOUT [expected PASS] subtest: Navigate a frame via form-submission with javascript:-urls in report-only mode.

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in report-only mode.
  • OK /wasm/webapi/abort.any.worker.html (#40013)
    • FAIL [expected PASS] subtest: compileStreaming() asynchronously racing with abort should succeed or reject with AbortError

      assert_equals: expected "AbortError" but got "CompileError"
      

  • OK /webdriver/tests/classic/execute_async_script/objects.py
    • FAIL [expected PASS] subtest: test_object

      AssertionError: no such window (404): No such window
      

  • OK /webdriver/tests/classic/execute_script/collections.py
    • FAIL [expected PASS] subtest: test_arguments

      AssertionError: no such window (404): No such window
      

  • OK /webdriver/tests/classic/get_current_url/iframe.py
    • FAIL [expected PASS] subtest: test_iframe

      webdriver.error.NoSuchWindowException: no such window (404): No such window
      

  • CRASH [expected ERROR] /workers/Worker-constructor-proto.any.serviceworker.html
Stable unexpected results that are known to be intermittent (21)
  • TIMEOUT /FileAPI/url/url-in-tags-revoke.window.html (#19978)
    • PASS [expected TIMEOUT] subtest: Fetching a blob URL immediately before revoking it works in <script> tags.
  • FAIL [expected PASS] /_mozilla/mozilla/sslfail.html (#10760)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • CRASH [expected ERROR] /_webgl/conformance2/misc/uninitialized-test-2.html (#41656)
  • OK /css/css-fonts/generic-family-keywords-003.html (#38994)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted sans-serif (drawing text in a canvas)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted cursive (drawing text in a canvas)

      assert_equals: quoted cursive matches  @font-face rule expected 125 but got 40
      

    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted fantasy (drawing text in a canvas)

      assert_equals: quoted fantasy matches  @font-face rule expected 125 but got 40
      

    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(fangsong) (drawing text in a canvas)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(kai) (drawing text in a canvas)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(khmer-mul) (drawing text in a canvas)
  • ERROR [expected OK] /fetch/fetch-later/quota/same-origin-iframe/accumulated-oversized-payload.https.window.html (#41705)
  • OK /fetch/metadata/generated/element-iframe.https.sub.html (#40341)
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-site
    • PASS [expected FAIL] subtest: sec-fetch-site - Same site
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-Site -> Cross-Site
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Site -> Same-Site
  • OK /fetch/metadata/window-open.https.sub.html (#40339)
    • PASS [expected FAIL] subtest: Same-site window, forced: sec-fetch-site
    • PASS [expected FAIL] subtest: Same-site window, forced, reloaded: sec-fetch-site
    • PASS [expected FAIL] subtest: Cross-site window, forced: sec-fetch-site
    • PASS [expected FAIL] subtest: Cross-site window, forced, reloaded: sec-fetch-site
    • PASS [expected FAIL] subtest: Same-site window, user-activated: sec-fetch-site
    • PASS [expected FAIL] subtest: Cross-site window, user-activated: sec-fetch-site
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html (#29181)
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • PASS [expected TIMEOUT] subtest: Non-HTMLElement should not support autofocus
    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus should support autofocus

      assert_equals: expected Element node <div autofocus=""></div> but got Element node <body></body>
      

    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus including no focusable descendants should be skipped

      assert_equals: expected Element node <input autofocus=""></input> but got Element node <body><div autofocus=""></div><input autofocus=""></body>
      

    • FAIL [expected NOTRUN] subtest: Area element should support autofocus

      promise_test: Unhandled rejection with value: object "TypeError: can't access property "appendChild", w.document.querySelector(...) is null"
      

  • OK /html/semantics/embedded-content/media-elements/audio_loop_seek_to_eos.html (#41226)
    • PASS [expected FAIL] subtest: seeking to the end of looping audio
  • TIMEOUT [expected ERROR] /html/semantics/forms/the-input-element/click-user-gesture.html (#40512)
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/import-meta/import-meta-url.html (#40800)
  • OK /html/webappapis/dynamic-markup-insertion/document-write/iframe_005.html (#43671)
    • FAIL [expected PASS] subtest: document.write external script into iframe write back into parent

      assert_array_equals: lengths differ, expected array [1, 2, 3, 4, 5] length 5, got [1, 2] length 2
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete > Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd > Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart > Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd > Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart > Original loadEventStart
  • CRASH [expected OK] /preload/modulepreload-sri-importmap.html (#43354)
  • CRASH [expected OK] /preload/modulepreload-sri.html (#43354)
  • OK /touch-events/single-tap-when-touchend-listener-use-sync-xhr.html (#41175)
    • FAIL [expected PASS] subtest: Click event should be fired when touchend opens synchronous XHR

      assert_equals: expected "touchend@div, mousedown@div, mouseup@div, click@div" but got "touchend@div"
      

  • OK /trusted-types/trusted-types-reporting.html (#43737)
    • FAIL [expected PASS] subtest: Trusted Type violation report: sample for custom element assignment

      assert_equals: a single violation reported expected 1 but got 0
      

  • OK [expected TIMEOUT] /webmessaging/with-ports/018.html (#24485)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, javascript:
  • OK [expected TIMEOUT] /webmessaging/without-ports/018.html (#24485)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, javascript:
Stable unexpected results (206)
  • TIMEOUT [expected OK] /credential-management/otpcredential-get-basics.https.html
  • TIMEOUT [expected OK] /credential-management/otpcredential-iframe.https.html
    • TIMEOUT [expected FAIL] subtest: Test OTPCredential enabled in same origin iframes

      Test timed out
      

    • NOTRUN [expected FAIL] subtest: OTPCredential enabled in cross origin iframes with permissions policy
    • NOTRUN [expected FAIL] subtest: OTPCredential disabled in cross origin iframes without permissions policy
  • TIMEOUT [expected OK] /credential-management/otpcredential-store.https.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-001.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-002.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-003.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-004.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-005.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-006.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-007.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-008.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-009.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-010.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-011.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-012.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-013.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-014.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/orthogonal-positioned-grid-descendants-016.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-001.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-002.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-003.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-004.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-005.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-006.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-007.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-008.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-009.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-010.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-011.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-012.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-013.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-014.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-015.html
  • TIMEOUT [expected OK] /css/css-grid/abspos/positioned-grid-descendants-016.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-border-color.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-border-radius.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-border-shorthands.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-border-style.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-border-width.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-inset.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-margin.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-padding.html
  • TIMEOUT [expected OK] /css/css-logical/logical-box-size.html
  • TIMEOUT [expected OK] /css/css-logical/logical-values-float-clear.html
  • TIMEOUT [expected OK] /css/css-logical/logical-values-resize.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-absolute.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-nobox.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-static.html
  • TIMEOUT [expected OK] /css/cssom/getComputedStyle-insets-sticky.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-traversal.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-same-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-same-document-traversal.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-stop.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-cross-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-traversal-same-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-cross-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-same-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-same-document-traversal.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-nav-stop.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-nav.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-hashchange.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-same-document-traversal-pushstate.html
  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-stop.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-bad-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yes-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yes-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yes-subdomain-with-redirect.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/cross-origin-isolated.sub.https.html
    • TIMEOUT [expected FAIL] subtest: child: originAgentCluster must equal true

      Test timed out
      

  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/csp-sandbox-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/data-to-javascript-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/data-to-javascript-yes.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/data-url-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/data-url-yes.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/javascript-url-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/javascript-url-yes.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/removed-iframe.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-iframe-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-iframe-yes.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-no.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/getter-special-cases/sandboxed-same-origin-iframe-yes.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/insecure-http.sub.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-no-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-port.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-same.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/popups/opener-yes-openee-yes-subdomain.sub.https.html
  • TIMEOUT [expected OK] /html/browsers/origin/origin-keyed-agent-clusters/removing-iframes.sub.https.html
  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-html.html
  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-img.html
  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-js.html
  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-mp4.html
  • TIMEOUT [expected ERROR] /html/semantics/embedded-content/bfcache/embedded-not-found.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/cloning-steps.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/focus-dynamic-type-change-on-blur.html
  • TIMEOUT [expected ERROR] /html/semantics/forms/the-input-element/focus-dynamic-type-change.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/selection-pointer.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/show-picker-cross-origin-iframe.html
    • TIMEOUT [expected PASS] subtest: Test showPicker() called from cross-origin iframe

      Test timed out
      

    • NOTRUN [expected FAIL] subtest: Test showPicker() called from cross-origin iframe 1
    • NOTRUN [expected PASS] subtest: Test showPicker() called from cross-origin iframe 2
    • NOTRUN [expected FAIL] subtest: Test showPicker() called from cross-origin iframe 3
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/show-picker-disabled-readonly.html
  • TIMEOUT [expected OK] /html/semantics/forms/the-input-element/show-picker-does-not-focus.html
  • OK /html/semantics/scripting-1/the-script-element/import-attributes/empty-attributes-clause.html
    • FAIL [expected PASS] subtest: Test that no error occurs when an empty import attributes clause is provided.

      assert_array_equals: lengths differ, expected array ["hello", "empty-attributes-clause"] length 2, got [] length 0
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/charset-2.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/charset.html
  • OK /html/semantics/scripting-1/the-script-element/json-module/cors-crossorigin-requests.html
    • FAIL [expected PASS] subtest: Imported JSON module, cross-origin with CORS

      assert_equals: Unexpected _log value expected "imported JSON: 42" but got ""
      

    • FAIL [expected PASS] subtest: Imported JSON module, cross-origin, missing CORS ACAO header

      assert_equals: Unexpected _log value expected "error" but got ""
      

    • FAIL [expected PASS] subtest: Imported JSON module with parse error, cross-origin, with CORS

      assert_equals: Unexpected _log value expected "SyntaxError" but got ""
      

  • OK /html/semantics/scripting-1/the-script-element/json-module/credentials.sub.html
    • FAIL [expected PASS] subtest: JSON Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute

      assert_equals: Descendant JSON modules should be loaded with the credentials when the crossOrigin attribute is not specified and the target is same-origin expected (boolean) true but got (undefined) undefined
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/http-accept-header.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/integrity.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/module.html
    • NOTRUN [expected PASS] subtest: JSON modules
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/parse-error-location.tentative.html
    • TIMEOUT [expected PASS] subtest: JSON modules: parse error file location

      Test timed out
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/parse-error.html
    • TIMEOUT [expected PASS] subtest: JSON modules: parse error

      Test timed out
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/referrer-policies.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/json-module/valid-content-type.html
    • NOTRUN [expected PASS] subtest: text/json
    • NOTRUN [expected PASS] subtest: application/json
    • NOTRUN [expected PASS] subtest: text/html+json
    • NOTRUN [expected PASS] subtest: image/svg+json
    • NOTRUN [expected PASS] subtest: text/json;boundary=something
    • NOTRUN [expected PASS] subtest: text/json;foo=bar
    • NOTRUN [expected PASS] subtest: text/json;+json
    • NOTRUN [expected PASS] subtest: text/html+xml+json
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-2.html
    • NOTRUN [expected FAIL] subtest: Module script queueing a microtask then throwing an exception
  • OK /html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
    • FAIL [expected PASS] subtest: Instantiation errors in different files should be reported depending on different roots

      assert_equals: expected 4 but got 0
      

  • OK /html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
    • FAIL [expected PASS] subtest: Evaluation errors are cached in intermediate module scripts

      assert_equals: expected 5 but got 0
      

  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/compilation-error-1.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/compilation-error-2.html
  • OK /html/semantics/scripting-1/the-script-element/module/crossorigin.html
    • FAIL [expected PASS] subtest: Imported module, Blocked script download, mismatched CORS ACAO header

      assert_equals: Unexpected _log value expected "error" but got ""
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html
  • OK /html/semantics/scripting-1/the-script-element/module/error-type-2.html
    • FAIL [expected PASS] subtest: parse error has higher priority than instantiation error

      assert_equals: expected 4 but got 2
      

  • OK /html/semantics/scripting-1/the-script-element/module/error-type-3.html
    • FAIL [expected PASS] subtest: instantiation error has higher priority than evaluation error

      assert_equals: expected 5 but got 3
      

  • OK /html/semantics/scripting-1/the-script-element/module/errorhandling.html
    • FAIL [expected PASS] subtest: IFrame test: 'iframe_parseError_Dependent'

      assert_equals: Unexpected _errorReported value expected "error" but got ""
      

  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html
  • OK /html/semantics/scripting-1/the-script-element/module/fetch-error-2.html
    • FAIL [expected PASS] subtest: Test that failure to fetch dependency leads to error event on script.

      assert_array_equals: lengths differ, expected array ["script"] length 1, got [] length 0
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/imports.html
    • NOTRUN [expected PASS] subtest: Import a module that validly imports itself
    • NOTRUN [expected PASS] subtest: Import a module with a valid cyclical module dependency
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html
  • OK /html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html
    • FAIL [expected PASS] subtest: Test that loading a graph in which a module is already errored results in an error.

      assert_equals: Log length expected 4 but got 0
      

  • OK /html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html
    • FAIL [expected PASS] subtest: Test that loading a graph in which a module is already errored results an error.

      assert_equals: Log length expected 4 but got 0
      

  • OK /html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html
    • FAIL [expected PASS] subtest: Test that ambiguous star exports lead to an instantiation error and that the correct module is blamed.

      assert_array_equals: lengths differ, expected array [undefined, 1, "instantiation-error-6c", "instantiation-error-6d", "instantiation-error-6b", 2] length 6, got [] length 0
      

  • OK /html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html
    • FAIL [expected PASS] subtest: Test that ambiguous star exports lead to an instantiation error, even when discovered through a star export, and that the correct module is blamed.

      assert_array_equals: lengths differ, expected array [undefined, 1, "instantiation-error-7d", "instantiation-error-7e", "instantiation-error-7c", "instantiation-error-7f", "instantiation-error-7b", 2] length 8, got [] length 0
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/integrity.html
  • OK /html/semantics/scripting-1/the-script-element/module/late-star-export-request.html
    • FAIL [expected PASS] subtest: Test the situation where a module is instantiated without a use of its star-exports, but later on a different module requests them.

      assert_array_equals: lengths differ, expected array ["export-something", "export-something-nested", "import-something-namespace", 42, 43] length 5, got [] length 0
      

  • TIMEOUT [expected ERROR] /html/semantics/scripting-1/the-script-element/module/module-import-referrer.html
  • OK /html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html
    • FAIL [expected PASS] subtest: Test that evaluating something as classic script does not prevent it from being evaluated as module script.

      assert_array_equals: lengths differ, expected array [object "[object Window]", undefined] length 2, got [object "[object Window]"] length 1
      

  • OK /html/semantics/scripting-1/the-script-element/module/nested-imports.html
    • FAIL [expected PASS] subtest: should load all modules successfully

      assert_equals: expected 2 but got 0
      

  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-policy-for-descendants.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-strict-policies.sub.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html
  • CRASH [expected OK] /html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html
  • TIMEOUT [expected OK] /html/semantics/scripting-1/the-script-element/module/slow-cycle.html
  • OK /html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html
    • FAIL [expected PASS] subtest: An asynchronously loaded classic script with noModule set to false must run

      assert_true: expected true got false
      

  • OK /html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html
    • FAIL [expected PASS] subtest: An external module script with nomodule content attribute must run

      assert_equals: expected "object" but got "undefined"
      

  • TIMEOUT [expected OK] /html/webappapis/dynamic-markup-insertion/document-write/module-static-import-delayed.html
    • TIMEOUT [expected FAIL] subtest: document.write in an imported module

      Test timed out
      

  • OK /html/webappapis/dynamic-markup-insertion/document-write/module-static-import.html
    • FAIL [expected PASS] subtest: document.write in an imported module

      assert_true: onload must be called expected true got false
      

  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?data-url-prefix.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?empty-import-map.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?empty-scopes.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?overlapping-entries.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?packages-via-trailing-slashes.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?resolving-null.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?scopes-exact-vs-prefix.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?scopes.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?tricky-specifiers.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?url-specifiers-schemes.json
  • TIMEOUT [expected OK] /import-maps/data-driven/resolving.html?url-specifiers.json
  • TIMEOUT [expected OK] /import-maps/multiple-import-maps/resolution-consistency-in-module-tree-inline.html
  • TIMEOUT [expected OK] /import-maps/multiple-import-maps/resolution-consistency-in-module-tree.html
  • TIMEOUT [expected OK] /import-maps/not-overridden/external-script-bare-descendent.html
  • TIMEOUT [expected OK] /import-maps/not-overridden/external-script-descendent-with-scope.html
    • TIMEOUT [expected PASS] subtest: Testing descendent resolution with scopes

      Test timed out
      

  • TIMEOUT [expected OK] /import-maps/not-overridden/external-script-descendent.html
  • TIMEOUT [expected OK] /import-maps/not-overridden/integrity.html
  • TIMEOUT [expected OK] /import-maps/not-overridden/script-descendent.html
  • TIMEOUT [expected OK] /import-maps/not-overridden/url-resolution-conflict.html
  • TIMEOUT [expected OK] /import-maps/static-integrity.html
  • TIMEOUT [expected OK] /trusted-types/TrustedTypePolicyFactory-getAttributeType-event-handler-content-attributes.tentative.html
  • TIMEOUT [expected OK] /trusted-types/set-event-handlers-content-attributes.tentative.html

@github-actions
Copy link
Copy Markdown

⚠️ Try run (#23703999107) failed!

@Gae24
Copy link
Copy Markdown
Contributor

Gae24 commented Mar 29, 2026

@jdm unlike https://github.com/elomscansio/servo/blob/delaying_the_load_event/components/script/dom/html/htmlscriptelement.rs#L307 where do i unblock the render for modulescripts

For module scripts the corresponding of finish_fetching_a_classic_script is notify_owner_to_finish.
That said I wonder if we can simply set delaying the load event to false at the end of HTMLScriptElement::execute since we need to do it after executing steps to run when the result is ready (the only case where execute is not called directly is ParsingBlocking).

let blocker = &self.delaying_the_load_event;
if delay && blocker.borrow().is_none() {
*blocker.borrow_mut() = Some(LoadBlocker::new(
&self.owner_document(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is not correct, we should use either parser_document or preparation_time_document, which should be determined by the ExternalScriptKind of the fetched script.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What we are doing is just toggle on/off the load blocker.

See comment by @jdm

I think the way to do this correctly is stop using Document::fetch in htmlscriptelement.rs and DocumentLoader::fetch_async_with_callback in script_module.rs, and store an explicit DomRefCell<Option<LoadBlocker>> in HTMLScriptElement which we can manipulate when the spec modifies https://html.spec.whatwg.org/multipage/scripting.html#concept-script-delay-load .
#43697 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gae24 means that using owner_doc() here is not correct; we need to use a more specific document when creating the load blocker.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, as a starting point we should introduce a method that implements step 35 which returns ExternalScriptKind, with that we can then identify which document to use.

@servo-highfive servo-highfive added S-needs-code-changes Changes have not yet been made that were requested by a reviewer. and removed S-awaiting-review There is new code that needs to be reviewed. labels Mar 29, 2026
@elomscansio
Copy link
Copy Markdown
Contributor Author

elomscansio commented Mar 29, 2026 via email

@elomscansio elomscansio force-pushed the delaying_the_load_event branch from e0bfdeb to 1425e16 Compare March 29, 2026 19:23
@servo-highfive servo-highfive added S-awaiting-review There is new code that needs to be reviewed. and removed S-needs-code-changes Changes have not yet been made that were requested by a reviewer. labels Mar 29, 2026
.expect("Script should have an active document when delaying load event");

let url = self
.get_script_url()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can simply pass down the url and avoid this method.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, but required making ScriptResult.url public so that we won't pollute execute method which are called from document and so on.

@servo-highfive servo-highfive added S-needs-code-changes Changes have not yet been made that were requested by a reviewer. S-awaiting-review There is new code that needs to be reviewed. and removed S-awaiting-review There is new code that needs to be reviewed. S-needs-code-changes Changes have not yet been made that were requested by a reviewer. labels Mar 29, 2026
@elomscansio elomscansio force-pushed the delaying_the_load_event branch from c2dbf2b to 615e35c Compare March 30, 2026 11:37
@elomscansio elomscansio requested review from Gae24 and jdm March 30, 2026 11:49
@elomscansio
Copy link
Copy Markdown
Contributor Author

current commit test result

Ran 470 tests finished in 714.4 seconds.
  • 435 ran as expected.
  • 28 tests crashed unexpectedly
  • 1 tests timed out unexpectedly
  • 6 tests unexpectedly okay
  • 1 tests had unexpected subtest results

/home/elomscansio/.local/share/uv/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/multiprocessing/resource_tracker.py:254: UserWarning: resource_tracker: There appear to be 90 leaked semaphore objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '

Seems i'm still getting fews things wrong.

@elomscansio
Copy link
Copy Markdown
Contributor Author

@jdm
Copy link
Copy Markdown
Member

jdm commented Mar 30, 2026

Render-blicked documents are supposed to be skipped when running the "update the rendering" algorithm. For script elements that's tracked with

marked_as_render_blocking: Cell<bool>,
. Delaying the load event means that the onliad event for the document will not be fired, and that's tracked with the LoadBlocker object. Does that answer your question?

@Gae24
Copy link
Copy Markdown
Contributor

Gae24 commented Mar 30, 2026

The correct document was solely used in finish_fetching_a_classic_script, we should update these places too

match kind {
ExternalScriptKind::Deferred => doc.add_deferred_script(self),
ExternalScriptKind::ParsingBlocking => {
doc.set_pending_parsing_blocking_script(self, None)
},
ExternalScriptKind::AsapInOrder => doc.push_asap_in_order_script(self),
ExternalScriptKind::Asap => doc.add_asap_script(self),
}

if !asynch && was_parser_inserted {
// 33.4: module, not async, parser-inserted
doc.add_deferred_script(self);
} else if !asynch && !self.non_blocking.get() {
// 33.3: module, not parser-inserted
doc.push_asap_in_order_script(self);
} else {
// 33.2: module, async
doc.add_asap_script(self);
};

if !asynch && was_parser_inserted {
doc.add_deferred_script(self);
} else if !asynch && !self.non_blocking.get() {
doc.push_asap_in_order_script(self);
} else {
doc.add_asap_script(self);
};

if !asynch && script.get_parser_inserted() {
document.deferred_script_loaded(cx, &script, load);
} else if !asynch && !script.get_non_blocking() {
document.asap_in_order_script_loaded(cx, &script, load);
} else {
document.asap_script_loaded(cx, &script, load);
};

Copy link
Copy Markdown
Contributor

@Gae24 Gae24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also update the test expectations with the try run logs.

@elomscansio elomscansio requested a review from Gae24 April 3, 2026 17:11
@Gae24
Copy link
Copy Markdown
Contributor

Gae24 commented Apr 3, 2026

Still need to update the test expectations.

@elomscansio elomscansio force-pushed the delaying_the_load_event branch from a0052cb to aa0cd0b Compare April 4, 2026 11:26
elomscansio and others added 16 commits April 4, 2026 12:35
Signed-off-by: Emmanuel Paul Elom <[email protected]>
…ding

The HTML spec defines two important documents for script elements:
- Preparation-time document: Set when the script is prepared (owner document at that time)
- Parser document: Set when the script is parser-inserted

Previously, the code would call `owner_document()` each time it needed to dispatch script load events, which could return a different document if the script element was moved between documents.

This change:
- Adds getter methods `get_preparation_time_document()` and `get_parser_document()` to `HTMLScriptElement`
- Updates `script_module.rs` to use these getters instead of calling `owner_document()` directly
- Ensures script load events are dispatched to the correct document according to the HTML spec

Signed-off-by: Emmanuel Paul Elom <[email protected]>
… && was_parser_inserted`

Signed-off-by: Emmanuel Paul Elom <[email protected]>
…ents

- Centralize script kind logic into `get_script_kind()` method
- Remove duplicated kind determination in classic and module script paths
- Call `delay_load_event` after script fetch completion
- Clean up unused url variable assignments in script execution

Signed-off-by: Emmanuel Paul Elom <[email protected]>
…/html/semantics/scripting-1/the-script-element

Signed-off-by: Emmanuel Paul Elom <[email protected]>
Co-authored-by: Gae24 <[email protected]>
Signed-off-by: Emmanuel Paul Elom <[email protected]>
Co-authored-by: Gae24 <[email protected]>
Signed-off-by: Emmanuel Paul Elom <[email protected]>
@elomscansio elomscansio force-pushed the delaying_the_load_event branch from aa0cd0b to 59f5b6e Compare April 4, 2026 11:35
@elomscansio elomscansio requested a review from Gae24 April 4, 2026 11:36
@elomscansio elomscansio force-pushed the delaying_the_load_event branch from 59f5b6e to 42e79f1 Compare April 4, 2026 11:39
@servo-highfive servo-highfive removed the S-awaiting-review There is new code that needs to be reviewed. label Apr 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Module scripts unblock the load event too early Intermittent TIMEOUT in /preload/modulepreload-sri-importmap.html and /preload/modulepreload-sri.html

5 participants