diff options
author | aditj <aditjain1980@gmail.com> | 2019-04-19 13:15:50 +0530 |
---|---|---|
committer | aditj <aditjain1980@gmail.com> | 2019-04-19 13:15:50 +0530 |
commit | 64961cc9c1ef389a3b36b89d71782872a8b48a14 (patch) | |
tree | 3a3c7ddcf81d8d01c10545950b6cd788290a5b8a | |
parent | 04c93c511b021a1e76512f997992667540657c4e (diff) | |
download | servo-64961cc9c1ef389a3b36b89d71782872a8b48a14.tar.gz servo-64961cc9c1ef389a3b36b89d71782872a8b48a14.zip |
Add webdriver deletecookies function
-rw-r--r-- | components/net/cookie.rs | 4 | ||||
-rw-r--r-- | components/net/cookie_storage.rs | 7 | ||||
-rw-r--r-- | components/net/resource_thread.rs | 8 | ||||
-rw-r--r-- | components/net_traits/lib.rs | 1 | ||||
-rw-r--r-- | components/script/script_thread.rs | 3 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 23 | ||||
-rw-r--r-- | components/script_traits/webdriver_msg.rs | 1 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 14 |
8 files changed, 60 insertions, 1 deletions
diff --git a/components/net/cookie.rs b/components/net/cookie.rs index ade42b93f7d..4d77d0911c4 100644 --- a/components/net/cookie.rs +++ b/components/net/cookie.rs @@ -143,6 +143,10 @@ impl Cookie { self.last_access = now(); } + pub fn set_expiry_time_negative(&mut self) { + self.expiry_time = Some(Serde(now() - Duration::seconds(1))); + } + // http://tools.ietf.org/html/rfc6265#section-5.1.4 pub fn default_path(request_path: &str) -> &str { // Step 2 diff --git a/components/net/cookie_storage.rs b/components/net/cookie_storage.rs index 6bc55f1387b..0f37ae754b9 100644 --- a/components/net/cookie_storage.rs +++ b/components/net/cookie_storage.rs @@ -83,6 +83,13 @@ 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_insert(vec![]); + for cookie in cookies.iter_mut() { + cookie.set_expiry_time_negative(); + } + } // http://tools.ietf.org/html/rfc6265#section-5.3 pub fn push(&mut self, mut cookie: Cookie, url: &ServoUrl, source: CookieSource) { diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 7a9dd49139c..32a3fb28058 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -236,6 +236,14 @@ impl ResourceChannelManager { http_state, ), }, + CoreResourceMsg::DeleteCookies(request) => { + http_state + .cookie_jar + .write() + .unwrap() + .clear_storage(&request); + return true; + }, CoreResourceMsg::FetchRedirect(req_init, res_init, sender, cancel_chan) => self .resource_manager .fetch(req_init, Some(res_init), sender, http_state, cancel_chan), diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 78385483d8a..8c7fcd188e0 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -397,6 +397,7 @@ pub enum CoreResourceMsg { IpcSender<Vec<Serde<Cookie<'static>>>>, CookieSource, ), + DeleteCookies(ServoUrl), /// 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/script/script_thread.rs b/components/script/script_thread.rs index 135e05abd0b..2118e3efda1 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1844,6 +1844,9 @@ impl ScriptThread { WebDriverScriptCommand::AddCookie(params, reply) => { webdriver_handlers::handle_add_cookie(&*documents, pipeline_id, params, reply) }, + WebDriverScriptCommand::DeleteCookies(reply) => { + webdriver_handlers::handle_delete_cookies(&*documents, pipeline_id, reply) + }, WebDriverScriptCommand::ExecuteScript(script, reply) => { webdriver_handlers::handle_execute_script(&*documents, pipeline_id, script, reply) }, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 89e2df12c9d..a3c143a4faa 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -34,7 +34,7 @@ use js::rust::HandleValue; use msg::constellation_msg::BrowsingContextId; use msg::constellation_msg::PipelineId; use net_traits::CookieSource::{NonHTTP, HTTP}; -use net_traits::CoreResourceMsg::{GetCookiesDataForUrl, SetCookieForUrl}; +use net_traits::CoreResourceMsg::{DeleteCookies, GetCookiesDataForUrl, SetCookieForUrl}; use net_traits::IpcSend; use script_traits::webdriver_msg::WebDriverCookieError; use script_traits::webdriver_msg::{ @@ -356,6 +356,27 @@ pub fn handle_add_cookie( .unwrap(); } +pub fn handle_delete_cookies( + documents: &Documents, + pipeline: PipelineId, + reply: IpcSender<Result<(), ()>>, +) { + let document = match documents.find_document(pipeline) { + Some(document) => document, + None => { + return reply.send(Err(())).unwrap(); + }, + }; + let url = document.url(); + document + .window() + .upcast::<GlobalScope>() + .resource_threads() + .send(DeleteCookies(url)) + .unwrap(); + let _ = reply.send(Ok(())); +} + pub fn handle_get_title(documents: &Documents, pipeline: PipelineId, reply: IpcSender<String>) { // TODO: Return an error if the pipeline doesn't exist. let title = documents diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 157ea3aa7a9..95b37afac96 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -21,6 +21,7 @@ pub enum WebDriverScriptCommand { Cookie<'static>, IpcSender<Result<(), WebDriverCookieError>>, ), + DeleteCookies(IpcSender<Result<(), ()>>), ExecuteScript(String, IpcSender<WebDriverJSResult>), ExecuteAsyncScript(String, IpcSender<WebDriverJSResult>), FindElementCSS(String, IpcSender<Result<Option<String>, ()>>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index bf838715a4c..293b364967c 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -971,6 +971,19 @@ impl Handler { } } + fn handle_delete_cookies(&self) -> WebDriverResult<WebDriverResponse> { + let (sender, receiver) = ipc::channel().unwrap(); + let cmd = WebDriverScriptCommand::DeleteCookies(sender); + self.browsing_context_script_command(cmd)?; + match receiver.recv().unwrap() { + Ok(_) => Ok(WebDriverResponse::Void), + Err(_) => Err(WebDriverError::new( + ErrorStatus::NoSuchWindow, + "No such window found.", + )), + } + } + fn handle_set_timeouts( &mut self, parameters: &TimeoutsParameters, @@ -1261,6 +1274,7 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::ElementSendKeys(ref element, ref keys) => { self.handle_element_send_keys(element, keys) }, + WebDriverCommand::DeleteCookies => self.handle_delete_cookies(), WebDriverCommand::SetTimeouts(ref x) => self.handle_set_timeouts(x), WebDriverCommand::TakeScreenshot => self.handle_take_screenshot(), WebDriverCommand::Extension(ref extension) => match *extension { |