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