• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 // Defines the Chrome Extensions Cookies API functions for accessing internet
6 // cookies, as specified in the extension API JSON.
7 
8 #ifndef CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_
9 #define CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_
10 
11 #include <string>
12 
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"
24 #include "url/gurl.h"
25 
26 namespace net {
27 class URLRequestContextGetter;
28 }
29 
30 namespace extensions {
31 
32 // Observes CookieMonster notifications and routes them as events to the
33 // extension system.
34 class CookiesEventRouter : public content::NotificationObserver {
35  public:
36   explicit CookiesEventRouter(content::BrowserContext* context);
37   virtual ~CookiesEventRouter();
38 
39  private:
40   // content::NotificationObserver implementation.
41   virtual void Observe(int type,
42                        const content::NotificationSource& source,
43                        const content::NotificationDetails& details) OVERRIDE;
44 
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);
48 
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,
53                      GURL& cookie_domain);
54 
55   // Used for tracking registrations to CookieMonster notifications.
56   content::NotificationRegistrar registrar_;
57 
58   Profile* profile_;
59 
60   DISALLOW_COPY_AND_ASSIGN(CookiesEventRouter);
61 };
62 
63 // Implements the cookies.get() extension function.
64 class CookiesGetFunction : public ChromeAsyncExtensionFunction {
65  public:
66   DECLARE_EXTENSION_FUNCTION("cookies.get", COOKIES_GET)
67 
68   CookiesGetFunction();
69 
70  protected:
71   virtual ~CookiesGetFunction();
72 
73   // ExtensionFunction:
74   virtual bool RunAsync() OVERRIDE;
75 
76  private:
77   void GetCookieOnIOThread();
78   void RespondOnUIThread();
79   void GetCookieCallback(const net::CookieList& cookie_list);
80 
81   GURL url_;
82   scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
83   scoped_ptr<extensions::api::cookies::Get::Params> parsed_args_;
84 };
85 
86 // Implements the cookies.getAll() extension function.
87 class CookiesGetAllFunction : public ChromeAsyncExtensionFunction {
88  public:
89   DECLARE_EXTENSION_FUNCTION("cookies.getAll", COOKIES_GETALL)
90 
91   CookiesGetAllFunction();
92 
93  protected:
94   virtual ~CookiesGetAllFunction();
95 
96   // ExtensionFunction:
97   virtual bool RunAsync() OVERRIDE;
98 
99  private:
100   void GetAllCookiesOnIOThread();
101   void RespondOnUIThread();
102   void GetAllCookiesCallback(const net::CookieList& cookie_list);
103 
104   GURL url_;
105   scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
106   scoped_ptr<extensions::api::cookies::GetAll::Params> parsed_args_;
107 };
108 
109 // Implements the cookies.set() extension function.
110 class CookiesSetFunction : public ChromeAsyncExtensionFunction {
111  public:
112   DECLARE_EXTENSION_FUNCTION("cookies.set", COOKIES_SET)
113 
114   CookiesSetFunction();
115 
116  protected:
117   virtual ~CookiesSetFunction();
118   virtual bool RunAsync() OVERRIDE;
119 
120  private:
121   void SetCookieOnIOThread();
122   void RespondOnUIThread();
123   void PullCookie(bool set_cookie_);
124   void PullCookieCallback(const net::CookieList& cookie_list);
125 
126   GURL url_;
127   bool success_;
128   scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
129   scoped_ptr<extensions::api::cookies::Set::Params> parsed_args_;
130 };
131 
132 // Implements the cookies.remove() extension function.
133 class CookiesRemoveFunction : public ChromeAsyncExtensionFunction {
134  public:
135   DECLARE_EXTENSION_FUNCTION("cookies.remove", COOKIES_REMOVE)
136 
137   CookiesRemoveFunction();
138 
139  protected:
140   virtual ~CookiesRemoveFunction();
141 
142   // ExtensionFunction:
143   virtual bool RunAsync() OVERRIDE;
144 
145  private:
146   void RemoveCookieOnIOThread();
147   void RespondOnUIThread();
148   void RemoveCookieCallback();
149 
150   GURL url_;
151   scoped_refptr<net::URLRequestContextGetter> store_browser_context_;
152   scoped_ptr<extensions::api::cookies::Remove::Params> parsed_args_;
153 };
154 
155 // Implements the cookies.getAllCookieStores() extension function.
156 class CookiesGetAllCookieStoresFunction : public ChromeSyncExtensionFunction {
157  public:
158   DECLARE_EXTENSION_FUNCTION("cookies.getAllCookieStores",
159                              COOKIES_GETALLCOOKIESTORES)
160 
161  protected:
~CookiesGetAllCookieStoresFunction()162   virtual ~CookiesGetAllCookieStoresFunction() {}
163 
164   // ExtensionFunction:
165   virtual bool RunSync() OVERRIDE;
166 };
167 
168 class CookiesAPI : public BrowserContextKeyedAPI,
169                    public extensions::EventRouter::Observer {
170  public:
171   explicit CookiesAPI(content::BrowserContext* context);
172   virtual ~CookiesAPI();
173 
174   // KeyedService implementation.
175   virtual void Shutdown() OVERRIDE;
176 
177   // BrowserContextKeyedAPI implementation.
178   static BrowserContextKeyedAPIFactory<CookiesAPI>* GetFactoryInstance();
179 
180   // EventRouter::Observer implementation.
181   virtual void OnListenerAdded(const extensions::EventListenerInfo& details)
182       OVERRIDE;
183 
184  private:
185   friend class BrowserContextKeyedAPIFactory<CookiesAPI>;
186 
187   content::BrowserContext* browser_context_;
188 
189   // BrowserContextKeyedAPI implementation.
service_name()190   static const char* service_name() {
191     return "CookiesAPI";
192   }
193   static const bool kServiceIsNULLWhileTesting = true;
194 
195   // Created lazily upon OnListenerAdded.
196   scoped_ptr<CookiesEventRouter> cookies_event_router_;
197 
198   DISALLOW_COPY_AND_ASSIGN(CookiesAPI);
199 };
200 
201 }  // namespace extensions
202 
203 #endif  // CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_
204