1// Copyright (c) 2011 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 chrome/common/extensions/api/extension_api.json.
7
8#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_
9#define CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_
10#pragma once
11
12#include <string>
13
14#include "base/memory/ref_counted.h"
15#include "base/memory/singleton.h"
16#include "base/time.h"
17#include "chrome/browser/extensions/extension_function.h"
18#include "chrome/browser/net/chrome_cookie_notification_details.h"
19#include "content/common/notification_observer.h"
20#include "content/common/notification_registrar.h"
21#include "googleurl/src/gurl.h"
22#include "net/base/cookie_monster.h"
23
24class DictionaryValue;
25
26namespace net {
27class URLRequestContextGetter;
28}
29
30// Observes CookieMonster notifications and routes them as events to the
31// extension system.
32class ExtensionCookiesEventRouter : public NotificationObserver {
33 public:
34  // Single instance of the event router.
35  static ExtensionCookiesEventRouter* GetInstance();
36
37  void Init();
38
39 private:
40  friend struct DefaultSingletonTraits<ExtensionCookiesEventRouter>;
41
42  ExtensionCookiesEventRouter() {}
43  virtual ~ExtensionCookiesEventRouter() {}
44
45  // NotificationObserver implementation.
46  virtual void Observe(NotificationType type,
47                       const NotificationSource& source,
48                       const NotificationDetails& details);
49
50  // Handler for the COOKIE_CHANGED event. The method takes the details of such
51  // an event and constructs a suitable JSON formatted extension event from it.
52  void CookieChanged(Profile* profile,
53                     ChromeCookieDetails* details);
54
55  // This method dispatches events to the extension message service.
56  void DispatchEvent(Profile* context,
57                     const char* event_name,
58                     const std::string& json_args,
59                     GURL& cookie_domain);
60
61  // Used for tracking registrations to CookieMonster notifications.
62  NotificationRegistrar registrar_;
63
64  DISALLOW_COPY_AND_ASSIGN(ExtensionCookiesEventRouter);
65};
66
67// Serves as a base class for all cookies API functions, and defines some
68// common functionality for parsing cookies API function arguments.
69// Note that all of the functions in this file derive from
70// AsyncExtensionFunction, and are not threadsafe, so they should not be
71// concurrently accessed from multiple threads. They modify |result_| and other
72// member variables directly.
73// See chrome/browser/extensions/extension_function.h for more information.
74class CookiesFunction : public AsyncExtensionFunction {
75 protected:
76  // Looks for a 'url' value in the given details dictionary and constructs a
77  // GURL from it. Returns false and assigns the internal error_ value if the
78  // URL is invalid or isn't found in the dictionary. If check_host_permissions
79  // is true, the URL is also checked against the extension's host permissions,
80  // and if there is no permission for the URL, this function returns false.
81  bool ParseUrl(const DictionaryValue* details, GURL* url,
82                bool check_host_permissions);
83
84  // Checks the given details dictionary for a 'storeId' value, and retrieves
85  // the cookie store context and the store ID associated with it.  If the
86  // 'storeId' value isn't found in the dictionary, the current execution
87  // context's cookie store context is retrieved. Returns false on error and
88  // assigns the internal error_ value if that occurs.
89  // At least one of the output parameters store and store_id should be
90  // non-NULL.
91  bool ParseStoreContext(const DictionaryValue* details,
92                         net::URLRequestContextGetter** context,
93                         std::string* store_id);
94};
95
96// Implements the cookies.get() extension function.
97class GetCookieFunction : public CookiesFunction {
98 public:
99  GetCookieFunction();
100  virtual ~GetCookieFunction();
101  virtual bool RunImpl();
102  DECLARE_EXTENSION_FUNCTION_NAME("cookies.get")
103
104 private:
105  void GetCookieOnIOThread();
106  void RespondOnUIThread();
107
108  std::string name_;
109  GURL url_;
110  std::string store_id_;
111  scoped_refptr<net::URLRequestContextGetter> store_context_;
112};
113
114// Implements the cookies.getAll() extension function.
115class GetAllCookiesFunction : public CookiesFunction {
116 public:
117  GetAllCookiesFunction();
118  virtual ~GetAllCookiesFunction();
119  virtual bool RunImpl();
120  DECLARE_EXTENSION_FUNCTION_NAME("cookies.getAll")
121
122 private:
123  void GetAllCookiesOnIOThread();
124  void RespondOnUIThread();
125
126  DictionaryValue* details_;
127  GURL url_;
128  std::string store_id_;
129  scoped_refptr<net::URLRequestContextGetter> store_context_;
130};
131
132// Implements the cookies.set() extension function.
133class SetCookieFunction : public CookiesFunction {
134 public:
135  SetCookieFunction();
136  virtual ~SetCookieFunction();
137  virtual bool RunImpl();
138  DECLARE_EXTENSION_FUNCTION_NAME("cookies.set")
139
140 private:
141  void SetCookieOnIOThread();
142  void RespondOnUIThread();
143
144  GURL url_;
145  std::string name_;
146  std::string value_;
147  std::string domain_;
148  std::string path_;
149  bool secure_;
150  bool http_only_;
151  base::Time expiration_time_;
152  bool success_;
153  std::string store_id_;
154  scoped_refptr<net::URLRequestContextGetter> store_context_;
155};
156
157// Implements the cookies.remove() extension function.
158class RemoveCookieFunction : public CookiesFunction {
159 public:
160  RemoveCookieFunction();
161  virtual ~RemoveCookieFunction();
162  virtual bool RunImpl();
163  DECLARE_EXTENSION_FUNCTION_NAME("cookies.remove")
164
165 private:
166  void RemoveCookieOnIOThread();
167  void RespondOnUIThread();
168
169  GURL url_;
170  std::string name_;
171  bool success_;
172  std::string store_id_;
173  scoped_refptr<net::URLRequestContextGetter> store_context_;
174};
175
176// Implements the cookies.getAllCookieStores() extension function.
177class GetAllCookieStoresFunction : public CookiesFunction {
178 public:
179  virtual bool RunImpl();
180  // GetAllCookieStoresFunction is sync.
181  virtual void Run();
182  DECLARE_EXTENSION_FUNCTION_NAME("cookies.getAllCookieStores")
183};
184
185#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_
186