Skip to content

webdriver: Add touch support for all platforms#41067

Merged
yezhizhen merged 4 commits intoservo:mainfrom
yezhizhen:webdriver-touch
Dec 5, 2025
Merged

webdriver: Add touch support for all platforms#41067
yezhizhen merged 4 commits intoservo:mainfrom
yezhizhen:webdriver-touch

Conversation

@yezhizhen
Copy link
Copy Markdown
Member

@yezhizhen yezhizhen commented Dec 5, 2025

Some mobile websites only have touch event listeners, but not any for mouse events. We add native touch support for "element click", for Android/OHOS. We are finally utilizing subtype and can remove the dead_code macro for it: we dispatch action based on the subtype given, which has impact for Perform Actions on all platforms.

Testing:

  1. Tested on OHOS for a normal webpage, plus a special webpage that only has touch event listener.
  2. Desktop: Previously, we always ignore the requested of pointer subtype and dispatch the mouse. All 138 stable unexpected test actually never worked, and now crash due to "Got a touchmove event for a non-active touch point" since we can dispatch touch now. I plan to improve this and make it work soon!

Fixes: The step 4 of #41042. We still need to fix some bugs of spec, and wait for resolution.

TODO later: When we have touch simulation for Desktop, "Element click" should also dispatch pointer touch.

@yezhizhen yezhizhen requested a review from xiaochengh December 5, 2025 07:56
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Dec 5, 2025
@yezhizhen yezhizhen added the T-linux-wpt Do a try run of the WPT label Dec 5, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Dec 5, 2025
@yezhizhen yezhizhen added T-linux-wpt Do a try run of the WPT T-ohos Do a try run on OpenHarmony labels Dec 5, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

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

@github-actions github-actions bot removed T-linux-wpt Do a try run of the WPT T-ohos Do a try run on OpenHarmony labels Dec 5, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

🔨 Triggering try run (#19956497303) for Linux (WPT), OpenHarmony

@jschwe
Copy link
Copy Markdown
Member

jschwe commented Dec 5, 2025

Could this get an automated test to prevent future regressions with a simple demo page that only has a touch handler (is there no wpt test already covering this)?

@yezhizhen
Copy link
Copy Markdown
Member Author

yezhizhen commented Dec 5, 2025

Could this get an automated test to prevent future regressions with a simple demo page that only has a touch handler (is there no wpt test already covering this)?

Maybe later after this PR.

Signed-off-by: Euclid Ye <[email protected]>
@yezhizhen yezhizhen added the T-ohos Do a try run on OpenHarmony label Dec 5, 2025
@github-actions github-actions bot removed the T-ohos Do a try run on OpenHarmony label Dec 5, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

🔨 Triggering try run (#19956792916) for OpenHarmony

@yezhizhen
Copy link
Copy Markdown
Member Author

yezhizhen commented Dec 5, 2025

is there no wpt test already covering this

I don't think there is for "element click", as it is not supported by any vendor yet and is under ongoing discussion in W3C.

But there are for "Perform actions". I haven't supported it yet, which would be in a future PR. It is used less frequently but still important.

@yezhizhen yezhizhen marked this pull request as draft December 5, 2025 08:24
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

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

Flaky unexpected result (33)
  • TIMEOUT /FileAPI/url/url-in-tags-revoke.window.html (#19978)
    • TIMEOUT [expected PASS] subtest: Fetching a blob URL immediately before revoking it works in &lt;script&gt; tags.

      Test timed out
      

  • OK /IndexedDB/idbfactory_open.any.html
    • FAIL [expected PASS] subtest: Calling open() with version argument 1.5 should not throw.

      assert_equals: version expected 1 but got 9007199254740991
      

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

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

    • FAIL [expected PASS] subtest: offsetLeft

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

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

      assert_equals: expected 62 but got 60.35
      

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

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

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

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

  • 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 6 more unexpected results...
  • 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 /custom-elements/form-associated/ElementInternals-setFormValue.html (#29174)
    • PASS [expected FAIL] subtest: Single value - empty name exists
    • PASS [expected FAIL] subtest: Single value - Non-empty name exists
  • TIMEOUT /fetch/metadata/generated/css-images.sub.tentative.html (#29047)
    • TIMEOUT [expected PASS] subtest: background-image sec-fetch-user - Not sent to non-trustworthy cross-site destination

      Test timed out
      

  • ERROR [expected OK] /focus/focus-event-after-switching-iframes.sub.html (#40368)
  • CRASH [expected OK] /html/browsers/browsing-the-web/unloading-documents/beforeunload-canceling.html
  • 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/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])
      

  • OK /html/browsers/windows/browsing-context-names/duplicate-name-order.html (#34623)
    • PASS [expected FAIL] subtest: Duplicate name lookup order
  • CRASH [expected TIMEOUT] /html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.w.html
  • OK /html/semantics/embedded-content/media-elements/audio_loop_seek_to_eos.html
    • FAIL [expected PASS] subtest: seeking to the end of looping audio

      promise_test: Unhandled rejection with value: object "TypeError: this argument is not a finite floating-point value"
      

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

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

    • PASS [expected FAIL] subtest: multipart/form-data: single quote in name (normal form)
  • OK /html/semantics/forms/form-submission-0/text-plain.window.html (#28687)
    • FAIL [expected PASS] subtest: text/plain: Basic test (formdata event)

      assert_equals: expected "basic=test\r\n" but got ""
      

    • 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: double quote in value (normal form)
  • CRASH [expected OK] /html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html
  • OK /mixed-content/tentative/autoupgrades/mixed-content-cors.https.sub.html
    • FAIL [expected PASS] subtest: Cross-Origin video should get upgraded even if CORS is set

      assert_equals: Length. Other host expected 1 but got Infinity
      

  • OK /resource-timing/buffer-full-add-then-clear.html (#40819)
    • PASS [expected FAIL] subtest: Test that if the buffer is cleared after entries were added to the secondary buffer, those entries make it into the primary one
  • CRASH [expected OK] /trusted-types/eval-function-constructor.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?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!\""
      

  • CRASH [expected OK] /uievents/click/click_events_on_input.html
  • CRASH [expected OK] /webaudio/the-audio-api/the-audiobuffersourcenode-interface/ctor-audiobuffersource.html
  • OK /webdriver/tests/classic/element_click/events.py
    • FAIL [expected PASS] subtest: test_event_mousemove

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

  • OK /webdriver/tests/classic/get_active_element/get.py
    • ERROR [expected PASS] subtest: test_no_top_browsing_context

      setup error: webdriver.error.NoSuchElementException: no such element (404)
      

  • OK /workers/dedicated-worker-from-blob-url.window.html (#22286)
    • PASS [expected FAIL] subtest: Creating a dedicated worker from a blob URL works immediately before revoking.
Stable unexpected results that are known to be intermittent (20)
  • 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()
  • 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-001.html (#37467)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted generic(fangsong)

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

    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted generic(khmer-mul)

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

  • OK /css/css-fonts/generic-family-keywords-002.html (#40929)
    • PASS [expected FAIL] subtest: font-family: -webkit-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-sans-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-cursive treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-fantasy treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-monospace treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-system-ui treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-math treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • FAIL [expected PASS] subtest: font-family: -webkit-generic(fangsong) treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 50 but got 30
      

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

      assert_equals: expected 50 but got 30
      

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

      assert_equals: expected 50 but got 30
      

    • And 12 more unexpected results...
  • OK /css/css-fonts/generic-family-keywords-003.html (#38994)
    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted cursive (drawing text in a canvas)
  • 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-user
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination

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

    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination
  • OK /fetch/metadata/generated/element-img-environment-change.https.sub.html (#30111)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Cross-Site -&gt; Same-Origin redirect, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-Site -&gt; Same Origin, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-Site -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Same-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Site -&gt; Same-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Site -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - attributes: crossorigin
    • And 4 more unexpected results...
  • OK /fetch/metadata/generated/element-img-environment-change.sub.html (#30111)
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy same-origin destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-dest - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-dest - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-user - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination, no attributes
  • OK /html/browsers/browsing-the-web/navigating-across-documents/005.html (#27062)
    • PASS [expected FAIL] subtest: Link with onclick navigation and href navigation
  • 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/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • PASS [expected NOTRUN] subtest: Non-HTMLElement should not support autofocus
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/update-the-rendering.html (#24145)
    • TIMEOUT [expected FAIL] subtest: "Flush autofocus candidates" should be happen before a scroll event and animation frame callbacks

      Test timed out
      

  • OK /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.html (#33948)
    • 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"
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • FAIL [expected PASS] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd

      assert_true: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd expected true got false
      

  • OK /preload/prefetch-document.html (#37210)
    • FAIL [expected PASS] subtest: different-site document prefetch with 'as=document' should not be consumed

      assert_equals: expected 2 but got 1
      

  • OK /preload/preload-error.sub.html (#37177)
    • PASS [expected FAIL] subtest: 404 (fetch): main
  • TIMEOUT [expected OK] /webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.html (#29053)
    • TIMEOUT [expected PASS] subtest: StorageKey: test 3P about:blank window opened from a 3P iframe

      Test timed out
      

Stable unexpected results (138)
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-body.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-div.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-document.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-root.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-window.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-body.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-div.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-document.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-root.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-window.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-body.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-div.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-document.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-root.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-window.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-body.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-div.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-document.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-root.html
  • CRASH [expected OK] /dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-window.html
  • CRASH [expected TIMEOUT] /dom/events/scrolling/overscroll-event-fired-to-document.tentative.html
  • CRASH [expected TIMEOUT] /dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html
  • CRASH [expected TIMEOUT] /dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html
  • CRASH [expected TIMEOUT] /dom/events/scrolling/overscroll-event-fired-to-window.tentative.html
  • CRASH [expected TIMEOUT] /dom/events/scrolling/scrollend-event-fired-after-snap.html
  • CRASH [expected OK] /html/semantics/interestfor/interestfor-pseudo-element.tentative.html
  • CRASH [expected OK] /html/semantics/popovers/popover-self-invoke.html
  • CRASH [expected TIMEOUT] /html/user-activation/activation-trigger-pointerevent.html?pen
  • CRASH [expected TIMEOUT] /html/user-activation/activation-trigger-pointerevent.html?touch
  • CRASH [expected OK] /pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html?pen
  • CRASH [expected OK] /pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes.https.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes.https.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes_on_redispatch.https.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes_on_redispatch.https.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes_under_load.https.optional.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/coalesced_events_attributes_under_load.https.optional.html?touch
  • CRASH [expected OK] /pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_appended.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_appended.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_appended_interleaved.tentative.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_appended_interleaved.tentative.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_removed.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_removed.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_removed_interleaved.tentative.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_after_target_removed_interleaved.tentative.html?touch
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?mouse
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?mouse-nonstandard
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?mouse-right
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?mouse-right-nonstandard
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?pen
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?pen-nonstandard
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?pen-right
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?pen-right-nonstandard
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?touch
  • CRASH [expected ERROR] /pointerevents/pointerevent_attributes.html?touch-nonstandard
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_auxclick_is_a_pointerevent.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_boundary_events_in_capturing.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_boundary_events_in_capturing.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_capture_touch_and_release_at_got_capture.html
  • CRASH [expected OK] /pointerevents/pointerevent_change-touch-action-onpointerdown_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_click_during_parent_capture.html?pointerType=touch&amp;preventDefault=
  • CRASH [expected OK] /pointerevents/pointerevent_click_during_parent_capture.html?pointerType=touch&amp;preventDefault=pointerdown
  • CRASH [expected OK] /pointerevents/pointerevent_click_during_parent_capture.html?pointerType=touch&amp;preventDefault=touchstart
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_click_is_a_pointerevent.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_click_is_a_pointerevent.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_click_is_a_pointerevent_multiple_clicks.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_click_is_a_pointerevent_multiple_clicks.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_disabled_form_control.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_disabled_form_control.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_element_haspointercapture.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_element_haspointercapture.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_fractional_coordinates.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_iframe-touch-action-none_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_movementxy.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_movementxy.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointercancel_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointercapture_in_frame.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointercapture_in_frame.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointerleave_after_pointercancel_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointerout_after_pointercancel_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointerout_pen.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointerrawupdate_coalesced_events_attributes.https.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_pointerrawupdate_coalesced_events_attributes.https.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_events_to_original_target.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_events_to_original_target.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_onpointercancel_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_pointerup_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_sequence_at_implicit_release_on_click.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_sequence_at_implicit_release_on_click.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_sequence_at_implicit_release_on_drag.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_setpointercapture_pointerup_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_setpointercapture_to_same_element_twice.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_setpointercapture_to_same_element_twice.html?touch
  • CRASH [expected OK] /pointerevents/pointerevent_to_slotted_target.html?pen
  • CRASH [expected OK] /pointerevents/pointerevent_to_slotted_target.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-action-auto-css_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_touch-action-button-none-test_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-inherit_child-none_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-action-modified_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-none-css_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_touch-action-none-on-body-when-style-propagates-to-viewport_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-down-css_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-left-css_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-right-css_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-up-css_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-x-css_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-action-pan-x-pan-y_touch.html
  • CRASH [expected ERROR] /pointerevents/pointerevent_touch-action-pan-y-css_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_touch-action-span-none-test_touch.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-action-table-none-test_touch.html
  • CRASH [expected OK] /pointerevents/pointerevent_touch-adjustment_click_target.html
  • CRASH [expected TIMEOUT] /pointerevents/pointerevent_touch-propagates-when-target-is-video_touch.html
  • CRASH [expected OK] /pointerevents/pointerup_after_pointerdown_target_removed.html?pen
  • CRASH [expected OK] /pointerevents/pointerup_after_pointerdown_target_removed.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/predicted_events_attributes.html?pen
  • CRASH [expected TIMEOUT] /pointerevents/predicted_events_attributes.html?touch
  • CRASH [expected TIMEOUT] /pointerevents/touch-action-with-swipe-dir-change.html?touch
  • CRASH [expected OK] /touch-events/mouseevents-after-touchend.tentative.html
  • CRASH [expected TIMEOUT] /touch-events/multi-touch-interactions.html
  • CRASH [expected TIMEOUT] /touch-events/multi-touch-interfaces.html
  • CRASH [expected TIMEOUT] /touch-events/single-tap-when-touchend-listener-use-sync-xhr.html
  • CRASH [expected TIMEOUT] /touch-events/single-touch-vertical-rl.html
  • TIMEOUT [expected OK] /webdriver/tests/classic/perform_actions/pointer_pen.py
  • TIMEOUT [expected OK] /webdriver/tests/classic/perform_actions/pointer_touch.py

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

🐰 Bencher Report

Branch41067/PR
TestbedHUAWEI Mate 60 Pro

⚠️ WARNING: No Threshold found!

Without a Threshold, no Alerts will ever be generated.

Click here to create a new Threshold
For more information, see the Threshold documentation.
To only post results if a Threshold exists, set the --ci-only-thresholds flag.

Click to view all benchmark results
BenchmarkDataMeasure (units) x 1e3Latencymilliseconds (ms)MemoryBytesscoreMeasure (units)
release/E2E/file:///parse_from_string.html/📈 view plot
⚠️ NO THRESHOLD
1.67 units x 1e3
release/E2E/https://www.google.com/JS/gc-heap/admin📈 view plot
⚠️ NO THRESHOLD
26,752.00
release/E2E/https://www.google.com/JS/gc-heap/decommitted📈 view plot
⚠️ NO THRESHOLD
409,600.00
release/E2E/https://www.google.com/JS/gc-heap/unused📈 view plot
⚠️ NO THRESHOLD
136,016.00
release/E2E/https://www.google.com/JS/gc-heap/used📈 view plot
⚠️ NO THRESHOLD
476,208.00
release/E2E/https://www.google.com/JS/malloc-heap📈 view plot
⚠️ NO THRESHOLD
5,052,991.00
release/E2E/https://www.google.com/JS/non-heap📈 view plot
⚠️ NO THRESHOLD
262,144.00
release/E2E/https://www.google.com/LayoutThread/box-tree📈 view plot
⚠️ NO THRESHOLD
108,771.00
release/E2E/https://www.google.com/LayoutThread/display-list📈 view plot
⚠️ NO THRESHOLD
0.00
release/E2E/https://www.google.com/LayoutThread/font-context📈 view plot
⚠️ NO THRESHOLD
9,288.00
release/E2E/https://www.google.com/LayoutThread/fragment-tree📈 view plot
⚠️ NO THRESHOLD
112.00
release/E2E/https://www.google.com/LayoutThread/stacking-context-tree📈 view plot
⚠️ NO THRESHOLD
14,080.00
release/E2E/https://www.google.com/LayoutThread/stylist📈 view plot
⚠️ NO THRESHOLD
5,504.00
release/E2E/https://www.google.com/image-cache📈 view plot
⚠️ NO THRESHOLD
2,328.00
release/E2E/https://www.google.com/resident-smaps📈 view plot
⚠️ NO THRESHOLD
371,962,675.00
release/E2E/https://www.servo.org/Load📈 view plot
⚠️ NO THRESHOLD
1,077.43 ms
release/E2E/https://www.servo.org/Resident📈 view plot
⚠️ NO THRESHOLD
418,768,486.00
release/E2E/https://www.servo.org/resident-smaps📈 view plot
⚠️ NO THRESHOLD
417,821,491.00
release/Speedometer/Charts-observable-plot📈 view plot
⚠️ NO THRESHOLD
735.08 ms
release/Speedometer/Charts-observable-plot/Dotted📈 view plot
⚠️ NO THRESHOLD
86.71 ms
release/Speedometer/Charts-observable-plot/Dotted/Async📈 view plot
⚠️ NO THRESHOLD
10.24 ms
release/Speedometer/Charts-observable-plot/Dotted/Sync📈 view plot
⚠️ NO THRESHOLD
76.46 ms
release/Speedometer/Charts-observable-plot/Stacked by 20📈 view plot
⚠️ NO THRESHOLD
356.84 ms
release/Speedometer/Charts-observable-plot/Stacked by 20/Async📈 view plot
⚠️ NO THRESHOLD
18.84 ms
release/Speedometer/Charts-observable-plot/Stacked by 20/Sync📈 view plot
⚠️ NO THRESHOLD
338.00 ms
release/Speedometer/Charts-observable-plot/Stacked by 6📈 view plot
⚠️ NO THRESHOLD
291.53 ms
release/Speedometer/Charts-observable-plot/Stacked by 6/Async📈 view plot
⚠️ NO THRESHOLD
9.15 ms
release/Speedometer/Charts-observable-plot/Stacked by 6/Sync📈 view plot
⚠️ NO THRESHOLD
282.38 ms
release/Speedometer/Geomean📈 view plot
⚠️ NO THRESHOLD
651.69 ms
release/Speedometer/Iteration-0-Total📈 view plot
⚠️ NO THRESHOLD
806.77 ms
release/Speedometer/Iteration-1-Total📈 view plot
⚠️ NO THRESHOLD
802.79 ms
release/Speedometer/Iteration-2-Total📈 view plot
⚠️ NO THRESHOLD
799.89 ms
release/Speedometer/Iteration-3-Total📈 view plot
⚠️ NO THRESHOLD
798.81 ms
release/Speedometer/Iteration-4-Total📈 view plot
⚠️ NO THRESHOLD
791.23 ms
release/Speedometer/Iteration-5-Total📈 view plot
⚠️ NO THRESHOLD
793.84 ms
release/Speedometer/Iteration-6-Total📈 view plot
⚠️ NO THRESHOLD
954.41 ms
release/Speedometer/Iteration-7-Total📈 view plot
⚠️ NO THRESHOLD
1,058.95 ms
release/Speedometer/Iteration-8-Total📈 view plot
⚠️ NO THRESHOLD
1,072.37 ms
release/Speedometer/Iteration-9-Total📈 view plot
⚠️ NO THRESHOLD
1,072.10 ms
release/Speedometer/Score📈 view plot
⚠️ NO THRESHOLD
1.56 units
release/Speedometer/TodoMVC-Angular📈 view plot
⚠️ NO THRESHOLD
938.70 ms
release/Speedometer/TodoMVC-Angular/Adding100Items📈 view plot
⚠️ NO THRESHOLD
461.21 ms
release/Speedometer/TodoMVC-Angular/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
50.15 ms
release/Speedometer/TodoMVC-Angular/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
411.06 ms
release/Speedometer/TodoMVC-Angular/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
293.62 ms
release/Speedometer/TodoMVC-Angular/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
37.90 ms
release/Speedometer/TodoMVC-Angular/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
255.72 ms
release/Speedometer/TodoMVC-Angular/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
183.87 ms
release/Speedometer/TodoMVC-Angular/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
7.39 ms
release/Speedometer/TodoMVC-Angular/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
176.48 ms
release/Speedometer/TodoMVC-JavaScript-ES5📈 view plot
⚠️ NO THRESHOLD
1,389.76 ms
release/Speedometer/TodoMVC-JavaScript-ES5/Adding100Items📈 view plot
⚠️ NO THRESHOLD
1,124.76 ms
release/Speedometer/TodoMVC-JavaScript-ES5/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
56.36 ms
release/Speedometer/TodoMVC-JavaScript-ES5/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
1,068.40 ms
release/Speedometer/TodoMVC-JavaScript-ES5/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
167.30 ms
release/Speedometer/TodoMVC-JavaScript-ES5/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
32.59 ms
release/Speedometer/TodoMVC-JavaScript-ES5/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
134.71 ms
release/Speedometer/TodoMVC-JavaScript-ES5/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
97.71 ms
release/Speedometer/TodoMVC-JavaScript-ES5/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
7.25 ms
release/Speedometer/TodoMVC-JavaScript-ES5/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
90.46 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack📈 view plot
⚠️ NO THRESHOLD
1,924.44 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/Adding100Items📈 view plot
⚠️ NO THRESHOLD
1,540.74 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
39.05 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
1,501.69 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
244.34 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
39.68 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
204.66 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
139.36 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
7.93 ms
release/Speedometer/TodoMVC-JavaScript-ES6-Webpack/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
131.44 ms
release/Speedometer/TodoMVC-Preact📈 view plot
⚠️ NO THRESHOLD
156.19 ms
release/Speedometer/TodoMVC-Preact/Adding100Items📈 view plot
⚠️ NO THRESHOLD
78.43 ms
release/Speedometer/TodoMVC-Preact/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
70.83 ms
release/Speedometer/TodoMVC-Preact/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
7.60 ms
release/Speedometer/TodoMVC-Preact/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
61.60 ms
release/Speedometer/TodoMVC-Preact/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
50.66 ms
release/Speedometer/TodoMVC-Preact/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
10.94 ms
release/Speedometer/TodoMVC-Preact/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
16.16 ms
release/Speedometer/TodoMVC-Preact/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
10.32 ms
release/Speedometer/TodoMVC-Preact/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
5.84 ms
release/Speedometer/TodoMVC-React📈 view plot
⚠️ NO THRESHOLD
862.38 ms
release/Speedometer/TodoMVC-React-Redux📈 view plot
⚠️ NO THRESHOLD
1,023.61 ms
release/Speedometer/TodoMVC-React-Redux/Adding100Items📈 view plot
⚠️ NO THRESHOLD
329.77 ms
release/Speedometer/TodoMVC-React-Redux/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
35.21 ms
release/Speedometer/TodoMVC-React-Redux/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
294.56 ms
release/Speedometer/TodoMVC-React-Redux/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
451.85 ms
release/Speedometer/TodoMVC-React-Redux/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
38.53 ms
release/Speedometer/TodoMVC-React-Redux/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
413.32 ms
release/Speedometer/TodoMVC-React-Redux/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
241.99 ms
release/Speedometer/TodoMVC-React-Redux/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
8.02 ms
release/Speedometer/TodoMVC-React-Redux/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
233.97 ms
release/Speedometer/TodoMVC-React/Adding100Items📈 view plot
⚠️ NO THRESHOLD
334.34 ms
release/Speedometer/TodoMVC-React/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
77.83 ms
release/Speedometer/TodoMVC-React/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
256.51 ms
release/Speedometer/TodoMVC-React/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
333.62 ms
release/Speedometer/TodoMVC-React/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
34.98 ms
release/Speedometer/TodoMVC-React/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
298.64 ms
release/Speedometer/TodoMVC-React/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
194.42 ms
release/Speedometer/TodoMVC-React/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
7.90 ms
release/Speedometer/TodoMVC-React/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
186.52 ms
release/Speedometer/TodoMVC-Svelte📈 view plot
⚠️ NO THRESHOLD
130.78 ms
release/Speedometer/TodoMVC-Svelte/Adding100Items📈 view plot
⚠️ NO THRESHOLD
70.41 ms
release/Speedometer/TodoMVC-Svelte/Adding100Items/Async📈 view plot
⚠️ NO THRESHOLD
54.66 ms
release/Speedometer/TodoMVC-Svelte/Adding100Items/Sync📈 view plot
⚠️ NO THRESHOLD
15.76 ms
release/Speedometer/TodoMVC-Svelte/CompletingAllItems📈 view plot
⚠️ NO THRESHOLD
45.08 ms
release/Speedometer/TodoMVC-Svelte/CompletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
36.95 ms
release/Speedometer/TodoMVC-Svelte/CompletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
8.13 ms
release/Speedometer/TodoMVC-Svelte/DeletingAllItems📈 view plot
⚠️ NO THRESHOLD
15.29 ms
release/Speedometer/TodoMVC-Svelte/DeletingAllItems/Async📈 view plot
⚠️ NO THRESHOLD
10.88 ms
release/Speedometer/TodoMVC-Svelte/DeletingAllItems/Sync📈 view plot
⚠️ NO THRESHOLD
4.41 ms
🐰 View full continuous benchmarking report in Bencher

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

⚠️ Try run (#19956493099) failed.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

✨ Try run (#19956792916) succeeded.

@yezhizhen
Copy link
Copy Markdown
Member Author

yezhizhen commented Dec 5, 2025

Oh the impact of this, is much deeper than I thought.
We can actually dispatch touch event now in Desktop version.

I need to fix the "Got a touchmove event for a non-active touch point" later.

We can cover a lot more test with this change after it!

@yezhizhen
Copy link
Copy Markdown
Member Author

yezhizhen commented Dec 5, 2025

Stable unexpected results (138)

All these tests never worked as intended, as we've been ignoring the "touch" pointer type, always dispatching mouse.

I would like to update the test results for now, and improve this very soon later.

Comment on lines 876 to +877
.or_insert(InputSourceState::Pointer(PointerInputState::new(
PointerType::Mouse,
parameters.pointer_type,
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

We are no longer ignoring requested pointer type.
This allows us to dispatch touch actions correctly for Perform Actions.

@yezhizhen yezhizhen changed the title webdriver: Add Android/OHOS touch support webdriver: Add touch support for all platforms Dec 5, 2025
Signed-off-by: Euclid Ye <[email protected]>
@yezhizhen yezhizhen added the T-linux-wpt Do a try run of the WPT label Dec 5, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Dec 5, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

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

Flaky unexpected result (27)
  • TIMEOUT /FileAPI/url/url-in-tags-revoke.window.html (#19978)
    • TIMEOUT [expected PASS] subtest: Fetching a blob URL immediately before revoking it works in &lt;script&gt; tags.

      Test timed out
      

  • OK /IndexedDB/idbfactory_open.any.html
    • FAIL [expected PASS] subtest: Calling open() with version argument 1.5 should not throw.

      assert_equals: version expected 1 but got 9007199254740991
      

  • CRASH [expected OK] /_mozilla/mozilla/img_find_non_sibling_map.html
  • OK /_mozilla/webxr/create_session.https.html
    • FAIL [expected PASS] subtest: create_session

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

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

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

  • ERROR [expected TIMEOUT] /_mozilla/webxr/sessionavailable.https.html
  • CRASH [expected OK] /_webgl/conformance2/wasm/readpixels-2gb-in-4gb-wasm-memory.html
  • OK /content-security-policy/frame-ancestors/frame-ancestors-path-ignored.window.html (#36468)
    • FAIL [expected PASS] subtest: A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.

      assert_unreached: The IFrame should have been blocked (or cross-origin). It wasn't. Reached unreachable code
      

  • 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"
      

  • FAIL [expected PASS] /css/css-backgrounds/background-size-041.html
  • OK /custom-elements/form-associated/ElementInternals-setFormValue.html (#29174)
    • PASS [expected FAIL] subtest: Single value - empty name exists
  • ERROR [expected OK] /focus/focus-event-after-switching-iframes.sub.html (#40368)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.html (#29049)
    • PASS [expected FAIL] subtest: Same-origin navigation started from unload handler must be ignored
  • OK /html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html (#28697)
    • PASS [expected FAIL] subtest: aElement.click() before the load event must NOT replace
  • CRASH [expected TIMEOUT] /html/canvas/offscreen/text/2d.text.measure.strokeTextCluster-align.tentative.w.html
  • 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/forms/form-submission-0/jsurl-form-submit.tentative.html (#36489)
    • PASS [expected FAIL] subtest: Verifies that form submissions scheduled inside javascript: urls take precedence over the javascript: url's return value.
  • OK /html/semantics/forms/form-submission-0/multipart-formdata.window.html (#28725)
    • PASS [expected FAIL] subtest: multipart/form-data: 0x00 in value (formdata event)
  • OK /html/semantics/forms/form-submission-0/text-plain.window.html (#28687)
    • FAIL [expected PASS] subtest: text/plain: Basic test (formdata event)

      assert_equals: expected "basic=test\r\n" but got ""
      

    • 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 name (formdata event)
    • PASS [expected FAIL] subtest: text/plain: 0x00 in value (normal form)
  • OK /html/semantics/forms/form-submission-0/urlencoded2.window.html (#28687)
    • FAIL [expected PASS] subtest: application/x-www-form-urlencoded: Basic test (formdata event)

      assert_equals: expected "basic=test" but got ""
      

    • 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: double quote in filename (formdata event)
  • OK [expected ERROR] /html/user-activation/no-activation-thru-escape-key.html (#40343)
  • OK /preload/preload-invalid-resources.html (#39091)
    • PASS [expected FAIL] subtest: Preloading an invalid image (missing) should preload and not re-fetch
  • ERROR [expected OK] /resource-timing/cors-preflight.any.html (#28694)
  • CRASH [expected OK] /trusted-types/eval-csp-no-tt.html
  • OK [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
    • PASS [expected TIMEOUT] subtest: Navigate a frame via anchor with javascript:-urls w/ default policy in report-only mode.
    • FAIL [expected NOTRUN] subtest: Navigate a window via anchor with javascript:-urls w/ a default policy throwing an exception in enforcing mode.

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

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

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

  • CRASH [expected OK] /wasm/webapi/esm-integration/worklet-import-source-phase.tentative.https.html
  • CRASH [expected OK] /websockets/unload-a-document/003.html
Stable unexpected results that are known to be intermittent (20)
  • 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()
  • FAIL [expected PASS] /_mozilla/mozilla/sslfail.html (#10760)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • OK /css/css-cascade/layer-cssom-order-reverse.html (#36094)
    • PASS [expected FAIL] subtest: Delete layer invalidates @font-face
  • OK /css/css-fonts/generic-family-keywords-001.html (#37467)
    • FAIL [expected PASS] subtest: @font-face matching for quoted and unquoted generic(fangsong)

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

    • PASS [expected FAIL] subtest: @font-face matching for quoted and unquoted generic(nastaliq)
  • OK /css/css-fonts/generic-family-keywords-002.html (#40929)
    • PASS [expected FAIL] subtest: font-family: -webkit-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-sans-serif treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-cursive treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-fantasy treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-monospace treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-system-ui treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • PASS [expected FAIL] subtest: font-family: -webkit-math treated as &lt;font-family&gt;, not &lt;generic-name&gt;
    • FAIL [expected PASS] subtest: font-family: -webkit-generic(fangsong) treated as &lt;font-family&gt;, not &lt;generic-name&gt;

      assert_equals: expected 50 but got 30
      

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

      assert_equals: expected 50 but got 30
      

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

      assert_equals: expected 50 but got 30
      

    • And 12 more unexpected results...
  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Cross-site

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

  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-origin destination

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

    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination

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

    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination
  • OK /fetch/metadata/generated/element-img-environment-change.https.sub.html (#30111)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Cross-Site -&gt; Same-Origin redirect, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-Site -&gt; Same Origin, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Cross-Site -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Same-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Origin -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Site -&gt; Same-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Same-Site -&gt; Cross-Site, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - attributes: crossorigin
    • And 4 more unexpected results...
  • OK /fetch/metadata/generated/element-img-environment-change.sub.html (#30111)
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy same-origin destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-mode - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-dest - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-dest - Not sent to non-trustworthy cross-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-user - Not sent to non-trustworthy same-site destination, no attributes
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination, no attributes
  • 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/initial-empty-document/load-pageshow-events-window-open.html (#28691)
    • FAIL [expected PASS] subtest: load event does not fire on window.open('about:blank')

      assert_unreached: load should not be fired Reached unreachable code
      

  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • TIMEOUT [expected NOTRUN] subtest: Non-HTMLElement should not support autofocus

      Test timed out
      

    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus should support autofocus
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus including no focusable descendants should be skipped
    • NOTRUN [expected FAIL] subtest: Area element should support autofocus
  • OK /html/webappapis/user-prompts/print-during-unload.html (#35944)
    • FAIL [expected PASS] subtest: print() during unload

      assert_array_equals: expected property 1 to be "destination" but got "error: window.print is not a function" (expected array ["start", "destination"] got ["start", "error: window.print is not a function"])
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload domInteractive &gt; Original domInteractive
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • 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
      

    • FAIL [expected PASS] subtest: CORS (fetch): main

      assert_greater_than: http://not-web-platform.test:8000/preload/resources/dummy.xml?pipe=header%28Access-Control-Allow-Origin%2C*%29&amp;label=fetch should be loaded expected a number greater than 0 but got 0
      

  • OK /preload/preload-xhr.html (#39092)
    • FAIL [expected PASS] subtest: Make an XHR request immediately after creating link rel=preload.

      assert_equals: resources/dummy.xml?token=299084da-5a70-46bf-a674-7cb8bd741877 expected 1 but got 0
      

  • OK /webdriver/tests/classic/dismiss_alert/dismiss.py (#39098)
    • FAIL [expected PASS] subtest: test_dismiss_in_popup_window

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

  • TIMEOUT [expected OK] /webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.html (#29053)
    • TIMEOUT [expected PASS] subtest: StorageKey: test 3P about:blank window opened from a 3P iframe

      Test timed out
      

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 5, 2025

✨ Try run (#19957800954) succeeded.

@yezhizhen yezhizhen marked this pull request as ready for review December 5, 2025 09:28
@PotatoCP
Copy link
Copy Markdown
Contributor

PotatoCP commented Dec 5, 2025

Oh the impact of this, is much deeper than I thought. We can actually dispatch touch event now in Desktop version.

I need to fix the "Got a touchmove event for a non-active touch point" later.

We can cover a lot more test with this change after it!

Actually I have investigated it a little bit. I think we assume that touch down event always happens before touch move and touch up. Hence we only insert into active_touch_points when touch down,

if !self
.touch_sequence_map
.contains_key(&self.current_sequence_id) ||
self.get_touch_sequence(self.current_sequence_id)
.is_finished()
{
self.current_sequence_id.next();
debug!("Entered new touch sequence: {:?}", self.current_sequence_id);
let active_touch_points = vec![TouchPoint::new(id, point)];
self.touch_sequence_map.insert(
self.current_sequence_id,
TouchSequenceInfo {
state: Touching,
active_touch_points,
handling_touch_move: false,
prevent_click: false,
prevent_move: TouchMoveAllowed::Pending,
pending_touch_move_actions: vec![],
hit_test_result_cache: None,
},
);

and this will fails

let idx = match touch_sequence
.active_touch_points
.iter_mut()
.position(|t| t.id == id)
{
Some(i) => i,
None => {
error!("Got a touchmove event for a non-active touch point");
return None;
},
};

Signed-off-by: Euclid Ye <[email protected]>
Copy link
Copy Markdown
Member

@jschwe jschwe left a comment

Choose a reason for hiding this comment

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

LGTM, hope to see the follow-ups soon 👍

/// There is currently no spec for touchscreen webdriver support.
/// There is an ongoing discussion in W3C:
/// <https://github.com/w3c/webdriver/issues/1925>
#[cfg(any(target_env = "ohos", target_os = "android"))]
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.

I would prefer if we did a runtime check for device type, since ohos / android devices can be run in desktop mode.
I don't think we need ot change this now, would just prefer if we didn't add to many cfgs like this when it shouldn't be a compiletime option.

Copy link
Copy Markdown
Member Author

@yezhizhen yezhizhen Dec 5, 2025

Choose a reason for hiding this comment

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

Thanks! Will do when I got time.

Another way is to process "user_agent" of webdriver session to determine at runtime.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

TODO later: When we have touch simulation for Desktop, "Element click" should also dispatch pointer touch.

We always have a plan to do this in runtime.

@servo-highfive servo-highfive removed the S-awaiting-review There is new code that needs to be reviewed. label Dec 5, 2025
@yezhizhen yezhizhen added this pull request to the merge queue Dec 5, 2025
@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 Dec 5, 2025
Merged via the queue into servo:main with commit 60b9a03 Dec 5, 2025
30 checks passed
@yezhizhen yezhizhen deleted the webdriver-touch branch December 5, 2025 11:03
@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 Dec 5, 2025
github-merge-queue bot pushed a commit that referenced this pull request Dec 10, 2025
…bedder `MouseMove` (#41171)

Back in #41067, we added webdriver touch support for all platforms. All
touch-related testdriver tests which faked to work has been CRASH
instead, as we assume that touch down event always happens before touch
move and touch up.

But the assumption above is not wrong, as I observed embedder events
dispatched from OHOS/Android when interacting as human. It is just that
the tests are flawed: almost all of them have pointermove first even for
touch, and spec didn't consider touch/pen support well enough: #41042.

Luckily, our embedder `MouseMove` event would also update the webdriver
pointer status, which effectively allow touch down/touch up to happen at
right point. It **doesn't matter** whether the website has mouse
listener or not.

Testing: Tested manually on a touch-event-only complicated website.
Also, tests no longer crash, also with expectations different from
before #41067, e.g.
[this](https://github.com/servo/servo/pull/41067/files#diff-db149f4025dab43bd5a3c8a412ea2ac9e521f4745c0f982925b4d15b236ff955)
had been failing but now passes.

---------

Signed-off-by: Euclid Ye <[email protected]>
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.

4 participants