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 { 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const char kGlobalCookieSetURL[] = "chrome://cookieset"; 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)void CannedBrowsingDataCookieHelper::AddReadCookies( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef net::CookieList::const_iterator cookie_iterator; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (cookie_iterator add_cookie = cookie_list.begin(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_cookie != cookie_list.end(); ++add_cookie) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCookie(frame_url, *add_cookie); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::AddChangedCookie( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieOptions& options) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::CanonicalCookie> cookie(net::CanonicalCookie::Create( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, cookie_line, base::Time::Now(), options)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie.get()) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCookie(frame_url, *cookie); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::Reset() { 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) STLDeleteContainerPairSecondPointers(origin_cookie_set_map_.begin(), 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) origin_cookie_set_map_.end()); 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) origin_cookie_set_map_.clear(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataCookieHelper::empty() const { 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (OriginCookieSetMap::const_iterator it = origin_cookie_set_map_.begin(); 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) it != origin_cookie_set_map_.end(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!it->second->empty()) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t CannedBrowsingDataCookieHelper::GetCookieCount() const { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count = 0; 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (OriginCookieSetMap::const_iterator it = origin_cookie_set_map_.begin(); 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) it != origin_cookie_set_map_.end(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count += it->second->size(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return count; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::StartFetching( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieMonster::GetCookieListCallback& callback) { 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::UI); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieList cookie_list; 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (OriginCookieSetMap::iterator it = origin_cookie_set_map_.begin(); 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) it != origin_cookie_set_map_.end(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_list.insert(cookie_list.begin(), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second->begin(), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second->end()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(cookie_list); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CannedBrowsingDataCookieHelper::DeleteCookie( 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const net::CanonicalCookie& cookie) { 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (OriginCookieSetMap::iterator it = origin_cookie_set_map_.begin(); 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) it != origin_cookie_set_map_.end(); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteMatchingCookie(cookie, it->second); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowsingDataCookieHelper::DeleteCookie(cookie); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CannedBrowsingDataCookieHelper::DeleteMatchingCookie( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& add_cookie, 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canonical_cookie::CookieHashSet* cookie_set) { 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return cookie_set->erase(add_cookie) > 0; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)canonical_cookie::CookieHashSet* CannedBrowsingDataCookieHelper::GetCookiesFor( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_origin) { 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OriginCookieSetMap::iterator it = 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) origin_cookie_set_map_.find(first_party_origin); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (it == origin_cookie_set_map_.end()) { 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canonical_cookie::CookieHashSet* cookies = 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new canonical_cookie::CookieHashSet; 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) origin_cookie_set_map_.insert( 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::pair<GURL, canonical_cookie::CookieHashSet*>(first_party_origin, 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cookies)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cookies; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CannedBrowsingDataCookieHelper::AddCookie( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cookie) { 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Storing cookies in separate cookie sets per frame origin makes the 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetCookieCount method count a cookie multiple times if it is stored in 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // multiple sets. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // E.g. let "example.com" be redirected to "www.example.com". A cookie set 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the cookie string "A=B; Domain=.example.com" would be sent to both 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // hosts. This means it would be stored in the separate cookie sets for both 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hosts ("example.com", "www.example.com"). The method GetCookieCount would 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // count this cookie twice. To prevent this, we us a single global cookie 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // set as a work-around to store all added cookies. Per frame URL cookie 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // sets are currently not used. In the future they will be used for 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // collecting cookies per origin in redirect chains. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): A) Change the GetCookiesCount method to prevent 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // counting cookies multiple times if they are stored in multiple cookie 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // sets. B) Replace the GetCookieFor method call below with: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "GetCookiesFor(frame_url.GetOrigin());" 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(const GURL, origin_cookie_url, (kGlobalCookieSetURL)); 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canonical_cookie::CookieHashSet* cookie_set = 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GetCookiesFor(origin_cookie_url); 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DeleteMatchingCookie(cookie, cookie_set); 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cookie_set->insert(cookie); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 230