|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef NET_COOKIES_COOKIE_STORE_TEST_CALLBACKS_H_ | 
|  | #define NET_COOKIES_COOKIE_STORE_TEST_CALLBACKS_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/run_loop.h" | 
|  | #include "net/cookies/canonical_cookie.h" | 
|  | #include "net/cookies/cookie_store.h" | 
|  |  | 
|  | namespace base { | 
|  | class MessageLoop; | 
|  | class Thread; | 
|  | } | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | // Defines common behaviour for the callbacks from GetCookies, SetCookies, etc. | 
|  | // Asserts that the current thread is the expected invocation thread, sends a | 
|  | // quit to the thread in which it was constructed. | 
|  | class CookieCallback { | 
|  | public: | 
|  | // Waits until the callback is invoked. | 
|  | void WaitUntilDone(); | 
|  |  | 
|  | protected: | 
|  | // Constructs a callback that expects to be called in the given thread. | 
|  | explicit CookieCallback(base::Thread* run_in_thread); | 
|  |  | 
|  | // Constructs a callback that expects to be called in current thread and will | 
|  | // send a QUIT to the constructing thread. | 
|  | CookieCallback(); | 
|  |  | 
|  | ~CookieCallback(); | 
|  |  | 
|  | // Tests whether the current thread was the caller's thread. | 
|  | // Sends a QUIT to the constructing thread. | 
|  | void CallbackEpilogue(); | 
|  |  | 
|  | private: | 
|  | base::Thread* run_in_thread_; | 
|  | base::MessageLoop* run_in_loop_; | 
|  | base::RunLoop loop_to_quit_; | 
|  | }; | 
|  |  | 
|  | // Callback implementations for the asynchronous CookieStore methods. | 
|  |  | 
|  | template <typename T> | 
|  | class ResultSavingCookieCallback : public CookieCallback { | 
|  | public: | 
|  | ResultSavingCookieCallback() { | 
|  | } | 
|  | explicit ResultSavingCookieCallback(base::Thread* run_in_thread) | 
|  | : CookieCallback(run_in_thread) { | 
|  | } | 
|  |  | 
|  | void Run(T result) { | 
|  | result_ = result; | 
|  | CallbackEpilogue(); | 
|  | } | 
|  |  | 
|  | const T& result() { return result_; } | 
|  |  | 
|  | private: | 
|  | T result_; | 
|  | }; | 
|  |  | 
|  | class NoResultCookieCallback : public CookieCallback { | 
|  | public: | 
|  | NoResultCookieCallback(); | 
|  | explicit NoResultCookieCallback(base::Thread* run_in_thread); | 
|  |  | 
|  | void Run() { | 
|  | CallbackEpilogue(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class GetCookieListCallback : public CookieCallback { | 
|  | public: | 
|  | GetCookieListCallback(); | 
|  | explicit GetCookieListCallback(base::Thread* run_in_thread); | 
|  |  | 
|  | ~GetCookieListCallback(); | 
|  |  | 
|  | void Run(const CookieList& cookies); | 
|  |  | 
|  | const CookieList& cookies() { return cookies_; } | 
|  |  | 
|  | private: | 
|  | CookieList cookies_; | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_COOKIES_COOKIE_STORE_TEST_CALLBACKS_H_ |