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