browsing_data_cookie_helper.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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) { 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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() { 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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() { 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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) { 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(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() && 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (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