mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
webdriver chore: check browsing context existence before handling user prompt when required (#38142)
Thanks to Trong with #38035, we can finally handle user prompt. This PR is mainly dirty work: 1. Add browsing context check before handling user prompt when required, according to spec. 2. Reduce IPC by removing redundant context existence check. 3. Add many missing docs. Testing: New passing cases and turn some ERROR into FAIL. --------- Signed-off-by: Euclid Ye <euclid.ye@huawei.com>
This commit is contained in:
parent
9a5a33190d
commit
f81ae1f57f
8 changed files with 165 additions and 89 deletions
|
@ -845,14 +845,18 @@ impl Handler {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#dfn-get-current-url>
|
||||||
fn handle_current_url(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_current_url(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_top_level_browsing_context_is_open(self.session()?.webview_id)?;
|
||||||
// Step 2. Handle any user prompt.
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
self.top_level_script_command(
|
self.top_level_script_command(
|
||||||
WebDriverScriptCommand::GetUrl(sender),
|
WebDriverScriptCommand::GetUrl(sender),
|
||||||
VerifyBrowsingContextIsOpen::Yes,
|
VerifyBrowsingContextIsOpen::No,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let url = wait_for_script_response(receiver)?;
|
let url = wait_for_script_response(receiver)?;
|
||||||
|
@ -986,6 +990,7 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#back>
|
||||||
fn handle_go_back(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_go_back(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
let webview_id = self.session()?.webview_id;
|
let webview_id = self.session()?.webview_id;
|
||||||
// Step 1. If session's current top-level browsing context is no longer open,
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
@ -1002,6 +1007,7 @@ impl Handler {
|
||||||
self.wait_for_navigation_to_complete()
|
self.wait_for_navigation_to_complete()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#forward>
|
||||||
fn handle_go_forward(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_go_forward(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
let webview_id = self.session()?.webview_id;
|
let webview_id = self.session()?.webview_id;
|
||||||
// Step 1. If session's current top-level browsing context is no longer open,
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
@ -1018,6 +1024,7 @@ impl Handler {
|
||||||
self.wait_for_navigation_to_complete()
|
self.wait_for_navigation_to_complete()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#refresh>
|
||||||
fn handle_refresh(&mut self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_refresh(&mut self) -> WebDriverResult<WebDriverResponse> {
|
||||||
let webview_id = self.session()?.webview_id;
|
let webview_id = self.session()?.webview_id;
|
||||||
// Step 1. If session's current top-level browsing context is no longer open,
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
@ -1039,7 +1046,11 @@ impl Handler {
|
||||||
Ok(WebDriverResponse::Void)
|
Ok(WebDriverResponse::Void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-title>
|
||||||
fn handle_title(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_title(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_top_level_browsing_context_is_open(self.session()?.webview_id)?;
|
||||||
// Step 2. Handle any user prompt.
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
|
@ -1047,15 +1058,18 @@ impl Handler {
|
||||||
|
|
||||||
self.top_level_script_command(
|
self.top_level_script_command(
|
||||||
WebDriverScriptCommand::GetTitle(sender),
|
WebDriverScriptCommand::GetTitle(sender),
|
||||||
VerifyBrowsingContextIsOpen::Yes,
|
VerifyBrowsingContextIsOpen::No,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let value = wait_for_script_response(receiver)?;
|
// Step 3. Let title be the session's current top-level
|
||||||
|
// browsing context's active document's title.
|
||||||
|
let title = wait_for_script_response(receiver)?;
|
||||||
Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(title)?,
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-window-handle>
|
||||||
fn handle_window_handle(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_window_handle(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
let session = self.session.as_ref().unwrap();
|
let session = self.session.as_ref().unwrap();
|
||||||
// Step 1. If session's current top-level browsing context is no longer open,
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
|
@ -1069,6 +1083,7 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-window-handles>
|
||||||
fn handle_window_handles(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_window_handles(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
let handles = self
|
let handles = self
|
||||||
.session
|
.session
|
||||||
|
@ -1178,8 +1193,8 @@ impl Handler {
|
||||||
// Step 1. If session's current top-level browsing context is no longer open,
|
// Step 1. If session's current top-level browsing context is no longer open,
|
||||||
// return error with error code no such window.
|
// return error with error code no such window.
|
||||||
self.verify_top_level_browsing_context_is_open(webview_id)?;
|
self.verify_top_level_browsing_context_is_open(webview_id)?;
|
||||||
// (SKIP) Step 2. Try to handle any user prompts with session.
|
// Step 2. Try to handle any user prompts with session.
|
||||||
|
self.handle_any_user_prompts(webview_id)?;
|
||||||
// Step 3. Set the current browsing context with session and
|
// Step 3. Set the current browsing context with session and
|
||||||
// session's current top-level browsing context.
|
// session's current top-level browsing context.
|
||||||
self.session_mut()?.browsing_context_id = BrowsingContextId::from(webview_id);
|
self.session_mut()?.browsing_context_id = BrowsingContextId::from(webview_id);
|
||||||
|
@ -1211,13 +1226,17 @@ impl Handler {
|
||||||
return Ok(WebDriverResponse::Void);
|
return Ok(WebDriverResponse::Void);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Step 2. If session's current parent browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
|
let cmd = WebDriverScriptCommand::GetParentFrameId(sender);
|
||||||
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
||||||
|
|
||||||
// Step 3. Handle any user prompt.
|
// Step 3. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(webview_id)?;
|
self.handle_any_user_prompts(webview_id)?;
|
||||||
|
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
// Step 4. If session's current parent browsing context is not null,
|
||||||
let cmd = WebDriverScriptCommand::GetParentFrameId(sender);
|
// set the current browsing context with session and current parent browsing context.
|
||||||
// TODO: Track Parent Browsing Context directly in the session, as expected by Spec.
|
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(browsing_context_id) => {
|
Ok(browsing_context_id) => {
|
||||||
self.session_mut()?.browsing_context_id = browsing_context_id;
|
self.session_mut()?.browsing_context_id = browsing_context_id;
|
||||||
|
@ -1283,6 +1302,9 @@ impl Handler {
|
||||||
if parameters.value.is_empty() {
|
if parameters.value.is_empty() {
|
||||||
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
||||||
}
|
}
|
||||||
|
// Step 5. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
|
||||||
// Step 6. Handle any user prompt.
|
// Step 6. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
@ -1294,7 +1316,7 @@ impl Handler {
|
||||||
parameters.value.clone(),
|
parameters.value.clone(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
||||||
let cmd = WebDriverScriptCommand::FindElementsLinkText(
|
let cmd = WebDriverScriptCommand::FindElementsLinkText(
|
||||||
|
@ -1302,19 +1324,19 @@ impl Handler {
|
||||||
parameters.using == LocatorStrategy::PartialLinkText,
|
parameters.using == LocatorStrategy::PartialLinkText,
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::TagName => {
|
LocatorStrategy::TagName => {
|
||||||
let cmd =
|
let cmd =
|
||||||
WebDriverScriptCommand::FindElementsTagName(parameters.value.clone(), sender);
|
WebDriverScriptCommand::FindElementsTagName(parameters.value.clone(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::XPath => {
|
LocatorStrategy::XPath => {
|
||||||
let cmd = WebDriverScriptCommand::FindElementsXpathSelector(
|
let cmd = WebDriverScriptCommand::FindElementsXpathSelector(
|
||||||
parameters.value.clone(),
|
parameters.value.clone(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1352,6 +1374,9 @@ impl Handler {
|
||||||
if parameters.value.is_empty() {
|
if parameters.value.is_empty() {
|
||||||
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
||||||
}
|
}
|
||||||
|
// Step 5. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
|
||||||
// Step 6. Handle any user prompt.
|
// Step 6. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
@ -1365,7 +1390,7 @@ impl Handler {
|
||||||
element.to_string(),
|
element.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
||||||
let cmd = WebDriverScriptCommand::FindElementElementsLinkText(
|
let cmd = WebDriverScriptCommand::FindElementElementsLinkText(
|
||||||
|
@ -1374,7 +1399,7 @@ impl Handler {
|
||||||
parameters.using == LocatorStrategy::PartialLinkText,
|
parameters.using == LocatorStrategy::PartialLinkText,
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::TagName => {
|
LocatorStrategy::TagName => {
|
||||||
let cmd = WebDriverScriptCommand::FindElementElementsTagName(
|
let cmd = WebDriverScriptCommand::FindElementElementsTagName(
|
||||||
|
@ -1382,7 +1407,7 @@ impl Handler {
|
||||||
element.to_string(),
|
element.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::XPath => {
|
LocatorStrategy::XPath => {
|
||||||
let cmd = WebDriverScriptCommand::FindElementElementsXPathSelector(
|
let cmd = WebDriverScriptCommand::FindElementElementsXPathSelector(
|
||||||
|
@ -1390,7 +1415,7 @@ impl Handler {
|
||||||
element.to_string(),
|
element.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1419,6 +1444,10 @@ impl Handler {
|
||||||
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Step 5. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
|
||||||
// Step 6. Handle any user prompt.
|
// Step 6. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
|
@ -1431,7 +1460,7 @@ impl Handler {
|
||||||
shadow_root.to_string(),
|
shadow_root.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
LocatorStrategy::LinkText | LocatorStrategy::PartialLinkText => {
|
||||||
let cmd = WebDriverScriptCommand::FindShadowElementsLinkText(
|
let cmd = WebDriverScriptCommand::FindShadowElementsLinkText(
|
||||||
|
@ -1440,7 +1469,7 @@ impl Handler {
|
||||||
parameters.using == LocatorStrategy::PartialLinkText,
|
parameters.using == LocatorStrategy::PartialLinkText,
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::TagName => {
|
LocatorStrategy::TagName => {
|
||||||
let cmd = WebDriverScriptCommand::FindShadowElementsTagName(
|
let cmd = WebDriverScriptCommand::FindShadowElementsTagName(
|
||||||
|
@ -1448,7 +1477,7 @@ impl Handler {
|
||||||
shadow_root.to_string(),
|
shadow_root.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
LocatorStrategy::XPath => {
|
LocatorStrategy::XPath => {
|
||||||
let cmd = WebDriverScriptCommand::FindShadowElementsXPathSelector(
|
let cmd = WebDriverScriptCommand::FindShadowElementsXPathSelector(
|
||||||
|
@ -1456,7 +1485,7 @@ impl Handler {
|
||||||
shadow_root.to_string(),
|
shadow_root.to_string(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1487,11 +1516,16 @@ impl Handler {
|
||||||
unwrap_first_element_response(res)
|
unwrap_first_element_response(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-element-shadow-root>
|
||||||
fn handle_get_shadow_root(&self, element: WebElement) -> WebDriverResult<WebDriverResponse> {
|
fn handle_get_shadow_root(&self, element: WebElement) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetElementShadowRoot(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::GetElementShadowRoot(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => {
|
Ok(value) => {
|
||||||
let Some(value) = value else {
|
let Some(value) = value else {
|
||||||
|
@ -1505,12 +1539,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect
|
/// <https://w3c.github.io/webdriver/#get-element-rect>
|
||||||
fn handle_element_rect(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
fn handle_element_rect(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetElementRect(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::GetElementRect(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(rect) => {
|
Ok(rect) => {
|
||||||
let response = ElementRectResponse {
|
let response = ElementRectResponse {
|
||||||
|
@ -1527,10 +1565,14 @@ impl Handler {
|
||||||
|
|
||||||
/// <https://w3c.github.io/webdriver/#dfn-get-element-text>
|
/// <https://w3c.github.io/webdriver/#dfn-get-element-text>
|
||||||
fn handle_element_text(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
fn handle_element_text(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetElementText(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::GetElementText(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(value)?,
|
||||||
|
@ -1541,10 +1583,14 @@ impl Handler {
|
||||||
|
|
||||||
///<https://w3c.github.io/webdriver/#get-active-element>
|
///<https://w3c.github.io/webdriver/#get-active-element>
|
||||||
fn handle_active_element(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_active_element(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetActiveElement(sender);
|
let cmd = WebDriverScriptCommand::GetActiveElement(sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
let value = wait_for_script_response(receiver)?
|
let value = wait_for_script_response(receiver)?
|
||||||
.map(|x| serde_json::to_value(WebElement(x)).unwrap());
|
.map(|x| serde_json::to_value(WebElement(x)).unwrap());
|
||||||
// Step 4. If active element is a non-null element, return success
|
// Step 4. If active element is a non-null element, return success
|
||||||
|
@ -1562,11 +1608,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-computed-role>
|
||||||
fn handle_computed_role(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
fn handle_computed_role(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetComputedRole(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::GetComputedRole(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(value)?,
|
||||||
|
@ -1575,11 +1626,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-element-tag-name>
|
||||||
fn handle_element_tag_name(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
fn handle_element_tag_name(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetElementTagName(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::GetElementTagName(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(value)?,
|
||||||
|
@ -1588,11 +1644,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-element-attribute>
|
||||||
fn handle_element_attribute(
|
fn handle_element_attribute(
|
||||||
&self,
|
&self,
|
||||||
element: &WebElement,
|
element: &WebElement,
|
||||||
name: &str,
|
name: &str,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetElementAttribute(
|
let cmd = WebDriverScriptCommand::GetElementAttribute(
|
||||||
|
@ -1600,7 +1661,7 @@ impl Handler {
|
||||||
name.to_owned(),
|
name.to_owned(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(value)?,
|
||||||
|
@ -1609,11 +1670,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-element-property>
|
||||||
fn handle_element_property(
|
fn handle_element_property(
|
||||||
&self,
|
&self,
|
||||||
element: &WebElement,
|
element: &WebElement,
|
||||||
name: &str,
|
name: &str,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
|
|
||||||
|
@ -1622,7 +1688,7 @@ impl Handler {
|
||||||
name.to_owned(),
|
name.to_owned(),
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
|
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
|
@ -1632,16 +1698,21 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-element-css-value>
|
||||||
fn handle_element_css(
|
fn handle_element_css(
|
||||||
&self,
|
&self,
|
||||||
element: &WebElement,
|
element: &WebElement,
|
||||||
name: &str,
|
name: &str,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd =
|
let cmd =
|
||||||
WebDriverScriptCommand::GetElementCSS(element.to_string(), name.to_owned(), sender);
|
WebDriverScriptCommand::GetElementCSS(element.to_string(), name.to_owned(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
serde_json::to_value(value)?,
|
serde_json::to_value(value)?,
|
||||||
|
@ -1650,11 +1721,16 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-all-cookies>
|
||||||
fn handle_get_cookies(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_get_cookies(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetCookies(sender);
|
let cmd = WebDriverScriptCommand::GetCookies(sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
let cookies = match wait_for_script_response(receiver)? {
|
let cookies = match wait_for_script_response(receiver)? {
|
||||||
Ok(cookies) => cookies,
|
Ok(cookies) => cookies,
|
||||||
Err(error) => return Err(WebDriverError::new(error, "")),
|
Err(error) => return Err(WebDriverError::new(error, "")),
|
||||||
|
@ -1666,11 +1742,16 @@ impl Handler {
|
||||||
Ok(WebDriverResponse::Cookies(CookiesResponse(response)))
|
Ok(WebDriverResponse::Cookies(CookiesResponse(response)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#get-named-cookie>
|
||||||
fn handle_get_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> {
|
fn handle_get_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::GetCookie(name, sender);
|
let cmd = WebDriverScriptCommand::GetCookie(name, sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
let cookies = match wait_for_script_response(receiver)? {
|
let cookies = match wait_for_script_response(receiver)? {
|
||||||
Ok(cookies) => cookies,
|
Ok(cookies) => cookies,
|
||||||
Err(error) => return Err(WebDriverError::new(error, "")),
|
Err(error) => return Err(WebDriverError::new(error, "")),
|
||||||
|
@ -1685,10 +1766,15 @@ impl Handler {
|
||||||
Ok(WebDriverResponse::Cookie(CookieResponse(response)))
|
Ok(WebDriverResponse::Cookie(CookieResponse(response)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#add-cookie>
|
||||||
fn handle_add_cookie(
|
fn handle_add_cookie(
|
||||||
&self,
|
&self,
|
||||||
params: &AddCookieParameters,
|
params: &AddCookieParameters,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
|
|
||||||
|
@ -1705,25 +1791,35 @@ impl Handler {
|
||||||
};
|
};
|
||||||
|
|
||||||
let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender);
|
let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(_) => Ok(WebDriverResponse::Void),
|
Ok(_) => Ok(WebDriverResponse::Void),
|
||||||
Err(error) => Err(WebDriverError::new(error, "")),
|
Err(error) => Err(WebDriverError::new(error, "")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#delete-cookie>
|
||||||
fn handle_delete_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> {
|
fn handle_delete_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::DeleteCookie(name, sender);
|
let cmd = WebDriverScriptCommand::DeleteCookie(name, sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(_) => Ok(WebDriverResponse::Void),
|
Ok(_) => Ok(WebDriverResponse::Void),
|
||||||
Err(error) => Err(WebDriverError::new(error, "")),
|
Err(error) => Err(WebDriverError::new(error, "")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#delete-all-cookies>
|
||||||
fn handle_delete_cookies(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_delete_cookies(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::DeleteCookies(sender);
|
let cmd = WebDriverScriptCommand::DeleteCookies(sender);
|
||||||
|
@ -1771,11 +1867,17 @@ impl Handler {
|
||||||
Ok(WebDriverResponse::Void)
|
Ok(WebDriverResponse::Void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#dfn-get-page-source>
|
||||||
fn handle_get_page_source(&self) -> WebDriverResult<WebDriverResponse> {
|
fn handle_get_page_source(&self) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 1. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 2. Handle any user prompt.
|
||||||
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
|
|
||||||
let cmd = WebDriverScriptCommand::GetPageSource(sender);
|
let cmd = WebDriverScriptCommand::GetPageSource(sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
|
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse(
|
Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse(
|
||||||
|
@ -1785,6 +1887,7 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#perform-actions>
|
||||||
fn handle_perform_actions(
|
fn handle_perform_actions(
|
||||||
&mut self,
|
&mut self,
|
||||||
parameters: ActionsParameters,
|
parameters: ActionsParameters,
|
||||||
|
@ -1845,10 +1948,15 @@ impl Handler {
|
||||||
Ok(WebDriverResponse::Void)
|
Ok(WebDriverResponse::Void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#dfn-execute-script>
|
||||||
fn handle_execute_script(
|
fn handle_execute_script(
|
||||||
&self,
|
&self,
|
||||||
parameters: &JavascriptCommandParameters,
|
parameters: &JavascriptCommandParameters,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 2. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 3. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
let func_body = ¶meters.script;
|
let func_body = ¶meters.script;
|
||||||
|
@ -1872,7 +1980,7 @@ impl Handler {
|
||||||
|
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::ExecuteScript(script, sender);
|
let cmd = WebDriverScriptCommand::ExecuteScript(script, sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
let result = wait_for_script_response(receiver)?;
|
let result = wait_for_script_response(receiver)?;
|
||||||
self.postprocess_js_result(result)
|
self.postprocess_js_result(result)
|
||||||
}
|
}
|
||||||
|
@ -1881,6 +1989,10 @@ impl Handler {
|
||||||
&self,
|
&self,
|
||||||
parameters: &JavascriptCommandParameters,
|
parameters: &JavascriptCommandParameters,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 2. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
|
// Step 3. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
let func_body = ¶meters.script;
|
let func_body = ¶meters.script;
|
||||||
|
@ -1918,7 +2030,7 @@ impl Handler {
|
||||||
|
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
let cmd = WebDriverScriptCommand::ExecuteAsyncScript(script, sender);
|
let cmd = WebDriverScriptCommand::ExecuteAsyncScript(script, sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
let result = wait_for_script_response(receiver)?;
|
let result = wait_for_script_response(receiver)?;
|
||||||
self.postprocess_js_result(result)
|
self.postprocess_js_result(result)
|
||||||
}
|
}
|
||||||
|
@ -1957,11 +2069,15 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <https://w3c.github.io/webdriver/#dfn-element-send-keys>
|
||||||
fn handle_element_send_keys(
|
fn handle_element_send_keys(
|
||||||
&self,
|
&self,
|
||||||
element: &WebElement,
|
element: &WebElement,
|
||||||
keys: &SendKeysParameters,
|
keys: &SendKeysParameters,
|
||||||
) -> WebDriverResult<WebDriverResponse> {
|
) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
// Step 3. If session's current browsing context is no longer open,
|
||||||
|
// return error with error code no such window.
|
||||||
|
self.verify_browsing_context_is_open(self.session()?.browsing_context_id)?;
|
||||||
// Step 4. Handle any user prompt.
|
// Step 4. Handle any user prompt.
|
||||||
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
self.handle_any_user_prompts(self.session()?.webview_id)?;
|
||||||
|
|
||||||
|
@ -1972,7 +2088,7 @@ impl Handler {
|
||||||
self.session()?.strict_file_interactability,
|
self.session()?.strict_file_interactability,
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
|
|
||||||
// TODO: distinguish the not found and not focusable cases
|
// TODO: distinguish the not found and not focusable cases
|
||||||
// File input and non-typeable form control should have
|
// File input and non-typeable form control should have
|
||||||
|
@ -2009,7 +2125,7 @@ impl Handler {
|
||||||
|
|
||||||
// Steps 1 - 7 + Step 8 for <option>
|
// Steps 1 - 7 + Step 8 for <option>
|
||||||
let cmd = WebDriverScriptCommand::ElementClick(element.to_string(), sender);
|
let cmd = WebDriverScriptCommand::ElementClick(element.to_string(), sender);
|
||||||
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::Yes)?;
|
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;
|
||||||
|
|
||||||
match wait_for_script_response(receiver)? {
|
match wait_for_script_response(receiver)? {
|
||||||
Ok(element_id) => match element_id {
|
Ok(element_id) => match element_id {
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
[events.py]
|
[events.py]
|
||||||
[test_form_control_send_text[input\]]
|
[test_form_control_send_text[input\]]
|
||||||
expected: ERROR
|
expected: FAIL
|
||||||
|
|
||||||
[test_form_control_send_text[textarea\]]
|
[test_form_control_send_text[textarea\]]
|
||||||
expected: ERROR
|
expected: FAIL
|
||||||
|
|
||||||
[test_file_upload]
|
|
||||||
expected: ERROR
|
|
||||||
|
|
||||||
[test_not_blurred[input\]]
|
|
||||||
expected: ERROR
|
|
||||||
|
|
||||||
[test_not_blurred[textarea\]]
|
|
||||||
expected: ERROR
|
|
||||||
|
|
|
@ -19,3 +19,6 @@
|
||||||
|
|
||||||
[test_readonly_element]
|
[test_readonly_element]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[test_iframe_is_interactable]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -7,6 +7,3 @@
|
||||||
|
|
||||||
[test_get_prompt_text]
|
[test_get_prompt_text]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test_unexpected_alert]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[user_prompts.py]
|
[user_prompts.py]
|
||||||
expected: TIMEOUT
|
|
||||||
[test_accept[capabilities0-alert-None\]]
|
[test_accept[capabilities0-alert-None\]]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -44,12 +43,3 @@
|
||||||
|
|
||||||
[test_ignore[capabilities0-prompt\]]
|
[test_ignore[capabilities0-prompt\]]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test_default[alert-None\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_default[confirm-False\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_default[prompt-None\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
[pointer_contextmenu.py]
|
|
||||||
[test_control_click[\\ue051-ctrlKey\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_release_control_click]
|
|
||||||
expected: FAIL
|
|
|
@ -1,12 +0,0 @@
|
||||||
[wheel.py]
|
|
||||||
[test_scroll_shadow_tree[outer-closed\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_scroll_shadow_tree[inner-closed\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_scroll_shadow_tree[outer-open\]]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test_scroll_shadow_tree[inner-open\]]
|
|
||||||
expected: FAIL
|
|
|
@ -8,9 +8,6 @@
|
||||||
[test_invalid_input[text1\]]
|
[test_invalid_input[text1\]]
|
||||||
expected: ERROR
|
expected: ERROR
|
||||||
|
|
||||||
[test_invalid_input[text2\]]
|
|
||||||
expected: ERROR
|
|
||||||
|
|
||||||
[test_invalid_input[42\]]
|
[test_invalid_input[42\]]
|
||||||
expected: ERROR
|
expected: ERROR
|
||||||
|
|
||||||
|
@ -36,16 +33,16 @@
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test_send_alert_text[\]]
|
[test_send_alert_text[\]]
|
||||||
expected: ERROR
|
expected: FAIL
|
||||||
|
|
||||||
[test_send_alert_text[Federer\]]
|
[test_send_alert_text[Federer\]]
|
||||||
expected: ERROR
|
expected: FAIL
|
||||||
|
|
||||||
[test_send_alert_text[ Fed erer \]]
|
[test_send_alert_text[ Fed erer \]]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test_send_alert_text[Fed\\terer\]]
|
[test_send_alert_text[Fed\\terer\]]
|
||||||
expected: ERROR
|
expected: FAIL
|
||||||
|
|
||||||
[test_unexpected_alert]
|
[test_unexpected_alert]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue