1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/prerender/prerender_cookie_store.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using content::BrowserThread; 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace prerender { 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PrerenderCookieStore::PrerenderCookieStore( 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<net::CookieMonster> default_cookie_monster, 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& cookie_conflict_cb) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : in_forwarding_mode_(false), 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default_cookie_monster_(default_cookie_monster), 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) changes_cookie_monster_(new net::CookieMonster(NULL, NULL)), 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_conflict_cb_(cookie_conflict_cb), 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_conflict_(false) { 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(default_cookie_monster_.get() != NULL); 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(default_cookie_monster_->loaded()); 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PrerenderCookieStore::~PrerenderCookieStore() { 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::SetCookieWithOptionsAsync( 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& cookie_line, 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::CookieOptions& options, 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SetCookiesCallback& callback) { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CookieOperation op; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.op = COOKIE_OP_SET_COOKIE_WITH_OPTIONS_ASYNC; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.url = url; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.cookie_line = cookie_line; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.options = options; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCookieStoreForCookieOpAndLog(op)-> 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetCookieWithOptionsAsync(url, cookie_line, options, callback); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::GetCookiesWithOptionsAsync( 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::CookieOptions& options, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GetCookiesCallback& callback) { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CookieOperation op; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.op = COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.url = url; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.options = options; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCookieStoreForCookieOpAndLog(op)-> 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCookiesWithOptionsAsync(url, options, callback); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::GetAllCookiesForURLAsync( 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GetCookieListCallback& callback) { 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CookieOperation op; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.op = COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.url = url; 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCookieStoreForCookieOpAndLog(op)->GetAllCookiesForURLAsync(url, callback); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::DeleteCookieAsync(const GURL& url, 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& cookie_name, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& callback) { 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CookieOperation op; 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.op = COOKIE_OP_DELETE_COOKIE_ASYNC; 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.url = url; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.cookie_name = cookie_name; 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCookieStoreForCookieOpAndLog(op)->DeleteCookieAsync(url, cookie_name, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::DeleteAllCreatedBetweenAsync( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Time& delete_begin, 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Time& delete_end, 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const DeleteCallback& callback) { 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::DeleteAllCreatedBetweenForHostAsync( 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Time delete_begin, 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Time delete_end, 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const DeleteCallback& callback) { 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::DeleteSessionCookiesAsync(const DeleteCallback&) { 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)net::CookieMonster* PrerenderCookieStore::GetCookieMonster() { 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)net::CookieStore* PrerenderCookieStore::GetCookieStoreForCookieOpAndLog( 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const CookieOperation& op) { 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string key = default_cookie_monster_->GetKey(op.url.host()); 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_read_only = (op.op == COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC || 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) op.op == COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (in_forwarding_mode_) 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return default_cookie_monster_.get(); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(changes_cookie_monster_.get() != NULL); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_ops_.push_back(op); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool key_copied = ContainsKey(copied_keys_, key); 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (key_copied) 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return changes_cookie_monster_.get(); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_read_only) { 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Insert this key into the set of read keys, if it doesn't exist yet. 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!ContainsKey(read_keys_, key)) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) read_keys_.insert(key); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return default_cookie_monster_.get(); 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If this method hasn't returned yet, the key has not been copied yet, 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and we must copy it due to the requested write operation. 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool copy_success = 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default_cookie_monster_->CopyCookiesForKeyToOtherCookieMonster( 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci key, changes_cookie_monster_.get()); 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The copy must succeed. 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(copy_success); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) copied_keys_.insert(key); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return changes_cookie_monster_.get(); 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::ApplyChanges(std::vector<GURL>* cookie_change_urls) { 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (in_forwarding_mode_) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Apply all changes to the underlying cookie store. 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<CookieOperation>::const_iterator it = cookie_ops_.begin(); 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != cookie_ops_.end(); 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (it->op) { 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case COOKIE_OP_SET_COOKIE_WITH_OPTIONS_ASYNC: 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_change_urls->push_back(it->url); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default_cookie_monster_->SetCookieWithOptionsAsync( 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it->url, it->cookie_line, it->options, SetCookiesCallback()); 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC: 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default_cookie_monster_->GetCookiesWithOptionsAsync( 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it->url, it->options, GetCookiesCallback()); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC: 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default_cookie_monster_->GetAllCookiesForURLAsync( 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it->url, GetCookieListCallback()); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case COOKIE_OP_DELETE_COOKIE_ASYNC: 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_change_urls->push_back(it->url); 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default_cookie_monster_->DeleteCookieAsync( 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it->url, it->cookie_name, base::Closure()); 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case COOKIE_OP_MAX: 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) in_forwarding_mode_ = true; 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) copied_keys_.clear(); 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_ops_.clear(); 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) changes_cookie_monster_ = NULL; 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PrerenderCookieStore::OnCookieChangedForURL( 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::CookieMonster* cookie_monster, 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url) { 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If the cookie was changed in a different cookie monster than the one 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // being decorated, there is nothing to do). 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cookie_monster != default_cookie_monster_.get()) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (in_forwarding_mode_) 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we have encountered a conflict before, it has already been recorded 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and the cb has been issued, so nothing to do. 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (cookie_conflict_) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string key = default_cookie_monster_->GetKey(url.host()); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If the key for the cookie which was modified was neither read nor written, 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // nothing to do. 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((!ContainsKey(read_keys_, key)) && (!ContainsKey(copied_keys_, key))) 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // There was a conflict in cookies. Call the conflict callback, which should 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // cancel the prerender if necessary (i.e. if it hasn't already been 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // cancelled for some other reason). 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Notice that there is a race here with swapping in the prerender, but this 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // is the same issue that occurs when two tabs modify cookies for the 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // same domain concurrently. Therefore, there is no need to do anything 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // special to prevent this race condition. 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_conflict_ = true; 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!cookie_conflict_cb_.is_null()) { 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTask( 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::UI, 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cookie_conflict_cb_); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PrerenderCookieStore::CookieOperation::CookieOperation() { 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PrerenderCookieStore::CookieOperation::~CookieOperation() { 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace prerender 243