Added a timeout to SetWindowSize.

This commit is contained in:
Alan Jeffrey 2016-05-17 15:12:00 -05:00
parent e2203f81d3
commit 3962ffc501
4 changed files with 22 additions and 11 deletions

View file

@ -293,7 +293,7 @@ impl<'a> Iterator for FrameTreeIterator<'a> {
struct WebDriverData { struct WebDriverData {
load_channel: Option<(PipelineId, IpcSender<webdriver_msg::LoadStatus>)>, load_channel: Option<(PipelineId, IpcSender<webdriver_msg::LoadStatus>)>,
resize_channel: Option<IpcSender<WindowSizeData>>, resize_channel: Option<IpcSender<Option<WindowSizeData>>>,
} }
impl WebDriverData { impl WebDriverData {
@ -1713,7 +1713,7 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF>
} }
if let Some(resize_channel) = self.webdriver.resize_channel.take() { if let Some(resize_channel) = self.webdriver.resize_channel.take() {
let _ = resize_channel.send(new_size); let _ = resize_channel.send(Some(new_size));
} }
self.window_size = new_size; self.window_size = new_size;

View file

@ -193,7 +193,7 @@ pub enum WebDriverCommandMsg {
Refresh(PipelineId, IpcSender<LoadStatus>), Refresh(PipelineId, IpcSender<LoadStatus>),
ScriptCommand(PipelineId, WebDriverScriptCommand), ScriptCommand(PipelineId, WebDriverScriptCommand),
SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>), SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>),
SetWindowSize(PipelineId, Size2D<u32>, IpcSender<WindowSizeData>), SetWindowSize(PipelineId, Size2D<u32>, IpcSender<Option<WindowSizeData>>),
TakeScreenshot(PipelineId, IpcSender<Option<Image>>), TakeScreenshot(PipelineId, IpcSender<Option<Image>>),
} }

View file

@ -25,16 +25,15 @@ use dom::node::Node;
use dom::window::ScriptHelpers; use dom::window::ScriptHelpers;
use euclid::point::Point2D; use euclid::point::Point2D;
use euclid::rect::Rect; use euclid::rect::Rect;
use euclid::size::{Size2D, TypedSize2D}; use euclid::size::Size2D;
use ipc_channel::ipc::IpcSender; use ipc_channel::ipc::IpcSender;
use js::jsapi::JSContext; use js::jsapi::JSContext;
use js::jsapi::{HandleValue, RootedValue}; use js::jsapi::{HandleValue, RootedValue};
use js::jsval::UndefinedValue; use js::jsval::UndefinedValue;
use msg::constellation_msg::{PipelineId, WindowSizeData}; use msg::constellation_msg::PipelineId;
use msg::webdriver_msg::{WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue}; use msg::webdriver_msg::{WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue};
use script_thread::get_browsing_context; use script_thread::get_browsing_context;
use url::Url; use url::Url;
use util::geometry::ViewportPx;
use util::str::DOMString; use util::str::DOMString;
fn find_node_by_unique_id(context: &BrowsingContext, fn find_node_by_unique_id(context: &BrowsingContext,

View file

@ -83,6 +83,7 @@ struct Handler {
constellation_chan: Sender<ConstellationMsg>, constellation_chan: Sender<ConstellationMsg>,
script_timeout: u32, script_timeout: u32,
load_timeout: u32, load_timeout: u32,
resize_timeout: u32,
implicit_wait_timeout: u32 implicit_wait_timeout: u32
} }
@ -222,6 +223,7 @@ impl Handler {
constellation_chan: constellation_chan, constellation_chan: constellation_chan,
script_timeout: 30_000, script_timeout: 30_000,
load_timeout: 300_000, load_timeout: 300_000,
resize_timeout: 30_000,
implicit_wait_timeout: 0 implicit_wait_timeout: 0
} }
} }
@ -372,14 +374,24 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let size = Size2D::new(params.width as u32, params.height as u32); let size = Size2D::new(params.width as u32, params.height as u32);
let pipeline_id = try!(self.root_pipeline()); let pipeline_id = try!(self.root_pipeline());
let cmd_msg = WebDriverCommandMsg::SetWindowSize(pipeline_id, size, sender); let cmd_msg = WebDriverCommandMsg::SetWindowSize(pipeline_id, size, sender.clone());
self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap();
let window_size = receiver.recv().unwrap(); let timeout = self.resize_timeout;
thread::spawn(move || {
thread::sleep(Duration::from_millis(timeout as u64));
let _ = sender.send(None);
});
match receiver.recv().unwrap() {
Some(window_size) => {
let vp = window_size.visible_viewport; let vp = window_size.visible_viewport;
let window_size_response = WindowSizeResponse::new(vp.width.get() as u64, vp.height.get() as u64); let window_size_response = WindowSizeResponse::new(vp.width.get() as u64, vp.height.get() as u64);
Ok(WebDriverResponse::WindowSize(window_size_response)) Ok(WebDriverResponse::WindowSize(window_size_response))
},
None => Err(WebDriverError::new(ErrorStatus::Timeout, "Resize timed out")),
}
} }
fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> {