aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorAlan Jeffrey <ajeffrey@mozilla.com>2016-05-17 15:12:00 -0500
committerAlan Jeffrey <ajeffrey@mozilla.com>2016-05-20 09:20:45 -0500
commit3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718 (patch)
tree1d2c29a9fda2455558e729cd7ddfc8adbc35f343 /components
parente2203f81d31bb865e9d73765de33c87178fa2d14 (diff)
downloadservo-3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718.tar.gz
servo-3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718.zip
Added a timeout to SetWindowSize.
Diffstat (limited to 'components')
-rw-r--r--components/constellation/constellation.rs4
-rw-r--r--components/msg/constellation_msg.rs2
-rw-r--r--components/script/webdriver_handlers.rs5
-rw-r--r--components/webdriver_server/lib.rs22
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> {