1/*
2 * Copyright (C) Julien Chaffraix <julien.chaffraix@gmail.com>
3 * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#ifndef CookieMap_h
28#define CookieMap_h
29
30#include <wtf/HashMap.h>
31#include <wtf/Vector.h>
32#include <wtf/text/StringHash.h>
33#include <wtf/text/WTFString.h>
34
35namespace WebCore {
36
37enum CookieFilter {
38    NoHttpOnlyCookie,
39    WithHttpOnlyCookies,
40};
41
42class ParsedCookie;
43
44/* A cookie map is a node in the tree held by CookieManager that represents
45 * cookies that matches a common domain.
46 *
47 * A CookieMap holds reference to the cookies that it contains and the child
48 * domains that exist within the tree.
49 *
50 * The number of cookie per host is limited by CookieManager::s_maxCookieCountPerHost
51 */
52
53class CookieMap {
54
55public:
56    CookieMap(const String& name = "");
57    ~CookieMap();
58
59    unsigned count() const { return m_cookieVector.size(); }
60    const String& getName() const { return m_name; }
61
62    // Return false if the candidateCookie is rejected.
63    bool addOrReplaceCookie(PassRefPtr<ParsedCookie> prpCandidateCookie, RefPtr<ParsedCookie>& replacedCookie, CookieFilter = WithHttpOnlyCookies);
64
65    // Need to return the reference to the removed cookie so manager can deal with it (garbage collect).
66    PassRefPtr<ParsedCookie> removeCookie(const PassRefPtr<ParsedCookie>, CookieFilter = WithHttpOnlyCookies);
67
68    // Returns a map with that given subdomain.
69    CookieMap* getSubdomainMap(const String&);
70    void addSubdomainMap(const String&, CookieMap*);
71    void deleteAllCookiesAndDomains();
72
73    void getAllCookies(Vector<RefPtr<ParsedCookie> >*);
74    void getAllChildCookies(Vector<RefPtr<ParsedCookie> >* stackOfCookies);
75    PassRefPtr<ParsedCookie> removeOldestCookie();
76
77private:
78    void updateOldestCookie();
79    PassRefPtr<ParsedCookie> removeCookieAtIndex(int position, const PassRefPtr<ParsedCookie>);
80
81    Vector<RefPtr<ParsedCookie> > m_cookieVector;
82    // The key is a subsection of the domain.
83    // ex: if inserting accounts.google.com & this cookiemap is "com", this subdomain map will contain "google"
84    // the "google" cookiemap will contain "accounts" in its subdomain map.
85    HashMap<String, CookieMap*> m_subdomains;
86
87    // Store the oldest cookie to speed up LRU checks.
88    RefPtr<ParsedCookie> m_oldestCookie;
89    const String m_name;
90
91    // FIXME : should have a m_shouldUpdate flag to update the network layer only when the map has changed.
92};
93
94} // namespace WebCore
95
96#endif // CookieMap_h
97