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);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Need to duplicate UMA_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