webdriver: configure Expires and SameSite in handle_add_cookie (#38285)

Handler::handle_add_cookie did not configure the attributes "Expires"
and "SameSite". This patch adds them.

Testing: Passing WPT tests that were expected to fail.
Fixes: https://github.com/servo/servo/pull/37715#issuecomment-3069734014

Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
This commit is contained in:
Kingsley Yung 2025-07-26 20:23:24 +08:00 committed by GitHub
parent a3de3ffa75
commit 4d899ecba5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 30 additions and 30 deletions

1
Cargo.lock generated
View file

@ -9520,6 +9520,7 @@ dependencies = [
"servo_geometry", "servo_geometry",
"servo_url", "servo_url",
"stylo_traits", "stylo_traits",
"time",
"uuid", "uuid",
"webdriver", "webdriver",
] ]

View file

@ -30,5 +30,6 @@ servo_config = { path = "../config" }
servo_geometry = { path = "../geometry" } servo_geometry = { path = "../geometry" }
servo_url = { path = "../url" } servo_url = { path = "../url" }
stylo_traits = { workspace = true } stylo_traits = { workspace = true }
time = { workspace = true }
uuid = { workspace = true } uuid = { workspace = true }
webdriver = { workspace = true } webdriver = { workspace = true }

View file

@ -21,7 +21,7 @@ use std::{env, fmt, process, thread};
use base::id::{BrowsingContextId, WebViewId}; use base::id::{BrowsingContextId, WebViewId};
use base64::Engine; use base64::Engine;
use capabilities::ServoCapabilities; use capabilities::ServoCapabilities;
use cookie::{CookieBuilder, Expiration}; use cookie::{CookieBuilder, Expiration, SameSite};
use crossbeam_channel::{Receiver, Sender, after, select, unbounded}; use crossbeam_channel::{Receiver, Sender, after, select, unbounded};
use embedder_traits::{ use embedder_traits::{
EventLoopWaker, MouseButton, WebDriverCommandMsg, WebDriverCommandResponse, WebDriverFrameId, EventLoopWaker, MouseButton, WebDriverCommandMsg, WebDriverCommandResponse, WebDriverFrameId,
@ -44,6 +44,7 @@ use servo_config::prefs::{self, PrefValue, Preferences};
use servo_geometry::DeviceIndependentIntRect; use servo_geometry::DeviceIndependentIntRect;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use style_traits::CSSPixel; use style_traits::CSSPixel;
use time::OffsetDateTime;
use uuid::Uuid; use uuid::Uuid;
use webdriver::actions::{ use webdriver::actions::{
ActionSequence, ActionsType, PointerAction, PointerActionItem, PointerActionParameters, ActionSequence, ActionsType, PointerAction, PointerActionItem, PointerActionParameters,
@ -1811,17 +1812,32 @@ impl Handler {
self.handle_any_user_prompts(self.session()?.webview_id)?; self.handle_any_user_prompts(self.session()?.webview_id)?;
let (sender, receiver) = ipc::channel().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let cookie_builder = CookieBuilder::new(params.name.to_owned(), params.value.to_owned()) let mut cookie_builder =
.secure(params.secure) CookieBuilder::new(params.name.to_owned(), params.value.to_owned())
.http_only(params.httpOnly); .secure(params.secure)
let cookie_builder = match params.domain { .http_only(params.httpOnly);
Some(ref domain) => cookie_builder.domain(domain.to_owned()), if let Some(ref domain) = params.domain {
_ => cookie_builder, cookie_builder = cookie_builder.domain(domain.clone());
}; }
let cookie_builder = match params.path { if let Some(ref path) = params.path {
Some(ref path) => cookie_builder.path(path.to_owned()), cookie_builder = cookie_builder.path(path.clone());
_ => cookie_builder, }
}; if let Some(ref expiry) = params.expiry {
if let Ok(datetime) = OffsetDateTime::from_unix_timestamp(expiry.0 as i64) {
cookie_builder = cookie_builder.expires(datetime);
}
}
if let Some(ref same_site) = params.sameSite {
cookie_builder = match same_site.as_str() {
"None" => Ok(cookie_builder.same_site(SameSite::None)),
"Lax" => Ok(cookie_builder.same_site(SameSite::Lax)),
"Strict" => Ok(cookie_builder.same_site(SameSite::Strict)),
_ => Err(WebDriverError::new(
ErrorStatus::InvalidArgument,
"invalid argument",
)),
}?;
}
let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender); let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender);
self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?; self.browsing_context_script_command(cmd, VerifyBrowsingContextIsOpen::No)?;

View file

@ -25,21 +25,3 @@
[test_cookie_unsupported_scheme[secure websocket\]] [test_cookie_unsupported_scheme[secure websocket\]]
expected: FAIL expected: FAIL
[test_add_non_session_cookie]
expected: FAIL
[test_add_cookie_with_expiry_in_the_future]
expected: FAIL
[test_add_cookie_with_valid_samesite_flag[None\]]
expected: FAIL
[test_add_cookie_with_valid_samesite_flag[Lax\]]
expected: FAIL
[test_add_cookie_with_valid_samesite_flag[Strict\]]
expected: FAIL
[test_add_cookie_with_invalid_samesite_flag]
expected: FAIL