diff options
author | Alan Jeffrey <ajeffrey@mozilla.com> | 2016-05-17 15:12:00 -0500 |
---|---|---|
committer | Alan Jeffrey <ajeffrey@mozilla.com> | 2016-05-20 09:20:45 -0500 |
commit | 3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718 (patch) | |
tree | 1d2c29a9fda2455558e729cd7ddfc8adbc35f343 /components | |
parent | e2203f81d31bb865e9d73765de33c87178fa2d14 (diff) | |
download | servo-3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718.tar.gz servo-3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718.zip |
Added a timeout to SetWindowSize.
Diffstat (limited to 'components')
-rw-r--r-- | components/constellation/constellation.rs | 4 | ||||
-rw-r--r-- | components/msg/constellation_msg.rs | 2 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 5 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 22 |
4 files changed, 22 insertions, 11 deletions
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 5a75d43df3e..0dc96a4e8de 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -293,7 +293,7 @@ impl<'a> Iterator for FrameTreeIterator<'a> { struct WebDriverData { load_channel: Option<(PipelineId, IpcSender<webdriver_msg::LoadStatus>)>, - resize_channel: Option<IpcSender<WindowSizeData>>, + resize_channel: Option<IpcSender<Option<WindowSizeData>>>, } impl WebDriverData { @@ -1713,7 +1713,7 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> } 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; diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs index 543e4277f23..d938cd63cb4 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -193,7 +193,7 @@ pub enum WebDriverCommandMsg { Refresh(PipelineId, IpcSender<LoadStatus>), ScriptCommand(PipelineId, WebDriverScriptCommand), SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>), - SetWindowSize(PipelineId, Size2D<u32>, IpcSender<WindowSizeData>), + SetWindowSize(PipelineId, Size2D<u32>, IpcSender<Option<WindowSizeData>>), TakeScreenshot(PipelineId, IpcSender<Option<Image>>), } diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 8c84c950ae0..6a7492492e2 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -25,16 +25,15 @@ use dom::node::Node; use dom::window::ScriptHelpers; use euclid::point::Point2D; use euclid::rect::Rect; -use euclid::size::{Size2D, TypedSize2D}; +use euclid::size::Size2D; use ipc_channel::ipc::IpcSender; use js::jsapi::JSContext; use js::jsapi::{HandleValue, RootedValue}; use js::jsval::UndefinedValue; -use msg::constellation_msg::{PipelineId, WindowSizeData}; +use msg::constellation_msg::PipelineId; use msg::webdriver_msg::{WebDriverFrameId, WebDriverJSError, WebDriverJSResult, WebDriverJSValue}; use script_thread::get_browsing_context; use url::Url; -use util::geometry::ViewportPx; use util::str::DOMString; fn find_node_by_unique_id(context: &BrowsingContext, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 57174704408..1f3de6a0db4 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -83,6 +83,7 @@ struct Handler { constellation_chan: Sender<ConstellationMsg>, script_timeout: u32, load_timeout: u32, + resize_timeout: u32, implicit_wait_timeout: u32 } @@ -222,6 +223,7 @@ impl Handler { constellation_chan: constellation_chan, script_timeout: 30_000, load_timeout: 300_000, + resize_timeout: 30_000, implicit_wait_timeout: 0 } } @@ -372,14 +374,24 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let size = Size2D::new(params.width as u32, params.height as u32); 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(); - let window_size = receiver.recv().unwrap(); - let vp = window_size.visible_viewport; - let window_size_response = WindowSizeResponse::new(vp.width.get() as u64, vp.height.get() as u64); - Ok(WebDriverResponse::WindowSize(window_size_response)) + 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 window_size_response = WindowSizeResponse::new(vp.width.get() as u64, vp.height.get() as u64); + Ok(WebDriverResponse::WindowSize(window_size_response)) + }, + None => Err(WebDriverError::new(ErrorStatus::Timeout, "Resize timed out")), + } } fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { |