From 5acf0f9a0515c8358b3170f8d9a117c50b41bd7d Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 13 May 2016 15:18:39 -0500 Subject: [PATCH] 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(),