mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Synchronize dispatch_actions
in WebDriver (#36932)
Implement missing synchronization in `dispatch_actions` of `WebDriver`. https://w3c.github.io/webdriver/#dispatching-actions > The user agent event loop has spun enough times to process the DOM events generated by the last invocation of the >[dispatch tick actions](https://w3c.github.io/webdriver/#dfn-dispatch-tick-actions) steps. - Add a way for `ScriptThread` to notify `WebDriver` about the completion of input commands. - Add a `webdriver_id` field for `InputEvent`. `ScriptThread` uses it to distinguish WebDriver events and sends notification. Tests: `./mach test-wpt --product servodriver -r tests\wpt\tests\webdriver\tests\classic\element_click\events.py` pass if `hit_testing` pass. Check [issue](https://github.com/servo/servo/issues/36676#issuecomment-2882917136) cc: @xiaochengh --------- Signed-off-by: batu_hoang <longvatrong111@gmail.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
3a527d784b
commit
f52fa9b672
13 changed files with 471 additions and 140 deletions
|
@ -132,7 +132,7 @@ use embedder_traits::{
|
|||
FocusSequenceNumber, ImeEvent, InputEvent, JSValue, JavaScriptEvaluationError,
|
||||
JavaScriptEvaluationId, MediaSessionActionType, MediaSessionEvent, MediaSessionPlaybackState,
|
||||
MouseButton, MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverCommandMsg,
|
||||
WebDriverLoadStatus,
|
||||
WebDriverCommandResponse, WebDriverLoadStatus,
|
||||
};
|
||||
use euclid::Size2D;
|
||||
use euclid::default::Size2D as UntypedSize2D;
|
||||
|
@ -532,6 +532,8 @@ pub struct InitialConstellationState {
|
|||
struct WebDriverData {
|
||||
load_channel: Option<(PipelineId, IpcSender<WebDriverLoadStatus>)>,
|
||||
resize_channel: Option<IpcSender<Size2D<f32, CSSPixel>>>,
|
||||
// Forward responses from the script thread to the webdriver server.
|
||||
input_command_response_sender: Option<IpcSender<WebDriverCommandResponse>>,
|
||||
}
|
||||
|
||||
impl WebDriverData {
|
||||
|
@ -539,6 +541,7 @@ impl WebDriverData {
|
|||
WebDriverData {
|
||||
load_channel: None,
|
||||
resize_channel: None,
|
||||
input_command_response_sender: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1867,6 +1870,18 @@ where
|
|||
ScriptToConstellationMessage::FinishJavaScriptEvaluation(evaluation_id, result) => {
|
||||
self.handle_finish_javascript_evaluation(evaluation_id, result)
|
||||
},
|
||||
ScriptToConstellationMessage::WebDriverInputComplete(msg_id) => {
|
||||
if let Some(ref reply_sender) = self.webdriver.input_command_response_sender {
|
||||
reply_sender
|
||||
.send(WebDriverCommandResponse { id: msg_id })
|
||||
.unwrap_or_else(|_| {
|
||||
warn!("Failed to send WebDriverInputComplete {:?}", msg_id);
|
||||
self.webdriver.input_command_response_sender = None;
|
||||
});
|
||||
} else {
|
||||
warn!("No WebDriver input_command_response_sender");
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4836,7 +4851,11 @@ where
|
|||
mouse_button,
|
||||
x,
|
||||
y,
|
||||
msg_id,
|
||||
response_sender,
|
||||
) => {
|
||||
self.webdriver.input_command_response_sender = Some(response_sender);
|
||||
|
||||
self.compositor_proxy
|
||||
.send(CompositorMsg::WebDriverMouseButtonEvent(
|
||||
webview_id,
|
||||
|
@ -4844,11 +4863,16 @@ where
|
|||
mouse_button,
|
||||
x,
|
||||
y,
|
||||
msg_id,
|
||||
));
|
||||
},
|
||||
WebDriverCommandMsg::MouseMoveAction(webview_id, x, y) => {
|
||||
WebDriverCommandMsg::MouseMoveAction(webview_id, x, y, msg_id, response_sender) => {
|
||||
self.webdriver.input_command_response_sender = Some(response_sender);
|
||||
|
||||
self.compositor_proxy
|
||||
.send(CompositorMsg::WebDriverMouseMoveEvent(webview_id, x, y));
|
||||
.send(CompositorMsg::WebDriverMouseMoveEvent(
|
||||
webview_id, x, y, msg_id,
|
||||
));
|
||||
},
|
||||
WebDriverCommandMsg::WheelScrollAction(webview, x, y, delta_x, delta_y) => {
|
||||
self.compositor_proxy
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue