Skip to content

script: Implement the scrollend event#38773

Merged
yezhizhen merged 3 commits intoservo:mainfrom
abdelrahman1234567:scroll_end
Mar 20, 2026
Merged

script: Implement the scrollend event#38773
yezhizhen merged 3 commits intoservo:mainfrom
abdelrahman1234567:scroll_end

Conversation

@abdelrahman1234567
Copy link
Copy Markdown
Contributor

@abdelrahman1234567 abdelrahman1234567 commented Aug 19, 2025

This change implements the scrollend event. Since there is no support for asynchronous / smooth scrolling, with this change all scroll events simply send a scrollend event in a way that looks a bit like what the specification says. Note that there are currently some serious issues (w3c/csswg-drafts#8396) with specification, so things are still a bit weird overall.

In addition, this organizes and reduces duplication in some of the existing scroll event code.

Testing: This causes some WPT tests to start passing or to stop timing out.

@mrobinson mrobinson changed the title script: Implementing scrollend event script: Implement the scrollend event Aug 19, 2025
Comment thread components/script/dom/window.rs Outdated
Comment thread components/script/dom/window.rs Outdated
Comment on lines +1553 to +1561

let scroll_offset = self.scroll_offset();
// Step 3
let left = x + scroll_offset.x as f64;
// Step 4
let top = y + scroll_offset.y as f64;

// Step 5
self.scroll(left, top, options.parent.behavior);
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.

If you are adding more step numbers, please paste the contents of the step text into the comment here as well. You should be able to find other examples as well.

Comment on lines +133 to +145

/// <https://html.spec.whatwg.org/multipage/#dom-focus>
fn Focus(&self, options: &FocusOptions) {
let document = self.element.owner_document();
document.request_focus_with_options(
Some(&self.element),
FocusInitiator::Local,
FocusOptions {
preventScroll: options.preventScroll,
},
CanGc::note(),
);
}
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.

Can this change be split out into another PR?

Comment thread components/script/dom/element.rs Outdated
Comment on lines +1007 to +1009
if ancestor.is::<Document>() {
true // Document viewport is always in the containing block chain
} else if ancestor.is::<Element>() {
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.

Please use an early return here instead of a bit nested if statement.

Comment thread components/script/dom/element.rs Outdated
Comment on lines +1038 to +1040
} else {
false
}
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.

Please use an early return at the top of the function.

Comment on lines +421 to +433
/// <https://html.spec.whatwg.org/multipage/#dom-focus>
fn Focus(&self, options: &FocusOptions, can_gc: CanGc) {
// TODO: Mark the element as locked for focus and run the focusing steps.
// https://html.spec.whatwg.org/multipage/#focusing-steps
// <https://html.spec.whatwg.org/multipage/#focusing-steps>
let document = self.owner_document();
document.request_focus(Some(self.upcast()), FocusInitiator::Local, can_gc);
document.request_focus_with_options(
Some(self.upcast()),
FocusInitiator::Local,
FocusOptions {
preventScroll: options.preventScroll,
},
can_gc,
);
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.

Can this change to the way that Focus works be moved to a separate PR?

Comment thread components/script/dom/document.rs Outdated
Comment thread components/script/dom/document.rs Outdated
Comment thread components/script/dom/window.rs Outdated
@abdelrahman1234567
Copy link
Copy Markdown
Contributor Author

@mrobinson this PR is rebased on #38754 and #38495, still labeled as draft PR waiting for the other two PRs to be merged first. You can check the implementation of this certain PR in f4522a0

@abdelrahman1234567 abdelrahman1234567 force-pushed the scroll_end branch 2 times, most recently from 3972feb to 79298d3 Compare September 9, 2025 11:05
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Sep 9, 2025
@abdelrahman1234567 abdelrahman1234567 marked this pull request as ready for review September 9, 2025 11:05
@abdelrahman1234567
Copy link
Copy Markdown
Contributor Author

CC: @stevennovaryo @yezhizhen

Copy link
Copy Markdown
Member

@stevennovaryo stevennovaryo left a comment

Choose a reason for hiding this comment

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

Looking good! There are several preliminary comments.

I am wondering whether there are more passes from WPTs with testdriver to check the scrollend event from embedder. You can run testdriver WPTs with --product servodriver.

};

document.handle_element_scroll_event(&element);
document.handle_element_scrollend_event(&element);
Copy link
Copy Markdown
Member

@stevennovaryo stevennovaryo Sep 12, 2025

Choose a reason for hiding this comment

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

It should be noted here that we should consider touch panning and trackpad scrolling as well in the future, since the behavior is not exactly the same as instant scroll.

User gestures like touch panning or trackpad scrolling aren’t complete until pointers or keys have released.

Comment thread components/script/dom/document.rs Outdated
Comment on lines +1651 to +1658
/// Whenever scrolling is completed, the user agent must run these steps:
/// <https://drafts.csswg.org/cssom-view/#scrolling-events>
///
/// Note: This function should be called when all scrolling operations are complete.
/// For each scrolling box, the corresponding handle_viewport_scrollend_event or
/// handle_element_scrollend_event should have been called beforehand to populate
/// the pending_scrollend_event_targets list.
pub(crate) fn handle_scroll_complete_event(&self, can_gc: CanGc) {
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.

There are a recent consensus that we should push all of any pending scroll event (includes scrollend) to a single queue and dispatch them in the next tick. See w3c/csswg-drafts#11164.

The current scrollend event in spec does seems a bit too complicated and not in sync with the scroll event after all.

@Loirooriol Loirooriol added the T-linux-wpt Do a try run of the WPT label Sep 18, 2025
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Sep 18, 2025
@github-actions
Copy link
Copy Markdown

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

@github-actions
Copy link
Copy Markdown

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

Flaky unexpected result (35)
  • OK /IndexedDB/idbobjectstore_getAll-options.tentative.any.html
    • PASS [expected FAIL] subtest: Get all values with invalid query keys
  • OK /IndexedDB/idbobjectstore_getAll-options.tentative.any.worker.html
    • PASS [expected FAIL] subtest: Get all values with invalid query keys
  • OK /IndexedDB/idbobjectstore_getAll.any.html (#39276)
    • PASS [expected FAIL] subtest: Single item get
    • PASS [expected FAIL] subtest: Get bound range
    • PASS [expected FAIL] subtest: Get bound range with maxCount
    • PASS [expected FAIL] subtest: Non existent key
    • PASS [expected FAIL] subtest: Query with empty range where first key &lt; upperBound
    • PASS [expected FAIL] subtest: Query with empty range where lowerBound &lt; last key
  • OK /IndexedDB/idbobjectstore_getAll.any.worker.html
    • PASS [expected FAIL] subtest: Single item get
    • PASS [expected FAIL] subtest: Get bound range
    • PASS [expected FAIL] subtest: Get bound range with maxCount
    • PASS [expected FAIL] subtest: Non existent key
    • PASS [expected FAIL] subtest: Query with empty range where first key &lt; upperBound
    • PASS [expected FAIL] subtest: Query with empty range where lowerBound &lt; last key
  • OK /IndexedDB/idbobjectstore_getAllKeys-options.tentative.any.html
    • PASS [expected FAIL] subtest: Get all keys with invalid query keys
  • OK /IndexedDB/idbobjectstore_getAllKeys-options.tentative.any.worker.html
    • PASS [expected FAIL] subtest: Get all keys with invalid query keys
  • OK /IndexedDB/idbobjectstore_getAllKeys.any.html
    • PASS [expected FAIL] subtest: Single item get
    • PASS [expected FAIL] subtest: Single item get (generated key)
    • PASS [expected FAIL] subtest: Get bound range
    • PASS [expected FAIL] subtest: Get bound range with maxCount
    • PASS [expected FAIL] subtest: Get bound range (generated) with maxCount
    • PASS [expected FAIL] subtest: Non existent key
    • PASS [expected FAIL] subtest: Query with empty range where first key &lt; upperBound
    • PASS [expected FAIL] subtest: Query with empty range where lowerBound &lt; last key
  • OK /IndexedDB/idbobjectstore_getAllKeys.any.worker.html
    • PASS [expected FAIL] subtest: Single item get
    • PASS [expected FAIL] subtest: Single item get (generated key)
    • PASS [expected FAIL] subtest: Get bound range
    • PASS [expected FAIL] subtest: Get bound range with maxCount
    • PASS [expected FAIL] subtest: Get bound range (generated) with maxCount
    • PASS [expected FAIL] subtest: Non existent key
    • PASS [expected FAIL] subtest: Query with empty range where first key &lt; upperBound
    • PASS [expected FAIL] subtest: Query with empty range where lowerBound &lt; last key
  • FAIL [expected PASS] /css/CSS2/css1/c412-hz-box-000.xht
  • OK /css/css-cascade/layer-cssom-order-reverse.html (#36094)
    • FAIL [expected PASS] subtest: Delete layer invalidates @font-face

      assert_equals: expected "220px" but got "133px"
      

  • FAIL [expected PASS] /css/css-fonts/font-palette-29.html
  • FAIL [expected PASS] /css/css-tables/paint/table-border-paint-caption-change.html (#38036)
  • OK /custom-elements/form-associated/form-disabled-callback.html (#38843)
    • PASS [expected FAIL] subtest: A disabled form-associated custom element should not submit an entry for it
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.tentative.https.window.html (#35176)
  • 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
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html (#34819)
    • PASS [expected FAIL] subtest: form submission
  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.html (#29056)
    • PASS [expected FAIL] subtest: Cross-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"
      

  • CRASH [expected OK] /html/browsers/the-window-object/open-close/open-features-non-integer-innerwidth.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]
      }"
      

  • TIMEOUT [expected OK] /html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.html (#30970)
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html (#28259)
    • FAIL [expected TIMEOUT] subtest: Autofocus elements in top-level browsing context's documents with empty fragments should work.

      assert_not_equals: got disallowed value Element node &lt;body&gt;
      &lt;div id="anchor1"&gt;&lt;/div&gt;
      &lt;input autofocus=""&gt;
      
      &lt;/b...
      

  • 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
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus should support autofocus
    • NOTRUN [expected TIMEOUT] subtest: Host element with delegatesFocus including no focusable descendants should be skipped
  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html (#32697)
    • NOTRUN [expected FAIL] subtest: Navigating iframe loading='lazy' and then setting src: location.replace
  • OK /html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html (#32595)
    • FAIL [expected PASS] subtest: Reloading iframe loading='lazy' before it is loaded: location.reload

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

  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html (#24057)
  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (#24066)
  • OK /html/semantics/forms/form-submission-0/urlencoded2.window.html (#28687)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: Basic test (normal form)
  • OK /html/semantics/forms/historical.html (#28568)
    • PASS [expected FAIL] subtest: &lt;input name=isindex&gt; should not be supported
  • OK [expected CRASH] /html/semantics/forms/the-fieldset-element/disabled-003.html (#31730)
  • FAIL [expected PASS] /png/apng/fcTL-dispose-previous-first.html
  • OK /preload/preload-invalid-resources.html (#39091)
    • FAIL [expected PASS] subtest: Preloading an invalid image (missing) should preload and not re-fetch

      assert_equals: /nothing.png expected 1 but got 2
      

  • OK /preload/preload-xhr.html (#39092)
    • PASS [expected FAIL] subtest: Make an XHR request immediately after creating link rel=preload.
  • OK /trusted-types/trusted-types-navigation.html?21-25 (#38997)
    • PASS [expected FAIL] subtest: Navigate a window via form-submission with javascript:-urls in enforcing mode.
  • OK /webdriver/tests/classic/take_element_screenshot/iframe.py (#36715)
    • FAIL [expected PASS] subtest: test_source_origin[cross_origin]

      AssertionError: assert 'iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFaklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a/aNlddddXzQ+Wqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhD+ETibBx2wK4avAAAAAElFTkSuQmCC' == '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V1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC4Jsm6uuuur5oXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YJQueqqq14QKlddddULQuWqq656QahcddVVLwiVq6666gWhctVVV70gVK666qoXhMpVV131glC56qqrXhAqV1111QtC5aqrrnpBqFx11VUvCJWrrrrqBaFy1VVXvSBUrrrqqheEylVXXfWCULnqqqteECpXXXXVC0LlqquuekGoXHXVVS8IlauuuuoFoXLVVVe9IFSuuuqqF4TKVVdd9YLwjw2M8o0UG8LnAAAAAElFTkSuQmCC'
      

Stable unexpected results that are known to be intermittent (24)
  • FAIL [expected PASS] /_mozilla/css/iframe/hide_and_show.html (#15265)
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • 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 /content-security-policy/frame-ancestors/frame-ancestors-path-ignored.window.html (#36468)
    • PASS [expected FAIL] subtest: A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.
  • TIMEOUT /content-security-policy/inheritance/location-reload.html (#38983)
    • FAIL [expected PASS] subtest: location.reload() of empty iframe.

      assert_equals: Image should be blocked by CSP after reload. expected "img blocked" but got "img loaded"
      

  • OK /css/css-fonts/generic-family-keywords-003.html (#38994)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted generic(nastaliq) (drawing text in a canvas)

      assert_equals: quoted generic(nastaliq) matches  @font-face rule expected 125 but got 40
      

  • FAIL [expected PASS] /css/css-grid/grid-items/grid-auto-margin-and-replaced-item-001.html (#37162)
  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-dest
    • PASS [expected FAIL] subtest: sec-fetch-user
  • OK /html/browsers/browsing-the-web/navigating-across-documents/008.html (#24456)
    • FAIL [expected PASS] subtest: Link with onclick form submit to javascript url and href navigation

      assert_equals: expected "href" but got "click"
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.html (#29049)
    • FAIL [expected PASS] subtest: Same-origin navigation started from unload handler must be ignored

      assert_equals: expected "?pass" but got "?fail"
      

  • 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])
      

  • PASS [expected FAIL] /html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html (#30063)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html (#24066)
  • OK /html/semantics/forms/form-submission-0/multipart-formdata.window.html (#28725)
    • PASS [expected FAIL] subtest: multipart/form-data: double quote in value (normal form)
  • OK /preload/preload-error.sub.html (#37177)
    • FAIL [expected PASS] subtest: success (fetch): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.xml?label=fetch should be loaded expected a number greater than 0 but got 0
      

  • PASS [expected FAIL] /shadow-dom/shadow-style-invalidation-vw-units.html (#38468)
  • OK /trusted-types/trusted-types-navigation.html?01-05 (#38975)
    • PASS [expected FAIL] subtest: Navigate a window via anchor with javascript:-urls in enforcing mode.
    • FAIL [expected PASS] subtest: Navigate a window via anchor with javascript:-urls in report-only mode.

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

    • PASS [expected FAIL] subtest: Navigate a frame via anchor with javascript:-urls in enforcing mode.
  • TIMEOUT [expected CRASH] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
    • TIMEOUT [expected FAIL] subtest: Navigate a frame via anchor with javascript:-urls w/ default policy in report-only mode.

      Test timed out
      

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

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

    • TIMEOUT [expected FAIL] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in enforcing mode.

      Test timed out
      

  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?31-35 (#38034)
    • PASS [expected TIMEOUT] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in report-only mode.
    • FAIL [expected NOTRUN] subtest: Navigate a window via form-submission 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 form-submission 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!\""
      

    • FAIL [expected NOTRUN] subtest: Navigate a window via form-submission with javascript:-urls w/ a default policy making the URL invalid in enforcing mode.

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

  • ERROR [expected OK] /webxr/render_state_update.https.html (#27535)
  • ERROR [expected OK] /workers/constructors/Worker/Worker-constructor.html (#22991)

@github-actions
Copy link
Copy Markdown

✨ Try run (#17835071391) succeeded.

@mrobinson mrobinson force-pushed the scroll_end branch 2 times, most recently from 8b10377 to 8ac49a1 Compare September 23, 2025 14:30
Implementing and handling scrollend even based on spec: https://drafts.csswg.org/cssom-view/#eventdef-document-scrollend

Signed-off-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
@mrobinson
Copy link
Copy Markdown
Member

I've revived this one. Sorry for letting it get stale.

@stevennovaryo Do you mind taking a look?

@mrobinson mrobinson added the T-linux-wpt Do a try run of the WPT label Mar 19, 2026
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Mar 19, 2026
@github-actions
Copy link
Copy Markdown

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

@github-actions
Copy link
Copy Markdown

⚠️ Try run (#23302663998) failed!

@mrobinson mrobinson added the T-linux-wpt Do a try run of the WPT label Mar 19, 2026
@github-actions
Copy link
Copy Markdown

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

@github-actions
Copy link
Copy Markdown

⚠️ Try run (#23303098292) failed!

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
@mrobinson mrobinson added the T-linux-wpt Do a try run of the WPT label Mar 19, 2026
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Mar 19, 2026
@github-actions
Copy link
Copy Markdown

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

@github-actions
Copy link
Copy Markdown

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

Flaky unexpected result (21)
  • OK /_mozilla/mozilla/getBoundingClientRect.html (#39668)
    • FAIL [expected PASS] subtest: getBoundingClientRect 1

      assert_equals: expected 62 but got 60.35
      

  • OK /beacon/beacon-basic.https.window.html (#41723)
    • FAIL [expected PASS] subtest: Payload size restriction should be accumulated: type = arraybuffer

      assert_false: expected false got true
      

  • FAIL [expected PASS] /css/css-backgrounds/background-size-041.html
  • 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...
  • FAIL [expected PASS] /css/css-ui/webkit-appearance-meter-001.html
  • OK /dom/nodes/moveBefore/iframe-document-preserve.window.html (#43152)
    • FAIL [expected PASS] subtest: moveBefore(): cross-origin iframe is preserved: remove self via innerHTML

      assert_equals: iframe does not fire a second load event expected 1 but got 0
      

  • 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)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Cross-site
  • OK /html/browsers/history/the-history-interface/traverse_the_history_2.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 3 but got 1 (expected array [6, 3] got [6, 1])
      

  • OK /html/browsers/history/the-history-interface/traverse_the_history_3.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • OK /html/semantics/embedded-content/media-elements/seeking/seek-to-max-value.htm (#40626)
    • FAIL [expected PASS] subtest: seek to Number.MAX_VALUE

      assert_equals: currentTime after setting expected 5.153333333 but got 0
      

  • 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
      

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

      Test timed out
      

  • CRASH [expected OK] /html/webappapis/timers/cleartimeout-clearinterval.any.worker.html
  • OK /pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html (#42813)
    • PASS [expected FAIL] subtest: After a touchstart listener moves the target to different position, touch events should be fired on the pointerdown target, but pointer events should be fired on the pointerdown target parent
    • PASS [expected FAIL] subtest: After a touchstart listener moves the target to different position, touchmove event should be fired on the pointerdown target parent
  • OK /resource-timing/test_resource_timing.html (#25720)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (link)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest)
  • OK /resource-timing/test_resource_timing.https.html (#25216)
    • FAIL [expected PASS] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest)

      assert_equals: expected 55.69999999999999 but got 55.7
      

  • 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?06-10 (#37920)
    • PASS [expected FAIL] subtest: Navigate a frame via anchor with javascript:-urls in report-only mode.
  • 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
  • OK [expected ERROR] /webxr/render_state_update.https.html (#27535)
Stable unexpected results that are known to be intermittent (15)
  • OK /FileAPI/url/url-with-fetch.any.html (#21517)
    • PASS [expected FAIL] subtest: Revoke blob URL after calling fetch, fetch should succeed
  • 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 [expected TIMEOUT] /content-security-policy/inheritance/document-write-iframe.html (#41195)
    • PASS [expected TIMEOUT] subtest: document.open() keeps inherited CSPs on transient about:blank.
  • OK /css/css-fonts/generic-family-keywords-003.html (#38994)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted sans-serif (drawing text in a canvas)

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

    • 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
      

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

      assert_equals: quoted generic(fangsong) matches  @font-face rule expected 125 but got 40
      

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

      assert_equals: quoted generic(nastaliq) matches  @font-face rule expected 125 but got 40
      

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

      assert_equals: unquoted ui-serif does not match @font-face rule expected 40 but got 125
      

    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted ui-sans-serif (drawing text in a canvas)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted ui-monospace (drawing text in a canvas)
  • ERROR [expected OK] /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 /fetch/metadata/window-open.https.sub.html (#40339)
    • FAIL [expected PASS] subtest: Same-site window, forced, reloaded

      The operation is insecure.
      

  • 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)&amp;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"
      

  • 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 [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html (#28259)
    • FAIL [expected TIMEOUT] subtest: Autofocus elements in top-level browsing context's documents with "top" fragments should work.

      assert_not_equals: got disallowed value Element node &lt;body&gt;&lt;/body&gt;
      

  • 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 TIMEOUT] subtest: Non-HTMLElement should not support autofocus
  • OK /resource-timing/buffer-full-add-then-clear.html (#40819)
    • FAIL [expected PASS] subtest: Test that if the buffer is cleared after entries were added to the secondary buffer, those entries make it into the primary one

      assert_equals: Number of entries does not match the expected value. expected 3 but got 0
      

  • 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 /webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html (#22849)
    • FAIL [expected PASS] subtest: buffer-stitching-1

      assert_approx_equals: Stitched sine‑wave buffers at sample rate 44100 sample[16680] |1.6908711586438585e-7 - 0.47198569774627686| = 0.471985528659161 &gt; 0.000090957 expected 0.47198569774627686 +/- 0.000090957 but got 1.6908711586438585e-7
      

Stable unexpected results (20)
  • OK [expected TIMEOUT] /css/css-overflow/scroll-markers/targeted-scroll-marker-selection.tentative.html
    • FAIL [expected TIMEOUT] subtest: scroll-marker of target (idx 1) of scrollIntoView is selected

      assert_equals: marker 15 should be unselected. expected "rgb(255, 0, 0)" but got ""
      

    • FAIL [expected NOTRUN] subtest: scroll-marker of target (idx 14) of scrollIntoView is selected

      assert_equals: marker 15 should be unselected. expected "rgb(255, 0, 0)" but got ""
      

    • FAIL [expected NOTRUN] subtest: scroll-marker of parent of target of scrollIntoView is selected

      assert_equals: marker 15 should be unselected. expected "rgb(255, 0, 0)" but got ""
      

    • FAIL [expected NOTRUN] subtest: scroll-marker of earlier sibling of target of scrollIntoView is selected

      assert_equals: marker 15 should be unselected. expected "rgb(255, 0, 0)" but got ""
      

  • TIMEOUT [expected OK] /css/cssom-view/scrollIntoView-smooth.html
    • TIMEOUT [expected PASS] subtest: Smooth scrollIntoView should scroll the element to the 'nearest' position

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Smooth scrollIntoView should scroll the element to the 'start' position
    • NOTRUN [expected PASS] subtest: Smooth scrollIntoView should scroll the element to the 'center' position
    • NOTRUN [expected PASS] subtest: Smooth scrollIntoView should scroll the element to the 'end' position
  • OK /css/cssom-view/smooth-scroll-nonstop.html
    • PASS [expected FAIL] subtest: noop scrollIntoView doesn't interrupt ongoing smooth scroll.
  • OK [expected TIMEOUT] /css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html
    • PASS [expected TIMEOUT] subtest: Smooth scroll to hash fragment (on pageload) alongside smooth scrollIntoView runs to completion.
    • PASS [expected NOTRUN] subtest: Smooth scroll to hash fragment (on click) alongside smooth scrollIntoView runs to completion.
  • OK [expected TIMEOUT] /css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html
    • PASS [expected TIMEOUT] subtest: scrollIntoView is not interrupted by unrelated gesture scroll
  • OK [expected TIMEOUT] /dom/events/scrolling/scrollend-event-fired-after-snap.html
    • FAIL [expected TIMEOUT] subtest: Tests that scrollend is fired after scroll snap animation completion.

      assert_false: expected false got true
      

    • FAIL [expected NOTRUN] subtest: Tests that scrollend is fired after fling snap animation completion.

      assert_false: expected false got true
      

  • OK /dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html?include=subframe-scrollBy-auto
    • PASS [expected FAIL] subtest: Tests scrollend event for calling scrollBy with behavior 'auto' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html?include=subframe-scrollBy-smooth
    • PASS [expected FAIL] subtest: Tests scrollend event for calling scrollBy with behavior 'smooth' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html?include=subframe-scrollTo-auto
    • PASS [expected FAIL] subtest: Tests scrollend event for calling scrollTo with behavior 'auto' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html?include=subframe-scrollTo-smooth
    • PASS [expected FAIL] subtest: Tests scrollend event for calling scrollTo with behavior 'smooth' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scroll-attr-change.html?include=subframe-scrollLeft-auto
    • PASS [expected FAIL] subtest: Tests scrollend event for [scrollLeft] behavior:'auto' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scroll-attr-change.html?include=subframe-scrollLeft-smooth
    • PASS [expected FAIL] subtest: Tests scrollend event for [scrollLeft] behavior:'smooth' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scroll-attr-change.html?include=subframe-scrollTop-auto
    • PASS [expected FAIL] subtest: Tests scrollend event for [scrollTop] behavior:'auto' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scroll-attr-change.html?include=subframe-scrollTop-smooth
    • PASS [expected FAIL] subtest: Tests scrollend event for [scrollTop] behavior:'smooth' on subframe.
  • OK [expected TIMEOUT] /dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=nested-scrollIntoView
    • PASS [expected TIMEOUT] subtest: Tests scrollend event for nested scrollIntoView.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-end-block-end-behavior-auto
    • PASS [expected FAIL] subtest: Tests scrollend event for scrollIntoView with behavior 'auto' on subframe.
  • OK /dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-start-block-start-behavior-smooth
    • PASS [expected FAIL] subtest: Tests scrollend event for scrollIntoView with behavior 'smooth' on subframe.
  • ERROR [expected TIMEOUT] /dom/events/scrolling/scrollend-event-fired-to-document.html
  • TIMEOUT /dom/events/scrolling/scrollend-event-handler-content-attributes.html
    • PASS [expected TIMEOUT] subtest: Tests scrollend event is handled by event handler content attribute.
    • PASS [expected NOTRUN] subtest: Tests scrollend event is not fired to document body event handler content attribute.
    • TIMEOUT [expected NOTRUN] subtest: Tests scrollend event is fired to document event handler property

      Test timed out
      

  • OK [expected TIMEOUT] /dom/events/scrolling/scrollend-event-not-fired-after-removing-scroller.tentative.html
    • FAIL [expected PASS] subtest: No scrollend is received after removing parent div

      promise_test: Unhandled rejection with value: "Condition is not true anymore."
      

    • FAIL [expected PASS] subtest: No scrollend is received after removing scrolling element

      promise_test: Unhandled rejection with value: "Condition is not true anymore."
      

    • PASS [expected TIMEOUT] subtest: scrollend is received after removing descendant div

@github-actions
Copy link
Copy Markdown

⚠️ Try run (#23304137393) failed!

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
@mrobinson mrobinson added the T-linux-wpt Do a try run of the WPT label Mar 20, 2026
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Mar 20, 2026
@github-actions
Copy link
Copy Markdown

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

@github-actions
Copy link
Copy Markdown

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

Flaky unexpected result (34)
  • 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 22 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...
  • OK /content-security-policy/frame-ancestors/frame-ancestors-path-ignored.window.html (#36468)
    • PASS [expected FAIL] subtest: A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.
  • OK [expected TIMEOUT] /content-security-policy/inheritance/document-write-iframe.html (#41195)
    • PASS [expected TIMEOUT] subtest: document.open() keeps inherited CSPs on transient about:blank.
  • OK /css/css-animations/event-order.tentative.html (#39000)
    • PASS [expected FAIL] subtest: Same events on pseudo-elements follow the prescribed order
  • FAIL [expected PASS] /css/css-backgrounds/border-image-repeat-space-9.html
  • 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...
  • ERROR [expected OK] /fetch/fetch-later/quota/same-origin-iframe/accumulated-oversized-payload.https.window.html (#41705)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/sandboxed-iframe.https.window.html (#41704)
  • CRASH [expected OK] /html/anonymous-iframe/embedding.tentative.https.window.html?2-2
  • ERROR [expected TIMEOUT] /html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html (#40387)
  • OK /html/browsers/history/the-history-interface/traverse_the_history_3.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • TIMEOUT /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • PASS [expected TIMEOUT] subtest: Non-HTMLElement should not support autofocus
    • TIMEOUT [expected NOTRUN] subtest: Host element with delegatesFocus should support autofocus

      Test timed out
      

  • 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 /html/semantics/embedded-content/media-elements/media_fragment_seek.html (#24114)
    • FAIL [expected PASS] subtest: Video should seek to time specified in media fragment syntax

      assert_equals: expected 1 but got 0
      

  • 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.
  • CRASH [expected ERROR] /html/semantics/forms/the-select-element/customizable-select/select-appearance-button-after-span.html
  • 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"])
      

  • 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-blend-source-solid.html (#41560)
  • FAIL [expected PASS] /png/apng/fcTL-dispose-previous-final.html (#41837)
  • 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"
      

  • 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.
  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?31-35 (#38034)
    • PASS [expected TIMEOUT] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in report-only mode.
    • FAIL [expected NOTRUN] subtest: Navigate a window via form-submission 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 form-submission 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!\""
      

    • FAIL [expected NOTRUN] subtest: Navigate a window via form-submission with javascript:-urls w/ a default policy making the URL invalid in enforcing mode.

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

  • OK /webdriver/tests/classic/element_send_keys/events.py
    • FAIL [expected PASS] subtest: test_file_upload

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

  • OK /webdriver/tests/classic/find_elements/user_prompts.py
    • FAIL [expected PASS] subtest: test_accept[alert-None]

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

  • OK /webdriver/tests/classic/get_page_source/user_prompts.py
    • FAIL [expected PASS] subtest: test_accept[alert-None]

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

  • OK /webdriver/tests/classic/maximize_window/user_prompts.py
    • FAIL [expected PASS] subtest: test_accept[alert-None]

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

  • 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
  • OK [expected ERROR] /webxr/render_state_update.https.html (#27535)
  • CRASH [expected OK] /webxr/xrFrame_lifetime.https.html
  • ERROR [expected OK] /workers/baseurl/alpha/sharedworker-in-worker.html (#21315)
Stable unexpected results that are known to be intermittent (14)
  • OK /FileAPI/url/url-with-fetch.any.html (#21517)
    • PASS [expected FAIL] subtest: Revoke blob URL after calling fetch, fetch should succeed
  • 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-fonts/generic-family-keywords-003.html (#38994)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted sans-serif (drawing text in a canvas)

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

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

      assert_equals: quoted generic(khmer-mul) matches  @font-face rule expected 125 but got 40
      

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

      assert_equals: quoted generic(nastaliq) matches  @font-face rule expected 125 but got 40
      

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

      assert_equals: unquoted ui-serif does not match @font-face rule expected 40 but got 125
      

  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-mode
    • PASS [expected FAIL] subtest: sec-fetch-dest
  • ERROR [expected OK] /fetch/metadata/window-open.https.sub.html (#40339)
  • 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/history/the-history-interface/traverse_the_history_2.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 3 but got 1 (expected array [6, 3] got [6, 1])
      

  • OK /html/browsers/history/the-history-interface/traverse_the_history_4.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])
      

  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html (#28259)
    • FAIL [expected TIMEOUT] subtest: Autofocus elements in top-level browsing context's documents with "top" fragments should work.

      assert_not_equals: got disallowed value Element node &lt;body&gt;&lt;/body&gt;
      

  • CRASH [expected OK] /resource-timing/render-blocking-status-link.html (#41664)
  • OK /resource-timing/test_resource_timing.https.html (#25216)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (iframe)
    • FAIL [expected PASS] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest)

      assert_equals: expected 57.44999999999999 but got 57.44
      

  • OK /visual-viewport/resize-event-order.html (#41981)
    • PASS [expected FAIL] subtest: Popup: DOMWindow resize fired before VisualViewport.
  • OK /webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html (#22849)
    • FAIL [expected PASS] subtest: buffer-stitching-1

      assert_approx_equals: Stitched sine‑wave buffers at sample rate 44100 sample[16680] |-2.390188589390869e-24 - 0.47198569774627686| = 0.47198569774627686 &gt; 0.000090957 expected 0.47198569774627686 +/- 0.000090957 but got -2.390188589390869e-24
      

@github-actions
Copy link
Copy Markdown

✨ Try run (#23338729968) succeeded.

@servo-highfive servo-highfive removed the S-awaiting-review There is new code that needs to be reviewed. label Mar 20, 2026
@mrobinson mrobinson added this pull request to the merge queue Mar 20, 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 Mar 20, 2026
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Mar 20, 2026
@servo-highfive servo-highfive added S-tests-failed The changes caused existing tests to fail. and removed S-awaiting-merge The PR is in the process of compiling and running tests on the automated CI. labels Mar 20, 2026
@yezhizhen yezhizhen added this pull request to the merge queue Mar 20, 2026
@servo-highfive servo-highfive added S-awaiting-merge The PR is in the process of compiling and running tests on the automated CI. and removed S-tests-failed The changes caused existing tests to fail. labels Mar 20, 2026
Merged via the queue into servo:main with commit 76e1a09 Mar 20, 2026
74 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 Mar 20, 2026
niyabits pushed a commit to niyabits/servo that referenced this pull request Mar 21, 2026
This change implements the `scrollend` event. Since there is no support
for asynchronous / smooth scrolling, with this change all `scroll`
events simply send a `scrollend` event in a way that looks a bit like
what the specification says. Note that there are currently some serious
issues (w3c/csswg-drafts#8396) with specification, so things are still a
bit weird overall.

In addition, this organizes and reduces duplication in some of the
existing scroll event code.

Testing: This causes some WPT tests to start passing or to stop timing
out.

---------

Signed-off-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
Signed-off-by: Niya Gupta <niyabits@gmail.com>
Gae24 pushed a commit to Gae24/servo that referenced this pull request Mar 26, 2026
This change implements the `scrollend` event. Since there is no support
for asynchronous / smooth scrolling, with this change all `scroll`
events simply send a `scrollend` event in a way that looks a bit like
what the specification says. Note that there are currently some serious
issues (w3c/csswg-drafts#8396) with specification, so things are still a
bit weird overall.

In addition, this organizes and reduces duplication in some of the
existing scroll event code.

Testing: This causes some WPT tests to start passing or to stop timing
out.

---------

Signed-off-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
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.

6 participants