From 38e826b454e1ad1cea1e12286b0f75f3315a18bb Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Thu, 5 Jan 2023 22:23:22 -0600 Subject: [PATCH] marionette: Pass params to NewWindow The `NewWindow` Marionette command actually takes two arguments. They are optional, and without them, Firefox will open a new *tab* instead of a new *window*. Since we obviously want windows rather than tabs, so as to place them on separate monitors, we need to explicitly specify this when we execute the command. --- src/marionette/message.rs | 26 +++++++++++++++++++++++++- src/marionette/mod.rs | 26 ++++++++++++++++++++------ src/session.rs | 7 ++++++- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/marionette/message.rs b/src/marionette/message.rs index af9f015..aba51f7 100644 --- a/src/marionette/message.rs +++ b/src/marionette/message.rs @@ -90,6 +90,30 @@ pub struct CloseWindowParams { pub handle: String, } +#[derive(Debug, Serialize)] +#[serde(rename_all = "lowercase")] +#[allow(dead_code)] +pub enum WindowType { + Window, + Tab, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +pub struct NewWindowParams { + #[serde(rename = "type")] + pub window_type: WindowType, + pub focus: bool, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +pub struct NewWindowResponse { + pub handle: String, +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] #[allow(dead_code)] @@ -124,7 +148,7 @@ pub enum Command { #[serde(rename = "WebDriver:CloseWindow")] CloseWindow(CloseWindowParams), #[serde(rename = "WebDriver:NewWindow")] - NewWindow, + NewWindow(NewWindowParams), #[serde(rename = "WebDriver:SwitchToWindow")] SwitchToWindow(SwitchToWindowParams), #[serde(rename = "WebDriver:FullscreenWindow")] diff --git a/src/marionette/mod.rs b/src/marionette/mod.rs index df0071e..0ccbcf7 100644 --- a/src/marionette/mod.rs +++ b/src/marionette/mod.rs @@ -20,7 +20,8 @@ pub use error::{CommandError, ConnectionError, ErrorResponse, MessageError}; use message::{ CloseWindowParams, Command, GetCurrentUrlResponse, GetTitleResponse, Hello, NavigateParams, NewSessionParams, NewSessionResponse, - SwitchToWindowParams, WindowRect, + NewWindowParams, NewWindowResponse, SwitchToWindowParams, WindowRect, + WindowType, }; #[derive(Debug, Deserialize, Serialize)] @@ -184,8 +185,11 @@ impl Marionette { } pub async fn fullscreen(&mut self) -> Result<(), CommandError> { - let res: serde_json::Value = - self.conn.send_message(Command::FullscreenWindow).await?.unwrap(); + let res: serde_json::Value = self + .conn + .send_message(Command::FullscreenWindow) + .await? + .unwrap(); debug!("Received message: {:?}", res); Ok(()) } @@ -247,9 +251,19 @@ impl Marionette { Ok(res) } - pub async fn new_window(&mut self) -> Result { - let res: String = - self.conn.send_message(Command::NewWindow).await?.unwrap(); + pub async fn new_window( + &mut self, + window_type: WindowType, + focus: bool, + ) -> Result { + let res: NewWindowResponse = self + .conn + .send_message(Command::NewWindow(NewWindowParams { + window_type, + focus, + })) + .await? + .unwrap(); debug!("Received message: {:?}", res); Ok(res.handle) } diff --git a/src/session.rs b/src/session.rs index 6ad340c..9b87470 100644 --- a/src/session.rs +++ b/src/session.rs @@ -6,6 +6,7 @@ use tracing::{debug, error, info, trace, warn}; use crate::browser::{Browser, BrowserError}; use crate::config::Configuration; use crate::marionette::error::{CommandError, ConnectionError}; +use crate::marionette::message::WindowType; use crate::marionette::{Marionette, MarionetteConnection}; use crate::monitor::Monitor; use crate::mqtt::{Message, MqttClient, MqttPublisher}; @@ -149,7 +150,11 @@ impl Session { monitor.y ); if window.is_none() { - window = Some(self.marionette.new_window().await?); + window = Some( + self.marionette + .new_window(WindowType::Window, false) + .await?, + ); } let w = window.take().unwrap(); self.marionette.switch_to_window(w.clone(), false).await?;