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