Chromium Code Reviews| Index: chrome/browser/browsing_data_cookie_helper.cc |
| =================================================================== |
| --- chrome/browser/browsing_data_cookie_helper.cc (revision 0) |
| +++ chrome/browser/browsing_data_cookie_helper.cc (revision 0) |
| @@ -0,0 +1,190 @@ |
| +// Copyright (c) 2010 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/browsing_data_cookie_helper.h" |
| + |
| +#include "base/bind.h" |
| +#include "chrome/browser/net/chrome_url_request_context.h" |
|
erikwright (departed)
2011/07/18 02:08:30
why do you need chrome_url_request_context and not
ycxiao1
2011/07/19 22:12:48
Done.
|
| +#include "chrome/browser/profiles/profile.h" |
| +#include "content/browser/browser_thread.h" |
| + |
|
erikwright (departed)
2011/07/18 02:08:30
#include base::Time, DCHECK, scoped_ptr
ycxiao1
2011/07/19 22:12:48
Done.
|
| +using base::Time; |
| + |
| +BrowsingDataCookieHelper::BrowsingDataCookieHelper(Profile* profile) |
| + : is_fetching_(false), |
| + profile_(profile), |
| + request_context_getter_(profile->GetRequestContext()) { |
| +} |
| + |
| +void BrowsingDataCookieHelper::StartFetching( |
| + const net::CookieMonster::GetCookieListCallback& callback) { |
| + if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
|
erikwright (departed)
2011/07/18 02:08:30
DCHECK that the member completion_callback_ is nul
ycxiao1
2011/07/19 22:12:48
Done.
|
| + DCHECK(!is_fetching_); |
| + DCHECK(!callback.is_null()); |
| + is_fetching_ = true; |
| + cookie_list_.clear(); |
| + completion_callback_ = callback; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&BrowsingDataCookieHelper::StartFetching, this, callback)); |
| + return; |
| + } |
| + |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
|
erikwright (departed)
2011/07/18 02:08:30
Separate the UI and IO thread portions of this met
ycxiao1
2011/07/19 22:12:48
Done.
|
| + scoped_refptr<net::CookieMonster> cookie_monster = |
| + request_context_getter_->GetURLRequestContext()-> |
| + cookie_store()->GetCookieMonster(); |
| + if (cookie_monster) |
|
erikwright (departed)
2011/07/18 02:08:30
if !cookie_monster, unset is_fetching_ and invoke
ycxiao1
2011/07/19 22:12:48
Done.
|
| + cookie_monster->GetAllCookiesAsync( |
| + base::Bind(&BrowsingDataCookieHelper::OnFetchComplete, this)); |
| +} |
| + |
| +void BrowsingDataCookieHelper::CancelNotification() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + completion_callback_.Reset(); |
| +} |
| + |
| +void BrowsingDataCookieHelper::DeleteCookie( |
| + const net::CookieMonster::CanonicalCookie& cookie) { |
| + if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&BrowsingDataCookieHelper::DeleteCookie, this, cookie)); |
| + return; |
| + } |
| + |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
|
erikwright (departed)
2011/07/18 02:08:30
Separate into two methods as mentioned above.
ycxiao1
2011/07/19 22:12:48
Done.
|
| + scoped_refptr<net::CookieMonster> cookie_monster = |
| + request_context_getter_->GetURLRequestContext()-> |
| + cookie_store()->GetCookieMonster(); |
| + if (cookie_monster) |
| + cookie_monster->DeleteCanonicalCookieAsync( |
| + cookie, |
| + net::CookieMonster::DeleteCookieCallback()); |
| +} |
| + |
| +const net::CookieList& BrowsingDataCookieHelper::cookie_list() { |
| + return cookie_list_; |
| +} |
| + |
| +BrowsingDataCookieHelper::~BrowsingDataCookieHelper() {} |
| + |
| +void BrowsingDataCookieHelper::OnFetchComplete(const net::CookieList& cookies) { |
|
erikwright (departed)
2011/07/18 02:08:30
Separate into two methods.
ycxiao1
2011/07/19 22:12:48
Done.
|
| + if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&BrowsingDataCookieHelper::OnFetchComplete, this, cookies)); |
| + return; |
| + } |
| + |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(is_fetching_); |
| + is_fetching_ = false; |
| + cookie_list_ = cookies; |
| + if (!completion_callback_.is_null()) { |
| + completion_callback_.Run(cookie_list_); |
| + completion_callback_.Reset(); |
| + } |
| +} |
| + |
| +CannedBrowsingDataCookieHelper::CannedBrowsingDataCookieHelper( |
| + Profile* profile) |
| + : BrowsingDataCookieHelper(profile), |
| + profile_(profile) { |
| +} |
| + |
| +CannedBrowsingDataCookieHelper* CannedBrowsingDataCookieHelper::Clone() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CannedBrowsingDataCookieHelper* clone = |
| + new CannedBrowsingDataCookieHelper(profile_); |
| + |
| + clone->cookie_list_ = cookie_list_; |
| + return clone; |
| +} |
| + |
| +void CannedBrowsingDataCookieHelper::AddReadCookie( |
| + const GURL& url, |
| + const net::CookieList& cookie_list) { |
| + typedef net::CookieList::const_iterator cookie_iterator; |
| + for (cookie_iterator add_cookie = cookie_list.begin(); |
| + add_cookie != cookie_list.end(); ++add_cookie) { |
| + // May have multiple set cookies that result in the same system time. |
| + Time creation_time = Time::Now(); |
| + std::string mac_key; |
| + std::string mac_algorithm; |
| + scoped_ptr<net::CookieMonster::CanonicalCookie> cc; |
| + cc.reset(net::CookieMonster::CanonicalCookie::Create( |
| + url, |
| + add_cookie->Name(), |
| + add_cookie->Value(), |
| + add_cookie->Domain(), |
| + add_cookie->Path(), |
| + mac_key, mac_algorithm, |
| + creation_time, |
| + add_cookie->ExpiryDate(), |
| + add_cookie->IsSecure(), |
| + add_cookie->IsHttpOnly())); |
| + |
| + if (cc.get() && !HasCookie(*cc)) { |
| + cookie_list_.push_back(*cc); |
| + } |
| + } |
| +} |
| + |
| +void CannedBrowsingDataCookieHelper::AddChangeCookie( |
| + const GURL& url, |
| + const std::string& cookie_line, |
| + const net::CookieOptions& options) { |
| + typedef net::CookieList::const_iterator cookie_iterator; |
| + net::CookieMonster::ParsedCookie pc(cookie_line); |
| + scoped_ptr<net::CookieMonster::CanonicalCookie> cc; |
| + cc.reset(new net::CookieMonster::CanonicalCookie(url, pc)); |
| + |
| + if (cc.get()) { |
| + for (cookie_iterator cookie = cookie_list_.begin(); |
| + cookie != cookie_list_.end(); ++cookie) { |
| + if (cookie->Source() == cc->Source() && |
| + cookie->Name() == cc->Name() && |
| + cookie->Value() == cc->Value() && |
| + cookie->Domain() == cc->Domain()&& |
| + cookie->Path() == cc->Path()) { |
| + return; |
| + } |
| + } |
| + cookie_list_.push_back(*cc); |
| + } |
| +} |
| + |
| +void CannedBrowsingDataCookieHelper::Reset() { |
| + cookie_list_.clear(); |
| +} |
| + |
| +bool CannedBrowsingDataCookieHelper::empty() const { |
| + return cookie_list_.empty(); |
| +} |
| + |
| +void CannedBrowsingDataCookieHelper::StartFetching( |
| + const net::CookieMonster::GetCookieListCallback& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (!callback.is_null()) |
| + callback.Run(cookie_list_); |
| +} |
| + |
| +bool CannedBrowsingDataCookieHelper::HasCookie( |
| + const net::CookieMonster::CanonicalCookie& add_cookie) { |
| + typedef net::CookieList::const_iterator cookie_iterator; |
| + for (cookie_iterator cookie = cookie_list_.begin(); |
| + cookie != cookie_list_.end(); ++cookie) { |
| + if (cookie->Source() == add_cookie.Source() && |
| + cookie->Name() == add_cookie.Name() && |
| + cookie->Value() == add_cookie.Value() && |
| + cookie->Domain() == add_cookie.Domain()&& |
| + cookie->Path() == add_cookie.Path()) { |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| +CannedBrowsingDataCookieHelper::~CannedBrowsingDataCookieHelper() {} |
| Property changes on: chrome/browser/browsing_data_cookie_helper.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |