use serde::{Deserialize, Serialize};
use crate::bidi::BiDi;
use crate::bidi::command::{BidiCommand, Empty};
use crate::bidi::error::BidiError;
use crate::bidi::ids::{BrowsingContextId, UserContextId};
use crate::common::protocol::string_enum;
string_enum! {
pub enum ForcedColorsModeTheme {
Light = "light",
Dark = "dark",
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetForcedColorsModeThemeOverride {
pub theme: Option<ForcedColorsModeTheme>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetForcedColorsModeThemeOverride {
const METHOD: &'static str = "emulation.setForcedColorsModeThemeOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeolocationCoordinates {
pub latitude: f64,
pub longitude: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub accuracy: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub altitude: Option<f64>,
#[serde(rename = "altitudeAccuracy", skip_serializing_if = "Option::is_none")]
pub altitude_accuracy: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub heading: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speed: Option<f64>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum GeolocationOverride {
Coordinates {
#[serde(skip_serializing_if = "Option::is_none")]
coordinates: Option<GeolocationCoordinates>,
},
Error {
error: GeolocationPositionError,
},
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum GeolocationPositionError {
PositionUnavailable,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetGeolocationOverride {
#[serde(flatten)]
pub geolocation: GeolocationOverride,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetGeolocationOverride {
const METHOD: &'static str = "emulation.setGeolocationOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetLocaleOverride {
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetLocaleOverride {
const METHOD: &'static str = "emulation.setLocaleOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum NetworkConditions {
Offline,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetNetworkConditions {
pub network_conditions: Option<NetworkConditions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetNetworkConditions {
const METHOD: &'static str = "emulation.setNetworkConditions";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScreenArea {
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetScreenSettingsOverride {
pub screen_area: Option<ScreenArea>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetScreenSettingsOverride {
const METHOD: &'static str = "emulation.setScreenSettingsOverride";
type Returns = Empty;
}
string_enum! {
pub enum ScreenOrientationNatural {
Portrait = "portrait",
Landscape = "landscape",
}
}
string_enum! {
pub enum ScreenOrientationType {
PortraitPrimary = "portrait-primary",
PortraitSecondary = "portrait-secondary",
LandscapePrimary = "landscape-primary",
LandscapeSecondary = "landscape-secondary",
}
}
#[derive(Debug, Clone, Serialize)]
pub struct ScreenOrientation {
pub natural: ScreenOrientationNatural,
#[serde(rename = "type")]
pub orientation_type: ScreenOrientationType,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetScreenOrientationOverride {
pub screen_orientation: Option<ScreenOrientation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetScreenOrientationOverride {
const METHOD: &'static str = "emulation.setScreenOrientationOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetUserAgentOverride {
pub user_agent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetUserAgentOverride {
const METHOD: &'static str = "emulation.setUserAgentOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetScriptingEnabled {
#[serde(serialize_with = "serialize_disable_only")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
fn serialize_disable_only<S: serde::Serializer>(
value: &Option<bool>,
serializer: S,
) -> Result<S::Ok, S::Error> {
match value {
Some(false) => serializer.serialize_bool(false),
_ => serializer.serialize_none(),
}
}
impl BidiCommand for SetScriptingEnabled {
const METHOD: &'static str = "emulation.setScriptingEnabled";
type Returns = Empty;
}
string_enum! {
pub enum ScrollbarType {
Classic = "classic",
Overlay = "overlay",
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetScrollbarTypeOverride {
pub scrollbar_type: Option<ScrollbarType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetScrollbarTypeOverride {
const METHOD: &'static str = "emulation.setScrollbarTypeOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetTimezoneOverride {
pub timezone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetTimezoneOverride {
const METHOD: &'static str = "emulation.setTimezoneOverride";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetTouchOverride {
pub max_touch_points: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<BrowsingContextId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_contexts: Option<Vec<UserContextId>>,
}
impl BidiCommand for SetTouchOverride {
const METHOD: &'static str = "emulation.setTouchOverride";
type Returns = Empty;
}
#[derive(Debug)]
pub struct EmulationModule<'a> {
bidi: &'a BiDi,
}
impl<'a> EmulationModule<'a> {
pub(crate) fn new(bidi: &'a BiDi) -> Self {
Self {
bidi,
}
}
pub async fn set_forced_colors_mode_theme_override(
&self,
theme: Option<ForcedColorsModeTheme>,
) -> Result<(), BidiError> {
self.bidi
.send(SetForcedColorsModeThemeOverride {
theme,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_geolocation_override(
&self,
coordinates: Option<GeolocationCoordinates>,
) -> Result<(), BidiError> {
self.bidi
.send(SetGeolocationOverride {
geolocation: GeolocationOverride::Coordinates {
coordinates,
},
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_locale_override(&self, locale: Option<String>) -> Result<(), BidiError> {
self.bidi
.send(SetLocaleOverride {
locale,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_network_conditions(
&self,
conditions: Option<NetworkConditions>,
) -> Result<(), BidiError> {
self.bidi
.send(SetNetworkConditions {
network_conditions: conditions,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_screen_settings_override(
&self,
screen_area: Option<ScreenArea>,
) -> Result<(), BidiError> {
self.bidi
.send(SetScreenSettingsOverride {
screen_area,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_screen_orientation_override(
&self,
orientation: Option<ScreenOrientation>,
) -> Result<(), BidiError> {
self.bidi
.send(SetScreenOrientationOverride {
screen_orientation: orientation,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_user_agent_override(
&self,
user_agent: Option<String>,
) -> Result<(), BidiError> {
self.bidi
.send(SetUserAgentOverride {
user_agent,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_scripting_enabled(&self, enabled: Option<bool>) -> Result<(), BidiError> {
self.bidi
.send(SetScriptingEnabled {
enabled,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_scrollbar_type_override(
&self,
scrollbar_type: Option<ScrollbarType>,
) -> Result<(), BidiError> {
self.bidi
.send(SetScrollbarTypeOverride {
scrollbar_type,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_timezone_override(&self, timezone: Option<String>) -> Result<(), BidiError> {
self.bidi
.send(SetTimezoneOverride {
timezone,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
pub async fn set_touch_override(&self, max_touch_points: Option<u32>) -> Result<(), BidiError> {
self.bidi
.send(SetTouchOverride {
max_touch_points,
contexts: None,
user_contexts: None,
})
.await?;
Ok(())
}
}