Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / cookies / cookies_api.h
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   ~CookiesEventRouter() override;
38
39  private:
40   // content::NotificationObserver implementation.
41   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   ~CookiesGetFunction() override;
72
73   // ExtensionFunction:
74   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   ~CookiesGetAllFunction() override;
95
96   // ExtensionFunction:
97   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   ~CookiesSetFunction() override;
118   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   ~CookiesRemoveFunction() override;
141
142   // ExtensionFunction:
143   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:
162   ~CookiesGetAllCookieStoresFunction() override {}
163
164   // ExtensionFunction:
165   bool RunSync() override;
166 };
167
168 class CookiesAPI : public BrowserContextKeyedAPI,
169                    public extensions::EventRouter::Observer {
170  public:
171   explicit CookiesAPI(content::BrowserContext* context);
172   ~CookiesAPI() override;
173
174   // KeyedService implementation.
175   void Shutdown() override;
176
177   // BrowserContextKeyedAPI implementation.
178   static BrowserContextKeyedAPIFactory<CookiesAPI>* GetFactoryInstance();
179
180   // EventRouter::Observer implementation.
181   void OnListenerAdded(const extensions::EventListenerInfo& details) override;
182
183  private:
184   friend class BrowserContextKeyedAPIFactory<CookiesAPI>;
185
186   content::BrowserContext* browser_context_;
187
188   // BrowserContextKeyedAPI implementation.
189   static const char* service_name() {
190     return "CookiesAPI";
191   }
192   static const bool kServiceIsNULLWhileTesting = true;
193
194   // Created lazily upon OnListenerAdded.
195   scoped_ptr<CookiesEventRouter> cookies_event_router_;
196
197   DISALLOW_COPY_AND_ASSIGN(CookiesAPI);
198 };
199
200 }  // namespace extensions
201
202 #endif  // CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_API_H_