servo/components/webdriver_server/capabilities.rs
batu_hoang f5ee72f89a
Rework webdriver session (#38225)
Reimplement webdriver session for better match to spec:

- Add `create_session`:
[spec](https://www.w3.org/TR/webdriver2/#dfn-create-a-session)
- Refactor `handle_new_session`
- Replace `PageLoadStrategy` string by enum

---------

Signed-off-by: batu_hoang <hoang.binh.trong@huawei.com>
2025-07-28 10:14:14 +00:00

137 lines
4.3 KiB
Rust

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use serde_json::{Map, Value};
use webdriver::capabilities::{BrowserCapabilities, Capabilities};
use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult};
pub struct ServoCapabilities {
pub browser_name: String,
pub browser_version: String,
pub platform_name: Option<String>,
pub accept_insecure_certs: bool,
pub set_window_rect: bool,
pub strict_file_interactability: bool,
pub accept_proxy: bool,
pub accept_custom: bool,
}
impl ServoCapabilities {
pub fn new() -> ServoCapabilities {
ServoCapabilities {
browser_name: "servo".to_string(),
browser_version: "0.0.1".to_string(),
platform_name: get_platform_name(),
accept_insecure_certs: false,
set_window_rect: true,
strict_file_interactability: false,
accept_proxy: false,
accept_custom: true,
}
}
}
impl BrowserCapabilities for ServoCapabilities {
fn init(&mut self, _: &Capabilities) {}
fn browser_name(&mut self, _: &Capabilities) -> WebDriverResult<Option<String>> {
Ok(Some(self.browser_name.clone()))
}
fn browser_version(&mut self, _: &Capabilities) -> WebDriverResult<Option<String>> {
Ok(Some(self.browser_version.clone()))
}
fn compare_browser_version(&mut self, _: &str, _: &str) -> WebDriverResult<bool> {
Ok(true)
}
fn platform_name(&mut self, _: &Capabilities) -> WebDriverResult<Option<String>> {
Ok(self.platform_name.clone())
}
fn accept_insecure_certs(&mut self, _: &Capabilities) -> WebDriverResult<bool> {
Ok(self.accept_insecure_certs)
}
fn set_window_rect(&mut self, _: &Capabilities) -> WebDriverResult<bool> {
Ok(self.set_window_rect)
}
fn strict_file_interactability(&mut self, value: &Capabilities) -> WebDriverResult<bool> {
if let Some(Value::Bool(strict_file_interactability)) =
value.get("strictFileInteractability")
{
self.strict_file_interactability = *strict_file_interactability;
}
Ok(self.strict_file_interactability)
}
fn accept_proxy(&mut self, _: &Map<String, Value>, _: &Capabilities) -> WebDriverResult<bool> {
Ok(self.accept_proxy)
}
fn accept_custom(&mut self, _: &str, _: &Value, _: &Capabilities) -> WebDriverResult<bool> {
Ok(self.accept_custom)
}
fn validate_custom(&mut self, _: &str, _: &Value) -> WebDriverResult<()> {
Ok(())
}
fn web_socket_url(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_virtual_authenticators(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_uvm(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_prf(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_large_blob(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_cred_blob(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
}
fn get_platform_name() -> Option<String> {
if cfg!(target_os = "windows") {
Some("windows".to_string())
} else if cfg!(target_os = "linux") {
Some("linux".to_string())
} else if cfg!(target_os = "macos") {
Some("mac".to_string())
} else {
None
}
}