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.
This commit is contained in:
2023-01-05 22:23:22 -06:00
parent ebb5318390
commit 38e826b454
3 changed files with 51 additions and 8 deletions

View File

@@ -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")]

View File

@@ -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<String, CommandError> {
let res: String =
self.conn.send_message(Command::NewWindow).await?.unwrap();
pub async fn new_window(
&mut self,
window_type: WindowType,
focus: bool,
) -> Result<String, CommandError> {
let res: NewWindowResponse = self
.conn
.send_message(Command::NewWindow(NewWindowParams {
window_type,
focus,
}))
.await?
.unwrap();
debug!("Received message: {:?}", res);
Ok(res.handle)
}

View File

@@ -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?;