summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 20:23:31 +0000
committerdewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 20:23:31 +0000
commit9afacd27ad2436db5efce5a71febe8d8b169bee7 (patch)
tree0432b0902c76cac3b065946a5053ae03a8256d25
parent33843bba42f92361e817339e3ba8ac2153dee056 (diff)
downloadchromium_src-9afacd27ad2436db5efce5a71febe8d8b169bee7.zip
chromium_src-9afacd27ad2436db5efce5a71febe8d8b169bee7.tar.gz
chromium_src-9afacd27ad2436db5efce5a71febe8d8b169bee7.tar.bz2
Fix broken threading model in CheckDesktopNotificationPermission
Over time, this function (which is called on the IO thread) was updated to use DesktopNotificationService. While the methods in that service were enforced to run on the correct thread, it's not possible to get the notification service from the ProfileIOData safely. This removes the dependency on DesktopNotificationService from the IO-thread notification functions. BUG=256638 Review URL: https://codereview.chromium.org/61323002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234886 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chrome_content_browser_client.cc52
-rw-r--r--chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc8
-rw-r--r--chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc6
-rw-r--r--chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc8
-rw-r--r--chrome/browser/extensions/extension_protocols_unittest.cc17
-rw-r--r--chrome/browser/extensions/extension_system.cc31
-rw-r--r--chrome/browser/notifications/desktop_notification_service.cc32
-rw-r--r--chrome/browser/notifications/desktop_notification_service.h5
-rw-r--r--chrome/browser/notifications/desktop_notification_service_unittest.cc37
-rw-r--r--chrome/browser/profiles/profile_io_data.cc22
-rw-r--r--chrome/browser/profiles/profile_io_data.h13
-rw-r--r--extensions/browser/info_map.cc23
-rw-r--r--extensions/browser/info_map.h9
-rw-r--r--extensions/browser/info_map_unittest.cc26
14 files changed, 141 insertions, 148 deletions
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 7604bac3..2886537 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1948,31 +1948,37 @@ blink::WebNotificationPresenter::Permission
int render_process_id) {
#if defined(ENABLE_NOTIFICATIONS)
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- // Sometimes a notification may be invoked during the shutdown.
- // See http://crbug.com/256638
- if (browser_shutdown::IsTryingToQuit())
- return blink::WebNotificationPresenter::PermissionNotAllowed;
ProfileIOData* io_data = ProfileIOData::FromResourceContext(context);
-
- DesktopNotificationService* notification_service =
- io_data->GetNotificationService();
- if (notification_service) {
- InfoMap* extension_info_map = io_data->GetExtensionInfoMap();
- ExtensionSet extensions;
- extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin(
- source_origin, render_process_id,
- extensions::APIPermission::kNotification, &extensions);
- for (ExtensionSet::const_iterator iter = extensions.begin();
- iter != extensions.end(); ++iter) {
- NotifierId notifier_id(NotifierId::APPLICATION, (*iter)->id());
- if (notification_service->IsNotifierEnabled(notifier_id))
- return blink::WebNotificationPresenter::PermissionAllowed;
- }
-
- return notification_service->HasPermission(source_origin);
- }
-
+ InfoMap* extension_info_map = io_data->GetExtensionInfoMap();
+
+ // We want to see if there is an extension that hasn't been manually disabled
+ // that has the notifications permission and applies to this security origin.
+ // First, get the list of extensions with permission for the origin.
+ ExtensionSet extensions;
+ extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin(
+ source_origin, render_process_id,
+ extensions::APIPermission::kNotification, &extensions);
+ for (ExtensionSet::const_iterator iter = extensions.begin();
+ iter != extensions.end(); ++iter) {
+ // Then, check to see if it's been disabled by the user.
+ if (!extension_info_map->AreNotificationsDisabled((*iter)->id()))
+ return blink::WebNotificationPresenter::PermissionAllowed;
+ }
+
+ // No enabled extensions exist, so check the normal host content settings.
+ HostContentSettingsMap* host_content_settings_map =
+ io_data->GetHostContentSettingsMap();
+ ContentSetting setting = host_content_settings_map->GetContentSetting(
+ source_origin,
+ source_origin,
+ CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+ NO_RESOURCE_IDENTIFIER);
+
+ if (setting == CONTENT_SETTING_ALLOW)
+ return blink::WebNotificationPresenter::PermissionAllowed;
+ if (setting == CONTENT_SETTING_BLOCK)
+ return blink::WebNotificationPresenter::PermissionDenied;
return blink::WebNotificationPresenter::PermissionNotAllowed;
#else
return blink::WebNotificationPresenter::PermissionAllowed;
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
index ab6ec9a..b2054cb 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
@@ -125,10 +125,14 @@ void WebRequestActionWithThreadsTest::SetUp() {
extension_info_map_ = new InfoMap;
ASSERT_TRUE(extension_info_map_.get());
extension_info_map_->AddExtension(
- extension_.get(), base::Time::Now(), false /*incognito_enabled*/);
+ extension_.get(),
+ base::Time::Now(),
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
extension_info_map_->AddExtension(extension_all_urls_.get(),
base::Time::Now(),
- false /*incognito_enabled*/);
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
}
bool WebRequestActionWithThreadsTest::ActionWorksOnRequest(
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
index b2cce2c..93de526 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc
@@ -256,10 +256,12 @@ void WebRequestRulesRegistryTest::SetUp() {
ASSERT_TRUE(extension_info_map_.get());
extension_info_map_->AddExtension(extension_.get(),
base::Time() + base::TimeDelta::FromDays(1),
- false /*incognito_enabled*/);
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
extension_info_map_->AddExtension(extension2_.get(),
base::Time() + base::TimeDelta::FromDays(2),
- false /*incognito_enabled*/);
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
}
diff --git a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
index 1157807..c9e03b0 100644
--- a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -63,9 +63,13 @@ void ExtensionWebRequestHelpersTestWithThreadsTest::SetUp() {
extension_info_map_ = new extensions::InfoMap;
extension_info_map_->AddExtension(permissionless_extension_.get(),
base::Time::Now(),
- false /*incognito_enabled*/);
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
extension_info_map_->AddExtension(
- com_extension_.get(), base::Time::Now(), false /*incognito_enabled*/);
+ com_extension_.get(),
+ base::Time::Now(),
+ false /*incognito_enabled*/,
+ false /*notifications_disabled*/);
}
TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) {
diff --git a/chrome/browser/extensions/extension_protocols_unittest.cc b/chrome/browser/extensions/extension_protocols_unittest.cc
index ede181d..0bfa1d7 100644
--- a/chrome/browser/extensions/extension_protocols_unittest.cc
+++ b/chrome/browser/extensions/extension_protocols_unittest.cc
@@ -165,7 +165,7 @@ TEST_F(ExtensionProtocolTest, IncognitoRequest) {
scoped_refptr<Extension> extension =
CreateTestExtension(cases[i].name, cases[i].incognito_split_mode);
extension_info_map_->AddExtension(
- extension.get(), base::Time::Now(), cases[i].incognito_enabled);
+ extension.get(), base::Time::Now(), cases[i].incognito_enabled, false);
// First test a main frame request.
{
@@ -225,7 +225,10 @@ TEST_F(ExtensionProtocolTest, ComponentResourceRequest) {
SetProtocolHandler(false);
scoped_refptr<Extension> extension = CreateWebStoreExtension();
- extension_info_map_->AddExtension(extension.get(), base::Time::Now(), false);
+ extension_info_map_->AddExtension(extension.get(),
+ base::Time::Now(),
+ false,
+ false);
// First test it with the extension enabled.
{
@@ -259,7 +262,10 @@ TEST_F(ExtensionProtocolTest, ResourceRequestResponseHeaders) {
SetProtocolHandler(false);
scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension();
- extension_info_map_->AddExtension(extension.get(), base::Time::Now(), false);
+ extension_info_map_->AddExtension(extension.get(),
+ base::Time::Now(),
+ false,
+ false);
{
net::URLRequest request(extension->GetResourceURL("test.dat"),
@@ -294,7 +300,10 @@ TEST_F(ExtensionProtocolTest, AllowFrameRequests) {
SetProtocolHandler(false);
scoped_refptr<Extension> extension = CreateTestExtension("foo", false);
- extension_info_map_->AddExtension(extension.get(), base::Time::Now(), false);
+ extension_info_map_->AddExtension(extension.get(),
+ base::Time::Now(),
+ false,
+ false);
// All MAIN_FRAME and SUB_FRAME requests should succeed.
{
diff --git a/chrome/browser/extensions/extension_system.cc b/chrome/browser/extensions/extension_system.cc
index 3bbfead..3062ef9 100644
--- a/chrome/browser/extensions/extension_system.cc
+++ b/chrome/browser/extensions/extension_system.cc
@@ -46,6 +46,12 @@
#include "extensions/common/constants.h"
#include "extensions/common/manifest.h"
+#if defined(ENABLE_NOTIFICATIONS)
+#include "chrome/browser/notifications/desktop_notification_service.h"
+#include "chrome/browser/notifications/desktop_notification_service_factory.h"
+#include "ui/message_center/notifier_settings.h"
+#endif
+
#if defined(OS_CHROMEOS)
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.h"
@@ -397,13 +403,24 @@ void ExtensionSystemImpl::RegisterExtensionWithRequestContexts(
}
bool incognito_enabled =
extension_util::IsIncognitoEnabled(extension->id(), extension_service());
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(&InfoMap::AddExtension,
- info_map(),
- make_scoped_refptr(extension),
- install_time,
- incognito_enabled));
+
+ bool notifications_disabled = false;
+#if defined(ENABLE_NOTIFICATIONS)
+ message_center::NotifierId notifier_id(
+ message_center::NotifierId::APPLICATION,
+ extension->id());
+
+ DesktopNotificationService* notification_service =
+ DesktopNotificationServiceFactory::GetForProfile(profile_);
+ notifications_disabled =
+ !notification_service->IsNotifierEnabled(notifier_id);
+#endif
+
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&InfoMap::AddExtension, info_map(),
+ make_scoped_refptr(extension), install_time,
+ incognito_enabled, notifications_disabled));
}
void ExtensionSystemImpl::UnregisterExtensionWithRequestContexts(
diff --git a/chrome/browser/notifications/desktop_notification_service.cc b/chrome/browser/notifications/desktop_notification_service.cc
index 6fbaa2a..2863ce7 100644
--- a/chrome/browser/notifications/desktop_notification_service.cc
+++ b/chrome/browser/notifications/desktop_notification_service.cc
@@ -58,7 +58,6 @@ using content::BrowserThread;
using content::RenderViewHost;
using content::WebContents;
using message_center::NotifierId;
-using blink::WebNotificationPresenter;
using blink::WebTextDirection;
@@ -650,27 +649,6 @@ void DesktopNotificationService::OnStringListPrefChanged(
}
}
-blink::WebNotificationPresenter::Permission
- DesktopNotificationService::HasPermission(const GURL& origin) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- HostContentSettingsMap* host_content_settings_map =
- profile_->GetHostContentSettingsMap();
- ContentSetting setting = host_content_settings_map->GetContentSetting(
- origin,
- origin,
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
- NO_RESOURCE_IDENTIFIER);
-
- if (setting == CONTENT_SETTING_ALLOW)
- return blink::WebNotificationPresenter::PermissionAllowed;
- if (setting == CONTENT_SETTING_BLOCK)
- return blink::WebNotificationPresenter::PermissionDenied;
- if (setting == CONTENT_SETTING_ASK)
- return blink::WebNotificationPresenter::PermissionNotAllowed;
- NOTREACHED() << "Invalid notifications settings value: " << setting;
- return blink::WebNotificationPresenter::PermissionNotAllowed;
-}
-
void DesktopNotificationService::Observe(
int type,
const content::NotificationSource& source,
@@ -700,4 +678,14 @@ void DesktopNotificationService::FirePermissionLevelChangedEvent(
args.Pass()));
extensions::ExtensionSystem::Get(profile_)->event_router()->
DispatchEventToExtension(notifier_id.id, event.Pass());
+
+ // Tell the IO thread that this extension's permission for notifications
+ // has changed.
+ extensions::InfoMap* extension_info_map =
+ extensions::ExtensionSystem::Get(profile_)->info_map();
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&extensions::InfoMap::SetNotificationsDisabled,
+ extension_info_map, notifier_id.id, !enabled));
+
}
diff --git a/chrome/browser/notifications/desktop_notification_service.h b/chrome/browser/notifications/desktop_notification_service.h
index 61cc48b..c4bf961 100644
--- a/chrome/browser/notifications/desktop_notification_service.h
+++ b/chrome/browser/notifications/desktop_notification_service.h
@@ -151,11 +151,6 @@ class DesktopNotificationService : public BrowserContextKeyedService,
ContentSetting GetContentSetting(const GURL& origin);
- // Checks to see if a given origin has permission to create desktop
- // notifications.
- blink::WebNotificationPresenter::Permission
- HasPermission(const GURL& origin);
-
// Returns true if the notifier with |notifier_id| is allowed to send
// notifications.
bool IsNotifierEnabled(const message_center::NotifierId& notifier_id);
diff --git a/chrome/browser/notifications/desktop_notification_service_unittest.cc b/chrome/browser/notifications/desktop_notification_service_unittest.cc
index adcbb84..3fcf7e7 100644
--- a/chrome/browser/notifications/desktop_notification_service_unittest.cc
+++ b/chrome/browser/notifications/desktop_notification_service_unittest.cc
@@ -27,43 +27,6 @@ class DesktopNotificationServiceTest : public ChromeRenderViewHostTestHarness {
DesktopNotificationService* service_;
};
-TEST_F(DesktopNotificationServiceTest, SettingsForSchemes) {
- GURL url("file:///html/test.html");
-
- EXPECT_EQ(CONTENT_SETTING_ASK,
- service_->GetDefaultContentSetting(NULL));
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionNotAllowed,
- service_->HasPermission(url));
-
- service_->GrantPermission(url);
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionAllowed,
- service_->HasPermission(url));
-
- service_->DenyPermission(url);
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionDenied,
- service_->HasPermission(url));
-
- GURL https_url("https://testurl");
- GURL http_url("http://testurl");
- EXPECT_EQ(CONTENT_SETTING_ASK,
- service_->GetDefaultContentSetting(NULL));
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionNotAllowed,
- service_->HasPermission(http_url));
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionNotAllowed,
- service_->HasPermission(https_url));
-
- service_->GrantPermission(https_url);
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionNotAllowed,
- service_->HasPermission(http_url));
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionAllowed,
- service_->HasPermission(https_url));
-
- service_->DenyPermission(http_url);
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionDenied,
- service_->HasPermission(http_url));
- EXPECT_EQ(blink::WebNotificationPresenter::PermissionAllowed,
- service_->HasPermission(https_url));
-}
TEST_F(DesktopNotificationServiceTest, GetNotificationsSettings) {
service_->GrantPermission(GURL("http://allowed2.com"));
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index 758dc88..4d8610e 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -44,7 +44,6 @@
#include "chrome/browser/net/load_time_stats.h"
#include "chrome/browser/net/proxy_service_factory.h"
#include "chrome/browser/net/resource_prefetch_predictor_observer.h"
-#include "chrome/browser/notifications/desktop_notification_service_factory.h"
#include "chrome/browser/policy/url_blacklist_manager.h"
#include "chrome/browser/predictors/resource_prefetch_predictor.h"
#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
@@ -255,11 +254,6 @@ void ProfileIOData::InitializeOnUIThread(Profile* profile) {
new chrome_browser_net::ResourcePrefetchPredictorObserver(predictor));
}
-#if defined(ENABLE_NOTIFICATIONS)
- params->notification_service =
- DesktopNotificationServiceFactory::GetForProfile(profile);
-#endif
-
ProtocolHandlerRegistry* protocol_handler_registry =
ProtocolHandlerRegistryFactory::GetForProfile(profile);
DCHECK(protocol_handler_registry);
@@ -388,9 +382,6 @@ ProfileIOData::AppRequestContext::~AppRequestContext() {}
ProfileIOData::ProfileParams::ProfileParams()
: io_thread(NULL),
-#if defined(ENABLE_NOTIFICATIONS)
- notification_service(NULL),
-#endif
profile(NULL) {
}
@@ -398,9 +389,6 @@ ProfileIOData::ProfileParams::~ProfileParams() {}
ProfileIOData::ProfileIOData(bool is_incognito)
: initialized_(false),
-#if defined(ENABLE_NOTIFICATIONS)
- notification_service_(NULL),
-#endif
resource_context_(new ResourceContext(this)),
load_time_stats_(NULL),
initialized_on_UI_thread_(false),
@@ -621,13 +609,6 @@ HostContentSettingsMap* ProfileIOData::GetHostContentSettingsMap() const {
return host_content_settings_map_.get();
}
-#if defined(ENABLE_NOTIFICATIONS)
-DesktopNotificationService* ProfileIOData::GetNotificationService() const {
- DCHECK(initialized_);
- return notification_service_;
-}
-#endif
-
void ProfileIOData::InitializeMetricsEnabledStateOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
#if defined(OS_CHROMEOS)
@@ -807,9 +788,6 @@ void ProfileIOData::Init(content::ProtocolHandlerMap* protocol_handlers) const {
// Take ownership over these parameters.
cookie_settings_ = profile_params_->cookie_settings;
host_content_settings_map_ = profile_params_->host_content_settings_map;
-#if defined(ENABLE_NOTIFICATIONS)
- notification_service_ = profile_params_->notification_service;
-#endif
extension_info_map_ = profile_params_->extension_info_map;
resource_context_->host_resolver_ = io_thread_globals->host_resolver.get();
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h
index 493a4a1..d820172 100644
--- a/chrome/browser/profiles/profile_io_data.h
+++ b/chrome/browser/profiles/profile_io_data.h
@@ -29,7 +29,6 @@
class ChromeHttpUserAgentSettings;
class ChromeNetworkDelegate;
class CookieSettings;
-class DesktopNotificationService;
class HostContentSettingsMap;
class ManagedModeURLFilter;
class Profile;
@@ -119,10 +118,6 @@ class ProfileIOData {
CookieSettings* GetCookieSettings() const;
HostContentSettingsMap* GetHostContentSettingsMap() const;
-#if defined(ENABLE_NOTIFICATIONS)
- DesktopNotificationService* GetNotificationService() const;
-#endif
-
IntegerPrefMember* session_startup_pref() const {
return &session_startup_pref_;
}
@@ -256,10 +251,6 @@ class ProfileIOData {
scoped_ptr<chrome_browser_net::ResourcePrefetchPredictorObserver>
resource_prefetch_predictor_observer_;
-#if defined(ENABLE_NOTIFICATIONS)
- DesktopNotificationService* notification_service;
-#endif
-
// This pointer exists only as a means of conveying a url job factory
// pointer from the protocol handler registry on the UI thread to the
// the URLRequestContext on the IO thread. The consumer MUST take
@@ -499,10 +490,6 @@ class ProfileIOData {
mutable scoped_ptr<policy::PolicyCertVerifier> cert_verifier_;
#endif
-#if defined(ENABLE_NOTIFICATIONS)
- mutable DesktopNotificationService* notification_service_;
-#endif
-
mutable scoped_ptr<net::TransportSecurityPersister>
transport_security_persister_;
diff --git a/extensions/browser/info_map.cc b/extensions/browser/info_map.cc
index f790868..012f719 100644
--- a/extensions/browser/info_map.cc
+++ b/extensions/browser/info_map.cc
@@ -29,6 +29,9 @@ struct InfoMap::ExtraData {
// True if the user has allowed this extension to run in incognito mode.
bool incognito_enabled;
+ // True if the user has disabled notifications for this extension manually.
+ bool notifications_disabled;
+
ExtraData();
~ExtraData();
};
@@ -43,13 +46,15 @@ const ProcessMap& InfoMap::process_map() const { return process_map_; }
void InfoMap::AddExtension(const Extension* extension,
base::Time install_time,
- bool incognito_enabled) {
+ bool incognito_enabled,
+ bool notifications_disabled) {
CheckOnValidThread();
extensions_.Insert(extension);
disabled_extensions_.Remove(extension->id());
extra_data_[extension->id()].install_time = install_time;
extra_data_[extension->id()].incognito_enabled = incognito_enabled;
+ extra_data_[extension->id()].notifications_disabled = notifications_disabled;
}
void InfoMap::RemoveExtension(const std::string& extension_id,
@@ -171,6 +176,22 @@ bool InfoMap::IsSigninProcess(int process_id) const {
return process_id == signin_process_id_;
}
+void InfoMap::SetNotificationsDisabled(
+ const std::string& extension_id,
+ bool notifications_disabled) {
+ ExtraDataMap::iterator iter = extra_data_.find(extension_id);
+ if (iter != extra_data_.end())
+ iter->second.notifications_disabled = notifications_disabled;
+}
+
+bool InfoMap::AreNotificationsDisabled(
+ const std::string& extension_id) const {
+ ExtraDataMap::const_iterator iter = extra_data_.find(extension_id);
+ if (iter != extra_data_.end())
+ return iter->second.notifications_disabled;
+ return false;
+}
+
InfoMap::~InfoMap() {
if (quota_service_) {
BrowserThread::DeleteSoon(
diff --git a/extensions/browser/info_map.h b/extensions/browser/info_map.h
index d68933f..407982c 100644
--- a/extensions/browser/info_map.h
+++ b/extensions/browser/info_map.h
@@ -35,7 +35,8 @@ class InfoMap : public base::RefCountedThreadSafe<InfoMap> {
// Callback for when new extensions are loaded.
void AddExtension(const extensions::Extension* extension,
base::Time install_time,
- bool incognito_enabled);
+ bool incognito_enabled,
+ bool notifications_disabled);
// Callback for when an extension is unloaded.
void RemoveExtension(const std::string& extension_id,
@@ -85,6 +86,12 @@ class InfoMap : public base::RefCountedThreadSafe<InfoMap> {
void SetSigninProcess(int process_id);
bool IsSigninProcess(int process_id) const;
+ // Notifications can be enabled/disabled in real time by the user.
+ void SetNotificationsDisabled(const std::string& extension_id,
+ bool notifications_disabled);
+ bool AreNotificationsDisabled(const std::string& extension_id)
+ const;
+
private:
friend class base::RefCountedThreadSafe<InfoMap>;
diff --git a/extensions/browser/info_map_unittest.cc b/extensions/browser/info_map_unittest.cc
index 5136069..b023eed 100644
--- a/extensions/browser/info_map_unittest.cc
+++ b/extensions/browser/info_map_unittest.cc
@@ -90,9 +90,9 @@ TEST_F(InfoMapTest, RefCounting) {
EXPECT_TRUE(extension3->HasOneRef());
// Add a ref to each extension and give it to the info map.
- info_map->AddExtension(extension1.get(), base::Time(), false);
- info_map->AddExtension(extension2.get(), base::Time(), false);
- info_map->AddExtension(extension3.get(), base::Time(), false);
+ info_map->AddExtension(extension1.get(), base::Time(), false, false);
+ info_map->AddExtension(extension2.get(), base::Time(), false, false);
+ info_map->AddExtension(extension3.get(), base::Time(), false, false);
// Release extension1, and the info map should have the only ref.
const Extension* weak_extension1 = extension1.get();
@@ -116,8 +116,8 @@ TEST_F(InfoMapTest, Properties) {
scoped_refptr<Extension> extension1(CreateExtension("extension1"));
scoped_refptr<Extension> extension2(CreateExtension("extension2"));
- info_map->AddExtension(extension1.get(), base::Time(), false);
- info_map->AddExtension(extension2.get(), base::Time(), false);
+ info_map->AddExtension(extension1.get(), base::Time(), false, false);
+ info_map->AddExtension(extension2.get(), base::Time(), false, false);
EXPECT_EQ(2u, info_map->extensions().size());
EXPECT_EQ(extension1.get(), info_map->extensions().GetByID(extension1->id()));
@@ -137,8 +137,8 @@ TEST_F(InfoMapTest, CheckPermissions) {
ASSERT_TRUE(app->is_app());
ASSERT_TRUE(app->web_extent().MatchesURL(app_url));
- info_map->AddExtension(app.get(), base::Time(), false);
- info_map->AddExtension(extension.get(), base::Time(), false);
+ info_map->AddExtension(app.get(), base::Time(), false, false);
+ info_map->AddExtension(extension.get(), base::Time(), false, false);
// The app should have the notifications permission, either from a
// chrome-extension URL or from its web extent.
@@ -161,4 +161,16 @@ TEST_F(InfoMapTest, CheckPermissions) {
EXPECT_FALSE(match);
}
+TEST_F(InfoMapTest, TestNotificationsDisabled) {
+ scoped_refptr<InfoMap> info_map(new InfoMap());
+ scoped_refptr<Extension> app(LoadManifest("manifest_tests",
+ "valid_app.json"));
+ info_map->AddExtension(app.get(), base::Time(), false, false);
+
+ EXPECT_FALSE(info_map->AreNotificationsDisabled(app->id()));
+ info_map->SetNotificationsDisabled(app->id(), true);
+ EXPECT_TRUE(info_map->AreNotificationsDisabled(app->id()));
+ info_map->SetNotificationsDisabled(app->id(), false);
+}
+
} // namespace extensions