use std::time::Duration;
use crate::BrowserContext;
use crate::context::{
ColorScheme, ContextOptionsBuilder, ForcedColors, Permission, ProxyConfig, ReducedMotion,
StorageState,
};
use crate::devices::DeviceDescriptor;
use crate::error::BrowserError;
use crate::page::VideoOptions;
use super::Browser;
#[derive(Debug)]
pub struct NewContextBuilder<'a> {
browser: &'a Browser,
builder: ContextOptionsBuilder,
}
impl<'a> NewContextBuilder<'a> {
pub(super) fn new(browser: &'a Browser) -> Self {
Self {
browser,
builder: ContextOptionsBuilder::new(),
}
}
#[must_use]
pub fn storage_state_path(mut self, path: impl Into<std::path::PathBuf>) -> Self {
self.builder = self.builder.storage_state_path(path);
self
}
#[must_use]
pub fn storage_state(mut self, state: StorageState) -> Self {
self.builder = self.builder.storage_state(state);
self
}
#[must_use]
pub fn geolocation(mut self, latitude: f64, longitude: f64) -> Self {
self.builder = self.builder.geolocation(latitude, longitude);
self
}
#[must_use]
pub fn geolocation_with_accuracy(
mut self,
latitude: f64,
longitude: f64,
accuracy: f64,
) -> Self {
self.builder = self
.builder
.geolocation_with_accuracy(latitude, longitude, accuracy);
self
}
#[must_use]
pub fn permissions(mut self, permissions: Vec<Permission>) -> Self {
self.builder = self.builder.permissions(permissions);
self
}
#[must_use]
pub fn http_credentials(
mut self,
username: impl Into<String>,
password: impl Into<String>,
) -> Self {
self.builder = self.builder.http_credentials(username, password);
self
}
#[must_use]
pub fn extra_http_headers(
mut self,
headers: std::collections::HashMap<String, String>,
) -> Self {
self.builder = self.builder.extra_http_headers(headers);
self
}
#[must_use]
pub fn header(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
self.builder = self.builder.header(name, value);
self
}
#[must_use]
pub fn offline(mut self, offline: bool) -> Self {
self.builder = self.builder.offline(offline);
self
}
#[must_use]
pub fn default_timeout(mut self, timeout: Duration) -> Self {
self.builder = self.builder.default_timeout(timeout);
self
}
#[must_use]
pub fn default_navigation_timeout(mut self, timeout: Duration) -> Self {
self.builder = self.builder.default_navigation_timeout(timeout);
self
}
#[must_use]
pub fn has_touch(mut self, has_touch: bool) -> Self {
self.builder = self.builder.has_touch(has_touch);
self
}
#[must_use]
pub fn locale(mut self, locale: impl Into<String>) -> Self {
self.builder = self.builder.locale(locale);
self
}
#[must_use]
pub fn timezone_id(mut self, timezone_id: impl Into<String>) -> Self {
self.builder = self.builder.timezone_id(timezone_id);
self
}
#[must_use]
pub fn user_agent(mut self, user_agent: impl Into<String>) -> Self {
self.builder = self.builder.user_agent(user_agent);
self
}
#[must_use]
pub fn viewport(mut self, width: i32, height: i32) -> Self {
self.builder = self.builder.viewport(width, height);
self
}
#[must_use]
pub fn color_scheme(mut self, color_scheme: ColorScheme) -> Self {
self.builder = self.builder.color_scheme(color_scheme);
self
}
#[must_use]
pub fn reduced_motion(mut self, reduced_motion: ReducedMotion) -> Self {
self.builder = self.builder.reduced_motion(reduced_motion);
self
}
#[must_use]
pub fn forced_colors(mut self, forced_colors: ForcedColors) -> Self {
self.builder = self.builder.forced_colors(forced_colors);
self
}
#[must_use]
pub fn device_scale_factor(mut self, scale_factor: f64) -> Self {
self.builder = self.builder.device_scale_factor(scale_factor);
self
}
#[must_use]
pub fn is_mobile(mut self, is_mobile: bool) -> Self {
self.builder = self.builder.is_mobile(is_mobile);
self
}
#[must_use]
pub fn device(mut self, device: DeviceDescriptor) -> Self {
self.builder = self.builder.device(device);
self
}
#[must_use]
pub fn record_video(mut self, options: VideoOptions) -> Self {
self.builder = self.builder.record_video(options);
self
}
#[must_use]
pub fn proxy(mut self, proxy: ProxyConfig) -> Self {
self.builder = self.builder.proxy(proxy);
self
}
pub async fn build(self) -> Result<BrowserContext, BrowserError> {
self.browser
.new_context_with_options(self.builder.build())
.await
}
}