browsing_data_cookie_helper.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "utility"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/parsed_cookie.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGlobalCookieListURL[] = "chrome://cookielist";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataCookieHelper::BrowsingDataCookieHelper(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* request_context_getter)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : is_fetching_(false),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_context_getter_(request_context_getter) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataCookieHelper::~BrowsingDataCookieHelper() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::StartFetching(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(const net::CookieList& cookies)>& callback) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!is_fetching_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(completion_callback_.is_null());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_ = callback;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataCookieHelper::FetchCookiesOnIOThread, this));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::DeleteCookie(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& cookie) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataCookieHelper::DeleteCookieOnIOThread,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 this, cookie));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::FetchCookiesOnIOThread() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CookieMonster> cookie_monster =
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_context_getter_->GetURLRequestContext()->
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_store()->GetCookieMonster();
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (cookie_monster.get()) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_monster->GetAllCookiesAsync(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataCookieHelper::OnFetchComplete, this));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnFetchComplete(net::CookieList());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::OnFetchComplete(const net::CookieList& cookies) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataCookieHelper::NotifyInUIThread, this, cookies));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::NotifyInUIThread(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieList& cookies) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_fetching_);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = false;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Run(cookies);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Reset();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataCookieHelper::DeleteCookieOnIOThread(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& cookie) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CookieMonster> cookie_monster =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_context_getter_->GetURLRequestContext()->
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_store()->GetCookieMonster();
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (cookie_monster.get()) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_monster->DeleteCanonicalCookieAsync(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie, net::CookieMonster::DeleteCookieCallback());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataCookieHelper::CannedBrowsingDataCookieHelper(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* request_context_getter)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : BrowsingDataCookieHelper(request_context_getter) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataCookieHelper::~CannedBrowsingDataCookieHelper() {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CannedBrowsingDataCookieHelper* CannedBrowsingDataCookieHelper::Clone() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CannedBrowsingDataCookieHelper* clone =
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataCookieHelper(request_context_getter());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (OriginCookieListMap::iterator it = origin_cookie_list_map_.begin();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != origin_cookie_list_map_.end();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CookieList* cookies = clone->GetCookiesFor(it->first);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookies->insert(cookies->begin(), it->second->begin(), it->second->end());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return clone;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::AddReadCookies(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieList& cookie_list) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef net::CookieList::const_iterator cookie_iterator;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (cookie_iterator add_cookie = cookie_list.begin();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       add_cookie != cookie_list.end(); ++add_cookie) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddCookie(frame_url, *add_cookie);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::AddChangedCookie(
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cookie_line,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieOptions& options) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::CanonicalCookie> cookie(net::CanonicalCookie::Create(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url, cookie_line, base::Time::Now(), options));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cookie.get())
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddCookie(frame_url, *cookie);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::Reset() {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteContainerPairSecondPointers(origin_cookie_list_map_.begin(),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       origin_cookie_list_map_.end());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_cookie_list_map_.clear();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataCookieHelper::empty() const {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (OriginCookieListMap::const_iterator it =
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           origin_cookie_list_map_.begin();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != origin_cookie_list_map_.end();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!it->second->empty())
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t CannedBrowsingDataCookieHelper::GetCookieCount() const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t count = 0;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (OriginCookieListMap::const_iterator it = origin_cookie_list_map_.begin();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != origin_cookie_list_map_.end();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count += it->second->size();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return count;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::StartFetching(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieMonster::GetCookieListCallback& callback) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieList cookie_list;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (OriginCookieListMap::iterator it = origin_cookie_list_map_.begin();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != origin_cookie_list_map_.end();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_list.insert(cookie_list.begin(),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       it->second->begin(),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       it->second->end());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(cookie_list);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CannedBrowsingDataCookieHelper::DeleteCookie(
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const net::CanonicalCookie& cookie) {
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (OriginCookieListMap::iterator it = origin_cookie_list_map_.begin();
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != origin_cookie_list_map_.end();
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DeleteMatchingCookie(cookie, it->second);
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowsingDataCookieHelper::DeleteCookie(cookie);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataCookieHelper::DeleteMatchingCookie(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& add_cookie,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CookieList* cookie_list) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef net::CookieList::iterator cookie_iterator;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (cookie_iterator cookie = cookie_list->begin();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie != cookie_list->end(); ++cookie) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cookie->Name() == add_cookie.Name() &&
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie->Domain() == add_cookie.Domain()&&
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie->Path() == add_cookie.Path()) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_list->erase(cookie);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::CookieList* CannedBrowsingDataCookieHelper::GetCookiesFor(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& first_party_origin) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OriginCookieListMap::iterator it =
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_cookie_list_map_.find(first_party_origin);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == origin_cookie_list_map_.end()) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CookieList* cookies = new net::CookieList();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origin_cookie_list_map_.insert(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::pair<GURL, net::CookieList*>(first_party_origin, cookies));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cookies;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return it->second;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::AddCookie(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& cookie) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Storing cookies in separate cookie lists per frame origin makes the
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetCookieCount method count a cookie multiple times if it is stored in
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple lists.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // E.g. let "example.com" be redirected to "www.example.com". A cookie set
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the cookie string "A=B; Domain=.example.com" would be sent to both
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hosts. This means it would be stored in the separate cookie lists for both
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hosts ("example.com", "www.example.com"). The method GetCookieCount would
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // count this cookie twice. To prevent this, we us a single global cookie
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // list as a work-around to store all added cookies. Per frame URL cookie
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lists are currently not used. In the future they will be used for
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // collecting cookies per origin in redirect chains.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(markusheintz): A) Change the GetCookiesCount method to prevent
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // counting cookies multiple times if they are stored in multiple cookie
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lists.  B) Replace the GetCookieFor method call below with:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "GetCookiesFor(frame_url.GetOrigin());"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieList* cookie_list =
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCookiesFor(GURL(kGlobalCookieListURL));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteMatchingCookie(cookie, cookie_list);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_list->push_back(cookie);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
252