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

Side by Side Diff: chrome/browser/notifications/desktop_notification_service.cc

Issue 61323002: Fix broken threading model in CheckDesktopNotificationPermission (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Even more merge conflicts.. Created 7 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/notifications/desktop_notification_service.h" 5 #include "chrome/browser/notifications/desktop_notification_service.h"
6 6
7 #include "base/metrics/histogram.h" 7 #include "base/metrics/histogram.h"
8 #include "base/prefs/scoped_user_pref_update.h" 8 #include "base/prefs/scoped_user_pref_update.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "base/threading/thread.h" 10 #include "base/threading/thread.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 #include "ui/message_center/notifier_settings.h" 51 #include "ui/message_center/notifier_settings.h"
52 52
53 #if defined(OS_CHROMEOS) 53 #if defined(OS_CHROMEOS)
54 #include "ash/system/system_notifier.h" 54 #include "ash/system/system_notifier.h"
55 #endif 55 #endif
56 56
57 using content::BrowserThread; 57 using content::BrowserThread;
58 using content::RenderViewHost; 58 using content::RenderViewHost;
59 using content::WebContents; 59 using content::WebContents;
60 using message_center::NotifierId; 60 using message_center::NotifierId;
61 using blink::WebNotificationPresenter;
62 using blink::WebTextDirection; 61 using blink::WebTextDirection;
63 62
64 63
65 // NotificationPermissionInfoBarDelegate -------------------------------------- 64 // NotificationPermissionInfoBarDelegate --------------------------------------
66 65
67 // The delegate for the infobar shown when an origin requests notification 66 // The delegate for the infobar shown when an origin requests notification
68 // permissions. 67 // permissions.
69 class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate { 68 class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate {
70 public: 69 public:
71 // Creates a notification permission infobar delegate and adds it to 70 // Creates a notification permission infobar delegate and adds it to
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 const base::ListValue* pref_list = profile_->GetPrefs()->GetList(pref_name); 642 const base::ListValue* pref_list = profile_->GetPrefs()->GetList(pref_name);
644 for (size_t i = 0; i < pref_list->GetSize(); ++i) { 643 for (size_t i = 0; i < pref_list->GetSize(); ++i) {
645 std::string element; 644 std::string element;
646 if (pref_list->GetString(i, &element) && !element.empty()) 645 if (pref_list->GetString(i, &element) && !element.empty())
647 ids_field->insert(element); 646 ids_field->insert(element);
648 else 647 else
649 LOG(WARNING) << i << "-th element is not a string for " << pref_name; 648 LOG(WARNING) << i << "-th element is not a string for " << pref_name;
650 } 649 }
651 } 650 }
652 651
653 blink::WebNotificationPresenter::Permission
654 DesktopNotificationService::HasPermission(const GURL& origin) {
655 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
656 HostContentSettingsMap* host_content_settings_map =
657 profile_->GetHostContentSettingsMap();
658 ContentSetting setting = host_content_settings_map->GetContentSetting(
659 origin,
660 origin,
661 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
662 NO_RESOURCE_IDENTIFIER);
663
664 if (setting == CONTENT_SETTING_ALLOW)
665 return blink::WebNotificationPresenter::PermissionAllowed;
666 if (setting == CONTENT_SETTING_BLOCK)
667 return blink::WebNotificationPresenter::PermissionDenied;
668 if (setting == CONTENT_SETTING_ASK)
669 return blink::WebNotificationPresenter::PermissionNotAllowed;
670 NOTREACHED() << "Invalid notifications settings value: " << setting;
671 return blink::WebNotificationPresenter::PermissionNotAllowed;
672 }
673
674 void DesktopNotificationService::Observe( 652 void DesktopNotificationService::Observe(
675 int type, 653 int type,
676 const content::NotificationSource& source, 654 const content::NotificationSource& source,
677 const content::NotificationDetails& details) { 655 const content::NotificationDetails& details) {
678 DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNINSTALLED, type); 656 DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNINSTALLED, type);
679 657
680 extensions::Extension* extension = 658 extensions::Extension* extension =
681 content::Details<extensions::Extension>(details).ptr(); 659 content::Details<extensions::Extension>(details).ptr();
682 NotifierId notifier_id(NotifierId::APPLICATION, extension->id()); 660 NotifierId notifier_id(NotifierId::APPLICATION, extension->id());
683 if (IsNotifierEnabled(notifier_id)) 661 if (IsNotifierEnabled(notifier_id))
684 return; 662 return;
685 663
686 SetNotifierEnabled(notifier_id, true); 664 SetNotifierEnabled(notifier_id, true);
687 } 665 }
688 666
689 void DesktopNotificationService::FirePermissionLevelChangedEvent( 667 void DesktopNotificationService::FirePermissionLevelChangedEvent(
690 const NotifierId& notifier_id, bool enabled) { 668 const NotifierId& notifier_id, bool enabled) {
691 DCHECK_EQ(NotifierId::APPLICATION, notifier_id.type); 669 DCHECK_EQ(NotifierId::APPLICATION, notifier_id.type);
692 extensions::api::notifications::PermissionLevel permission = 670 extensions::api::notifications::PermissionLevel permission =
693 enabled ? extensions::api::notifications::PERMISSION_LEVEL_GRANTED 671 enabled ? extensions::api::notifications::PERMISSION_LEVEL_GRANTED
694 : extensions::api::notifications::PERMISSION_LEVEL_DENIED; 672 : extensions::api::notifications::PERMISSION_LEVEL_DENIED;
695 scoped_ptr<base::ListValue> args(new base::ListValue()); 673 scoped_ptr<base::ListValue> args(new base::ListValue());
696 args->Append(new base::StringValue( 674 args->Append(new base::StringValue(
697 extensions::api::notifications::ToString(permission))); 675 extensions::api::notifications::ToString(permission)));
698 scoped_ptr<extensions::Event> event(new extensions::Event( 676 scoped_ptr<extensions::Event> event(new extensions::Event(
699 extensions::api::notifications::OnPermissionLevelChanged::kEventName, 677 extensions::api::notifications::OnPermissionLevelChanged::kEventName,
700 args.Pass())); 678 args.Pass()));
701 extensions::ExtensionSystem::Get(profile_)->event_router()-> 679 extensions::ExtensionSystem::Get(profile_)->event_router()->
702 DispatchEventToExtension(notifier_id.id, event.Pass()); 680 DispatchEventToExtension(notifier_id.id, event.Pass());
681
682 // Tell the IO thread that this extension's permission for notifications
683 // has changed.
684 extensions::InfoMap* extension_info_map =
685 extensions::ExtensionSystem::Get(profile_)->info_map();
686 BrowserThread::PostTask(
687 BrowserThread::IO, FROM_HERE,
688 base::Bind(&extensions::InfoMap::SetNotificationsDisabled,
689 extension_info_map, notifier_id.id, !enabled));
690
703 } 691 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698