aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraditj <aditjain1980@gmail.com>2019-04-19 13:15:50 +0530
committeraditj <aditjain1980@gmail.com>2019-04-19 13:15:50 +0530
commit64961cc9c1ef389a3b36b89d71782872a8b48a14 (patch)
tree3a3c7ddcf81d8d01c10545950b6cd788290a5b8a
parent04c93c511b021a1e76512f997992667540657c4e (diff)
downloadservo-64961cc9c1ef389a3b36b89d71782872a8b48a14.tar.gz
servo-64961cc9c1ef389a3b36b89d71782872a8b48a14.zip
Add webdriver deletecookies function
-rw-r--r--components/net/cookie.rs4
-rw-r--r--components/net/cookie_storage.rs7
-rw-r--r--components/net/resource_thread.rs8
-rw-r--r--components/net_traits/lib.rs1
-rw-r--r--components/script/script_thread.rs3
-rw-r--r--components/script/webdriver_handlers.rs23
-rw-r--r--components/script_traits/webdriver_msg.rs1
-rw-r--r--components/webdriver_server/lib.rs14
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 {