Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4090)

Unified Diff: chrome/browser/extensions/extension_cookies_api.cc

Issue 2860012: Revert 50296 (Causes DCHECK failures) - Make CookieMonster NonThreadSafe.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_cookies_api.cc
===================================================================
--- chrome/browser/extensions/extension_cookies_api.cc (revision 50356)
+++ chrome/browser/extensions/extension_cookies_api.cc (working copy)
@@ -7,9 +7,7 @@
#include "chrome/browser/extensions/extension_cookies_api.h"
#include "base/json/json_writer.h"
-#include "base/task.h"
#include "chrome/browser/browser_list.h"
-#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/extensions/extension_cookies_api_constants.h"
#include "chrome/browser/extensions/extension_cookies_helpers.h"
#include "chrome/browser/extensions/extension_message_service.h"
@@ -101,10 +99,10 @@
return true;
}
-bool CookiesFunction::ParseStoreContext(const DictionaryValue* details,
- URLRequestContextGetter** context,
- std::string* store_id) {
- DCHECK(details && (context || store_id));
+bool CookiesFunction::ParseCookieStore(const DictionaryValue* details,
+ net::CookieStore** store,
+ std::string* store_id) {
+ DCHECK(details && (store || store_id));
Profile* store_profile = NULL;
if (details->HasKey(keys::kStoreIdKey)) {
// The store ID was explicitly specified in the details dictionary.
@@ -132,17 +130,14 @@
store_profile = current_browser->profile();
}
DCHECK(store_profile);
-
- if (context)
- *context = store_profile->GetRequestContext();
+ if (store)
+ *store = store_profile->GetRequestContext()->GetCookieStore();
if (store_id)
- *store_id = extension_cookies_helpers::GetStoreIdFromProfile(store_profile);
-
+ *store_id =
+ extension_cookies_helpers::GetStoreIdFromProfile(store_profile);
return true;
}
-GetCookieFunction::GetCookieFunction() {}
-
bool GetCookieFunction::RunImpl() {
// Return false if the arguments are malformed.
DictionaryValue* details;
@@ -150,115 +145,62 @@
DCHECK(details);
// Read/validate input parameters.
- if (!ParseUrl(details, &url_, true))
+ GURL url;
+ if (!ParseUrl(details, &url, true))
return false;
+ std::string name;
// Get the cookie name string or return false.
- EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kNameKey, &name_));
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kNameKey, &name));
- URLRequestContextGetter* store_context = NULL;
- if (!ParseStoreContext(details, &store_context, &store_id_))
+ net::CookieStore* cookie_store;
+ std::string store_id;
+ if (!ParseCookieStore(details, &cookie_store, &store_id))
return false;
+ DCHECK(cookie_store && !store_id.empty());
- DCHECK(store_context && !store_id_.empty());
- store_context_ = store_context;
-
- bool rv = ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &GetCookieFunction::GetCookieOnIOThread));
- DCHECK(rv);
-
- // Will finish asynchronously.
- return true;
-}
-
-void GetCookieFunction::GetCookieOnIOThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
- net::CookieStore* cookie_store = store_context_->GetCookieStore();
- cookie_list_ =
- extension_cookies_helpers::GetCookieListFromStore(cookie_store, url_);
-
- bool rv = ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &GetCookieFunction::RespondOnUIThread));
- DCHECK(rv);
-}
-
-void GetCookieFunction::RespondOnUIThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
-
+ net::CookieMonster::CookieList cookie_list =
+ extension_cookies_helpers::GetCookieListFromStore(cookie_store, url);
net::CookieMonster::CookieList::iterator it;
- for (it = cookie_list_.begin(); it != cookie_list_.end(); ++it) {
+ for (it = cookie_list.begin(); it != cookie_list.end(); ++it) {
// Return the first matching cookie. Relies on the fact that the
// CookieMonster retrieves them in reverse domain-length order.
const net::CookieMonster::CanonicalCookie& cookie = it->second;
- if (cookie.Name() == name_) {
+ if (cookie.Name() == name) {
result_.reset(
- extension_cookies_helpers::CreateCookieValue(*it, store_id_));
- break;
+ extension_cookies_helpers::CreateCookieValue(*it, store_id));
+ return true;
}
}
-
// The cookie doesn't exist; return null.
- if (it == cookie_list_.end())
- result_.reset(Value::CreateNullValue());
-
- SendResponse(true);
+ result_.reset(Value::CreateNullValue());
+ return true;
}
-GetAllCookiesFunction::GetAllCookiesFunction() {}
-
bool GetAllCookiesFunction::RunImpl() {
// Return false if the arguments are malformed.
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_));
- DCHECK(details_);
+ DictionaryValue* details;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details));
+ DCHECK(details);
// Read/validate input parameters.
- if (details_->HasKey(keys::kUrlKey) && !ParseUrl(details_, &url_, false))
+ GURL url;
+ if (details->HasKey(keys::kUrlKey) && !ParseUrl(details, &url, false))
return false;
- URLRequestContextGetter* store_context = NULL;
- if (!ParseStoreContext(details_, &store_context, &store_id_))
+ net::CookieStore* cookie_store;
+ std::string store_id;
+ if (!ParseCookieStore(details, &cookie_store, &store_id))
return false;
- DCHECK(store_context);
- store_context_ = store_context;
+ DCHECK(cookie_store);
- bool rv = ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &GetAllCookiesFunction::GetAllCookiesOnIOThread));
- DCHECK(rv);
-
- // Will finish asynchronously.
+ ListValue* matching_list = new ListValue();
+ extension_cookies_helpers::AppendMatchingCookiesToList(
+ cookie_store, store_id, url, details, GetExtension(), matching_list);
+ result_.reset(matching_list);
return true;
}
-void GetAllCookiesFunction::GetAllCookiesOnIOThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
- net::CookieStore* cookie_store = store_context_->GetCookieStore();
- cookie_list_ =
- extension_cookies_helpers::GetCookieListFromStore(cookie_store, url_);
-
- bool rv = ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &GetAllCookiesFunction::RespondOnUIThread));
- DCHECK(rv);
-}
-
-void GetAllCookiesFunction::RespondOnUIThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
-
- const Extension* extension = GetExtension();
- if (extension) {
- ListValue* matching_list = new ListValue();
- extension_cookies_helpers::AppendMatchingCookiesToList(
- cookie_list_, store_id_, url_, details_, GetExtension(), matching_list);
- result_.reset(matching_list);
- }
- SendResponse(true);
-}
-
-SetCookieFunction::SetCookieFunction() : secure_(false), http_only_(false) {}
-
bool SetCookieFunction::RunImpl() {
// Return false if the arguments are malformed.
DictionaryValue* details;
@@ -266,26 +208,36 @@
DCHECK(details);
// Read/validate input parameters.
- if (!ParseUrl(details, &url_, true))
+ GURL url;
+ if (!ParseUrl(details, &url, true))
return false;
// The macros below return false if argument types are not as expected.
- if (details->HasKey(keys::kNameKey))
- EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kNameKey, &name_));
- if (details->HasKey(keys::kValueKey))
- EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kValueKey, &value_));
- if (details->HasKey(keys::kDomainKey))
- EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kDomainKey, &domain_));
- if (details->HasKey(keys::kPathKey))
- EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kPathKey, &path_));
-
+ std::string name;
+ if (details->HasKey(keys::kNameKey)) {
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kNameKey, &name));
+ }
+ std::string value;
+ if (details->HasKey(keys::kValueKey)) {
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kValueKey, &value));
+ }
+ std::string domain;
+ if (details->HasKey(keys::kDomainKey)) {
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kDomainKey, &domain));
+ }
+ std::string path;
+ if (details->HasKey(keys::kPathKey)) {
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kPathKey, &path));
+ }
+ bool secure = false;
if (details->HasKey(keys::kSecureKey)) {
- EXTENSION_FUNCTION_VALIDATE(
- details->GetBoolean(keys::kSecureKey, &secure_));
+ EXTENSION_FUNCTION_VALIDATE(details->GetBoolean(keys::kSecureKey, &secure));
}
+ bool http_only = false;
if (details->HasKey(keys::kHttpOnlyKey)) {
EXTENSION_FUNCTION_VALIDATE(
- details->GetBoolean(keys::kHttpOnlyKey, &http_only_));
+ details->GetBoolean(keys::kHttpOnlyKey, &http_only));
}
+ base::Time expiration_time;
if (details->HasKey(keys::kExpirationDateKey)) {
Value* expiration_date_value;
EXTENSION_FUNCTION_VALIDATE(details->Get(keys::kExpirationDateKey,
@@ -300,73 +252,24 @@
EXTENSION_FUNCTION_VALIDATE(
expiration_date_value->GetAsReal(&expiration_date));
}
- expiration_time_ = base::Time::FromDoubleT(expiration_date);
+ expiration_time = base::Time::FromDoubleT(expiration_date);
}
- URLRequestContextGetter* store_context = NULL;
- if (!ParseStoreContext(details, &store_context, NULL))
+ net::CookieStore* cookie_store;
+ if (!ParseCookieStore(details, &cookie_store, NULL))
return false;
- DCHECK(store_context);
- store_context_ = store_context;
+ DCHECK(cookie_store);
- bool rv = ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &SetCookieFunction::SetCookieOnIOThread));
- DCHECK(rv);
-
- // Will finish asynchronously.
- return true;
-}
-
-void SetCookieFunction::SetCookieOnIOThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
- net::CookieMonster* cookie_monster =
- store_context_->GetCookieStore()->GetCookieMonster();
- success_ = cookie_monster->SetCookieWithDetails(
- url_, name_, value_, domain_, path_, expiration_time_,
- secure_, http_only_);
-
- bool rv = ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &SetCookieFunction::RespondOnUIThread));
- DCHECK(rv);
-}
-
-void SetCookieFunction::RespondOnUIThread() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- if (!success_) {
+ if (!cookie_store->GetCookieMonster()->SetCookieWithDetails(
+ url, name, value, domain, path, expiration_time, secure,
+ http_only)) {
error_ = ExtensionErrorUtils::FormatErrorMessage(
- keys::kCookieSetFailedError, name_);
+ keys::kCookieSetFailedError, name);
+ return false;
}
- SendResponse(success_);
+ return true;
}
-namespace {
-
-class RemoveCookieTask : public Task {
- public:
- RemoveCookieTask(const GURL& url,
- const std::string& name,
- const scoped_refptr<URLRequestContextGetter>& context_getter)
- : url_(url),
- name_(name),
- context_getter_(context_getter) {}
-
- virtual void Run() {
- net::CookieStore* cookie_store = context_getter_->GetCookieStore();
- cookie_store->DeleteCookie(url_, name_);
- }
-
- private:
- const GURL url_;
- const std::string name_;
- const scoped_refptr<URLRequestContextGetter> context_getter_;
-
- DISALLOW_COPY_AND_ASSIGN(RemoveCookieTask);
-};
-
-} // namespace
-
bool RemoveCookieFunction::RunImpl() {
// Return false if the arguments are malformed.
DictionaryValue* details;
@@ -382,19 +285,12 @@
// Get the cookie name string or return false.
EXTENSION_FUNCTION_VALIDATE(details->GetString(keys::kNameKey, &name));
- URLRequestContextGetter* store_context = NULL;
- if (!ParseStoreContext(details, &store_context, NULL))
+ net::CookieStore* cookie_store;
+ if (!ParseCookieStore(details, &cookie_store, NULL))
return false;
- DCHECK(store_context);
+ DCHECK(cookie_store);
- // We don't bother to synchronously wait for the result here, because
- // CookieMonster is only ever accessed on the IO thread, so any other accesses
- // should happen after this.
- bool rv = ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- new RemoveCookieTask(url, name, store_context));
- DCHECK(rv);
-
+ cookie_store->DeleteCookie(url, name);
return true;
}
« no previous file with comments | « chrome/browser/extensions/extension_cookies_api.h ('k') | chrome/browser/extensions/extension_cookies_helpers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698