Skip to content

Implement html5ever hooks for customizable <select> elements#42036

Merged
simonwuelker merged 6 commits intoservo:mainfrom
simonwuelker:relaxed-select-parsing
Jan 22, 2026
Merged

Implement html5ever hooks for customizable <select> elements#42036
simonwuelker merged 6 commits intoservo:mainfrom
simonwuelker:relaxed-select-parsing

Conversation

@simonwuelker
Copy link
Copy Markdown
Contributor

@simonwuelker simonwuelker commented Jan 20, 2026

Do not merge yet - we need to create a new html5ever release.
The html5ever bump also includes encoding indicators, which we handle in the most minimal way possible here. They will be handled properly by #41730

Companion PR for servo/html5ever#719

@simonwuelker simonwuelker added the T-linux-wpt Do a try run of the WPT label Jan 20, 2026
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Jan 20, 2026
@github-actions
Copy link
Copy Markdown

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

@codecov-commenter
Copy link
Copy Markdown

⚠️ JUnit XML file not found

The CLI was unable to find any JUnit XML files to upload.
For more help, visit our troubleshooting guide.

@github-actions
Copy link
Copy Markdown

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

Flaky unexpected result (41)
  • OK /FileAPI/file/send-file-form-punctuation.html
    • FAIL [expected PASS] subtest: Upload file-for-upload-in-form-REVERSE-SOLIDUS-[\].txt (ASCII) in UTF-8 form

      assert_greater_than: file-for-upload-in-form-REVERSE-SOLIDUS-[\].txt: multipart form data must have at least 3 lines: "" expected a number greater than 2 but got 0
      

    • PASS [expected FAIL] subtest: Upload file-for-upload-in-form-PERCENT-SIGN-[%].txt (ASCII) in UTF-8 form
    • PASS [expected FAIL] subtest: Upload file-for-upload-in-form-COLON-[:].txt (ASCII) in UTF-8 form
  • OK /IndexedDB/get-databases.any.html
    • FAIL [expected PASS] subtest: Enumerate one database.

      promise_test: Unhandled rejection with value: object "Error: indexedDB.open should not succeed without creating a versionchange transaction"
      

    • FAIL [expected PASS] subtest: Make sure an empty list is returned for the case of no databases.

      promise_test: Unhandled rejection with value: object "Error: indexedDB.open should not succeed without creating a versionchange transaction"
      

  • OK /IndexedDB/idbfactory-open-error-properties.any.html
    • PASS [expected FAIL] subtest: Properties of error event from failed open()
  • OK /IndexedDB/idbfactory-open-error-properties.any.worker.html
    • PASS [expected FAIL] subtest: Properties of error event from failed open()
  • OK /_mozilla/webxr/create_session.https.html
    • FAIL [expected PASS] subtest: create_session

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

  • ERROR [expected TIMEOUT] /_mozilla/webxr/sessionavailable.https.html
  • CRASH [expected OK] /_webgl/conformance2/vertex_arrays/vertex-array-object.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(nastaliq)
  • OK /custom-elements/form-associated/ElementInternals-setFormValue.html (#29174)
    • PASS [expected FAIL] subtest: Null value should submit nothing
    • PASS [expected FAIL] subtest: Newline normalization - \r\n in value (formdata)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/accumulated-oversized-payload.https.window.html (#41705)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.https.window.html (#35176)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/sandboxed-iframe.https.window.html (#41704)
  • OK [expected ERROR] /focus/focus-event-after-switching-iframes.sub.html (#40368)
  • 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
  • CRASH [expected OK] /html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-assign-user-click.html
  • OK /html/browsers/history/the-history-interface/traverse_the_history_2.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • OK /html/browsers/history/the-history-interface/traverse_the_history_5.html (#21383)
    • FAIL [expected PASS] subtest: Multiple history traversals, last would be aborted

      assert_array_equals: Pages opened during history navigation expected property 1 to be 5 but got 3 (expected array [6, 5] got [6, 3])
      

  • CRASH [expected OK] /html/browsers/history/the-location-interface/assign-with-nested-iframe.html
  • CRASH [expected OK] /html/canvas/element/canvas-context/2d.canvas.context.type.extend.html
  • TIMEOUT /html/semantics/embedded-content/media-elements/autoplay-allowed-by-feature-policy.https.sub.html (#41404)
    • PASS [expected TIMEOUT] subtest: Feature-Policy header: autoplay * allows same-origin iframes.
  • OK [expected TIMEOUT] /html/semantics/embedded-content/media-elements/autoplay-disabled-by-feature-policy.https.sub.html (#41221)
    • PASS [expected TIMEOUT] subtest: Feature-Policy header: autoplay "none" has no effect on the top level document.
    • 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-window-open.html (#32596)
    • FAIL [expected PASS] subtest: Navigating iframe loading='lazy' before it is loaded: location.replace

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

  • CRASH [expected OK] /html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html (#29634)
  • OK /html/semantics/forms/form-submission-0/multipart-formdata.window.html (#28725)
    • FAIL [expected PASS] subtest: multipart/form-data: Basic File test (normal form)

      assert_equals: expected "\r\nContent-Disposition: form-data; name=\"basic\"; filename=\"file-test.txt\"\r\nContent-Type: text/plain\r\n\r\n\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 value (formdata event)
    • PASS [expected FAIL] subtest: multipart/form-data: \n in value (formdata event)
  • 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 (normal form)
    • PASS [expected FAIL] subtest: text/plain: double quote in filename (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 (normal form)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: 0x00 in filename (formdata event)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: single quote in name (formdata event)
  • ERROR [expected TIMEOUT] /html/semantics/links/links-created-by-a-and-area-elements/target_blank_implicit_noopener_base.html (#40347)
  • OK /html/semantics/scripting-1/the-script-element/execution-timing/077.html (#22139)
    • FAIL [expected PASS] subtest: adding several types of scripts through the DOM and removing some of them confuses scheduler

      assert_array_equals: expected property 1 to be "Script #1 ran" but got "Script #3 ran" (expected array ["Script #2 ran", "Script #1 ran", "Script #3 ran", "Script #4 ran"] got ["Script #2 ran", "Script #3 ran", "Script #4 ran", "Script #1 ran"])
      

  • OK /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.worker.html (#33909)
    • FAIL [expected PASS] subtest: Revoking a blob URL immediately after calling import will not fail

      promise_test: Unhandled rejection with value: object "TypeError: Dynamic import failed"
      

  • CRASH [expected OK] /mixed-content/gen/top.meta/opt-in/worklet-audio.https.html
  • OK /preload/prefetch-document.html (#37210)
    • PASS [expected FAIL] subtest: different-site document prefetch with 'as=document' should not be consumed
  • CRASH [expected OK] /trusted-types/eval-csp-tt-no-default-policy.html
  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?01-05 (#38975)
    • PASS [expected TIMEOUT] subtest: Navigate a window via anchor with javascript:-urls in report-only mode.
    • PASS [expected NOTRUN] subtest: Navigate a window via anchor with javascript:-urls w/ default policy in report-only mode.
    • PASS [expected NOTRUN] subtest: Navigate a frame via anchor with javascript:-urls in enforcing mode.
  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
    • PASS [expected FAIL] subtest: Navigate a frame via anchor with javascript:-urls in report-only mode.
    • 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!\""
      

  • CRASH [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?11-15
  • 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 ERROR] /trusted-types/trusted-types-reporting-for-SharedWorker-eval.html
  • CRASH [expected OK] /upgrade-insecure-requests/gen/top.meta/unset/worklet-layout-import-data.https.html
  • CRASH [expected OK] /wasm/webapi/contenttype.any.html
  • CRASH [expected OK] /webaudio/the-audio-api/the-biquadfilternode-interface/biquad-peaking.html
  • OK /webdriver/tests/classic/is_element_enabled/user_prompts.py
    • ERROR [expected PASS] subtest: test_accept[alert-None]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_accept[confirm-True]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_accept[prompt-]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_accept_and_notify[alert-None]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_accept_and_notify[confirm-True]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_accept_and_notify[prompt-]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_dismiss[alert-None]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_dismiss[confirm-False]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_dismiss[prompt-None]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • ERROR [expected PASS] subtest: test_dismiss_and_notify[alert-None]

      setup error: webdriver.error.SessionNotCreatedException: session not created (500): Session is already started
      

    • And 8 more unexpected results...
Stable unexpected results that are known to be intermittent (33)
  • TIMEOUT /FileAPI/url/url-in-tags-revoke.window.html (#19978)
    • PASS [expected TIMEOUT] subtest: Fetching a blob URL immediately before revoking it works in &lt;script&gt; tags.
  • 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 /_mozilla/css/offset_properties_inline.html (#40543)
    • PASS [expected FAIL] subtest: offsetTop
    • PASS [expected FAIL] subtest: offsetLeft
  • 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 /_webgl/conformance/textures/misc/texture-upload-size.html (#21770)
    • PASS [expected FAIL] subtest: WebGL test #45
    • PASS [expected FAIL] subtest: WebGL test #47
    • PASS [expected FAIL] subtest: WebGL test #49
    • PASS [expected FAIL] subtest: WebGL test #51
    • FAIL [expected PASS] subtest: WebGL test #53

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

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

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

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

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

      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 #61
    • PASS [expected FAIL] subtest: WebGL test #63
    • And 10 more unexpected results...
  • TIMEOUT /content-security-policy/inheritance/location-reload.html (#38983)
    • PASS [expected FAIL] subtest: location.reload() of empty iframe.
  • 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 /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)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(fangsong) (drawing text in a canvas)
  • OK /css/css-fonts/variations/at-font-face-font-matching.html (#20684)
    • FAIL [expected PASS] subtest: Matching font-weight: '430' should prefer '420 440' over '450 460'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

  • TIMEOUT [expected OK] /fetch/api/redirect/redirect-keepalive.https.any.html (#32153)
    • TIMEOUT [expected PASS] subtest: [keepalive][iframe][load] mixed content redirect; setting up

      Test timed out
      

  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • FAIL [expected PASS] subtest: sec-fetch-mode

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

    • FAIL [expected PASS] subtest: sec-fetch-user

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Same site
  • 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 /fetch/metadata/generated/serviceworker.https.sub.html (#36247)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no options - registration
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html (#28691)
    • PASS [expected FAIL] subtest: load event does not fire on window.open('about:blank')
  • OK /html/browsers/windows/embedded-opener-remove-frame.html (#23867)
    • PASS [expected FAIL] subtest: opener of discarded auxiliary browsing context
  • 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 /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
      

  • OK [expected 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 the top-level document.
    • PASS [expected TIMEOUT] subtest: Default "autoplay" feature policy ["self"] allows same-origin iframes.
  • 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 [expected ERROR] /html/user-activation/no-activation-thru-escape-key.html (#40343)
  • FAIL [expected PASS] /png/apng/acTL-plays-one.html (#41218)
  • CRASH [expected OK] /resource-timing/render-blocking-status-link.html (#41664)
  • TIMEOUT /resource-timing/test_resource_timing.html (#25720)
    • FAIL [expected PASS] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (img)

      assert_equals: expected 6.419999999999998 but got 6.41
      

  • OK [expected TIMEOUT] /webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.html (#29053)
    • PASS [expected TIMEOUT] subtest: StorageKey: test 3P about:blank window opened from a 3P iframe
  • ERROR [expected OK] /webxr/render_state_update.https.html (#27535)
Stable unexpected results (34)
  • OK /html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html
    • FAIL [expected PASS] subtest: &lt;img srcset="data:image/svg+xml,&amp;lt;svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20width='20'&amp;gt;&amp;lt;circle%20r='1'/&amp;gt;&amp;lt;/svg&amp;gt; 2x" data-expect="10"&gt;

      assert_equals: height expected 10 but got 1
      

    • FAIL [expected PASS] subtest: &lt;img srcset="data:image/svg+xml,&amp;lt;svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20height='20'&amp;gt;&amp;lt;circle%20r='1'/&amp;gt;&amp;lt;/svg&amp;gt; 2x" data-expect="10"&gt;

      assert_equals: width expected 10 but got 1
      

  • OK /html/semantics/forms/the-select-element/customizable-select/nested-options.html
    • PASS [expected FAIL] subtest: The HTML parser should disallow nested options in select datalist.
  • OK /html/semantics/forms/the-select-element/customizable-select/option-disabled-invalid-nesting.html
    • PASS [expected FAIL] subtest: options should not inherit disabledness when nested in invalid elements.
  • OK /html/semantics/forms/the-select-element/customizable-select/option-disabled-optgroup.html
    • FAIL [expected PASS] subtest: options should check ancestor optgroup for disabled state.

      assert_equals: color after optgroup disabled expected "rgb(128, 128, 128)" but got "rgb(0, 0, 0)"
      

  • OK [expected ERROR] /html/semantics/forms/the-select-element/customizable-select/select-base-appearance-computed-style.html
    • FAIL [expected PASS] subtest: UA styles of base appearance &lt;select&gt;.

      assert_equals: background-color expected "rgba(0, 0, 0, 0)" but got "rgb(211, 211, 211)"
      

    • FAIL [expected PASS] subtest: UA styles of base appearance select::picker-icon.

      assert_equals: content expected "counter(fake-counter-name, disclosure-open)" but got ""
      

    • FAIL [expected PASS] subtest: UA styles of base appearance ::picker(select)

      assert_equals: box-sizing expected "border-box" but got ""
      

    • FAIL [expected PASS] subtest: UA styles of base appearance &lt;option&gt;.

      assert_equals: min-inline-size expected "24px" but got "auto"
      

    • FAIL [expected PASS] subtest: UA styles of base appearance option::checkmark.

      assert_equals: content expected "\"✓\"" but got ""
      

    • FAIL [expected PASS] subtest: UA styles of base appearance &lt;optgroup&gt;.

      assert_equals: font-weight expected "700" but got "500"
      

    • FAIL [expected PASS] subtest: UA styles of base appearance &lt;legend&gt;.

      assert_equals: min-block-size expected "13px" but got "auto"
      

    • FAIL [expected PASS] subtest: UA styles of base appearance select &lt;button&gt;.

      assert_equals: display expected "contents" but got "inline-block"
      

    • FAIL [expected PASS] subtest: UA styles of base appearance &lt;option&gt; in &lt;optgroup&gt;.

      assert_equals: font-weight expected "400" but got "500"
      

  • OK /html/semantics/forms/the-select-element/customizable-select/select-button-behaviors.html
    • PASS [expected FAIL] subtest: Select button should not inherit :disabled from select.
  • OK /html/semantics/forms/the-select-element/customizable-select/select-parsing.html
    • PASS [expected FAIL] subtest: &lt;div&gt;s, &lt;button&gt;s, and &lt;datalist&gt;s should be allowed in &lt;select&gt;
    • PASS [expected FAIL] subtest: &lt;/select&gt; should close &lt;button&gt;
    • PASS [expected FAIL] subtest: &lt;/select&gt; should close &lt;datalist&gt;
    • PASS [expected FAIL] subtest: &lt;select&gt; in &lt;button&gt; in &lt;select&gt; should remove inner &lt;select&gt;
    • PASS [expected FAIL] subtest: &lt;select&gt; in &lt;select&gt;&lt;button&gt;&lt;div&gt; should remove inner &lt;select&gt;
    • PASS [expected FAIL] subtest: Divs and imgs should be allowed as direct children of select and within options without a datalist
    • PASS [expected FAIL] subtest: textarea tags should parse inside select instead of closing the select
  • FAIL [expected PASS] /html/semantics/forms/the-select-element/customizable-select/select-size-multiple-new-content.html
  • OK /html/semantics/forms/the-select-element/customizable-select/selectedcontent-mutations.html
    • PASS [expected FAIL] subtest: MutationObserver records during parsing of &lt;select&gt; with &lt;selectedcontent&gt;: test2
    • PASS [expected FAIL] subtest: MutationObserver records during parsing of &lt;select&gt; with &lt;selectedcontent&gt;: test6
  • OK /html/syntax/parsing/html5lib_innerHTML_tests_innerHTML_1.html
    • PASS [expected FAIL] subtest: html5lib_innerHTML_tests_innerHTML_1.html 2c4284e6b2bb480daa50bca43bcbe29cfcdeeab4
    • PASS [expected FAIL] subtest: html5lib_innerHTML_tests_innerHTML_1.html d75277b65d0118463afeb66b478509d4e27565ab
    • PASS [expected FAIL] subtest: html5lib_innerHTML_tests_innerHTML_1.html b354df69dbe9b3ef0c42177648e3aace114cf8ea
  • OK /html/syntax/parsing/html5lib_innerHTML_webkit02.html
    • PASS [expected FAIL] subtest: html5lib_innerHTML_webkit02.html c2c4647447354abc154f1917a7fbefa4a679d5fb
  • OK /html/syntax/parsing/html5lib_menuitem-element.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
  • OK /html/syntax/parsing/html5lib_menuitem-element.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
  • OK /html/syntax/parsing/html5lib_menuitem-element.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_menuitem-element.html d4586cd7706bbb3a5b127c52c1f2861d1a3fb781
  • OK /html/syntax/parsing/html5lib_tests1.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_tests1.html 0b27e026dd03a356bbd78690fff7fb40cd63b606
    • PASS [expected FAIL] subtest: html5lib_tests1.html a2dd4d5a28a61ec99ce9dae35e9d4ffe92812e2f
  • OK /html/syntax/parsing/html5lib_tests1.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_tests1.html 0b27e026dd03a356bbd78690fff7fb40cd63b606
    • PASS [expected FAIL] subtest: html5lib_tests1.html a2dd4d5a28a61ec99ce9dae35e9d4ffe92812e2f
  • OK /html/syntax/parsing/html5lib_tests1.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_tests1.html 0b27e026dd03a356bbd78690fff7fb40cd63b606
    • PASS [expected FAIL] subtest: html5lib_tests1.html a2dd4d5a28a61ec99ce9dae35e9d4ffe92812e2f
  • OK /html/syntax/parsing/html5lib_tests10.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_tests10.html fee2541ab7080ca5b363bb4b7b0c18ee1d3699ba
    • PASS [expected FAIL] subtest: html5lib_tests10.html 679fbaa80e9d15416f17eb041a8fe04c373f0e12
    • PASS [expected FAIL] subtest: html5lib_tests10.html badaa2069df3f2bb2d2da79f8ae2598f66ab2d0f
    • PASS [expected FAIL] subtest: html5lib_tests10.html 64e72bd5af825a0b014a78c77d6d0be8c330892b
  • OK /html/syntax/parsing/html5lib_tests10.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_tests10.html fee2541ab7080ca5b363bb4b7b0c18ee1d3699ba
    • PASS [expected FAIL] subtest: html5lib_tests10.html 679fbaa80e9d15416f17eb041a8fe04c373f0e12
    • PASS [expected FAIL] subtest: html5lib_tests10.html badaa2069df3f2bb2d2da79f8ae2598f66ab2d0f
    • PASS [expected FAIL] subtest: html5lib_tests10.html 64e72bd5af825a0b014a78c77d6d0be8c330892b
  • OK /html/syntax/parsing/html5lib_tests10.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_tests10.html fee2541ab7080ca5b363bb4b7b0c18ee1d3699ba
    • PASS [expected FAIL] subtest: html5lib_tests10.html 679fbaa80e9d15416f17eb041a8fe04c373f0e12
    • PASS [expected FAIL] subtest: html5lib_tests10.html badaa2069df3f2bb2d2da79f8ae2598f66ab2d0f
    • PASS [expected FAIL] subtest: html5lib_tests10.html 64e72bd5af825a0b014a78c77d6d0be8c330892b
  • OK /html/syntax/parsing/html5lib_tests18.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_tests18.html e4eb33f77ae641718853d2cfddbdb2eece6b266b
    • PASS [expected FAIL] subtest: html5lib_tests18.html 53ce5b102579af9830bf561b634af681bbdb5dfd
  • OK /html/syntax/parsing/html5lib_tests18.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_tests18.html e4eb33f77ae641718853d2cfddbdb2eece6b266b
    • PASS [expected FAIL] subtest: html5lib_tests18.html 53ce5b102579af9830bf561b634af681bbdb5dfd
  • OK /html/syntax/parsing/html5lib_tests18.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_tests18.html e4eb33f77ae641718853d2cfddbdb2eece6b266b
    • PASS [expected FAIL] subtest: html5lib_tests18.html 53ce5b102579af9830bf561b634af681bbdb5dfd
  • OK /html/syntax/parsing/html5lib_tests7.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_tests7.html 5b0b3edcc3ce9fdc9f58eb62d326865ca0aab8c8
  • OK /html/syntax/parsing/html5lib_tests7.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_tests7.html 5b0b3edcc3ce9fdc9f58eb62d326865ca0aab8c8
  • OK /html/syntax/parsing/html5lib_tests7.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_tests7.html 5b0b3edcc3ce9fdc9f58eb62d326865ca0aab8c8
  • OK /html/syntax/parsing/html5lib_tests9.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_tests9.html b2a8131e72e53265479c08cd18d4f4663278a021
    • PASS [expected FAIL] subtest: html5lib_tests9.html a45a8948b799dadc321a86ff0bebf13167b5f076
    • PASS [expected FAIL] subtest: html5lib_tests9.html 224e1bcb8030f0972c17d0fc68d912be17905e1c
    • PASS [expected FAIL] subtest: html5lib_tests9.html e84d33cef974e49b69bdbc0c663c018a4dd010c0
  • OK /html/syntax/parsing/html5lib_tests9.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_tests9.html b2a8131e72e53265479c08cd18d4f4663278a021
    • PASS [expected FAIL] subtest: html5lib_tests9.html a45a8948b799dadc321a86ff0bebf13167b5f076
    • PASS [expected FAIL] subtest: html5lib_tests9.html 224e1bcb8030f0972c17d0fc68d912be17905e1c
    • PASS [expected FAIL] subtest: html5lib_tests9.html e84d33cef974e49b69bdbc0c663c018a4dd010c0
  • OK /html/syntax/parsing/html5lib_tests9.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_tests9.html b2a8131e72e53265479c08cd18d4f4663278a021
    • PASS [expected FAIL] subtest: html5lib_tests9.html a45a8948b799dadc321a86ff0bebf13167b5f076
    • PASS [expected FAIL] subtest: html5lib_tests9.html 224e1bcb8030f0972c17d0fc68d912be17905e1c
    • PASS [expected FAIL] subtest: html5lib_tests9.html e84d33cef974e49b69bdbc0c663c018a4dd010c0
  • OK /html/syntax/parsing/html5lib_webkit02.html?run_type=uri
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 3a112027586c5c0fb506c49aa01d3f695ca0a5fa
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 4bd119721a0eb84aa72a30ea83fc5beb5843ca68
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a15e2f18330327cc4dcfe8c10af07714903f773a
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 29539f494ab6b37b18213f062da16b0f0c9d00d9
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a6c50b1f6bfbe3c55102d8cad0950d0b68cc6729
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 411f313a1b92ac7be549c41ee6758f952dc2dced
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 84467597648753feeb78793e2cc9196bc75857c2
  • OK /html/syntax/parsing/html5lib_webkit02.html?run_type=write
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 3a112027586c5c0fb506c49aa01d3f695ca0a5fa
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 4bd119721a0eb84aa72a30ea83fc5beb5843ca68
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a15e2f18330327cc4dcfe8c10af07714903f773a
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 29539f494ab6b37b18213f062da16b0f0c9d00d9
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a6c50b1f6bfbe3c55102d8cad0950d0b68cc6729
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 411f313a1b92ac7be549c41ee6758f952dc2dced
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 84467597648753feeb78793e2cc9196bc75857c2
  • OK /html/syntax/parsing/html5lib_webkit02.html?run_type=write_single
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 3a112027586c5c0fb506c49aa01d3f695ca0a5fa
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 4bd119721a0eb84aa72a30ea83fc5beb5843ca68
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a15e2f18330327cc4dcfe8c10af07714903f773a
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 29539f494ab6b37b18213f062da16b0f0c9d00d9
    • PASS [expected FAIL] subtest: html5lib_webkit02.html a6c50b1f6bfbe3c55102d8cad0950d0b68cc6729
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 411f313a1b92ac7be549c41ee6758f952dc2dced
    • PASS [expected FAIL] subtest: html5lib_webkit02.html 84467597648753feeb78793e2cc9196bc75857c2
  • OK /html/syntax/serializing-html-fragments/serializing-lt-gt.html
    • PASS [expected FAIL] subtest: innerHTML
    • PASS [expected FAIL] subtest: outerHTML
  • OK /html/syntax/serializing-html-fragments/serializing.html
    • PASS [expected FAIL] subtest: innerHTML 7 &lt;a b="&amp;lt;"&gt;&lt;/a&gt;
    • PASS [expected FAIL] subtest: innerHTML 8 &lt;a b="&amp;gt;"&gt;&lt;/a&gt;
    • PASS [expected FAIL] subtest: innerHTML 9 &lt;a href="javascript:&amp;quot;&amp;lt;&amp;gt;&amp;quot;"&gt;&lt;/a&gt;
    • PASS [expected FAIL] subtest: outerHTML 7 &lt;span&gt;&lt;a b="&amp;lt;"&gt;&lt;/a&gt;&lt;/span&gt;
    • PASS [expected FAIL] subtest: outerHTML 8 &lt;span&gt;&lt;a b="&amp;gt;"&gt;&lt;/a&gt;&lt;/span&gt;
    • PASS [expected FAIL] subtest: outerHTML 9 &lt;span&gt;&lt;a href="javascript:&amp;quot;&amp;lt;&amp;gt;&amp;quot;"&gt;&lt;/a&gt;&lt;/span&gt;

@github-actions
Copy link
Copy Markdown

⚠️ Try run (#21183284019) failed!

@simonwuelker simonwuelker marked this pull request as ready for review January 21, 2026 12:07
@servo-highfive servo-highfive added S-awaiting-review There is new code that needs to be reviewed. S-needs-rebase There are merge conflict errors. labels Jan 21, 2026
@servo-highfive servo-highfive added S-awaiting-review There is new code that needs to be reviewed. S-needs-rebase There are merge conflict errors. and removed S-awaiting-review There is new code that needs to be reviewed. S-needs-rebase There are merge conflict errors. labels Jan 22, 2026
@simonwuelker simonwuelker force-pushed the relaxed-select-parsing branch from a608d03 to ac94724 Compare January 22, 2026 12:04
@servo-highfive servo-highfive removed the S-needs-rebase There are merge conflict errors. label Jan 22, 2026
@simonwuelker simonwuelker force-pushed the relaxed-select-parsing branch from b56c338 to 0ee6b81 Compare January 22, 2026 13:20
Signed-off-by: Simon Wülker <[email protected]>
@simonwuelker simonwuelker force-pushed the relaxed-select-parsing branch from 0ee6b81 to f230880 Compare January 22, 2026 13:26
@simonwuelker simonwuelker added this pull request to the merge queue Jan 22, 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 22, 2026
Merged via the queue into servo:main with commit 94e71e7 Jan 22, 2026
29 checks passed
@simonwuelker simonwuelker deleted the relaxed-select-parsing branch January 22, 2026 14:26
@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 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-awaiting-review There is new code that needs to be reviewed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants