Skip to content

Commit

Permalink
webdriver_server: allow script timeout to be optional
Browse files Browse the repository at this point in the history
The script timeout duration may be set to null, indicating that an
injected script should run indefinitely without getting interrupted.
This change fixes the internal data structure, but does not address the
parsing of the input arguments to handle_set_timeouts.
  • Loading branch information
andreastt committed Jan 26, 2017
1 parent e87c275 commit 90d1ee7
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions components/webdriver_server/lib.rs
Expand Up @@ -101,8 +101,9 @@ struct WebDriverSession {
id: Uuid,
frame_id: Option<FrameId>,

/// Time to wait for injected scripts to run before interrupting them.
script_timeout: u32,
/// Time to wait for injected scripts to run before interrupting them. A [`None`] value
/// specifies that the script should run indefinitely.
script_timeout: Option<u32>,

/// Time to wait for a page to finish loading upon navigation.
load_timeout: u32,
Expand All @@ -118,7 +119,7 @@ impl WebDriverSession {
id: Uuid::new_v4(),
frame_id: None,

script_timeout: 30_000,
script_timeout: Some(30_000),
load_timeout: 300_000,
implicit_wait_timeout: 0,
}
Expand Down Expand Up @@ -705,11 +706,10 @@ impl Handler {
.as_mut()
.ok_or(WebDriverError::new(ErrorStatus::SessionNotCreated, "")));

// TODO(ato): Conversation is wrong. The script timeout can be null, and the numeric
// values should be limited to u32 in the standard.
// TODO: this conversion is crazy, spec should limit these to u32 and check upstream
let value = parameters.ms as u32;
match &parameters.type_[..] {
"script" => session.script_timeout = value,
"script" => session.script_timeout = Some(value),
"page load" => session.load_timeout = value,
"implicit" => session.implicit_wait_timeout = value,
x => {
Expand Down Expand Up @@ -745,10 +745,15 @@ impl Handler {
let func_body = &parameters.script;
let args_string = "window.webdriverCallback";

let script = format!("setTimeout(webdriverTimeout, {}); (function(callback) {{ {} }})({})",
session.script_timeout,
func_body,
args_string);
let script = match session.script_timeout {
Some(timeout) => {
format!("setTimeout(webdriverTimeout, {}); (function(callback) {{ {} }})({})",
timeout,
func_body,
args_string)
}
None => format!("(function(callback) {{ {} }})({})", func_body, args_string),
};

let (sender, receiver) = ipc::channel().unwrap();
let command = WebDriverScriptCommand::ExecuteAsyncScript(script, sender);
Expand Down

0 comments on commit 90d1ee7

Please sign in to comment.