diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-10 13:14:44 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-10 13:14:44 +0000 |
commit | 2c5e1e131287e37ab5d837a271ab3e55cea06120 (patch) | |
tree | 5c5a43169fb13dcc75039c528709a9479a761596 | |
parent | 2ec79f7df2ebb464ddb187f65fae631d54408d04 (diff) | |
download | chromium_src-2c5e1e131287e37ab5d837a271ab3e55cea06120.zip chromium_src-2c5e1e131287e37ab5d837a271ab3e55cea06120.tar.gz chromium_src-2c5e1e131287e37ab5d837a271ab3e55cea06120.tar.bz2 |
Send event on changes to the cookie monster.
BUG=38398
TEST=*.CookiesEvents
Review URL: http://codereview.chromium.org/2703004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49390 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/extension_cookies_api.cc | 62 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_cookies_api.h | 40 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_cookies_api_constants.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_cookies_api_constants.h | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_cookies_apitest.cc | 9 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service.cc | 2 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/cookies/api/background.html (renamed from chrome/test/data/extensions/api_test/cookies/background.html) | 0 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/cookies/api/manifest.json (renamed from chrome/test/data/extensions/api_test/cookies/manifest.json) | 0 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/cookies/api/tab.html (renamed from chrome/test/data/extensions/api_test/cookies/tab.html) | 3 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/cookies/events/manifest.json | 7 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/cookies/events/test.html | 23 |
11 files changed, 151 insertions, 4 deletions
diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc index d9b46df..0cf9b07 100644 --- a/chrome/browser/extensions/extension_cookies_api.cc +++ b/chrome/browser/extensions/extension_cookies_api.cc @@ -6,16 +6,78 @@ #include "chrome/browser/extensions/extension_cookies_api.h" +#include "base/json/json_writer.h" #include "chrome/browser/browser_list.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" #include "chrome/browser/profile.h" #include "chrome/common/extensions/extension_error_utils.h" #include "chrome/common/net/url_request_context_getter.h" +#include "chrome/common/notification_type.h" +#include "chrome/common/notification_service.h" #include "net/base/cookie_monster.h" namespace keys = extension_cookies_api_constants; +// static +ExtensionCookiesEventRouter* ExtensionCookiesEventRouter::GetInstance() { + return Singleton<ExtensionCookiesEventRouter>::get(); +} + +void ExtensionCookiesEventRouter::Init() { + if (registrar_.IsEmpty()) { + registrar_.Add(this, + NotificationType::COOKIE_CHANGED, + NotificationService::AllSources()); + } +} + +void ExtensionCookiesEventRouter::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + switch (type.value) { + case NotificationType::COOKIE_CHANGED: + CookieChanged( + Source<Profile>(source).ptr(), + Details<ChromeCookieDetails>(details).ptr()); + break; + + default: + NOTREACHED(); + } +} + +void ExtensionCookiesEventRouter::CookieChanged( + Profile* profile, + ChromeCookieDetails* details) { + ListValue args; + DictionaryValue* dict = new DictionaryValue(); + dict->SetBoolean(keys::kRemovedKey, details->removed); + dict->Set( + keys::kCookieKey, + extension_cookies_helpers::CreateCookieValue(*details->cookie_pair, + extension_cookies_helpers::GetStoreIdFromProfile(profile))); + args.Append(dict); + + std::string json_args; + base::JSONWriter::Write(&args, false, &json_args); + GURL cookie_domain = + extension_cookies_helpers::GetURLFromCookiePair(*details->cookie_pair); + LOG(WARNING) << "Sending cookie " << json_args; + DispatchEvent(profile, keys::kOnChanged, json_args, cookie_domain); +} + +void ExtensionCookiesEventRouter::DispatchEvent(Profile* profile, + const char* event_name, + const std::string& json_args, + GURL& cookie_domain) { + if (profile && profile->GetExtensionMessageService()) { + profile->GetExtensionMessageService()->DispatchEventToRenderers( + event_name, json_args, profile->IsOffTheRecord(), cookie_domain); + } +} + bool CookiesFunction::ParseUrl(const DictionaryValue* details, GURL* url, bool check_host_permissions) { DCHECK(details && url); diff --git a/chrome/browser/extensions/extension_cookies_api.h b/chrome/browser/extensions/extension_cookies_api.h index 27cd626..c230b01 100644 --- a/chrome/browser/extensions/extension_cookies_api.h +++ b/chrome/browser/extensions/extension_cookies_api.h @@ -10,12 +10,52 @@ #include <string> +#include "base/singleton.h" #include "chrome/browser/extensions/extension_function.h" +#include "chrome/browser/net/chrome_cookie_notification_details.h" +#include "chrome/common/notification_registrar.h" namespace net { class CookieStore; } // namespace net +// Observes CookieMonster notifications and routes them as events to the +// extension system. +class ExtensionCookiesEventRouter : public NotificationObserver { + public: + // Single instance of the event router. + static ExtensionCookiesEventRouter* GetInstance(); + + void Init(); + + private: + friend struct DefaultSingletonTraits<ExtensionCookiesEventRouter>; + + ExtensionCookiesEventRouter() {} + virtual ~ExtensionCookiesEventRouter() {} + + // NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + // Handler for the COOKIE_CHANGED event. The method takes the details of such + // an event and constructs a suitable JSON formatted extension event from it. + void CookieChanged(Profile* profile, + ChromeCookieDetails* details); + + // This method dispatches events to the extension message service. + void DispatchEvent(Profile* context, + const char* event_name, + const std::string& json_args, + GURL& cookie_domain); + + // Used for tracking registrations to CookieMonster notifications. + NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionCookiesEventRouter); +}; + // Serves as a base class for all cookies API functions, and defines some // common functionality for parsing cookies API function arguments. // Note that all of the functions in this file derive from ExtensionFunction, diff --git a/chrome/browser/extensions/extension_cookies_api_constants.cc b/chrome/browser/extensions/extension_cookies_api_constants.cc index 921a966..e77482b 100644 --- a/chrome/browser/extensions/extension_cookies_api_constants.cc +++ b/chrome/browser/extensions/extension_cookies_api_constants.cc @@ -6,6 +6,7 @@ namespace extension_cookies_api_constants { +const wchar_t kCookieKey[] = L"cookie"; const wchar_t kDomainKey[] = L"domain"; const wchar_t kExpirationDateKey[] = L"expirationDate"; const wchar_t kHostOnlyKey[] = L"hostOnly"; @@ -13,6 +14,7 @@ const wchar_t kHttpOnlyKey[] = L"httpOnly"; const wchar_t kIdKey[] = L"id"; const wchar_t kNameKey[] = L"name"; const wchar_t kPathKey[] = L"path"; +const wchar_t kRemovedKey[] = L"removed"; const wchar_t kSecureKey[] = L"secure"; const wchar_t kSessionKey[] = L"session"; const wchar_t kStoreIdKey[] = L"storeId"; @@ -20,6 +22,8 @@ const wchar_t kTabIdsKey[] = L"tabIds"; const wchar_t kUrlKey[] = L"url"; const wchar_t kValueKey[] = L"value"; +const char kOnChanged[] = "experimental.cookies.onChanged"; + const char kCookieSetFailedError[] = "Failed to parse or set cookie named \"*\"."; const char kInvalidStoreIdError[] = "Invalid cookie store id: \"*\"."; diff --git a/chrome/browser/extensions/extension_cookies_api_constants.h b/chrome/browser/extensions/extension_cookies_api_constants.h index 28814b7..d9c0015 100644 --- a/chrome/browser/extensions/extension_cookies_api_constants.h +++ b/chrome/browser/extensions/extension_cookies_api_constants.h @@ -10,6 +10,7 @@ namespace extension_cookies_api_constants { // Keys. +extern const wchar_t kCookieKey[]; extern const wchar_t kDomainKey[]; extern const wchar_t kExpirationDateKey[]; extern const wchar_t kHostOnlyKey[]; @@ -17,6 +18,7 @@ extern const wchar_t kHttpOnlyKey[]; extern const wchar_t kIdKey[]; extern const wchar_t kNameKey[]; extern const wchar_t kPathKey[]; +extern const wchar_t kRemovedKey[]; extern const wchar_t kSecureKey[]; extern const wchar_t kSessionKey[]; extern const wchar_t kStoreIdKey[]; @@ -24,7 +26,8 @@ extern const wchar_t kTabIdsKey[]; extern const wchar_t kUrlKey[]; extern const wchar_t kValueKey[]; -// TODO(cindylau): kOnChanged is not yet implemented. +// Events. +extern const char kOnChanged[]; // Errors. extern const char kCookieSetFailedError[]; diff --git a/chrome/browser/extensions/extension_cookies_apitest.cc b/chrome/browser/extensions/extension_cookies_apitest.cc index 12c6373..396f8c7 100644 --- a/chrome/browser/extensions/extension_cookies_apitest.cc +++ b/chrome/browser/extensions/extension_cookies_apitest.cc @@ -10,5 +10,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Cookies) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableExperimentalExtensionApis); - ASSERT_TRUE(RunExtensionTest("cookies")) << message_; + ASSERT_TRUE(RunExtensionTest("cookies/api")) << message_; +} + +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CookiesEvents) { + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableExperimentalExtensionApis); + + ASSERT_TRUE(RunExtensionTest("cookies/events")) << message_; } diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc index 1837d15..d29d5c6 100644 --- a/chrome/browser/extensions/extensions_service.cc +++ b/chrome/browser/extensions/extensions_service.cc @@ -20,6 +20,7 @@ #include "chrome/browser/extensions/extension_accessibility_api.h" #include "chrome/browser/extensions/extension_bookmarks_module.h" #include "chrome/browser/extensions/extension_browser_event_router.h" +#include "chrome/browser/extensions/extension_cookies_api.h" #include "chrome/browser/extensions/extension_data_deleter.h" #include "chrome/browser/extensions/extension_dom_ui.h" #include "chrome/browser/extensions/extension_error_reporter.h" @@ -178,6 +179,7 @@ void ExtensionsService::InitEventRouters() { ExtensionBrowserEventRouter::GetInstance()->Init(); ExtensionBookmarkEventRouter::GetSingleton()->Observe( profile_->GetBookmarkModel()); + ExtensionCookiesEventRouter::GetInstance()->Init(); } void ExtensionsService::Init() { diff --git a/chrome/test/data/extensions/api_test/cookies/background.html b/chrome/test/data/extensions/api_test/cookies/api/background.html index 612e605..612e605 100644 --- a/chrome/test/data/extensions/api_test/cookies/background.html +++ b/chrome/test/data/extensions/api_test/cookies/api/background.html diff --git a/chrome/test/data/extensions/api_test/cookies/manifest.json b/chrome/test/data/extensions/api_test/cookies/api/manifest.json index 81ad918..81ad918 100644 --- a/chrome/test/data/extensions/api_test/cookies/manifest.json +++ b/chrome/test/data/extensions/api_test/cookies/api/manifest.json diff --git a/chrome/test/data/extensions/api_test/cookies/tab.html b/chrome/test/data/extensions/api_test/cookies/api/tab.html index cb7f2c0..0d3eddee 100644 --- a/chrome/test/data/extensions/api_test/cookies/tab.html +++ b/chrome/test/data/extensions/api_test/cookies/api/tab.html @@ -57,7 +57,7 @@ function readCookie(name) { function expectValidCookie(cookie) { chrome.test.assertTrue(cookie != null, 'Expected cookie not set.'); } - + function expectNullCookie(cookie) { chrome.test.assertEq(null, cookie); } @@ -295,4 +295,3 @@ chrome.test.runTests([ } ]); </script> - diff --git a/chrome/test/data/extensions/api_test/cookies/events/manifest.json b/chrome/test/data/extensions/api_test/cookies/events/manifest.json new file mode 100644 index 0000000..e1a901f --- /dev/null +++ b/chrome/test/data/extensions/api_test/cookies/events/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "events", + "version": "1.0", + "description": "Tests cookie events.", + "permissions": ["http://a.com/", "experimental"], + "background_page": "test.html" +} diff --git a/chrome/test/data/extensions/api_test/cookies/events/test.html b/chrome/test/data/extensions/api_test/cookies/events/test.html new file mode 100644 index 0000000..d42f385 --- /dev/null +++ b/chrome/test/data/extensions/api_test/cookies/events/test.html @@ -0,0 +1,23 @@ +<script> +chrome.experimental.cookies.onChanged.addListener(function (info) { + if (!info.removed && + info.cookie.name == 'test' && + info.cookie.value == '42' && + info.cookie.domain == 'a.com' && + info.cookie.hostOnly && + info.cookie.path == '/' && + !info.cookie.secure && + !info.cookie.httpOnly && + !info.cookie.session && + info.cookie.expirationDate == 12345678900 && + info.cookie.storeId == "0") { + chrome.test.notifyPass(); + } else { + chrome.test.notifyFail("Got an invalid cookie: " + JSON.stringify(info)); + } +}); +chrome.experimental.cookies.set({url: 'http://a.com/path', + name: 'test', + value: '42', + expirationDate: 12345678900}); +</script> |