| Index: trunk/src/chrome/browser/prerender/prerender_cookie_store.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/prerender/prerender_cookie_store.cc (revision 269877)
|
| +++ trunk/src/chrome/browser/prerender/prerender_cookie_store.cc (working copy)
|
| @@ -1,241 +0,0 @@
|
| -// Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/prerender/prerender_cookie_store.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/stl_util.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace prerender {
|
| -
|
| -PrerenderCookieStore::PrerenderCookieStore(
|
| - scoped_refptr<net::CookieMonster> default_cookie_monster,
|
| - const base::Closure& cookie_conflict_cb)
|
| - : in_forwarding_mode_(false),
|
| - default_cookie_monster_(default_cookie_monster),
|
| - changes_cookie_monster_(new net::CookieMonster(NULL, NULL)),
|
| - cookie_conflict_cb_(cookie_conflict_cb),
|
| - cookie_conflict_(false) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - DCHECK(default_cookie_monster_ != NULL);
|
| - DCHECK(default_cookie_monster_->loaded());
|
| -}
|
| -
|
| -PrerenderCookieStore::~PrerenderCookieStore() {
|
| -}
|
| -
|
| -void PrerenderCookieStore::SetCookieWithOptionsAsync(
|
| - const GURL& url,
|
| - const std::string& cookie_line,
|
| - const net::CookieOptions& options,
|
| - const SetCookiesCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - CookieOperation op;
|
| - op.op = COOKIE_OP_SET_COOKIE_WITH_OPTIONS_ASYNC;
|
| - op.url = url;
|
| - op.cookie_line = cookie_line;
|
| - op.options = options;
|
| -
|
| - GetCookieStoreForCookieOpAndLog(op)->
|
| - SetCookieWithOptionsAsync(url, cookie_line, options, callback);
|
| -}
|
| -
|
| -void PrerenderCookieStore::GetCookiesWithOptionsAsync(
|
| - const GURL& url,
|
| - const net::CookieOptions& options,
|
| - const GetCookiesCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - CookieOperation op;
|
| - op.op = COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC;
|
| - op.url = url;
|
| - op.options = options;
|
| -
|
| - GetCookieStoreForCookieOpAndLog(op)->
|
| - GetCookiesWithOptionsAsync(url, options, callback);
|
| -}
|
| -
|
| -void PrerenderCookieStore::GetAllCookiesForURLAsync(
|
| - const GURL& url,
|
| - const GetCookieListCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - CookieOperation op;
|
| - op.op = COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC;
|
| - op.url = url;
|
| -
|
| - GetCookieStoreForCookieOpAndLog(op)->GetAllCookiesForURLAsync(url, callback);
|
| -}
|
| -
|
| -
|
| -void PrerenderCookieStore::DeleteCookieAsync(const GURL& url,
|
| - const std::string& cookie_name,
|
| - const base::Closure& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - CookieOperation op;
|
| - op.op = COOKIE_OP_DELETE_COOKIE_ASYNC;
|
| - op.url = url;
|
| - op.cookie_name = cookie_name;
|
| -
|
| - GetCookieStoreForCookieOpAndLog(op)->DeleteCookieAsync(url, cookie_name,
|
| - callback);
|
| -}
|
| -
|
| -void PrerenderCookieStore::DeleteAllCreatedBetweenAsync(
|
| - const base::Time& delete_begin,
|
| - const base::Time& delete_end,
|
| - const DeleteCallback& callback) {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void PrerenderCookieStore::DeleteAllCreatedBetweenForHostAsync(
|
| - const base::Time delete_begin,
|
| - const base::Time delete_end,
|
| - const GURL& url,
|
| - const DeleteCallback& callback) {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void PrerenderCookieStore::DeleteSessionCookiesAsync(const DeleteCallback&) {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -net::CookieMonster* PrerenderCookieStore::GetCookieMonster() {
|
| - NOTREACHED();
|
| - return NULL;
|
| -}
|
| -
|
| -net::CookieStore* PrerenderCookieStore::GetCookieStoreForCookieOpAndLog(
|
| - const CookieOperation& op) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - std::string key = default_cookie_monster_->GetKey(op.url.host());
|
| - bool is_read_only = (op.op == COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC ||
|
| - op.op == COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC);
|
| -
|
| - if (in_forwarding_mode_)
|
| - return default_cookie_monster_;
|
| -
|
| - DCHECK(changes_cookie_monster_ != NULL);
|
| -
|
| - cookie_ops_.push_back(op);
|
| -
|
| - bool key_copied = ContainsKey(copied_keys_, key);
|
| -
|
| - if (key_copied)
|
| - return changes_cookie_monster_;
|
| -
|
| - if (is_read_only) {
|
| - // Insert this key into the set of read keys, if it doesn't exist yet.
|
| - if (!ContainsKey(read_keys_, key))
|
| - read_keys_.insert(key);
|
| - return default_cookie_monster_;
|
| - }
|
| -
|
| - // If this method hasn't returned yet, the key has not been copied yet,
|
| - // and we must copy it due to the requested write operation.
|
| -
|
| - bool copy_success = default_cookie_monster_->
|
| - CopyCookiesForKeyToOtherCookieMonster(key, changes_cookie_monster_);
|
| -
|
| - // The copy must succeed.
|
| - DCHECK(copy_success);
|
| -
|
| - copied_keys_.insert(key);
|
| -
|
| - return changes_cookie_monster_;
|
| -}
|
| -
|
| -void PrerenderCookieStore::ApplyChanges(std::vector<GURL>* cookie_change_urls) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (in_forwarding_mode_)
|
| - return;
|
| -
|
| - // Apply all changes to the underlying cookie store.
|
| - for (std::vector<CookieOperation>::const_iterator it = cookie_ops_.begin();
|
| - it != cookie_ops_.end();
|
| - ++it) {
|
| - switch (it->op) {
|
| - case COOKIE_OP_SET_COOKIE_WITH_OPTIONS_ASYNC:
|
| - cookie_change_urls->push_back(it->url);
|
| - default_cookie_monster_->SetCookieWithOptionsAsync(
|
| - it->url, it->cookie_line, it->options, SetCookiesCallback());
|
| - break;
|
| - case COOKIE_OP_GET_COOKIES_WITH_OPTIONS_ASYNC:
|
| - default_cookie_monster_->GetCookiesWithOptionsAsync(
|
| - it->url, it->options, GetCookiesCallback());
|
| - break;
|
| - case COOKIE_OP_GET_ALL_COOKIES_FOR_URL_ASYNC:
|
| - default_cookie_monster_->GetAllCookiesForURLAsync(
|
| - it->url, GetCookieListCallback());
|
| - break;
|
| - case COOKIE_OP_DELETE_COOKIE_ASYNC:
|
| - cookie_change_urls->push_back(it->url);
|
| - default_cookie_monster_->DeleteCookieAsync(
|
| - it->url, it->cookie_name, base::Closure());
|
| - break;
|
| - case COOKIE_OP_MAX:
|
| - NOTREACHED();
|
| - }
|
| - }
|
| -
|
| - in_forwarding_mode_ = true;
|
| - copied_keys_.clear();
|
| - cookie_ops_.clear();
|
| - changes_cookie_monster_ = NULL;
|
| -}
|
| -
|
| -void PrerenderCookieStore::OnCookieChangedForURL(
|
| - net::CookieMonster* cookie_monster,
|
| - const GURL& url) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - // If the cookie was changed in a different cookie monster than the one
|
| - // being decorated, there is nothing to do).
|
| - if (cookie_monster != default_cookie_monster_)
|
| - return;
|
| -
|
| - if (in_forwarding_mode_)
|
| - return;
|
| -
|
| - // If we have encountered a conflict before, it has already been recorded
|
| - // and the cb has been issued, so nothing to do.
|
| - if (cookie_conflict_)
|
| - return;
|
| -
|
| - std::string key = default_cookie_monster_->GetKey(url.host());
|
| -
|
| - // If the key for the cookie which was modified was neither read nor written,
|
| - // nothing to do.
|
| - if ((!ContainsKey(read_keys_, key)) && (!ContainsKey(copied_keys_, key)))
|
| - return;
|
| -
|
| - // There was a conflict in cookies. Call the conflict callback, which should
|
| - // cancel the prerender if necessary (i.e. if it hasn't already been
|
| - // cancelled for some other reason).
|
| - // Notice that there is a race here with swapping in the prerender, but this
|
| - // is the same issue that occurs when two tabs modify cookies for the
|
| - // same domain concurrently. Therefore, there is no need to do anything
|
| - // special to prevent this race condition.
|
| - cookie_conflict_ = true;
|
| - if (!cookie_conflict_cb_.is_null()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - cookie_conflict_cb_);
|
| - }
|
| -}
|
| -
|
| -PrerenderCookieStore::CookieOperation::CookieOperation() {
|
| -}
|
| -
|
| -PrerenderCookieStore::CookieOperation::~CookieOperation() {
|
| -}
|
| -
|
| -} // namespace prerender
|
|
|