Skip to content

paint: Propogate input event dispatch failure to Servo to resolve deadlock#43381

Merged
yezhizhen merged 11 commits into
servo:mainfrom
yezhizhen:response-must-be-given
Mar 23, 2026
Merged

paint: Propogate input event dispatch failure to Servo to resolve deadlock#43381
yezhizhen merged 11 commits into
servo:mainfrom
yezhizhen:response-must-be-given

Conversation

@yezhizhen

@yezhizhen yezhizhen commented Mar 18, 2026

Copy link
Copy Markdown
Member

dispatch_input_event_with_hit_testing already returns a bool to indicate whether the dispatch failed.
However, for some reason this was used nowhere. When it fails, embedder is not informed.
This is fine for embedder as right now it only handles keyboard shortcuts for headed window,
but a disaster for WebDriver as it is synchornously waiting for the feedback.

Testing: Several tests no longer CRASH.
Fixes: #43379

@yezhizhen yezhizhen requested a review from xiaochengh March 18, 2026 06:28
@yezhizhen yezhizhen requested a review from atbrakhi as a code owner March 18, 2026 06:28
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Mar 18, 2026

@yezhizhen yezhizhen left a comment

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.

Debug log
id:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: MouseMove(MouseMoveEvent { point: Page((400.0, 4.0)), is_compatibility_event_for_touch: false }), id: InputEventId(0) }:InputEventId(0)
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(0)
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(0)
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Notify InputEventId(0)
 3:23.64 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:23.64 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: MouseButton(MouseButtonEvent { action: Down, button: Left, point: Page((400.0, 4.0)) }), id: InputEventId(1) }:InputEventId(1)
 3:23.64 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(1)
 3:23.67 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(1)
 3:23.67 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Notify InputEventId(1)
 3:23.67 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:23.67 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:23.67 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: MouseButton(MouseButtonEvent { action: Up, button: Left, point: Page((400.0, 4.0)) }), id: InputEventId(2) }:InputEventId(2)
 3:23.67 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(2)
 3:23.70 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(2)
 3:23.70 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Notify InputEventId(2)
 3:23.70 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:23.87 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:23.87 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:23.87 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:23.88 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Down, touch_id: TouchId(2), point: Page((200.0, 200.0)), cancelable: true }), id: InputEventId(3) }:InputEventId(3)
 3:23.88 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(3)
 3:23.88 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Down, touch_id: TouchId(3), point: Page((210.0, 210.0)), cancelable: true }), id: InputEventId(4) }:InputEventId(4)
 3:23.88 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(4)
 3:23.89 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(3)
 3:23.89 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Notify InputEventId(3)
 3:23.89 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(4)
 3:23.89 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Notify InputEventId(4)
 3:23.89 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:23.90 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((197.6, 197.6)), cancelable: true }), id: InputEventId(5) }:InputEventId(5)
 3:23.90 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(5)
 3:23.90 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(3), point: Page((230.0, 230.0)), cancelable: true }), id: InputEventId(6) }:InputEventId(6)
 3:23.90 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(6)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(5)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(5)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(6)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(6)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((195.05, 195.05)), cancelable: true }), id: InputEventId(7) }:InputEventId(7)
 3:23.92 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(7)
 3:23.94 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((192.65, 192.65)), cancelable: true }), id: InputEventId(8) }:InputEventId(8)
 3:23.94 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(8)
 3:23.94 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(8)
 3:23.94 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(8)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(7)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(7)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((190.1, 190.1)), cancelable: true }), id: InputEventId(9) }:InputEventId(9)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(9)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(9)
 3:23.95 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(9)
 3:23.97 pid:22972 [2026-03-18T06:34:02Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((187.7, 187.7)), cancelable: true }), id: InputEventId(10) }:InputEventId(10)
 3:23.97 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Servoshell: InputEventId(10)
 3:23.97 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] Received InputEventId(10)
 3:23.97 pid:22972 [2026-03-18T06:34:02Z ERROR servoshell::running_app_state] No sender for InputEventId(10)
 3:23.99 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((185.3, 185.3)), cancelable: true }), id: InputEventId(11) }:InputEventId(11)
 3:23.99 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(11)
 3:23.99 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(11)
 3:23.99 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(11)
 3:24.00 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((182.75, 182.75)), cancelable: true }), id: InputEventId(12) }:InputEventId(12)
 3:24.00 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(12)
 3:24.00 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(12)
 3:24.00 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(12)
 3:24.02 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((180.35, 180.35)), cancelable: true }), id: InputEventId(13) }:InputEventId(13)
 3:24.02 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(13)
 3:24.02 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(13)
 3:24.02 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(13)
 3:24.03 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((177.8, 177.8)), cancelable: true }), id: InputEventId(14) }:InputEventId(14)
 3:24.03 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(14)
 3:24.03 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(14)
 3:24.03 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(14)
 3:24.05 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((175.4, 175.4)), cancelable: true }), id: InputEventId(15) }:InputEventId(15)
 3:24.05 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(15)
 3:24.05 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(15)
 3:24.05 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(15)
 3:24.07 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((173.0, 173.0)), cancelable: true }), id: InputEventId(16) }:InputEventId(16)
 3:24.07 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(16)
 3:24.07 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(16)
 3:24.07 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(16)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((170.45, 170.45)), cancelable: true }), id: InputEventId(17) }:InputEventId(17)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(17)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(17)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(17)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Move, touch_id: TouchId(2), point: Page((170.0, 170.0)), cancelable: true }), id: InputEventId(18) }:InputEventId(18)
 3:24.10 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:24.10 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(18)
 3:24.10 pid:22972 [components\webdriver_server\actions.rs:290:9] "Waiting.." = "Waiting.."
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Up, touch_id: TouchId(2), point: Page((170.0, 170.0)), cancelable: true }), id: InputEventId(19) }:InputEventId(19)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(19)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servo::webview] Sent InputEventAndId { event: Touch(TouchEvent { event_type: Up, touch_id: TouchId(3), point: Page((230.0, 230.0)), cancelable: true }), id: InputEventId(20) }:InputEventId(20)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Servoshell: InputEventId(20)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(18)
 3:24.10 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] No sender for InputEventId(18)
 3:24.15 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(19)
 3:24.15 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Notify InputEventId(19)
 3:24.15 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Received InputEventId(20)
 3:24.15 pid:22972 [2026-03-18T06:34:03Z ERROR servoshell::running_app_state] Notify InputEventId(20)
 3:24.15 pid:22972 [components\webdriver_server\actions.rs:294:9] "All done." = "All done."

Will remove the debug log commit after the review.

Comment thread components/servo/webview.rs Outdated
@yezhizhen

Copy link
Copy Markdown
Member Author

@stevennovaryo

Copy link
Copy Markdown
Member

Looks like it is the one that is affecting #43231 (comment).

@yezhizhen

Copy link
Copy Markdown
Member Author

Looks like it is the one that is affecting #43231 (comment).

What a coincidence :)

@mrobinson mrobinson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks like a great start, but I think we want event handling to always work in the same way no matter how the input event failed. I think you can do this by storing events that failed to send in a vector and then waking up the event loop inside the call to WebView::notify_input_event. Then during the next wakeup, for each of the stored event ids, we would report that they were handled (but not Consumed). Maybe we need a new InputEventResult.

Comment thread components/paint/painter.rs Outdated
Comment thread components/paint/webview_renderer.rs
Comment thread components/servo/webview.rs Outdated
.notify_scroll_event(self.id(), scroll, point);
}

pub fn notify_input_event(&self, event: InputEvent) -> InputEventId {

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.

Instead of returning a different return value, I think the thing to do here is to asynchronously call Webview::notify_input_event_handled. That will ensure that event handling always happens in the same way, which I think is important for people using the API.

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.

Do we leave this as a follow-up then?

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.

Hrm. I think we should probably not wait. I can help to implement this if you like.

This comment was marked as outdated.

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.

Emm. But we don't need to wake up the waker?
We can just handle the vector at the end of current spin?

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.

I will try implementing this without wake first.

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.

Hrm. I think the issue is that WebView::notify_input_event might be called independently of whether the Servo event loop is spinning or not. In that case the event loop will need to spin at some point in the future and the only way to guarantee that is to actually wake up the event loop.

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.

Make sense. I was only thinking about WebDriver, where WebView::notify_input_event is guaranteed to be called within the spin here

Message::FromUnknown(message) => self.handle_embedder_message(message),

Let's do wake then, as it might become useful in the future.

Comment thread components/servo/webview_delegate.rs Outdated
@servo-highfive servo-highfive added S-needs-code-changes Changes have not yet been made that were requested by a reviewer. and removed S-awaiting-review There is new code that needs to be reviewed. labels Mar 18, 2026
Comment thread components/servo/webview_delegate.rs Outdated

@stevennovaryo stevennovaryo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess in the long term it would be nice to have uniques error flag/enum for input event error within WebviewRenderer, aside from grouping it as a HitTestFailed.

@servo-highfive servo-highfive added S-awaiting-review There is new code that needs to be reviewed. and removed S-needs-code-changes Changes have not yet been made that were requested by a reviewer. labels Mar 18, 2026
@yezhizhen yezhizhen force-pushed the response-must-be-given branch from 5a9ff48 to 0901b34 Compare March 18, 2026 08:26
@yezhizhen yezhizhen added the T-linux-wpt Do a try run of the WPT label Mar 18, 2026
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Mar 18, 2026
@github-actions

Copy link
Copy Markdown

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

@github-actions

Copy link
Copy Markdown

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

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

      assert_equals: expected 62 but got 60.35
      

  • ERROR [expected OK] /_webgl/conformance/attribs/gl-bindAttribLocation-matrix.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)
    • PASS [expected FAIL] subtest: A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.
  • FAIL [expected PASS] /css/css-backgrounds/background-size-041.html
  • OK /fetch/content-length/api-and-duplicate-headers.any.worker.html (#35197)
    • FAIL [expected PASS] subtest: fetch() and duplicate Content-Length/Content-Type headers

      promise_test: Unhandled rejection with value: object "TypeError: Network error: HTTP failure: client error (SendRequest)"
      

  • CRASH [expected OK] /html/browsers/browsing-the-web/navigating-across-documents/javascript-url-global-scope.html
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • PASS [expected TIMEOUT] subtest: Non-HTMLElement should not support autofocus
    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus should support autofocus

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

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

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

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

      assert_equals: expected Element node <area autofocus="" href="/common/blank.html"></area> but got Element node <body>
      <img src="/media/poster.png" usemap="#map">
      <map n...
      

  • TIMEOUT /html/semantics/embedded-content/media-elements/preserves-pitch.html (#40352)
    • PASS [expected TIMEOUT] subtest: Speed-ups should not change the pitch when preservesPitch=true
    • PASS [expected NOTRUN] subtest: Slow-downs should not change the pitch when preservesPitch=true
    • FAIL [expected NOTRUN] subtest: Speed-ups should change the pitch when preservesPitch=false

      assert_approx_equals: The actual pitch should be close to the expected pitch. expected 880 +/- 132 but got 431.0850439882698
      

    • TIMEOUT [expected NOTRUN] subtest: Slow-downs should change the pitch when preservesPitch=false

      Test timed out
      

  • CRASH [expected TIMEOUT] /html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html
  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_other_frame_popup.sub.html (#39702)
    • TIMEOUT [expected FAIL] subtest: Sandboxed iframe can not navigate other frame's popup

      Test timed out
      

  • OK /html/semantics/forms/form-submission-0/jsurl-form-submit.tentative.html (#36489)
    • PASS [expected FAIL] subtest: Verifies that form submissions scheduled inside javascript: urls take precedence over the javascript: url's return value.
  • TIMEOUT [expected OK] /html/user-activation/navigation-state-reset-sameorigin.html
    • TIMEOUT [expected PASS] subtest: Post-navigation state reset.

      Test timed out
      

  • CRASH [expected OK] /html/webappapis/scripting/reporterror.any.worker.html
  • CRASH [expected ERROR] /html/webappapis/the-shadowrealmglobalscope-interface/self.any.shadowrealm-in-window.html
  • FAIL [expected PASS] /png/apng/fcTL-blend-source-nearly-transparent.html (#40915)
  • FAIL [expected PASS] /png/apng/fcTL-dispose-in-region-previous.html (#41410)
  • 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
      

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

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Navigate a frame via form-submission with javascript:-urls w/ default policy in report-only mode.
  • OK /visual-viewport/resize-event-order.html (#41981)
    • PASS [expected FAIL] subtest: Popup: DOMWindow resize fired before VisualViewport.
  • OK /webxr/xrSession_features_deviceSupport.https.html (#24357)
    • FAIL [expected PASS] subtest: Immersive XRSession requests with no supported device should reject

      assert_unreached: Should have rejected: undefined Reached unreachable code
      

  • CRASH [expected OK] /workers/WorkerGlobalScope_ErrorEvent_colno.htm
Stable unexpected results that are known to be intermittent (17)
  • FAIL [expected PASS] /_mozilla/mozilla/sslfail.html (#10760)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • CRASH [expected PASS] /_mozilla/shadow-dom/move-element-with-ua-shadow-tree-crash.html (#39473)
  • 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
      

    • 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 ui-serif (drawing text in a canvas)

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

    • 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 /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Cross-site
  • ERROR /fetch/metadata/generated/serviceworker.https.sub.html (#36247)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no options - registration
  • ERROR [expected OK] /focus/focus-event-after-switching-iframes.sub.html (#40368)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html (#28697)
    • FAIL [expected PASS] subtest: aElement.click() before the load event must NOT replace

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

  • 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 <body></body>
      

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

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

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

      assert_true: Reload fetchStart > Original fetchStart expected true got false
      

  • TIMEOUT [expected OK] /preload/modulepreload-sri.html (#43354)
    • TIMEOUT [expected PASS] subtest: Script should not be loaded if modulepreload's integrity is invalid

      Test timed out
      

  • 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 /resource-timing/test_resource_timing.https.html (#25216)
    • FAIL [expected PASS] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest)

      assert_equals: expected 48.67999999999999 but got 48.67
      

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

@github-actions

Copy link
Copy Markdown

✨ Try run (#23235667423) succeeded.

@yezhizhen yezhizhen marked this pull request as draft March 18, 2026 12:18
@yezhizhen

yezhizhen commented Mar 18, 2026

Copy link
Copy Markdown
Member Author

Let's give this a shot.

@yezhizhen yezhizhen added the T-linux-wpt Do a try run of the WPT label Mar 18, 2026
@github-actions github-actions Bot removed the T-linux-wpt Do a try run of the WPT label Mar 18, 2026
@github-actions

Copy link
Copy Markdown

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

@github-actions

Copy link
Copy Markdown

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

Flaky unexpected result (31)
  • TIMEOUT [expected OK] /_mozilla/mozilla/img_load_more_than_cache.html
    • TIMEOUT [expected PASS] subtest: Test Loading more images than keys obtained in a batch by the image cache

      Test timed out
      

  • CRASH [expected ERROR] /_webgl/conformance2/misc/uninitialized-test-2.html (#41656)
  • FAIL [expected PASS] /css/css-backgrounds/background-size-042.html
  • OK /css/css-ui/text-overflow-023.html (#19861)
    • FAIL [expected PASS] subtest: Checks hit testing on the ellipsis

      assert_equals: the element targeted by a hit on the ellipsis is the elided inline. expected "target" but got "parent"
      

  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.https.window.html (#35176)
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/sandboxed-iframe.https.window.html (#41704)
  • ERROR /fetch/metadata/generated/serviceworker.https.sub.html (#36247)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no options - registration
  • CRASH [expected TIMEOUT] /html/browsers/browsing-the-web/history-traversal/history-traversal-navigates-multiple-frames.html
  • ERROR [expected TIMEOUT] /html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html (#40387)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/005.html (#27062)
    • PASS [expected FAIL] subtest: Link with onclick navigation and href navigation
  • CRASH [expected OK] /html/browsers/browsing-the-web/navigating-across-documents/plugin-document.historical.html
  • CRASH [expected TIMEOUT] /html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html
  • OK /html/browsers/history/the-history-interface/traverse_the_history_5.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • OK /html/browsers/windows/embedded-opener-remove-frame.html (#23867)
    • FAIL [expected PASS] subtest: opener of discarded auxiliary browsing context

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

  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html (#29087)
    • TIMEOUT [expected FAIL] subtest: <dialog>-contained autofocus element gets focused when the dialog is shown

      Test timed out
      

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

      Test timed out
      

  • TIMEOUT [expected OK] /html/semantics/embedded-content/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/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
      

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

      assert_true: Reload domInteractive > Original domInteractive expected true got false
      

  • OK /paint-timing/with-lcp/fcp-document-opacity-image.html (#43068)
    • FAIL [expected PASS] subtest: Test that FCP after opacity change is not a larger value than LCP

      assert_equals: First contentful paint marked too early.  expected 0 but got 1
      

  • TIMEOUT [expected OK] /preload/modulepreload-sri-importmap.html (#43354)
    • TIMEOUT [expected PASS] subtest: Script should not be loaded if modulepreload's integrity is invalid

      Test timed out
      

  • CRASH [expected OK] /resource-timing/render-blocking-status-link.html (#41664)
  • 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 /visual-viewport/resize-event-order.html (#41981)
    • PASS [expected FAIL] subtest: Popup: DOMWindow resize fired before VisualViewport.
  • OK /webdriver/tests/classic/add_cookie/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/element_click/click.py
    • FAIL [expected PASS] subtest: test_null_response_value

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

  • OK /webdriver/tests/classic/element_send_keys/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_element_text/get.py
    • ERROR [expected PASS] subtest: test_no_top_browsing_context

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

  • OK [expected TIMEOUT] /webmessaging/without-ports/018.html (#24485)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, javascript:
  • CRASH [expected ERROR] /workers/Worker-constructor-proto.any.serviceworker.html
Stable unexpected results that are known to be intermittent (19)
  • 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 /_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 18 more unexpected results...
  • OK /beacon/beacon-basic.https.window.html (#41723)
    • FAIL [expected PASS] subtest: Payload size restriction should be accumulated: type = string

      assert_false: expected false got true
      

  • 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(khmer-mul)

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

  • 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 ui-monospace (drawing text in a canvas)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html (#20768)
    • PASS [expected FAIL] subtest: Tests that a fragment navigation in the unload handler will not block the initial navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/refresh/same-document-refresh.html (#34597)
    • FAIL [expected PASS] subtest: Same-Document Referrer from Refresh

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

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

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

  • 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 2 (expected array [6, 3] got [6, 2])
      

  • 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 lengths differ, expected array [6, 5] length 2, got [6, 3, 3] length 3
      

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

      Test timed out
      

  • 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 <body></body>
      

  • OK /resource-timing/test_resource_timing.html (#25720)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (img)
  • OK /resource-timing/test_resource_timing.https.html (#25216)
    • PASS [expected FAIL] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (img)
    • FAIL [expected PASS] subtest: PerformanceEntry has correct name, initiatorType, startTime, and duration (xmlhttprequest)

      assert_equals: expected 50.540000000000006 but got 50.53
      

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

@github-actions

Copy link
Copy Markdown

✨ Try run (#23249892178) succeeded.

@yezhizhen yezhizhen marked this pull request as ready for review March 18, 2026 15:05
@yezhizhen yezhizhen requested a review from mrobinson March 19, 2026 09:06
@yezhizhen

yezhizhen commented Mar 20, 2026

Copy link
Copy Markdown
Member Author

@mrobinson Can you check again? You asked to make some change that doesn't make real difference here instead of doing in follow-up. And I did.

This fixes all testdriver tests that use pinch zoom utility function. I need that to fix touch chain. New test added by Steven in another PR also needs this.

@mrobinson mrobinson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice work. I would like to suggest a few minor changes:

Comment thread components/shared/embedder/input_events.rs Outdated
Comment thread components/servo/servo.rs Outdated
Comment thread components/shared/embedder/input_events.rs Outdated
Comment thread components/servo/servo.rs Outdated
Comment thread components/paint/paint.rs Outdated
Comment thread components/paint/paint.rs Outdated
Comment on lines +789 to +790
/// Returning `false` means this is not going to reach constellation/script,
/// and we need to directly notify Embedder that input event is handled.

@mrobinson mrobinson Mar 20, 2026

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.

Nit:

Suggested change
/// Returning `false` means this is not going to reach constellation/script,
/// and we need to directly notify Embedder that input event is handled.
/// Returning `false` means this is not going to reach the Constellation,
/// and we need to directly notify the embedder that input event is handled.

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.

Thanks. I think this should not be plural tho :D
Constellations->Constellation

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.

Yes, well spotted. I've corrected the suggestion.

@yezhizhen yezhizhen force-pushed the response-must-be-given branch from 52769d6 to 4f487f0 Compare March 20, 2026 11:56
@yezhizhen yezhizhen requested a review from mrobinson March 20, 2026 11:57
@yezhizhen

yezhizhen commented Mar 20, 2026

Copy link
Copy Markdown
Member Author

Thanks for review. Please check 8fca267 and f6c7b61

@yezhizhen yezhizhen force-pushed the response-must-be-given branch 3 times, most recently from 7a797de to eef45dc Compare March 22, 2026 14:12

@mrobinson mrobinson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thank you!

Comment thread components/servo/webview.rs Outdated
Comment on lines +509 to +522
if !self
.inner()
.servo
.paint()
.notify_input_event(self.id(), event);
.notify_input_event(self.id(), event)
{
self.inner()
.servo
.add_pending_handled_input_event(PendingHandledInputEvent {
event_id,
webview_id,
});
self.inner().servo.event_loop_waker().wake();
}

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.

Instead of calling inner() three times, do you mind putting it in an instance variable?

@yezhizhen yezhizhen Mar 23, 2026

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.

Done in 2e2070c. Saved the call 4 times!

@servo-highfive servo-highfive removed the S-awaiting-review There is new code that needs to be reviewed. label Mar 22, 2026
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
@yezhizhen yezhizhen force-pushed the response-must-be-given branch from eef45dc to 0d74d10 Compare March 23, 2026 04:26
@servo-highfive servo-highfive added the S-awaiting-review There is new code that needs to be reviewed. label Mar 23, 2026
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
@yezhizhen yezhizhen force-pushed the response-must-be-given branch from 0d74d10 to 2e2070c Compare March 23, 2026 04:28
@yezhizhen yezhizhen added this pull request to the merge queue Mar 23, 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 23, 2026
Merged via the queue into servo:main with commit ca898ea Mar 23, 2026
30 checks passed
@yezhizhen yezhizhen deleted the response-must-be-given branch March 23, 2026 08:00
@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 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deadlock when input event fails to reach Constellation as embedder not informed

4 participants