Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1975)

Unified Diff: android_webview/native/cookie_manager.cc

Issue 273873003: Adds Asynchronous APIs to CookieManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/native/cookie_manager.cc
diff --git a/android_webview/native/cookie_manager.cc b/android_webview/native/cookie_manager.cc
index adb0ec87b5a804c53b906c3aec64e684552e8f55..47092ab8df041191df75abb0060f332d31c3a377 100644
--- a/android_webview/native/cookie_manager.cc
+++ b/android_webview/native/cookie_manager.cc
@@ -35,8 +35,10 @@
#include "net/url_request/url_request_context.h"
using base::FilePath;
+using base::WaitableEvent;
using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertJavaStringToUTF16;
+using base::android::ScopedJavaGlobalRef;
using content::BrowserThread;
using net::CookieList;
using net::CookieMonster;
@@ -53,6 +55,44 @@ using net::CookieMonster;
namespace android_webview {
+class RemoveCookiesCallback {
mkosiba (inactive) 2014/05/13 09:37:17 same here. CookieCallbackInteger, CookieCallbackBo
hjd_google 2014/05/15 10:52:07 Done.
+ public:
+ RemoveCookiesCallback(JNIEnv* env, jobject callback) {
+ callback_.Reset(env, callback);
+ }
+
+ void Invoke(int num_deleted) {
+ if (!callback_.is_null()) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_AwCookieManager_invokeRemoveCookieCallback(
+ env, callback_.obj(), num_deleted);
+ }
+ }
+
+ private:
+ ScopedJavaGlobalRef<jobject> callback_;
+ DISALLOW_COPY_AND_ASSIGN(RemoveCookiesCallback);
+};
+
+class SetCookieCallback {
+ public:
+ SetCookieCallback(JNIEnv* env, jobject callback) {
+ callback_.Reset(env, callback);
+ }
+
+ void Invoke(bool success) {
+ if (!callback_.is_null()) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_AwCookieManager_invokeSetCookieCallback(
+ env, callback_.obj(), success);
+ }
+ }
+
+ private:
+ ScopedJavaGlobalRef<jobject> callback_;
+ DISALLOW_COPY_AND_ASSIGN(SetCookieCallback);
+};
+
namespace {
// Are cookies allowed for file:// URLs by default?
@@ -98,10 +138,16 @@ class CookieManager {
bool AcceptCookie();
void SetAcceptThirdPartyCookie(bool accept);
bool AcceptThirdPartyCookie();
- void SetCookie(const GURL& host, const std::string& cookie_value);
+ void SetCookie(const GURL& host,
+ const std::string& cookie_value,
+ scoped_ptr<SetCookieCallback> callback);
+ void SetCookieSync(const GURL& host,
+ const std::string& cookie_value);
std::string GetCookie(const GURL& host);
- void RemoveSessionCookie();
- void RemoveAllCookie();
+ void RemoveSessionCookie(scoped_ptr<RemoveCookiesCallback> callback);
+ void RemoveAllCookie(scoped_ptr<RemoveCookiesCallback> callback);
+ void RemoveAllCookieSync();
+ void RemoveSessionCookieSync();
void RemoveExpiredCookie();
void FlushCookieStore();
bool HasCookies();
@@ -114,32 +160,44 @@ class CookieManager {
CookieManager();
~CookieManager();
- typedef base::Callback<void(base::WaitableEvent*)> CookieTask;
+ typedef base::Callback<void(WaitableEvent*)> CookieSyncTask;
+ typedef base::Callback<void()> CookieTask;
mkosiba (inactive) 2014/05/13 09:37:17 FYI: you're redefining base::Closure
+ void ExecCookieTaskSync(const CookieSyncTask& task);
void ExecCookieTask(const CookieTask& task);
- void SetCookieAsyncHelper(
+ void SetCookieHelper(
+ const GURL& host,
+ const std::string& value,
+ scoped_ptr<SetCookieCallback> callback);
+ void SetCookieSyncHelper(
const GURL& host,
const std::string& value,
- base::WaitableEvent* completion);
- void SetCookieCompleted(base::WaitableEvent* completion, bool success);
+ WaitableEvent* completion);
+ void SetCookieCompleted(scoped_ptr<SetCookieCallback> callback, bool success);
+ void SetCookieSyncCompleted(WaitableEvent* completion, bool success);
void GetCookieValueAsyncHelper(
const GURL& host,
std::string* result,
- base::WaitableEvent* completion);
- void GetCookieValueCompleted(base::WaitableEvent* completion,
+ WaitableEvent* completion);
+ void GetCookieValueCompleted(WaitableEvent* completion,
std::string* result,
const std::string& value);
- void RemoveSessionCookieAsyncHelper(base::WaitableEvent* completion);
- void RemoveAllCookieAsyncHelper(base::WaitableEvent* completion);
- void RemoveCookiesCompleted(base::WaitableEvent* completion, int num_deleted);
+ void RemoveSessionCookieHelper(scoped_ptr<RemoveCookiesCallback> callback);
+ void RemoveAllCookieHelper(scoped_ptr<RemoveCookiesCallback> callback);
+ void RemoveCookiesCompleted(scoped_ptr<RemoveCookiesCallback> callback,
+ int num_deleted);
+
+ void RemoveSessionCookieSyncHelper(WaitableEvent* completion);
+ void RemoveAllCookieSyncHelper(WaitableEvent* completion);
+ void RemoveCookiesSyncCompleted(WaitableEvent* completion, int num_deleted);
- void FlushCookieStoreAsyncHelper(base::WaitableEvent* completion);
+ void FlushCookieStoreAsyncHelper(WaitableEvent* completion);
void HasCookiesAsyncHelper(bool* result,
- base::WaitableEvent* completion);
- void HasCookiesCompleted(base::WaitableEvent* completion,
+ WaitableEvent* completion);
+ void HasCookiesCompleted(WaitableEvent* completion,
bool* result,
const CookieList& cookies);
@@ -163,6 +221,7 @@ class CookieManager {
DISALLOW_COPY_AND_ASSIGN(CookieManager);
};
+
base::LazyInstance<CookieManager>::Leaky g_lazy_instance;
// static
@@ -221,22 +280,27 @@ void CookieManager::EnsureCookieMonsterExistsLocked() {
cookie_monster_backend_thread_->message_loop_proxy());
}
-// Executes the |task| on the |cookie_monster_proxy_| message loop.
-void CookieManager::ExecCookieTask(const CookieTask& task) {
- base::WaitableEvent completion(false, false);
+// Executes the |task| on the |cookie_monster_proxy_| message loop and
+// waits for it to complete before returning.
+void CookieManager::ExecCookieTaskSync(const CookieSyncTask& task) {
+ WaitableEvent completion(false, false);
base::AutoLock lock(cookie_monster_lock_);
EnsureCookieMonsterExistsLocked();
cookie_monster_proxy_->PostTask(FROM_HERE, base::Bind(task, &completion));
- // We always wait for the posted task to complete, even when it doesn't return
- // a value, because previous versions of the CookieManager API were
- // synchronous in most/all cases and the caller may be relying on this.
ScopedAllowWaitForLegacyWebViewApi wait;
completion.Wait();
}
+// Executes the |task| on the |cookie_monster_proxy_| message loop.
+void CookieManager::ExecCookieTask(const CookieTask& task) {
+ base::AutoLock lock(cookie_monster_lock_);
+ EnsureCookieMonsterExistsLocked();
+ cookie_monster_proxy_->PostTask(FROM_HERE, task);
+}
+
scoped_refptr<net::CookieStore> CookieManager::CreateBrowserThreadCookieStore(
AwBrowserContext* browser_context) {
base::AutoLock lock(cookie_monster_lock_);
@@ -284,17 +348,27 @@ bool CookieManager::AcceptThirdPartyCookie() {
}
void CookieManager::SetCookie(const GURL& host,
+ const std::string& cookie_value,
+ scoped_ptr<SetCookieCallback> callback) {
+ ExecCookieTask(base::Bind(&CookieManager::SetCookieHelper,
+ base::Unretained(this),
+ host,
+ cookie_value,
+ Passed(&callback)));
+}
+
+void CookieManager::SetCookieSync(const GURL& host,
const std::string& cookie_value) {
- ExecCookieTask(base::Bind(&CookieManager::SetCookieAsyncHelper,
+ ExecCookieTaskSync(base::Bind(&CookieManager::SetCookieSyncHelper,
base::Unretained(this),
host,
cookie_value));
}
-void CookieManager::SetCookieAsyncHelper(
+void CookieManager::SetCookieHelper(
const GURL& host,
const std::string& value,
- base::WaitableEvent* completion) {
+ scoped_ptr<SetCookieCallback> callback) {
net::CookieOptions options;
options.set_include_httponly();
@@ -302,19 +376,36 @@ void CookieManager::SetCookieAsyncHelper(
host, value, options,
base::Bind(&CookieManager::SetCookieCompleted,
base::Unretained(this),
+ Passed(&callback)));
+}
+
+void CookieManager::SetCookieSyncHelper(
+ const GURL& host,
+ const std::string& value,
+ WaitableEvent* completion) {
+ net::CookieOptions options;
+ options.set_include_httponly();
+
+ cookie_monster_->SetCookieWithOptionsAsync(
+ host, value, options,
+ base::Bind(&CookieManager::SetCookieSyncCompleted,
+ base::Unretained(this),
completion));
}
-void CookieManager::SetCookieCompleted(base::WaitableEvent* completion,
+void CookieManager::SetCookieCompleted(scoped_ptr<SetCookieCallback> callback,
bool success) {
- // The CookieManager API does not return a value for SetCookie,
- // so we don't need to propagate the |success| value back to the caller.
+ callback->Invoke(success);
+}
+
+void CookieManager::SetCookieSyncCompleted(WaitableEvent* completion,
+ bool success) {
completion->Signal();
}
std::string CookieManager::GetCookie(const GURL& host) {
std::string cookie_value;
- ExecCookieTask(base::Bind(&CookieManager::GetCookieValueAsyncHelper,
+ ExecCookieTaskSync(base::Bind(&CookieManager::GetCookieValueAsyncHelper,
base::Unretained(this),
host,
&cookie_value));
@@ -325,7 +416,7 @@ std::string CookieManager::GetCookie(const GURL& host) {
void CookieManager::GetCookieValueAsyncHelper(
const GURL& host,
std::string* result,
- base::WaitableEvent* completion) {
+ WaitableEvent* completion) {
net::CookieOptions options;
options.set_include_httponly();
@@ -338,44 +429,77 @@ void CookieManager::GetCookieValueAsyncHelper(
result));
}
-void CookieManager::GetCookieValueCompleted(base::WaitableEvent* completion,
+void CookieManager::GetCookieValueCompleted(WaitableEvent* completion,
std::string* result,
const std::string& value) {
*result = value;
completion->Signal();
}
-void CookieManager::RemoveSessionCookie() {
- ExecCookieTask(base::Bind(&CookieManager::RemoveSessionCookieAsyncHelper,
+void CookieManager::RemoveSessionCookie(
+ scoped_ptr<RemoveCookiesCallback> callback) {
+ ExecCookieTask(base::Bind(&CookieManager::RemoveSessionCookieHelper,
+ base::Unretained(this),
+ Passed(&callback)));
+}
+
+void CookieManager::RemoveSessionCookieSync() {
+ ExecCookieTaskSync(base::Bind(&CookieManager::RemoveSessionCookieSyncHelper,
base::Unretained(this)));
}
-void CookieManager::RemoveSessionCookieAsyncHelper(
- base::WaitableEvent* completion) {
+void CookieManager::RemoveSessionCookieHelper(
+ scoped_ptr<RemoveCookiesCallback> callback) {
cookie_monster_->DeleteSessionCookiesAsync(
base::Bind(&CookieManager::RemoveCookiesCompleted,
base::Unretained(this),
+ Passed(&callback)));
+}
+
+void CookieManager::RemoveSessionCookieSyncHelper(WaitableEvent* completion) {
+ cookie_monster_->DeleteSessionCookiesAsync(
+ base::Bind(&CookieManager::RemoveCookiesSyncCompleted,
+ base::Unretained(this),
completion));
}
-void CookieManager::RemoveCookiesCompleted(base::WaitableEvent* completion,
- int num_deleted) {
- // The CookieManager API does not return a value for removeSessionCookie or
- // removeAllCookie, so we don't need to propagate the |num_deleted| value back
- // to the caller.
+void CookieManager::RemoveCookiesCompleted(
mkosiba (inactive) 2014/05/13 09:37:17 like we talked offline - let's try and collapse th
hjd_google 2014/05/15 10:52:07 Done!
+ scoped_ptr<RemoveCookiesCallback> callback,
+ int num_deleted) {
+ callback->Invoke(num_deleted);
+}
+
+void CookieManager::RemoveCookiesSyncCompleted(
+ WaitableEvent* completion,
+ int num_deleted) {
completion->Signal();
}
-void CookieManager::RemoveAllCookie() {
- ExecCookieTask(base::Bind(&CookieManager::RemoveAllCookieAsyncHelper,
+void CookieManager::RemoveAllCookie(
+ scoped_ptr<RemoveCookiesCallback> callback) {
+ ExecCookieTask(base::Bind(&CookieManager::RemoveAllCookieHelper,
+ base::Unretained(this),
+ Passed(&callback)));
+}
+
+void CookieManager::RemoveAllCookieSync() {
+ ExecCookieTaskSync(base::Bind(&CookieManager::RemoveAllCookieSyncHelper,
base::Unretained(this)));
}
-void CookieManager::RemoveAllCookieAsyncHelper(
- base::WaitableEvent* completion) {
+void CookieManager::RemoveAllCookieHelper(
+ scoped_ptr<RemoveCookiesCallback> callback) {
cookie_monster_->DeleteAllAsync(
base::Bind(&CookieManager::RemoveCookiesCompleted,
base::Unretained(this),
+ Passed(&callback)));
+}
+
+void CookieManager::RemoveAllCookieSyncHelper(
+ WaitableEvent* completion) {
+ cookie_monster_->DeleteAllAsync(
+ base::Bind(&CookieManager::RemoveCookiesSyncCompleted,
+ base::Unretained(this),
completion));
}
@@ -385,19 +509,19 @@ void CookieManager::RemoveExpiredCookie() {
}
void CookieManager::FlushCookieStoreAsyncHelper(
- base::WaitableEvent* completion) {
- cookie_monster_->FlushStore(base::Bind(&base::WaitableEvent::Signal,
+ WaitableEvent* completion) {
+ cookie_monster_->FlushStore(base::Bind(&WaitableEvent::Signal,
base::Unretained(completion)));
}
void CookieManager::FlushCookieStore() {
- ExecCookieTask(base::Bind(&CookieManager::FlushCookieStoreAsyncHelper,
+ ExecCookieTaskSync(base::Bind(&CookieManager::FlushCookieStoreAsyncHelper,
base::Unretained(this)));
}
bool CookieManager::HasCookies() {
bool has_cookies;
- ExecCookieTask(base::Bind(&CookieManager::HasCookiesAsyncHelper,
+ ExecCookieTaskSync(base::Bind(&CookieManager::HasCookiesAsyncHelper,
base::Unretained(this),
&has_cookies));
return has_cookies;
@@ -406,7 +530,7 @@ bool CookieManager::HasCookies() {
// TODO(kristianm): Simplify this, copying the entire list around
// should not be needed.
void CookieManager::HasCookiesAsyncHelper(bool* result,
- base::WaitableEvent* completion) {
+ WaitableEvent* completion) {
cookie_monster_->GetAllCookiesAsync(
base::Bind(&CookieManager::HasCookiesCompleted,
base::Unretained(this),
@@ -414,7 +538,7 @@ void CookieManager::HasCookiesAsyncHelper(bool* result,
result));
}
-void CookieManager::HasCookiesCompleted(base::WaitableEvent* completion,
+void CookieManager::HasCookiesCompleted(WaitableEvent* completion,
bool* result,
const CookieList& cookies) {
*result = cookies.size() != 0;
@@ -467,11 +591,25 @@ static jboolean AcceptThirdPartyCookie(JNIEnv* env, jobject obj) {
return CookieManager::GetInstance()->AcceptThirdPartyCookie();
}
-static void SetCookie(JNIEnv* env, jobject obj, jstring url, jstring value) {
+static void SetCookie(JNIEnv* env,
+ jobject obj,
+ jstring url,
+ jstring value,
+ jobject java_callback) {
GURL host(ConvertJavaStringToUTF16(env, url));
std::string cookie_value(ConvertJavaStringToUTF8(env, value));
+ scoped_ptr<SetCookieCallback> callback(
+ new SetCookieCallback(env, java_callback));
+ CookieManager::GetInstance()->SetCookie(host, cookie_value, callback.Pass());
+}
- CookieManager::GetInstance()->SetCookie(host, cookie_value);
+static void SetCookieSync(JNIEnv* env,
+ jobject obj,
+ jstring url,
+ jstring value) {
+ GURL host(ConvertJavaStringToUTF16(env, url));
+ std::string cookie_value(ConvertJavaStringToUTF8(env, value));
+ CookieManager::GetInstance()->SetCookieSync(host, cookie_value);
}
static jstring GetCookie(JNIEnv* env, jobject obj, jstring url) {
@@ -482,12 +620,26 @@ static jstring GetCookie(JNIEnv* env, jobject obj, jstring url) {
CookieManager::GetInstance()->GetCookie(host)).Release();
}
-static void RemoveSessionCookie(JNIEnv* env, jobject obj) {
- CookieManager::GetInstance()->RemoveSessionCookie();
+static void RemoveSessionCookie(JNIEnv* env,
+ jobject obj,
+ jobject java_callback) {
+ scoped_ptr<RemoveCookiesCallback> callback(
+ new RemoveCookiesCallback(env, java_callback));
+ CookieManager::GetInstance()->RemoveSessionCookie(callback.Pass());
+}
+
+static void RemoveSessionCookieSync(JNIEnv* env, jobject obj) {
+ CookieManager::GetInstance()->RemoveSessionCookieSync();
+}
+
+static void RemoveAllCookie(JNIEnv* env, jobject obj, jobject java_callback) {
+ scoped_ptr<RemoveCookiesCallback> callback(
+ new RemoveCookiesCallback(env, java_callback));
+ CookieManager::GetInstance()->RemoveAllCookie(callback.Pass());
}
-static void RemoveAllCookie(JNIEnv* env, jobject obj) {
- CookieManager::GetInstance()->RemoveAllCookie();
+static void RemoveAllCookieSync(JNIEnv* env, jobject obj) {
+ CookieManager::GetInstance()->RemoveAllCookieSync();
}
static void RemoveExpiredCookie(JNIEnv* env, jobject obj) {

Powered by Google App Engine
This is Rietveld 408576698