Skip to content

fonts: Create resource timing entries when loading web fonts (#41660)#41784

Merged
jdm merged 6 commits intoservo:mainfrom
lumi-me-not:issue-41660
Jan 9, 2026
Merged

fonts: Create resource timing entries when loading web fonts (#41660)#41784
jdm merged 6 commits intoservo:mainfrom
lumi-me-not:issue-41660

Conversation

@lumi-me-not
Copy link
Copy Markdown
Contributor

Add a callback on WebFontDocumentContext to create resource timing entries, this callback is then used to call submit_timing, using a shim listener, as this function requires a listener.

Testing: Using ./mach test-wpt tests/wpt/tests/preload/preload-resource-match.https.html
Fixes: #41660

…1660)

Add a callback on `WebFontDocumentContext` to create resource timing entries,
this callback is then used to call `submit_timing`, using a shim listener,
as this function requires a listener.

Fixes servo#41660

Signed-off-by: lumi <[email protected]>
@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 8, 2026

Oh, I understand what you mean about FetchResponseListener now! What happens if you remove that requirement from the generic type for submit_timing?

@lumi-me-not
Copy link
Copy Markdown
Contributor Author

Oh, I understand what you mean about FetchResponseListener now! What happens if you remove that requirement from the generic type for submit_timing?

Looks like the FetchResponseListener bound is not strictly necessary as the only methods used come from ResourceTimingListener. The code compiles without this bound.

I changed the initiator type to InitiatorType::Other as a last minute change to be more in line with the CSP code and I noticed it broke tests again. Which initiator type should be used here?

@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 8, 2026

@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 8, 2026

@lumi-me-not
Copy link
Copy Markdown
Contributor Author

lumi-me-not commented Jan 9, 2026

Looking around a bit, https://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype specifically says that it should be "css" for @font-face.

I've added "css" to the InitiatorType enum and removed the unnecessary FetchResponseListener bound.

Should I squash these commits?

@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 9, 2026

Looking around a bit, https://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype specifically says that it should be "css" for @font-face.

Good find! Also, this is a really bizarre way for that behaviour to be specified. One more thing about the performance/resource timing specifications to add to my list of grumbles.

Should I squash these commits?

It will be squashed automatically when merging. I don't mind reviewing individual commits like how they're currently structured!

@lumi-me-not lumi-me-not marked this pull request as ready for review January 9, 2026 00:59
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Jan 9, 2026
@jdm jdm added the T-linux-wpt Do a try run of the WPT label Jan 9, 2026
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Jan 9, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 9, 2026

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

@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 9, 2026

The changes look great! Let's see what the tests say now.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 9, 2026

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

Flaky unexpected result (42)
  • OK /FileAPI/file/send-file-form-utf-8.html
    • FAIL [expected PASS] subtest: Upload file-for-upload-in-form-.txt (x-user-defined) in UTF-8 form

      assert_greater_than: file-for-upload-in-form-.txt: multipart form data must have at least 3 lines: "" expected a number greater than 2 but got 0
      

  • 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 /_mozilla/mozilla/getBoundingClientRect.html (#39668)
    • FAIL [expected PASS] subtest: getBoundingClientRect 1

      assert_equals: expected 62 but got 60.35
      

  • CRASH [expected PASS] /_mozilla/shadow-dom/move-element-with-ua-shadow-tree-crash.html (#39473)
  • OK /_mozilla/webxr/create_session.https.html
    • FAIL [expected PASS] subtest: create_session

      can't access property "simulateDeviceConnection", navigator.xr.test is undefined
      

  • OK /_mozilla/webxr/obtain_frame.https.html
    • FAIL [expected PASS] subtest: obtain_frame

      promise_test: Unhandled rejection with value: object "TypeError: can't access property "simulateDeviceConnection", navigator.xr.test is undefined"
      

  • ERROR [expected TIMEOUT] /_mozilla/webxr/sessionavailable.https.html
  • OK /_webgl/conformance/textures/misc/texture-upload-size.html (#21770)
    • FAIL [expected PASS] subtest: WebGL test #77

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

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

      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 #81

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

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

      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 #85
    • PASS [expected FAIL] subtest: WebGL test #87
    • PASS [expected FAIL] subtest: WebGL test #89
    • PASS [expected FAIL] subtest: WebGL test #91
    • FAIL [expected PASS] subtest: WebGL test #93

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

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

      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 2 more unexpected results...
  • CRASH [expected ERROR] /_webgl/conformance2/textures/misc/tex-input-validation.html (#38890)
  • TIMEOUT [expected PASS] /css/CSS2/positioning/right-113.xht
  • FAIL [expected PASS] /css/css-backgrounds/background-size-042.html
  • OK /css/css-fonts/generic-family-keywords-001.html (#37467)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(fangsong)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(kai)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(khmer-mul)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(nastaliq)
  • OK /css/css-fonts/generic-family-keywords-002.html (#40929)
    • FAIL [expected PASS] subtest: font-family: -webkit-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-sans-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-cursive treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-fantasy treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-monospace treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-system-ui treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • FAIL [expected PASS] subtest: font-family: -webkit-math treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 30 but got 50
      

    • PASS [expected FAIL] subtest: font-family: -webkit-generic(fangsong) treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-generic(kai) treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-generic(khmer-mul) treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • And 12 more unexpected results...
  • OK /custom-elements/form-associated/ElementInternals-setFormValue.html (#29174)
    • PASS [expected FAIL] subtest: Null value should submit nothing
    • PASS [expected FAIL] subtest: setFormValue with an empty FormData should submit nothing
    • PASS [expected FAIL] subtest: Newline normalization - \r\n in value (formdata)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/sandboxed-iframe.https.window.html (#41704)
  • 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)
    • PASS [expected FAIL] subtest: aElement.click() before the load event must NOT replace
  • CRASH [expected OK] /html/browsers/browsing-the-web/unloading-documents/unload/002.html
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with empty fragments should work.

      Test timed out
      

  • TIMEOUT [expected OK] /html/semantics/embedded-content/media-elements/audio_loop_base.html (#41122)
    • NOTRUN [expected PASS] subtest: Check if audio.loop is set to true that expecting the seeking event is fired more than once
  • TIMEOUT /html/semantics/embedded-content/media-elements/autoplay-default-feature-policy.https.sub.html (#41193)
    • PASS [expected TIMEOUT] subtest: Default "autoplay" feature policy ["self"] allows same-origin iframes.
  • TIMEOUT /html/semantics/embedded-content/media-elements/autoplay-disabled-by-feature-policy.https.sub.html (#41221)
    • FAIL [expected TIMEOUT] subtest: Feature-Policy header: autoplay "none" disallows same-origin iframes.

      assert_false: autoplay expected false got true
      

  • OK /html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html (#32607)
    • FAIL [expected PASS] subtest: Navigating iframe loading='lazy' before it is loaded: form submit

      uncaught exception: Error: assert_equals: expected "http://web-platform.test:8000/html/semantics/embedded-content/the-iframe-element/support/blank.htm?" but got "http://web-platform.test:8000/html/semantics/embedded-content/the-iframe-element/support/blank.htm?src"
      

  • 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.
  • OK /html/semantics/forms/form-submission-0/text-plain.window.html (#28687)
    • FAIL [expected PASS] subtest: text/plain: Basic File test (normal form)

      assert_equals: expected "basic=file-test.txt\r\n" but got ""
      

    • PASS [expected FAIL] subtest: text/plain: 0x00 in value (formdata event)
    • PASS [expected FAIL] subtest: text/plain: single quote in name (normal form)
  • OK /html/semantics/forms/form-submission-0/urlencoded2.window.html (#28687)
    • FAIL [expected PASS] subtest: application/x-www-form-urlencoded: Basic File test (normal form)

      assert_equals: expected "basic=file-test.txt" but got ""
      

    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: 0x00 in value (formdata event)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: single quote in filename (normal form)
  • OK [expected ERROR] /html/user-activation/no-activation-thru-escape-key.html (#40343)
  • OK /html/webappapis/user-prompts/print-during-unload.html (#35944)
    • PASS [expected FAIL] subtest: print() during unload
  • CRASH [expected OK] /intersection-observer/observer-attributes.html
  • FAIL [expected PASS] /png/apng/fcTL-dispose-background-final.html (#41581)
  • OK /resource-timing/buffer-full-add-then-clear.html (#40819)
    • PASS [expected FAIL] subtest: Test that if the buffer is cleared after entries were added to the secondary buffer, those entries make it into the primary one
  • OK /service-workers/service-worker/fetch-event.https.html (#36234)
    • PASS [expected FAIL] subtest: Service Worker falls back to network in fetch event with POST form
  • CRASH [expected OK] /trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html
  • TIMEOUT /trusted-types/trusted-types-navigation.html?06-10 (#37920)
    • TIMEOUT [expected FAIL] subtest: Navigate a frame via anchor with javascript:-urls in report-only mode.

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Navigate a frame via anchor with javascript:-urls w/ default policy in report-only 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.
  • CRASH [expected OK] /webaudio/the-audio-api/the-audiobuffersourcenode-interface/ctor-audiobuffersource.html
  • OK /webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html (#22849)
    • FAIL [expected PASS] subtest: buffer-stitching-2

      assert_approx_equals: Stitched sine‑wave buffers at sample rate 43800 sample[24044] |5.93719358751724e-15 - -0.6139758825302124| = 0.6139758825302183 &gt; 0.0038986 expected -0.6139758825302124 +/- 0.0038986 but got 5.93719358751724e-15
      

  • CRASH [expected OK] /webaudio/the-audio-api/the-audioparam-interface/audioparam-setValueCurve-exceptions.html
  • OK /webdriver/tests/classic/dismiss_alert/dismiss.py (#39098)
    • FAIL [expected PASS] subtest: test_dismiss_in_popup_window

      AssertionError: no such alert (404): No user prompt is currently active.
      

  • CRASH [expected OK] /websockets/idlharness.any.html
  • CRASH [expected OK] /webxr/xrDevice_requestSession_no_mode.https.html
Stable unexpected results that are known to be intermittent (30)
  • OK /IndexedDB/idbcursor-continuePrimaryKey-exceptions.any.html (#39277)
    • FAIL [expected PASS] subtest: IDBCursor continuePrimaryKey() on object store cursor

      assert_throws_dom: continuePrimaryKey() should throw if source is not an index function "function() {
              cursor.continuePrimaryKey(2, 2);
            }" threw object "TypeError: cursor.continuePrimaryKey is not a function" that is not a DOMException InvalidAccessError: property "code" is equal to undefined, expected 15
      

  • OK /IndexedDB/idbcursor-continuePrimaryKey-exceptions.any.worker.html (#39277)
    • FAIL [expected PASS] subtest: IDBCursor continuePrimaryKey() on object store cursor

      assert_throws_dom: continuePrimaryKey() should throw if source is not an index function "function() {
              cursor.continuePrimaryKey(2, 2);
            }" threw object "TypeError: cursor.continuePrimaryKey is not a function" that is not a DOMException InvalidAccessError: property "code" is equal to undefined, expected 15
      

  • OK /IndexedDB/idbobjectstore_getAll.any.html (#39276)
    • PASS [expected FAIL] subtest: Get all values with transaction.commit()
  • OK /IndexedDB/idbobjectstore_getAll.any.worker.html (#39400)
    • PASS [expected FAIL] subtest: Get all values with transaction.commit()
  • OK /IndexedDB/idbrequest-onupgradeneeded.any.html (#38895)
    • PASS [expected FAIL] subtest: transaction oncomplete ordering relative to open request onsuccess
  • OK /IndexedDB/idbrequest-onupgradeneeded.any.worker.html (#38971)
    • PASS [expected FAIL] subtest: transaction oncomplete ordering relative to open request onsuccess
  • OK /IndexedDB/key-conversion-exceptions.any.html (#39305)
    • FAIL [expected PASS] subtest: IDBCursor continue() method with throwing/invalid keys

      assert_throws_exactly: key conversion with throwing getter should rethrow function "() =&gt; {
            receiver[method](key);
          }" threw object "TypeError: receiver[method] is not a function" but we expected it to throw object "getter: throwing from getter"
      

    • FAIL [expected PASS] subtest: IDBCursor update() method with throwing/invalid keys

      assert_throws_exactly: throwing getter should rethrow during clone function "() =&gt; {
            cursor.update(value);
          }" threw object "TypeError: cursor.update is not a function" but we expected it to throw object "getter: throwing from getter"
      

  • OK /IndexedDB/key-conversion-exceptions.any.worker.html (#39284)
    • FAIL [expected PASS] subtest: IDBCursor continue() method with throwing/invalid keys

      assert_throws_exactly: key conversion with throwing getter should rethrow function "() =&gt; {
            receiver[method](key);
          }" threw object "TypeError: receiver[method] is not a function" but we expected it to throw object "getter: throwing from getter"
      

    • FAIL [expected PASS] subtest: IDBCursor update() method with throwing/invalid keys

      assert_throws_exactly: throwing getter should rethrow during clone function "() =&gt; {
            cursor.update(value);
          }" threw object "TypeError: cursor.update is not a function" but we expected it to throw object "getter: throwing from getter"
      

  • OK /IndexedDB/transaction-deactivation-timing.any.html (#38772)
    • PASS [expected FAIL] subtest: New transactions are deactivated before next task
    • PASS [expected FAIL] subtest: New transactions from microtask are deactivated before next task
  • 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
      

  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • FAIL [expected PASS] subtest: @font-face override update with appended sheet 1

      assert_equals: expected "80px" but got "38.3166666666667px"
      

    • FAIL [expected PASS] subtest: @font-face override update with appended sheet 2

      assert_equals: expected "80px" but got "38.3166666666667px"
      

  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination
  • ERROR [expected OK] /focus/focus-event-after-switching-iframes.sub.html (#40368)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html (#20768)
    • FAIL [expected PASS] subtest: Tests that a fragment navigation in the unload handler will not block the initial navigation

      assert_equals: expected "" but got "#fragment"
      

  • OK /html/browsers/history/the-history-interface/traverse_the_history_5.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • 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]
      }"
      

  • TIMEOUT /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • TIMEOUT [expected FAIL] subtest: Element with tabindex should support autofocus

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Non-HTMLElement should not support autofocus
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/update-the-rendering.html (#24145)
    • FAIL [expected TIMEOUT] subtest: "Flush autofocus candidates" should be happen before a scroll event and animation frame callbacks

      assert_array_equals: animationFrame lengths differ, expected array ["autofocus", "scroll", "animationFrame"] length 3, got ["animationFrame"] length 1
      

  • OK /html/semantics/forms/form-submission-0/multipart-formdata.window.html (#28725)
    • FAIL [expected PASS] subtest: multipart/form-data: Basic test (formdata event)

      assert_equals: expected "\r\nContent-Disposition: form-data; name=\"basic\"\r\n\r\ntest\r\n--\r\n" but got ""
      

    • PASS [expected FAIL] subtest: multipart/form-data: Basic File test (formdata event)
    • PASS [expected FAIL] subtest: multipart/form-data: 0x00 in name (normal form)
    • PASS [expected FAIL] subtest: multipart/form-data: 0x00 in value (formdata event)
  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • FAIL [expected PASS] /png/apng/acTL-plays-one.html (#41218)
  • OK /preload/prefetch-document.html (#37210)
    • PASS [expected FAIL] subtest: different-site document prefetch with 'as=document' should not be consumed
  • OK /preload/preload-error.sub.html (#37177)
    • PASS [expected FAIL] subtest: 404 (image): main
    • FAIL [expected PASS] subtest: 404 (style): main

      assert_unreached: Should have rejected: undefined Reached unreachable code
      

    • FAIL [expected PASS] subtest: 404 (script): main

      assert_unreached: Should have rejected: undefined Reached unreachable code
      

    • PASS [expected FAIL] subtest: CORS (fetch): main
  • OK /preload/preload-resource-match.https.html (#38088)
    • PASS [expected FAIL] subtest: Loading font (anonymous) with link (no-cors) should discard the preloaded response
    • PASS [expected FAIL] subtest: Loading font (anonymous) with link (use-credentials) should discard the preloaded response
  • CRASH [expected OK] /resource-timing/render-blocking-status-link.html (#41664)
  • TIMEOUT /resource-timing/test_resource_timing.html (#25720)
    • PASS [expected FAIL] subtest: window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (xmlhttprequest)
  • TIMEOUT /resource-timing/test_resource_timing.https.html (#25216)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (img)
    • PASS [expected FAIL] subtest: window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (xmlhttprequest)
  • TIMEOUT [expected OK] /trusted-types/trusted-types-navigation.html?01-05 (#38975)
    • TIMEOUT [expected PASS] subtest: Navigate a window via anchor with javascript:-urls in report-only mode.

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Navigate a window via anchor with javascript:-urls w/ default policy in report-only mode.
    • NOTRUN [expected PASS] subtest: Navigate a frame via anchor with javascript:-urls in enforcing mode.
  • 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.
    • TIMEOUT [expected NOTRUN] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in enforcing mode.

      Test timed out
      

Stable unexpected results (9)
  • OK /css/css-fonts/font-display/font-display-failure-fallback.html
    • PASS [expected FAIL] subtest: Fallback for font failure period
  • OK /preload/preload-font-crossorigin.html
    • PASS [expected FAIL] subtest: Same origin font preload without crossorigin attribute
    • PASS [expected FAIL] subtest: Cross origin font preload without crossorigin attribute
  • OK /preload/subresource-integrity-font.html
    • PASS [expected FAIL] subtest: Cross-origin, not CORS request, with empty integrity.
  • TIMEOUT /resource-timing/TAO-match.html
    • FAIL [expected TIMEOUT] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value list contains a wildcard. (font)

      assert_greater_than_equal: domainLookupStart should be greater than fetchStart expected a number greater than or equal to 237.13 but got 0
      

    • PASS [expected NOTRUN] subtest: The timing allow check algorithm will fail when the Timing-Allow-Origin header value list contains a null origin. (font)
    • FAIL [expected NOTRUN] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value list contains multiple wildcards. (font)

      assert_greater_than_equal: domainLookupStart should be greater than fetchStart expected a number greater than or equal to 330.87 but got 0
      

    • PASS [expected NOTRUN] subtest: The timing allow check algorithm will fail when the Timing-Allow-Origin header value contains only the uppercased origin. (font)
    • PASS [expected NOTRUN] subtest: The timing allow check algorithm will fail when the Timing-Allow-Origin header value contains the origin, a space, then a wildcard. (font)
    • PASS [expected NOTRUN] subtest: The timing allow check algorithm will fail when the Timing-Allow-Origin header is not present. (font)
    • FAIL [expected NOTRUN] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value contains only the origin. (iframe)

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before entry fired"
      

    • FAIL [expected NOTRUN] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value contains only a wildcard. (iframe)

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before entry fired"
      

    • FAIL [expected NOTRUN] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value list contains a case-sensitive match. (iframe)

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before entry fired"
      

    • FAIL [expected NOTRUN] subtest: The timing allow check algorithm will pass when the Timing-Allow-Origin header value list contains the origin and a wildcard. (iframe)

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before entry fired"
      

    • And 1 more unexpected results...
  • OK /resource-timing/initiator-type/dynamic-insertion.html
    • PASS [expected FAIL] subtest: A font should have the 'css' initiator type.
  • OK /resource-timing/initiator-type/link.html
    • PASS [expected FAIL] subtest: The initiator type for font resources embedded in css must be 'css'
  • OK /resource-timing/initiator-type/style.html
    • PASS [expected FAIL] subtest: The initiator type for '@font-face' resources must be 'css'
  • OK [expected TIMEOUT] /resource-timing/nextHopProtocol-is-tao-protected.https.html
    • PASS [expected FAIL] subtest: Fetch TAO-less font from remote origin. Make sure nextHopProtocol is the empty string.
    • FAIL [expected TIMEOUT] subtest: Fetch TAO-less object from remote origin. Make sure nextHopProtocol is the empty string.

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: Fetch TAO'd object from remote origin. Make sure nextHopProtocol is not the empty string.

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • PASS [expected NOTRUN] subtest: Fetch TAO-less script from remote origin. Make sure nextHopProtocol is the empty string.
    • FAIL [expected NOTRUN] subtest: Fetch TAO'd script from remote origin. Make sure nextHopProtocol is not the empty string.

      assert_not_equals: nextHopProtocol should not be the empty string. got disallowed value ""
      

    • PASS [expected NOTRUN] subtest: Fetch TAO-less stylesheet from remote origin. Make sure nextHopProtocol is the empty string.
    • FAIL [expected NOTRUN] subtest: Fetch TAO'd stylesheet from remote origin. Make sure nextHopProtocol is not the empty string.

      assert_not_equals: nextHopProtocol should not be the empty string. got disallowed value ""
      

    • PASS [expected NOTRUN] subtest: Fetch TAO-less synchronous xhr from remote origin. Make sure nextHopProtocol is the empty string.
    • FAIL [expected NOTRUN] subtest: Fetch TAO'd synchronous xhr from remote origin. Make sure nextHopProtocol is not the empty string.

      assert_not_equals: nextHopProtocol should not be the empty string. got disallowed value ""
      

    • PASS [expected NOTRUN] subtest: Fetch TAO-less asynchronous xhr from remote origin. Make sure nextHopProtocol is the empty string.
    • And 1 more unexpected results...
  • TIMEOUT /resource-timing/response-status-code.html
    • FAIL [expected TIMEOUT] subtest: This test validates the response status of resources. 79

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 80

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 81

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 82

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 83

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 84

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 85

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 86

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 87

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • FAIL [expected NOTRUN] subtest: This test validates the response status of resources. 88

      promise_test: Unhandled rejection with value: object "TimeoutError: Timeout was reached before load or error events fired"
      

    • And 1 more unexpected results...

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 9, 2026

⚠️ Try run (#20837499413) failed!

@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 9, 2026

Love those results! You can update the expected results with ./mach update-wpt https://github.com/servo/servo/actions/runs/20837499413 and commit the changes.

@lumi-me-not
Copy link
Copy Markdown
Contributor Author

I've committed the results. Some of these configuration changes are in areas that seem unrelated to the changes or add expected: FAIL, should these be removed?

@servo-highfive servo-highfive removed the S-awaiting-review There is new code that needs to be reviewed. label Jan 9, 2026
@jdm
Copy link
Copy Markdown
Member

jdm commented Jan 9, 2026

I've committed the results. Some of these configuration changes are in areas that seem unrelated to the changes or add expected: FAIL, should these be removed?

Nope—there's a lot of tests that previously didn't get a chance to run, and now they do and they fail. This happens when a test involving a font face timed out because no resource timing information was ever recorded.

@lumi-me-not
Copy link
Copy Markdown
Contributor Author

Ah, got it! Thanks for the help! :)

@jdm jdm added this pull request to the merge queue Jan 9, 2026
@servo-highfive servo-highfive added the S-awaiting-merge The PR is in the process of compiling and running tests on the automated CI. label Jan 9, 2026
Merged via the queue into servo:main with commit 76b2b5a Jan 9, 2026
29 checks passed
@servo-highfive servo-highfive removed the S-awaiting-merge The PR is in the process of compiling and running tests on the automated CI. label Jan 9, 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.

Web fonts do not create resource timing entries

3 participants