1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Defines the Chrome Extensions Cookies API functions for accessing internet
6 // cookies, as specified in the extension API JSON.
8 #ifndef CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_
9 #define CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_
13 #include "base/compiler_specific.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "chrome/browser/extensions/chrome_extension_function.h"
17 #include "chrome/browser/net/chrome_cookie_notification_details.h"
18 #include "chrome/common/extensions/api/cookies.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21 #include "extensions/browser/browser_context_keyed_api_factory.h"
22 #include "extensions/browser/event_router.h"
23 #include "net/cookies/canonical_cookie.h"
27 class URLRequestContextGetter;
30 namespace extensions {
32 // Observes CookieMonster notifications and routes them as events to the
34 class CookiesEventRouter : public content::NotificationObserver {
36 explicit CookiesEventRouter(content::BrowserContext* context);
37 ~CookiesEventRouter() override;
40 // content::NotificationObserver implementation.
41 void Observe(int type,
42 const content::NotificationSource& source,
43 const content::NotificationDetails& details) override;
45 // Handler for the COOKIE_CHANGED event. The method takes the details of such
46 // an event and constructs a suitable JSON formatted extension event from it.
47 void CookieChanged(Profile* profile, ChromeCookieDetails* details);
49 // This method dispatches events to the extension message service.
50 void DispatchEvent(content::BrowserContext* context,
51 const std::string& event_name,
52 scoped_ptr<base::ListValue> event_args,
55 // Used for tracking registrations to CookieMonster notifications.
56 content::NotificationRegistrar registrar_;
60 DISALLOW_COPY_AND_ASSIGN(CookiesEventRouter);
63 // Implements the cookies.get() extension function.
64 class CookiesGetFunction : public ChromeAsyncExtensionFunction {
66 DECLARE_EXTENSION_FUNCTION("cookies.get", COOKIES_GET)
71 ~CookiesGetFunction() override;
74 bool RunAsync() override;
77 void GetCookieOnIOThread();
78 void RespondOnUIThread();
79 void GetCookieCallback(const net::CookieList& cookie_list);
82 scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
83 scoped_ptr<extensions::api::cookies::Get::Params> parsed_args_;
86 // Implements the cookies.getAll() extension function.
87 class CookiesGetAllFunction : public ChromeAsyncExtensionFunction {
89 DECLARE_EXTENSION_FUNCTION("cookies.getAll", COOKIES_GETALL)
91 CookiesGetAllFunction();
94 ~CookiesGetAllFunction() override;
97 bool RunAsync() override;
100 void GetAllCookiesOnIOThread();
101 void RespondOnUIThread();
102 void GetAllCookiesCallback(const net::CookieList& cookie_list);
105 scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
106 scoped_ptr<extensions::api::cookies::GetAll::Params> parsed_args_;
109 // Implements the cookies.set() extension function.
110 class CookiesSetFunction : public ChromeAsyncExtensionFunction {
112 DECLARE_EXTENSION_FUNCTION("cookies.set", COOKIES_SET)
114 CookiesSetFunction();
117 ~CookiesSetFunction() override;
118 bool RunAsync() override;
121 void SetCookieOnIOThread();
122 void RespondOnUIThread();
123 void PullCookie(bool set_cookie_);
124 void PullCookieCallback(const net::CookieList& cookie_list);
128 scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
129 scoped_ptr<extensions::api::cookies::Set::Params> parsed_args_;
132 // Implements the cookies.remove() extension function.
133 class CookiesRemoveFunction : public ChromeAsyncExtensionFunction {
135 DECLARE_EXTENSION_FUNCTION("cookies.remove", COOKIES_REMOVE)
137 CookiesRemoveFunction();
140 ~CookiesRemoveFunction() override;
142 // ExtensionFunction:
143 bool RunAsync() override;
146 void RemoveCookieOnIOThread();
147 void RespondOnUIThread();
148 void RemoveCookieCallback();
151 scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
152 scoped_ptr<extensions::api::cookies::Remove::Params> parsed_args_;
155 // Implements the cookies.getAllCookieStores() extension function.
156 class CookiesGetAllCookieStoresFunction : public ChromeSyncExtensionFunction {
158 DECLARE_EXTENSION_FUNCTION("cookies.getAllCookieStores",
159 COOKIES_GETALLCOOKIESTORES)
162 ~CookiesGetAllCookieStoresFunction() override {}
164 // ExtensionFunction:
165 bool RunSync() override;
168 class CookiesAPI : public BrowserContextKeyedAPI,
169 public extensions::EventRouter::Observer {
171 explicit CookiesAPI(content::BrowserContext* context);
172 ~CookiesAPI() override;
174 // KeyedService implementation.
175 void Shutdown() override;
177 // BrowserContextKeyedAPI implementation.
178 static BrowserContextKeyedAPIFactory<CookiesAPI>* GetFactoryInstance();
180 // EventRouter::Observer implementation.
181 void OnListenerAdded(const extensions::EventListenerInfo& details) override;
184 friend class BrowserContextKeyedAPIFactory<CookiesAPI>;
186 content::BrowserContext* browser_context_;
188 // BrowserContextKeyedAPI implementation.
189 static const char* service_name() {
192 static const bool kServiceIsNULLWhileTesting = true;
194 // Created lazily upon OnListenerAdded.
195 scoped_ptr<CookiesEventRouter> cookies_event_router_;
197 DISALLOW_COPY_AND_ASSIGN(CookiesAPI);
200 } // namespace extensions
202 #endif // CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_