From 5acf0f9a0515c8358b3170f8d9a117c50b41bd7d Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 13 May 2016 15:18:39 -0500 Subject: [PATCH 1/4] Implemented webdriver SetWindowSize. --- components/msg/webdriver_msg.rs | 3 +++ components/script/script_thread.rs | 2 ++ components/script/webdriver_handlers.rs | 15 ++++++++++++++- components/webdriver_server/Cargo.toml | 1 + components/webdriver_server/lib.rs | 16 +++++++++++++++- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/components/msg/webdriver_msg.rs b/components/msg/webdriver_msg.rs index fb59de4a922..fca22ab61e5 100644 --- a/components/msg/webdriver_msg.rs +++ b/components/msg/webdriver_msg.rs @@ -4,9 +4,11 @@ use constellation_msg::{PipelineId, WindowSizeData}; use euclid::rect::Rect; +use euclid::size::TypedSize2D; use ipc_channel::ipc::IpcSender; use rustc_serialize::json::{Json, ToJson}; use url::Url; +use util::geometry::ViewportPx; #[derive(Deserialize, Serialize)] pub enum WebDriverScriptCommand { @@ -24,6 +26,7 @@ pub enum WebDriverScriptCommand { GetFrameId(WebDriverFrameId, IpcSender, ()>>), GetUrl(IpcSender), GetWindowSize(IpcSender>), + SetWindowSize(TypedSize2D, IpcSender<()>), IsEnabled(String, IpcSender>), IsSelected(String, IpcSender>), GetTitle(IpcSender) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 8f43e1b1bfc..e8c87629b06 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1018,6 +1018,8 @@ impl ScriptThread { webdriver_handlers::handle_get_url(&context, pipeline_id, reply), WebDriverScriptCommand::GetWindowSize(reply) => webdriver_handlers::handle_get_window_size(&context, pipeline_id, reply), + WebDriverScriptCommand::SetWindowSize(size, reply) => + webdriver_handlers::handle_set_window_size(&context, pipeline_id, size, reply), WebDriverScriptCommand::IsEnabled(element_id, reply) => webdriver_handlers::handle_is_enabled(&context, pipeline_id, element_id, reply), WebDriverScriptCommand::IsSelected(element_id, reply) => diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 2defda98743..5e5424b131e 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -25,7 +25,7 @@ use dom::node::Node; use dom::window::ScriptHelpers; use euclid::point::Point2D; use euclid::rect::Rect; -use euclid::size::Size2D; +use euclid::size::{Size2D, TypedSize2D}; use ipc_channel::ipc::IpcSender; use js::jsapi::JSContext; use js::jsapi::{HandleValue, RootedValue}; @@ -34,6 +34,7 @@ use msg::constellation_msg::{PipelineId, WindowSizeData}; 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, @@ -290,6 +291,18 @@ pub fn handle_get_window_size(context: &BrowsingContext, reply.send(size).unwrap(); } +pub fn handle_set_window_size(context: &BrowsingContext, + _pipeline: PipelineId, + size: TypedSize2D, + reply: IpcSender<()>) { + let window = context.active_window(); + // TODO: converting to a dimensionless size is error-prone + let untyped = size.to_untyped(); + // TODO: when window puts in security checks for resize, we will need to rewrite this + window.ResizeTo(untyped.width as i32, untyped.height as i32); + reply.send(()).unwrap(); +} + pub fn handle_is_enabled(context: &BrowsingContext, pipeline: PipelineId, element_id: String, diff --git a/components/webdriver_server/Cargo.toml b/components/webdriver_server/Cargo.toml index d9cd38f9979..de365ebdae3 100644 --- a/components/webdriver_server/Cargo.toml +++ b/components/webdriver_server/Cargo.toml @@ -13,6 +13,7 @@ compositing = {path = "../compositing"} msg = {path = "../msg"} plugins = {path = "../plugins"} util = {path = "../util"} +euclid = {version = "0.6.4", features = ["plugins"]} ipc-channel = {git = "https://github.com/servo/ipc-channel"} image = "0.10" log = "0.3.5" diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 85b499afd01..151c6efddb6 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -11,6 +11,7 @@ #![deny(unsafe_code)] extern crate compositing; +extern crate euclid; extern crate hyper; extern crate image; extern crate ipc_channel; @@ -25,6 +26,7 @@ extern crate webdriver; mod keys; use compositing::CompositorMsg as ConstellationMsg; +use euclid::Size2D; use hyper::method::Method::{self, Post}; use image::{DynamicImage, ImageFormat, RgbImage}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; @@ -46,7 +48,8 @@ use util::prefs::{get_pref, reset_all_prefs, reset_pref, set_pref, PrefValue}; use util::thread::spawn_named; use uuid::Uuid; use webdriver::command::{GetParameters, JavascriptCommandParameters, LocatorParameters}; -use webdriver::command::{Parameters, SendKeysParameters, SwitchToFrameParameters, TimeoutsParameters}; +use webdriver::command::{Parameters, SendKeysParameters, SwitchToFrameParameters}; +use webdriver::command::{TimeoutsParameters, WindowSizeParameters}; use webdriver::command::{WebDriverCommand, WebDriverExtensionCommand, WebDriverMessage}; use webdriver::common::{LocatorStrategy, WebElement}; use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; @@ -367,6 +370,16 @@ impl Handler { } } + fn handle_set_window_size(&self, params: &WindowSizeParameters) -> WebDriverResult { + let (sender, receiver) = ipc::channel().unwrap(); + let size = Size2D::from_untyped(&Size2D::new(params.width as f32, params.height as f32)); + + try!(self.root_script_command(WebDriverScriptCommand::SetWindowSize(size, sender))); + receiver.recv().unwrap(); + + Ok(WebDriverResponse::Void) + } + fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult { let (sender, receiver) = ipc::channel().unwrap(); @@ -767,6 +780,7 @@ impl WebDriverHandler for Handler { WebDriverCommand::Get(ref parameters) => self.handle_get(parameters), WebDriverCommand::GetCurrentUrl => self.handle_current_url(), WebDriverCommand::GetWindowSize => self.handle_window_size(), + WebDriverCommand::SetWindowSize(ref size) => self.handle_set_window_size(size), WebDriverCommand::IsEnabled(ref element) => self.handle_is_enabled(element), WebDriverCommand::IsSelected(ref element) => self.handle_is_selected(element), WebDriverCommand::GoBack => self.handle_go_back(), From e2203f81d31bb865e9d73765de33c87178fa2d14 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Tue, 17 May 2016 13:27:45 -0500 Subject: [PATCH 2/4] Made SetWindowSize synchronous. --- components/constellation/constellation.rs | 17 ++++++++++++-- components/msg/constellation_msg.rs | 4 +++- components/msg/webdriver_msg.rs | 6 +---- components/script/script_thread.rs | 4 ---- components/script/webdriver_handlers.rs | 20 ---------------- components/webdriver_server/lib.rs | 28 ++++++++++++----------- 6 files changed, 34 insertions(+), 45 deletions(-) diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 88f8bd02265..5a75d43df3e 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -292,13 +292,15 @@ impl<'a> Iterator for FrameTreeIterator<'a> { } struct WebDriverData { - load_channel: Option<(PipelineId, IpcSender)> + load_channel: Option<(PipelineId, IpcSender)>, + resize_channel: Option>, } impl WebDriverData { pub fn new() -> WebDriverData { WebDriverData { - load_channel: None + load_channel: None, + resize_channel: None, } } } @@ -1484,6 +1486,13 @@ impl Constellation // Find the script channel for the given parent pipeline, // and pass the event to that script thread. match msg { + WebDriverCommandMsg::GetWindowSize(_, reply) => { + let _ = reply.send(self.window_size); + }, + WebDriverCommandMsg::SetWindowSize(_, size, reply) => { + self.webdriver.resize_channel = Some(reply); + self.compositor_proxy.send(ToCompositorMsg::ResizeTo(size)); + }, WebDriverCommandMsg::LoadUrl(pipeline_id, load_data, reply) => { self.load_url_for_webdriver(pipeline_id, load_data, reply); }, @@ -1703,6 +1712,10 @@ impl Constellation } } + if let Some(resize_channel) = self.webdriver.resize_channel.take() { + let _ = resize_channel.send(new_size); + } + self.window_size = new_size; } diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs index 3433b6915f0..543e4277f23 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -6,7 +6,7 @@ //! reduce coupling between these two components. use euclid::scale_factor::ScaleFactor; -use euclid::size::TypedSize2D; +use euclid::size::{Size2D, TypedSize2D}; use hyper::header::Headers; use hyper::method::Method; use ipc_channel::ipc::{IpcSender, IpcSharedMemory}; @@ -188,10 +188,12 @@ bitflags! { #[derive(Deserialize, Serialize)] pub enum WebDriverCommandMsg { + GetWindowSize(PipelineId, IpcSender), LoadUrl(PipelineId, LoadData, IpcSender), Refresh(PipelineId, IpcSender), ScriptCommand(PipelineId, WebDriverScriptCommand), SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>), + SetWindowSize(PipelineId, Size2D, IpcSender), TakeScreenshot(PipelineId, IpcSender>), } diff --git a/components/msg/webdriver_msg.rs b/components/msg/webdriver_msg.rs index fca22ab61e5..a6c94c3a439 100644 --- a/components/msg/webdriver_msg.rs +++ b/components/msg/webdriver_msg.rs @@ -2,13 +2,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use constellation_msg::{PipelineId, WindowSizeData}; +use constellation_msg::PipelineId; use euclid::rect::Rect; -use euclid::size::TypedSize2D; use ipc_channel::ipc::IpcSender; use rustc_serialize::json::{Json, ToJson}; use url::Url; -use util::geometry::ViewportPx; #[derive(Deserialize, Serialize)] pub enum WebDriverScriptCommand { @@ -25,8 +23,6 @@ pub enum WebDriverScriptCommand { GetElementText(String, IpcSender>), GetFrameId(WebDriverFrameId, IpcSender, ()>>), GetUrl(IpcSender), - GetWindowSize(IpcSender>), - SetWindowSize(TypedSize2D, IpcSender<()>), IsEnabled(String, IpcSender>), IsSelected(String, IpcSender>), GetTitle(IpcSender) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e8c87629b06..c791000cae4 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1016,10 +1016,6 @@ impl ScriptThread { webdriver_handlers::handle_get_frame_id(&context, pipeline_id, frame_id, reply), WebDriverScriptCommand::GetUrl(reply) => webdriver_handlers::handle_get_url(&context, pipeline_id, reply), - WebDriverScriptCommand::GetWindowSize(reply) => - webdriver_handlers::handle_get_window_size(&context, pipeline_id, reply), - WebDriverScriptCommand::SetWindowSize(size, reply) => - webdriver_handlers::handle_set_window_size(&context, pipeline_id, size, reply), WebDriverScriptCommand::IsEnabled(element_id, reply) => webdriver_handlers::handle_is_enabled(&context, pipeline_id, element_id, reply), WebDriverScriptCommand::IsSelected(element_id, reply) => diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 5e5424b131e..8c84c950ae0 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -283,26 +283,6 @@ pub fn handle_get_url(context: &BrowsingContext, reply.send((*url).clone()).unwrap(); } -pub fn handle_get_window_size(context: &BrowsingContext, - _pipeline: PipelineId, - reply: IpcSender>) { - let window = context.active_window(); - let size = window.window_size(); - reply.send(size).unwrap(); -} - -pub fn handle_set_window_size(context: &BrowsingContext, - _pipeline: PipelineId, - size: TypedSize2D, - reply: IpcSender<()>) { - let window = context.active_window(); - // TODO: converting to a dimensionless size is error-prone - let untyped = size.to_untyped(); - // TODO: when window puts in security checks for resize, we will need to rewrite this - window.ResizeTo(untyped.width as i32, untyped.height as i32); - reply.send(()).unwrap(); -} - pub fn handle_is_enabled(context: &BrowsingContext, pipeline: PipelineId, element_id: String, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 151c6efddb6..57174704408 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -357,27 +357,29 @@ impl Handler { fn handle_window_size(&self) -> WebDriverResult { let (sender, receiver) = ipc::channel().unwrap(); + let pipeline_id = try!(self.root_pipeline()); + let cmd_msg = WebDriverCommandMsg::GetWindowSize(pipeline_id, sender); - try!(self.root_script_command(WebDriverScriptCommand::GetWindowSize(sender))); + self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); - 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::NoSuchWindow, "Unable to determine window size")) - } + 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)) } fn handle_set_window_size(&self, params: &WindowSizeParameters) -> WebDriverResult { let (sender, receiver) = ipc::channel().unwrap(); - let size = Size2D::from_untyped(&Size2D::new(params.width as f32, params.height as f32)); + 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); - try!(self.root_script_command(WebDriverScriptCommand::SetWindowSize(size, sender))); - receiver.recv().unwrap(); + self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); - Ok(WebDriverResponse::Void) + 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)) } fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult { From 3962ffc5015e6e4b4e9ad7f0da5c7fd9b3de3718 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Tue, 17 May 2016 15:12:00 -0500 Subject: [PATCH 3/4] Added a timeout to SetWindowSize. --- components/constellation/constellation.rs | 4 ++-- components/msg/constellation_msg.rs | 2 +- components/script/webdriver_handlers.rs | 5 ++--- 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)>, - resize_channel: Option>, + resize_channel: Option>>, } impl WebDriverData { @@ -1713,7 +1713,7 @@ impl Constellation } 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), ScriptCommand(PipelineId, WebDriverScriptCommand), SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>), - SetWindowSize(PipelineId, Size2D, IpcSender), + SetWindowSize(PipelineId, Size2D, IpcSender>), TakeScreenshot(PipelineId, IpcSender>), } 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, 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 { From 8797f6f3ec8bb49ad35d375fd8bb2fb62a3abc32 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 20 May 2016 09:45:34 -0500 Subject: [PATCH 4/4] Responding to review comments. --- components/constellation/constellation.rs | 4 ++-- components/msg/constellation_msg.rs | 2 +- components/servo/Cargo.lock | 1 + components/webdriver_server/lib.rs | 20 ++++++++++---------- ports/cef/Cargo.lock | 1 + 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 0dc96a4e8de..5a75d43df3e 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)>, - resize_channel: Option>>, + resize_channel: Option>, } impl WebDriverData { @@ -1713,7 +1713,7 @@ impl Constellation } if let Some(resize_channel) = self.webdriver.resize_channel.take() { - let _ = resize_channel.send(Some(new_size)); + let _ = resize_channel.send(new_size); } self.window_size = new_size; diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs index d938cd63cb4..543e4277f23 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -193,7 +193,7 @@ pub enum WebDriverCommandMsg { Refresh(PipelineId, IpcSender), ScriptCommand(PipelineId, WebDriverScriptCommand), SendKeys(PipelineId, Vec<(Key, KeyModifiers, KeyState)>), - SetWindowSize(PipelineId, Size2D, IpcSender>), + SetWindowSize(PipelineId, Size2D, IpcSender), TakeScreenshot(PipelineId, IpcSender>), } diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 660731f9a76..f8dad025011 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -2476,6 +2476,7 @@ name = "webdriver_server" version = "0.0.1" dependencies = [ "compositing 0.0.1", + "euclid 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.2 (git+https://github.com/servo/ipc-channel)", diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 1f3de6a0db4..92c339fb7d5 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -223,7 +223,7 @@ impl Handler { constellation_chan: constellation_chan, script_timeout: 30_000, load_timeout: 300_000, - resize_timeout: 30_000, + resize_timeout: 500, implicit_wait_timeout: 0 } } @@ -379,19 +379,19 @@ impl Handler { self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); let timeout = self.resize_timeout; + let constellation_chan = self.constellation_chan.clone(); thread::spawn(move || { + // On timeout, we send a GetWindowSize message to the constellation, + // which will give the current window size. thread::sleep(Duration::from_millis(timeout as u64)); - let _ = sender.send(None); + let cmd_msg = WebDriverCommandMsg::GetWindowSize(pipeline_id, sender); + constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); }); - 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")), - } + 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)) } fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult { diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 096037b1913..e5c6fbc6366 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -2337,6 +2337,7 @@ name = "webdriver_server" version = "0.0.1" dependencies = [ "compositing 0.0.1", + "euclid 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.2 (git+https://github.com/servo/ipc-channel)",