diff options
author | Euclid Ye <yezhizhenjiakang@gmail.com> | 2025-04-04 13:24:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-04 05:24:47 +0000 |
commit | 4bad7c0a5d8e19eabbe89ee70b21a5ece0e3c007 (patch) | |
tree | 573e6deace934548565d82deee5b8614ff71eb7b /components | |
parent | e1de46c69131ae717d49228942feba04c955f775 (diff) | |
download | servo-4bad7c0a5d8e19eabbe89ee70b21a5ece0e3c007.tar.gz servo-4bad7c0a5d8e19eabbe89ee70b21a5ece0e3c007.zip |
Webdriver delete cookie (#36306)
1. Implement `WebDriverCommand::DeleteCookie`
2. Remove unnecessary clone for `WebDriverCommand::GetNamedCookie`
Fixes: #36287
---------
Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
Diffstat (limited to 'components')
-rw-r--r-- | components/net/cookie_storage.rs | 11 | ||||
-rw-r--r-- | components/net/resource_thread.rs | 8 | ||||
-rw-r--r-- | components/script/script_thread.rs | 3 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 28 | ||||
-rw-r--r-- | components/shared/embedder/webdriver.rs | 1 | ||||
-rw-r--r-- | components/shared/net/lib.rs | 1 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 17 |
7 files changed, 65 insertions, 4 deletions
diff --git a/components/net/cookie_storage.rs b/components/net/cookie_storage.rs index 6a9c88b0756..f158fd035e7 100644 --- a/components/net/cookie_storage.rs +++ b/components/net/cookie_storage.rs @@ -94,6 +94,7 @@ impl CookieStorage { Ok(None) } } + pub fn clear_storage(&mut self, url: &ServoUrl) { let domain = reg_host(url.host_str().unwrap_or("")); let cookies = self.cookies_map.entry(domain).or_default(); @@ -102,6 +103,16 @@ impl CookieStorage { } } + pub fn delete_cookie_with_name(&mut self, url: &ServoUrl, name: String) { + let domain = reg_host(url.host_str().unwrap_or("")); + let cookies = self.cookies_map.entry(domain).or_default(); + for cookie in cookies.iter_mut() { + if cookie.cookie.name() == name { + cookie.set_expiry_time_in_past(); + } + } + } + // http://tools.ietf.org/html/rfc6265#section-5.3 pub fn push(&mut self, mut cookie: ServoCookie, url: &ServoUrl, source: CookieSource) { // https://www.ietf.org/id/draft-ietf-httpbis-cookie-alone-01.txt Step 1 diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index f792596e12d..effcf7b8e26 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -379,6 +379,14 @@ impl ResourceChannelManager { .clear_storage(&request); return true; }, + CoreResourceMsg::DeleteCookie(request, name) => { + http_state + .cookie_jar + .write() + .unwrap() + .delete_cookie_with_name(&request, name); + return true; + }, CoreResourceMsg::FetchRedirect(request_builder, res_init, sender) => { let cancellation_listener = self.get_or_create_cancellation_listener(request_builder.id); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 35b45fee6dd..c3356c5e72b 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2104,6 +2104,9 @@ impl ScriptThread { WebDriverScriptCommand::DeleteCookies(reply) => { webdriver_handlers::handle_delete_cookies(&documents, pipeline_id, reply) }, + WebDriverScriptCommand::DeleteCookie(name, reply) => { + webdriver_handlers::handle_delete_cookie(&documents, pipeline_id, name, reply) + }, WebDriverScriptCommand::FindElementCSS(selector, reply) => { webdriver_handlers::handle_find_element_css( &documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index ffb04b09e3a..17c13e3c0b9 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -23,7 +23,9 @@ use js::jsval::UndefinedValue; use js::rust::wrappers::{JS_CallFunctionName, JS_GetProperty, JS_HasOwnProperty, JS_TypeOfValue}; use js::rust::{HandleObject, HandleValue, IdVector, ToString}; use net_traits::CookieSource::{HTTP, NonHTTP}; -use net_traits::CoreResourceMsg::{DeleteCookies, GetCookiesDataForUrl, SetCookieForUrl}; +use net_traits::CoreResourceMsg::{ + DeleteCookie, DeleteCookies, GetCookiesDataForUrl, SetCookieForUrl, +}; use net_traits::IpcSend; use servo_url::ServoUrl; use webdriver::common::{WebElement, WebFrame, WebWindow}; @@ -929,6 +931,7 @@ pub(crate) fn handle_add_cookie( .unwrap(); } +// https://w3c.github.io/webdriver/#delete-all-cookies pub(crate) fn handle_delete_cookies( documents: &DocumentCollection, pipeline: PipelineId, @@ -950,6 +953,29 @@ pub(crate) fn handle_delete_cookies( reply.send(Ok(())).unwrap(); } +// https://w3c.github.io/webdriver/#delete-cookie +pub(crate) fn handle_delete_cookie( + documents: &DocumentCollection, + pipeline: PipelineId, + name: String, + reply: IpcSender<Result<(), ErrorStatus>>, +) { + let document = match documents.find_document(pipeline) { + Some(document) => document, + None => { + return reply.send(Err(ErrorStatus::UnknownError)).unwrap(); + }, + }; + let url = document.url(); + document + .window() + .as_global_scope() + .resource_threads() + .send(DeleteCookie(url, name)) + .unwrap(); + reply.send(Ok(())).unwrap(); +} + pub(crate) fn handle_get_title( documents: &DocumentCollection, pipeline: PipelineId, diff --git a/components/shared/embedder/webdriver.rs b/components/shared/embedder/webdriver.rs index 349a45edf1b..eb9c61dc497 100644 --- a/components/shared/embedder/webdriver.rs +++ b/components/shared/embedder/webdriver.rs @@ -78,6 +78,7 @@ pub enum WebDriverScriptCommand { IpcSender<Result<(), WebDriverCookieError>>, ), DeleteCookies(IpcSender<Result<(), ErrorStatus>>), + DeleteCookie(String, IpcSender<Result<(), ErrorStatus>>), ExecuteScript(String, IpcSender<WebDriverJSResult>), ExecuteAsyncScript(String, IpcSender<WebDriverJSResult>), FindElementCSS(String, IpcSender<Result<Option<String>, ErrorStatus>>), diff --git a/components/shared/net/lib.rs b/components/shared/net/lib.rs index c2c447d503e..0f1a1712ab7 100644 --- a/components/shared/net/lib.rs +++ b/components/shared/net/lib.rs @@ -493,6 +493,7 @@ pub enum CoreResourceMsg { CookieSource, ), DeleteCookies(ServoUrl), + DeleteCookie(ServoUrl, String), /// Get a history state by a given history state id GetHistoryState(HistoryStateId, IpcSender<Option<Vec<u8>>>), /// Set a history state for a given history state id diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index e3538dde617..5797caf5dce 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -1298,9 +1298,9 @@ impl Handler { Ok(WebDriverResponse::Cookies(CookiesResponse(response))) } - fn handle_get_cookie(&self, name: &str) -> WebDriverResult<WebDriverResponse> { + fn handle_get_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> { let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetCookie(name.to_owned(), sender); + let cmd = WebDriverScriptCommand::GetCookie(name, sender); self.browsing_context_script_command(cmd)?; let cookies = receiver.recv().unwrap(); let response = cookies @@ -1346,6 +1346,16 @@ impl Handler { } } + fn handle_delete_cookie(&self, name: String) -> WebDriverResult<WebDriverResponse> { + let (sender, receiver) = ipc::channel().unwrap(); + let cmd = WebDriverScriptCommand::DeleteCookie(name, sender); + self.browsing_context_script_command(cmd)?; + match receiver.recv().unwrap() { + Ok(_) => Ok(WebDriverResponse::Void), + Err(error) => Err(WebDriverError::new(error, "")), + } + } + fn handle_delete_cookies(&self) -> WebDriverResult<WebDriverResponse> { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::DeleteCookies(sender); @@ -1832,7 +1842,7 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::FindElementElements(ref element, ref parameters) => { self.handle_find_elements_from_element(element, parameters) }, - WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), + WebDriverCommand::GetNamedCookie(name) => self.handle_get_cookie(name), WebDriverCommand::GetCookies => self.handle_get_cookies(), WebDriverCommand::GetActiveElement => self.handle_active_element(), WebDriverCommand::GetElementRect(ref element) => self.handle_element_rect(element), @@ -1860,6 +1870,7 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::ElementClick(ref element) => self.handle_element_click(element), WebDriverCommand::DismissAlert => self.handle_dismiss_alert(), WebDriverCommand::DeleteCookies => self.handle_delete_cookies(), + WebDriverCommand::DeleteCookie(name) => self.handle_delete_cookie(name), WebDriverCommand::GetTimeouts => self.handle_get_timeouts(), WebDriverCommand::SetTimeouts(ref x) => self.handle_set_timeouts(x), WebDriverCommand::TakeScreenshot => self.handle_take_screenshot(), |