1 // Copyright (c) 2010 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 common functionality used by the implementation of the Chrome 6 // Extensions Cookies API implemented in 7 // chrome/browser/extensions/extension_cookies_api.cc. This separate interface 8 // exposes pieces of the API implementation mainly for unit testing purposes. 9 10 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_HELPERS_H_ 11 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_HELPERS_H_ 12 #pragma once 13 14 #include <string> 15 16 #include "net/base/cookie_monster.h" 17 18 class Browser; 19 class DictionaryValue; 20 class Extension; 21 class ListValue; 22 class Profile; 23 24 namespace extension_cookies_helpers { 25 26 // Returns either the original profile or the incognito profile, based on the 27 // given store ID. Returns NULL if the profile doesn't exist or is not allowed 28 // (e.g. if incognito mode is not enabled for the extension). 29 Profile* ChooseProfileFromStoreId(const std::string& store_id, 30 Profile* profile, 31 bool include_incognito); 32 33 // Returns the store ID for a particular user profile. 34 const char* GetStoreIdFromProfile(Profile* profile); 35 36 // Constructs a Cookie object as defined by the cookies API. This function 37 // allocates a new DictionaryValue object; the caller is responsible for 38 // freeing it. 39 DictionaryValue* CreateCookieValue( 40 const net::CookieMonster::CanonicalCookie& cookie, 41 const std::string& store_id); 42 43 // Constructs a CookieStore object as defined by the cookies API. This function 44 // allocates a new DictionaryValue object; the caller is responsible for 45 // freeing it. 46 DictionaryValue* CreateCookieStoreValue(Profile* profile, 47 ListValue* tab_ids); 48 49 // Retrieves all cookies from the given cookie store corresponding to the given 50 // URL. If the URL is empty, all cookies in the cookie store are retrieved. 51 // This can only be called on the IO thread. 52 net::CookieList GetCookieListFromStore( 53 net::CookieStore* cookie_store, const GURL& url); 54 55 // Constructs a URL from a cookie's information for use in checking 56 // a cookie against the extension's host permissions. The Secure 57 // property of the cookie defines the URL scheme, and the cookie's 58 // domain becomes the URL host. 59 GURL GetURLFromCanonicalCookie( 60 const net::CookieMonster::CanonicalCookie& cookie); 61 62 // Looks through all cookies in the given cookie store, and appends to the 63 // match list all the cookies that both match the given URL and cookie details 64 // and are allowed by extension host permissions. 65 void AppendMatchingCookiesToList( 66 const net::CookieList& all_cookies, 67 const std::string& store_id, 68 const GURL& url, const DictionaryValue* details, 69 const Extension* extension, 70 ListValue* match_list); 71 72 // Appends the IDs of all tabs belonging to the given browser to the 73 // given list. 74 void AppendToTabIdList(Browser* browser, ListValue* tab_ids); 75 76 // A class representing the cookie filter parameters passed into 77 // cookies.getAll(). 78 // This class is essentially a convenience wrapper for the details dictionary 79 // passed into the cookies.getAll() API by the user. If the dictionary contains 80 // no filter parameters, the MatchFilter will always trivially 81 // match all cookies. 82 class MatchFilter { 83 public: 84 // Takes the details dictionary argument given by the user as input. 85 // This class does not take ownership of the lifetime of the DictionaryValue 86 // object. 87 explicit MatchFilter(const DictionaryValue* details); 88 89 // Returns true if the given cookie matches the properties in the match 90 // filter. 91 bool MatchesCookie(const net::CookieMonster::CanonicalCookie& cookie); 92 93 private: 94 // Returns true if the details dictionary contains a string with the given 95 // key and value. Also returns true if the dictionary doesn't contain the 96 // given key at all (trival match). 97 bool MatchesString(const char* key, const std::string& value); 98 99 // Returns true if the details dictionary contains a boolean with the given 100 // key and value. Also returns true if the dictionary doesn't contain the 101 // given key at all (trival match). 102 bool MatchesBoolean(const char* key, bool value); 103 104 // Returns true if the given cookie domain string matches the filter's 105 // domain. Any cookie domain which is equal to or is a subdomain of the 106 // filter's domain will be matched; leading '.' characters indicating 107 // host-only domains have no meaning in the match filter domain (for 108 // instance, a match filter domain of 'foo.bar.com' will be treated the same 109 // as '.foo.bar.com', and both will match cookies with domain values of 110 // 'foo.bar.com', '.foo.bar.com', and 'baz.foo.bar.com'. 111 bool MatchesDomain(const std::string& domain); 112 113 const DictionaryValue* details_; 114 }; 115 116 } // namespace extension_cookies_helpers 117 118 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_HELPERS_H_ 119