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

Side by Side Diff: android_webview/native/cookie_manager.cc

Issue 284313005: Fixes a deadlock between shouldInterceptRequest() and getCookie() (Closed) Base URL: https://chromium.googlesource.com/chromium/src
Patch Set: fix startupTest 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 unified diff | Download patch
« no previous file with comments | « android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/native/cookie_manager.h" 5 #include "android_webview/native/cookie_manager.h"
6 6
7 #include "android_webview/browser/aw_browser_context.h" 7 #include "android_webview/browser/aw_browser_context.h"
8 #include "android_webview/browser/aw_cookie_access_policy.h" 8 #include "android_webview/browser/aw_cookie_access_policy.h"
9 #include "android_webview/browser/net/init_native_callback.h" 9 #include "android_webview/browser/net/init_native_callback.h"
10 #include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h" 10 #include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 void GetUserDataDir(FilePath* user_data_dir) { 138 void GetUserDataDir(FilePath* user_data_dir) {
139 if (!PathService::Get(base::DIR_ANDROID_APP_DATA, user_data_dir)) { 139 if (!PathService::Get(base::DIR_ANDROID_APP_DATA, user_data_dir)) {
140 NOTREACHED() << "Failed to get app data directory for Android WebView"; 140 NOTREACHED() << "Failed to get app data directory for Android WebView";
141 } 141 }
142 } 142 }
143 143
144 class CookieManager { 144 class CookieManager {
145 public: 145 public:
146 static CookieManager* GetInstance(); 146 static CookieManager* GetInstance();
147 147
148 scoped_refptr<net::CookieStore> CreateBrowserThreadCookieStore( 148 scoped_refptr<net::CookieStore> GetCookieStore();
149 AwBrowserContext* browser_context);
150 149
151 void SetAcceptCookie(bool accept); 150 void SetAcceptCookie(bool accept);
152 bool AcceptCookie(); 151 bool AcceptCookie();
153 void SetAcceptThirdPartyCookie(bool accept); 152 void SetAcceptThirdPartyCookie(bool accept);
154 bool AcceptThirdPartyCookie(); 153 bool AcceptThirdPartyCookie();
155 void SetCookie(const GURL& host, 154 void SetCookie(const GURL& host,
156 const std::string& cookie_value, 155 const std::string& cookie_value,
157 scoped_ptr<BoolCookieCallbackHolder> callback); 156 scoped_ptr<BoolCookieCallbackHolder> callback);
158 void SetCookieSync(const GURL& host, 157 void SetCookieSync(const GURL& host,
159 const std::string& cookie_value); 158 const std::string& cookie_value);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 206 const scoped_refptr<base::SequencedTaskRunner>& client_task_runner,
208 const scoped_refptr<base::SequencedTaskRunner>& background_task_runner); 207 const scoped_refptr<base::SequencedTaskRunner>& background_task_runner);
209 void EnsureCookieMonsterExistsLocked(); 208 void EnsureCookieMonsterExistsLocked();
210 bool AllowFileSchemeCookiesLocked(); 209 bool AllowFileSchemeCookiesLocked();
211 void SetAcceptFileSchemeCookiesLocked(bool accept); 210 void SetAcceptFileSchemeCookiesLocked(bool accept);
212 211
213 scoped_refptr<net::CookieMonster> cookie_monster_; 212 scoped_refptr<net::CookieMonster> cookie_monster_;
214 scoped_refptr<base::MessageLoopProxy> cookie_monster_proxy_; 213 scoped_refptr<base::MessageLoopProxy> cookie_monster_proxy_;
215 base::Lock cookie_monster_lock_; 214 base::Lock cookie_monster_lock_;
216 215
217 // Both these threads are normally NULL. They only exist if CookieManager was
218 // accessed before Chromium was started.
219 scoped_ptr<base::Thread> cookie_monster_client_thread_; 216 scoped_ptr<base::Thread> cookie_monster_client_thread_;
220 scoped_ptr<base::Thread> cookie_monster_backend_thread_; 217 scoped_ptr<base::Thread> cookie_monster_backend_thread_;
221 218
222 DISALLOW_COPY_AND_ASSIGN(CookieManager); 219 DISALLOW_COPY_AND_ASSIGN(CookieManager);
223 }; 220 };
224 221
225 base::LazyInstance<CookieManager>::Leaky g_lazy_instance; 222 base::LazyInstance<CookieManager>::Leaky g_lazy_instance;
226 223
227 // static 224 // static
228 CookieManager* CookieManager::GetInstance() { 225 CookieManager* CookieManager::GetInstance() {
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 completion.Wait(); 317 completion.Wait();
321 } 318 }
322 319
323 // Executes the |task| on the |cookie_monster_proxy_| message loop. 320 // Executes the |task| on the |cookie_monster_proxy_| message loop.
324 void CookieManager::ExecCookieTask(const base::Closure& task) { 321 void CookieManager::ExecCookieTask(const base::Closure& task) {
325 base::AutoLock lock(cookie_monster_lock_); 322 base::AutoLock lock(cookie_monster_lock_);
326 EnsureCookieMonsterExistsLocked(); 323 EnsureCookieMonsterExistsLocked();
327 cookie_monster_proxy_->PostTask(FROM_HERE, task); 324 cookie_monster_proxy_->PostTask(FROM_HERE, task);
328 } 325 }
329 326
330 scoped_refptr<net::CookieStore> CookieManager::CreateBrowserThreadCookieStore( 327 scoped_refptr<net::CookieStore> CookieManager::GetCookieStore() {
331 AwBrowserContext* browser_context) {
332 base::AutoLock lock(cookie_monster_lock_); 328 base::AutoLock lock(cookie_monster_lock_);
333 329 EnsureCookieMonsterExistsLocked();
334 if (cookie_monster_client_thread_) {
335 // We created a cookie monster already on its own threads; we'll just keep
336 // using it rather than creating one on the normal Chromium threads.
337 // CookieMonster is threadsafe, so this is fine.
338 return cookie_monster_;
339 }
340
341 // Go ahead and create the cookie monster using the normal Chromium threads.
342 DCHECK(!cookie_monster_.get());
343 DCHECK(BrowserThread::IsMessageLoopValid(BrowserThread::IO));
344
345 FilePath user_data_dir;
346 GetUserDataDir(&user_data_dir);
347 DCHECK(browser_context->GetPath() == user_data_dir);
348
349 cookie_monster_proxy_ =
350 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
351 scoped_refptr<base::SequencedTaskRunner> background_task_runner =
352 BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
353 BrowserThread::GetBlockingPool()->GetSequenceToken());
354 CreateCookieMonster(user_data_dir,
355 cookie_monster_proxy_,
356 background_task_runner);
357 return cookie_monster_; 330 return cookie_monster_;
358 } 331 }
359 332
360 void CookieManager::SetAcceptCookie(bool accept) { 333 void CookieManager::SetAcceptCookie(bool accept) {
361 AwCookieAccessPolicy::GetInstance()->SetGlobalAllowAccess(accept); 334 AwCookieAccessPolicy::GetInstance()->SetGlobalAllowAccess(accept);
362 } 335 }
363 336
364 bool CookieManager::AcceptCookie() { 337 bool CookieManager::AcceptCookie() {
365 return AwCookieAccessPolicy::GetInstance()->GetGlobalAllowAccess(); 338 return AwCookieAccessPolicy::GetInstance()->GetGlobalAllowAccess();
366 } 339 }
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 return CookieManager::GetInstance()->AllowFileSchemeCookies(); 615 return CookieManager::GetInstance()->AllowFileSchemeCookies();
643 } 616 }
644 617
645 static void SetAcceptFileSchemeCookies(JNIEnv* env, jobject obj, 618 static void SetAcceptFileSchemeCookies(JNIEnv* env, jobject obj,
646 jboolean accept) { 619 jboolean accept) {
647 return CookieManager::GetInstance()->SetAcceptFileSchemeCookies(accept); 620 return CookieManager::GetInstance()->SetAcceptFileSchemeCookies(accept);
648 } 621 }
649 622
650 scoped_refptr<net::CookieStore> CreateCookieStore( 623 scoped_refptr<net::CookieStore> CreateCookieStore(
651 AwBrowserContext* browser_context) { 624 AwBrowserContext* browser_context) {
652 return CookieManager::GetInstance()->CreateBrowserThreadCookieStore( 625 return CookieManager::GetInstance()->GetCookieStore();
653 browser_context);
654 } 626 }
655 627
656 bool RegisterCookieManager(JNIEnv* env) { 628 bool RegisterCookieManager(JNIEnv* env) {
657 return RegisterNativesImpl(env); 629 return RegisterNativesImpl(env);
658 } 630 }
659 631
660 } // android_webview namespace 632 } // android_webview namespace
OLDNEW
« no previous file with comments | « android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698