mirror of
https://github.com/servo/servo.git
synced 2025-08-25 23:28:21 +01:00
webdriver: Simplify webview related steps that are guaranteed to succeed (#38855)
Testing: Semantically it is the same. But still run the test locally and
in [try](https://github.com/yezhizhen/servo/actions/runs/17159323926) as
I was worried about some unexpected side effect from
176e42d36d
. But seems everything is good.
---------
Signed-off-by: Euclid Ye <euclid.ye@huawei.com>
This commit is contained in:
parent
4082f57003
commit
f323e67024
2 changed files with 31 additions and 38 deletions
|
@ -574,9 +574,9 @@ impl Handler {
|
|||
webview_id
|
||||
},
|
||||
};
|
||||
self.session_mut()?.set_webview_id(Some(webview_id));
|
||||
self.session_mut()?.set_webview_id(webview_id);
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(BrowsingContextId::from(webview_id)));
|
||||
.set_browsing_context_id(BrowsingContextId::from(webview_id));
|
||||
|
||||
// Step 9. Set the request queue to a new queue.
|
||||
// Skip here because the requests are handled in the external crate.
|
||||
|
@ -674,7 +674,7 @@ impl Handler {
|
|||
|
||||
// Step 8.3. Set current browsing context with session and current top browsing context
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(BrowsingContextId::from(webview_id)));
|
||||
.set_browsing_context_id(BrowsingContextId::from(webview_id));
|
||||
|
||||
Ok(WebDriverResponse::Void)
|
||||
}
|
||||
|
@ -1016,7 +1016,7 @@ impl Handler {
|
|||
|
||||
// Step 5. Set current browsing context with session and current top browsing context.
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(BrowsingContextId::from(webview_id)));
|
||||
.set_browsing_context_id(BrowsingContextId::from(webview_id));
|
||||
|
||||
Ok(WebDriverResponse::Void)
|
||||
}
|
||||
|
@ -1066,7 +1066,7 @@ impl Handler {
|
|||
|
||||
/// <https://w3c.github.io/webdriver/#get-window-handles>
|
||||
fn handle_window_handles(&mut self) -> WebDriverResult<WebDriverResponse> {
|
||||
let mut handles = self.get_window_handles()?;
|
||||
let mut handles = self.get_window_handles();
|
||||
handles.sort();
|
||||
|
||||
Ok(WebDriverResponse::Generic(ValueResponse(
|
||||
|
@ -1074,35 +1074,25 @@ impl Handler {
|
|||
)))
|
||||
}
|
||||
|
||||
fn get_window_handle(&mut self, webview_id: WebViewId) -> WebDriverResult<String> {
|
||||
self.get_window_handles()?
|
||||
fn get_window_handle(&mut self, webview_id: WebViewId) -> Option<String> {
|
||||
self.get_window_handles()
|
||||
.iter()
|
||||
.find(|id| id == &&webview_id.to_string())
|
||||
.cloned()
|
||||
.ok_or_else(|| {
|
||||
WebDriverError::new(
|
||||
ErrorStatus::UnknownError,
|
||||
"No such window while getting window handle",
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
fn get_window_handles(&self) -> WebDriverResult<Vec<String>> {
|
||||
let handles = self
|
||||
.get_all_webview_ids()?
|
||||
fn get_window_handles(&self) -> Vec<String> {
|
||||
self.get_all_webview_ids()
|
||||
.into_iter()
|
||||
.map(|id| id.to_string())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
Ok(handles)
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn get_all_webview_ids(&self) -> WebDriverResult<Vec<WebViewId>> {
|
||||
fn get_all_webview_ids(&self) -> Vec<WebViewId> {
|
||||
let (sender, receiver) = ipc::channel().unwrap();
|
||||
self.send_message_to_embedder(WebDriverCommandMsg::GetAllWebViews(sender))?;
|
||||
let webviews = wait_for_ipc_response(receiver)?;
|
||||
|
||||
Ok(webviews)
|
||||
self.send_message_to_embedder(WebDriverCommandMsg::GetAllWebViews(sender))
|
||||
.unwrap();
|
||||
wait_for_ipc_response(receiver).unwrap_or_default()
|
||||
}
|
||||
|
||||
/// <https://w3c.github.io/webdriver/#find-element>
|
||||
|
@ -1136,7 +1126,7 @@ impl Handler {
|
|||
wait_for_ipc_response(receiver)?;
|
||||
|
||||
// Step 4. If there are no more open top-level browsing contexts, try to close the session.
|
||||
let window_handles = self.get_window_handles()?;
|
||||
let window_handles = self.get_window_handles();
|
||||
|
||||
if window_handles.is_empty() {
|
||||
self.session = None;
|
||||
|
@ -1172,7 +1162,9 @@ impl Handler {
|
|||
|
||||
if let Ok(webview_id) = receiver.recv() {
|
||||
let _ = self.wait_for_document_ready_state();
|
||||
let handle = self.get_window_handle(webview_id)?;
|
||||
let handle = self
|
||||
.get_window_handle(webview_id)
|
||||
.expect("Failed to get window handle of an existing webview");
|
||||
|
||||
Ok(WebDriverResponse::NewWindow(NewWindowResponse {
|
||||
handle,
|
||||
|
@ -1204,7 +1196,7 @@ impl Handler {
|
|||
// Step 3. Set the current browsing context with session and
|
||||
// session's current top-level browsing context.
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(BrowsingContextId::from(webview_id)));
|
||||
.set_browsing_context_id(BrowsingContextId::from(webview_id));
|
||||
return Ok(WebDriverResponse::Void);
|
||||
},
|
||||
// id is a Number object
|
||||
|
@ -1248,7 +1240,7 @@ impl Handler {
|
|||
match wait_for_ipc_response(receiver)? {
|
||||
Ok(browsing_context_id) => {
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(browsing_context_id));
|
||||
.set_browsing_context_id(browsing_context_id);
|
||||
Ok(WebDriverResponse::Void)
|
||||
},
|
||||
Err(error) => Err(WebDriverError::new(error, "")),
|
||||
|
@ -1260,9 +1252,9 @@ impl Handler {
|
|||
&mut self,
|
||||
parameters: &SwitchToWindowParameters,
|
||||
) -> WebDriverResult<WebDriverResponse> {
|
||||
let window_handles = self.get_all_webview_ids()?;
|
||||
let Some(webview_id) = window_handles
|
||||
.iter()
|
||||
let Some(webview_id) = self
|
||||
.get_all_webview_ids()
|
||||
.into_iter()
|
||||
.find(|id| id.to_string() == parameters.handle)
|
||||
else {
|
||||
return Err(WebDriverError::new(
|
||||
|
@ -1272,8 +1264,8 @@ impl Handler {
|
|||
};
|
||||
|
||||
let session = self.session_mut()?;
|
||||
session.set_webview_id(Some(*webview_id));
|
||||
session.set_browsing_context_id(Some(BrowsingContextId::from(*webview_id)));
|
||||
session.set_webview_id(webview_id);
|
||||
session.set_browsing_context_id(BrowsingContextId::from(webview_id));
|
||||
Ok(WebDriverResponse::Void)
|
||||
}
|
||||
|
||||
|
@ -1289,7 +1281,7 @@ impl Handler {
|
|||
match wait_for_ipc_response(receiver)? {
|
||||
Ok(browsing_context_id) => {
|
||||
self.session_mut()?
|
||||
.set_browsing_context_id(Some(browsing_context_id));
|
||||
.set_browsing_context_id(browsing_context_id);
|
||||
Ok(WebDriverResponse::Void)
|
||||
},
|
||||
Err(error) => Err(WebDriverError::new(error, "")),
|
||||
|
|
|
@ -60,6 +60,7 @@ pub struct WebDriverSession {
|
|||
|
||||
strict_file_interactability: bool,
|
||||
|
||||
/// <https://w3c.github.io/webdriver/#dfn-user-prompt-handler>
|
||||
user_prompt_handler: UserPromptHandler,
|
||||
|
||||
/// <https://w3c.github.io/webdriver/#dfn-input-state-map>
|
||||
|
@ -84,12 +85,12 @@ impl WebDriverSession {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_webview_id(&mut self, webview_id: Option<WebViewId>) {
|
||||
self.webview_id = webview_id;
|
||||
pub fn set_webview_id(&mut self, webview_id: WebViewId) {
|
||||
self.webview_id = Some(webview_id);
|
||||
}
|
||||
|
||||
pub fn set_browsing_context_id(&mut self, browsing_context_id: Option<BrowsingContextId>) {
|
||||
self.browsing_context_id = browsing_context_id;
|
||||
pub fn set_browsing_context_id(&mut self, browsing_context_id: BrowsingContextId) {
|
||||
self.browsing_context_id = Some(browsing_context_id);
|
||||
}
|
||||
|
||||
pub fn current_webview_id(&self) -> Option<WebViewId> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue