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
26namespace net {
27class URLRequestContextGetter;
28}
29
30namespace extensions {
31
32// Observes CookieMonster notifications and routes them as events to the
33// extension system.
34class 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.
64class 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.
87class 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.
110class 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.
133class 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.
156class CookiesGetAllCookieStoresFunction : public ChromeSyncExtensionFunction {
157 public:
158  DECLARE_EXTENSION_FUNCTION("cookies.getAllCookieStores",
159                             COOKIES_GETALLCOOKIESTORES)
160
161 protected:
162  virtual ~CookiesGetAllCookieStoresFunction() {}
163
164  // ExtensionFunction:
165  virtual bool RunSync() OVERRIDE;
166};
167
168class 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.
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