1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/net/evicted_domain_cookie_counter.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/metrics/histogram.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/canonical_cookie.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chrome_browser_net { 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::Time; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::TimeDelta; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const size_t kMaxEvictedDomainCookies = 500; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const size_t kPurgeEvictedDomainCookies = 100; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DelegateImpl : public EvictedDomainCookieCounter::Delegate { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DelegateImpl(); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EvictedDomainCookieCounter::Delegate implementation. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Report( 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedDomainCookieCounter::EvictedCookie& evicted_cookie, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Time& reinstatement_time) OVERRIDE; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual Time CurrentTime() const OVERRIDE; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DelegateImpl::DelegateImpl() {} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DelegateImpl::Report( 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedDomainCookieCounter::EvictedCookie& evicted_cookie, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Time& reinstatement_time) { 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TimeDelta reinstatement_delay( 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinstatement_time - evicted_cookie.eviction_time); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Need to duplicate HISTOGRAM_CUSTOM_TIMES(), since it is a macro that 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // defines a static variable. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (evicted_cookie.is_google) { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES("Cookie.ReinstatedCookiesGoogle", 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinstatement_delay, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TimeDelta::FromSeconds(1), 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TimeDelta::FromDays(7), 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES("Cookie.ReinstatedCookiesOther", 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinstatement_delay, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TimeDelta::FromSeconds(1), 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TimeDelta::FromDays(7), 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Time DelegateImpl::CurrentTime() const { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Time::Now(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)EvictedDomainCookieCounter::EvictedDomainCookieCounter( 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<net::CookieMonster::Delegate> next_cookie_monster_delegate) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : next_cookie_monster_delegate_(next_cookie_monster_delegate), 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_counter_delegate_(new DelegateImpl), 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_size_(kMaxEvictedDomainCookies), 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) purge_count_(kPurgeEvictedDomainCookies) { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)EvictedDomainCookieCounter::EvictedDomainCookieCounter( 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<net::CookieMonster::Delegate> next_cookie_monster_delegate, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Delegate> cookie_counter_delegate, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t max_size, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t purge_count) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : next_cookie_monster_delegate_(next_cookie_monster_delegate), 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_counter_delegate_(cookie_counter_delegate.Pass()), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) max_size_(max_size), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) purge_count_(purge_count) { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(cookie_counter_delegate_); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_LT(purge_count, max_size_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)EvictedDomainCookieCounter::~EvictedDomainCookieCounter() { 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STLDeleteContainerPairSecondPointers(evicted_cookies_.begin(), 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.end()); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)size_t EvictedDomainCookieCounter::GetStorageSize() const { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return evicted_cookies_.size(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictedDomainCookieCounter::OnCookieChanged( 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::CanonicalCookie& cookie, 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool removed, 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChangeCause cause) { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedDomainCookieCounter::EvictedCookieKey key(GetKey(cookie)); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time current_time(cookie_counter_delegate_->CurrentTime()); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (removed) { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cause == net::CookieMonster::Delegate::CHANGE_COOKIE_EVICTED) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StoreEvictedCookie(key, cookie, current_time); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { // Includes adds or updates. 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProcessNewCookie(key, cookie, current_time); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (next_cookie_monster_delegate_.get()) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_cookie_monster_delegate_->OnCookieChanged(cookie, removed, cause); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void EvictedDomainCookieCounter::OnLoaded() { 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (next_cookie_monster_delegate_.get()) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) next_cookie_monster_delegate_->OnLoaded(); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)EvictedDomainCookieCounter::EvictedCookieKey 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedDomainCookieCounter::GetKey(const net::CanonicalCookie& cookie) { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return cookie.Domain() + ";" + cookie.Path() + ";" + cookie.Name(); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool EvictedDomainCookieCounter::CompareEvictedCookie( 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedCookieMap::iterator evicted_cookie1, 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedCookieMap::iterator evicted_cookie2) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return evicted_cookie1->second->eviction_time 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) < evicted_cookie2->second->eviction_time; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictedDomainCookieCounter::GarbageCollect(const Time& current_time) { 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (evicted_cookies_.size() <= max_size_) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // From |evicted_cookies_|, removed all expired cookies, and remove cookies 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with the oldest |eviction_time| so that |size_goal| is attained. 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t size_goal = max_size_ - purge_count_; 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Bound on number of non-expired cookies to remove. 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t remove_quota = evicted_cookies_.size() - size_goal; 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_GT(remove_quota, 0u); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<EvictedCookieMap::iterator> remove_list; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remove_list.reserve(evicted_cookies_.size()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedCookieMap::iterator it = evicted_cookies_.begin(); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) while (it != evicted_cookies_.end()) { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (it->second->is_expired(current_time)) { 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete it->second; 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.erase(it++); // Post-increment idiom for in-loop removal. 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (remove_quota) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) --remove_quota; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (remove_quota) // Don't bother storing if quota met. 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remove_list.push_back(it); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++it; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Free the oldest |remove_quota| non-expired cookies. 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::partial_sort(remove_list.begin(), remove_list.begin() + remove_quota, 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remove_list.end(), CompareEvictedCookie); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < remove_quota; ++i) { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete remove_list[i]->second; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.erase(remove_list[i]); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Apply stricter check if non-expired cookies were deleted. 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(remove_quota ? evicted_cookies_.size() == size_goal : 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.size() <= size_goal); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictedDomainCookieCounter::StoreEvictedCookie( 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedCookieKey& key, 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::CanonicalCookie& cookie, 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Time& current_time) { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_google = google_util::IsGoogleHostname( 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie.Domain(), google_util::ALLOW_SUBDOMAIN); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedCookie* evicted_cookie = 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new EvictedCookie(current_time, cookie.ExpiryDate(), is_google); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::pair<EvictedCookieMap::iterator, bool> prev_entry = 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.insert( 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedCookieMap::value_type(key, evicted_cookie)); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!prev_entry.second) { 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete prev_entry.first->second; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prev_entry.first->second = evicted_cookie; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GarbageCollect(current_time); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EvictedDomainCookieCounter::ProcessNewCookie( 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EvictedCookieKey& key, 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::CanonicalCookie& cc, 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Time& current_time) { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EvictedCookieMap::iterator it = evicted_cookies_.find(key); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (it != evicted_cookies_.end()) { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!it->second->is_expired(current_time)) // Reinstatement. 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_counter_delegate_->Report(*it->second, current_time); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete it->second; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) evicted_cookies_.erase(it); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chrome_browser_net 208