From 0dfd00f6644c1dcd98c31a69d78401eb2a7e78d4 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 15 Jun 2015 15:33:09 +0800 Subject: [PATCH] Add cookies.remove API. --- atom/browser/api/atom_api_cookies.cc | 63 +++++++++++++++++++++++++--- atom/browser/api/atom_api_cookies.h | 17 +++++--- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/atom/browser/api/atom_api_cookies.cc b/atom/browser/api/atom_api_cookies.cc index bc784321da..c87b4fca62 100644 --- a/atom/browser/api/atom_api_cookies.cc +++ b/atom/browser/api/atom_api_cookies.cc @@ -43,7 +43,7 @@ bool GetCookieListFromStore(net::CookieStore* cookie_store, void RunGetCookiesCallbackOnUIThread(const base::DictionaryValue* filter, const std::string& error_message, const net::CookieList& cookie_list, - const atom::api::Cookies::GetCookiesCallback& callback) { + const atom::api::Cookies::CookiesCallback& callback) { // Should release filter here. delete filter; @@ -61,6 +61,22 @@ void RunGetCookiesCallbackOnUIThread(const base::DictionaryValue* filter, mate::Converter::ToV8(isolate, cookie_list)); } +void RunRemoveCookiesCallbackOnUIThread(const std::string& error_message, + const atom::api::Cookies::CookiesCallback& callback) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::Locker locker(isolate); + v8::HandleScope handle_scope(isolate); + + if (!error_message.empty()) { + v8::Local error = v8::String::NewFromUtf8(isolate, + error_message.c_str()); + callback.Run(error, v8::Null(isolate)); + return; + } + + callback.Run(v8::Null(isolate), v8::Null(isolate)); +} + bool MatchesDomain(const base::DictionaryValue* filter, const std::string& cookie_domain) { std::string filter_domain; @@ -143,7 +159,7 @@ Cookies::~Cookies() { } void Cookies::Get(const base::DictionaryValue& options, - const GetCookiesCallback& callback) { + const CookiesCallback& callback) { // The filter will be deleted manually after callback function finishes. base::DictionaryValue* filter = options.DeepCopyWithoutEmptyChildren(); @@ -153,7 +169,7 @@ void Cookies::Get(const base::DictionaryValue& options, } void Cookies::GetCookiesOnIOThread(const base::DictionaryValue* filter, - const GetCookiesCallback& callback) { + const CookiesCallback& callback) { net::CookieStore* cookie_store = AtomBrowserContext::Get()->url_request_context_getter() ->GetURLRequestContext()->cookie_store(); @@ -163,13 +179,13 @@ void Cookies::GetCookiesOnIOThread(const base::DictionaryValue* filter, base::Bind(&Cookies::OnGetCookies, base::Unretained(this), filter, callback))) { BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::Bind(&RunGetCookiesCallbackOnUIThread, filter, "url is not valid", + base::Bind(&RunGetCookiesCallbackOnUIThread, filter, "Url is not valid", net::CookieList(), callback)); } } void Cookies::OnGetCookies(const base::DictionaryValue* filter, - const GetCookiesCallback& callback, + const CookiesCallback& callback, const net::CookieList& cookie_list) { net::CookieList result; for (const auto& cookie : cookie_list) { @@ -180,10 +196,45 @@ void Cookies::OnGetCookies(const base::DictionaryValue* filter, &RunGetCookiesCallbackOnUIThread, filter, "", result, callback)); } +void Cookies::Remove(const base::DictionaryValue& details, + const CookiesCallback& callback) { + std::string url, name; + std::string error_message; + if (!details.GetString("url", &url) || !details.GetString("name", &name)) { + error_message = "Details(url, name) of removing cookie are required."; + } + GURL gurl(url); + if (error_message.empty() && !gurl.is_valid()) { + error_message = "Url is not valid."; + } + if (!error_message.empty()) { + RunRemoveCookiesCallbackOnUIThread(error_message, callback); + return; + } + content::BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, + base::Bind(&Cookies::RemoveCookiesOnIOThread, base::Unretained(this), + gurl, name, callback)); +} + +void Cookies::RemoveCookiesOnIOThread(const GURL& url, const std::string& name, + const CookiesCallback& callback) { + net::CookieStore* cookie_store = + AtomBrowserContext::Get()->url_request_context_getter() + ->GetURLRequestContext()->cookie_store(); + cookie_store->DeleteCookieAsync(url, name, + base::Bind(&Cookies::OnRemoveCookies, base::Unretained(this), callback)); +} + +void Cookies::OnRemoveCookies(const CookiesCallback& callback) { + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(&RunRemoveCookiesCallbackOnUIThread, "", callback)); +} + mate::ObjectTemplateBuilder Cookies::GetObjectTemplateBuilder( v8::Isolate* isolate) { return mate::ObjectTemplateBuilder(isolate) - .SetMethod("get", &Cookies::Get); + .SetMethod("get", &Cookies::Get) + .SetMethod("remove", &Cookies::Remove); } // static diff --git a/atom/browser/api/atom_api_cookies.h b/atom/browser/api/atom_api_cookies.h index ad0988106d..1ea4886b26 100644 --- a/atom/browser/api/atom_api_cookies.h +++ b/atom/browser/api/atom_api_cookies.h @@ -23,7 +23,7 @@ class Cookies : public mate::Wrappable { public: // node.js style callback function(error, result) typedef base::Callback, v8::Local)> - GetCookiesCallback; + CookiesCallback; static mate::Handle Create(v8::Isolate* isolate); @@ -32,15 +32,22 @@ class Cookies : public mate::Wrappable { ~Cookies(); void Get(const base::DictionaryValue& options, - const GetCookiesCallback& callback); + const CookiesCallback& callback); + void Remove(const base::DictionaryValue& details, + const CookiesCallback& callback); void GetCookiesOnIOThread(const base::DictionaryValue* filter, - const GetCookiesCallback& callback); - + const CookiesCallback& callback); void OnGetCookies(const base::DictionaryValue* filter, - const GetCookiesCallback& callback, + const CookiesCallback& callback, const net::CookieList& cookie_list); + void RemoveCookiesOnIOThread(const GURL& url, + const std::string& name, + const CookiesCallback& callback); + void OnRemoveCookies(const CookiesCallback& callback); + + // mate::Wrappable implementations: mate::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override;