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