desktop_notification_service.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_details.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_provider.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service_factory.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_object_proxy.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_pattern.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/show_desktop_notification_params.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center_util.h" 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/notifier_settings.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/web_ui_util.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNotificationPresenter; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ContentSetting kDefaultSetting = CONTENT_SETTING_ASK; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToggleListPrefItem(PrefService* prefs, const char* key, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& item, bool flag) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ListPrefUpdate update(prefs, key); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ListValue* const list = update.Get(); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (flag) { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // AppendIfNotPresent will delete |adding_value| when the same value 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // already exists. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringValue* const adding_value = new base::StringValue(item); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) list->AppendIfNotPresent(adding_value); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringValue removed_value(item); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) list->Remove(removed_value, NULL); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CopySetFromPrefToMemory(PrefService* prefs, const char* key, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string>* dst) { 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dst->clear(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::ListValue* pref_list = prefs->GetList(key); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < pref_list->GetSize(); ++i) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string element; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pref_list->GetString(i, &element) && element.empty()) { 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << i << "-th element is not a string for " 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << key; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dst->insert(element); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NotificationPermissionInfoBarDelegate -------------------------------------- 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delegate for the infobar shown when an origin requests notification 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a notification permission delegate and adds it to 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |infobar_service|. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Create(InfoBarService* infobar_service, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopNotificationService* notification_service, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& display_name, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int process_id, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int callback_context); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationPermissionInfoBarDelegate( 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* notification_service, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NotificationPermissionInfoBarDelegate(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ConfirmInfoBarDelegate: 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetIconID() const OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Type GetInfoBarType() const OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetMessageText() const OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Accept() OVERRIDE; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Cancel() OVERRIDE; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The origin we are asking for permissions on. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The display name for the origin to be displayed. Will be different from 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin_ for extensions. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 display_name_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The notification service to be used. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* notification_service_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback information that tells us how to respond to javascript via 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct RenderView. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the user clicked one of the buttons. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool action_taken_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NotificationPermissionInfoBarDelegate); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NotificationPermissionInfoBarDelegate::Create( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopNotificationService* notification_service, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& display_name, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int process_id, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int route_id, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int callback_context) { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new NotificationPermissionInfoBarDelegate( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_service, notification_service, origin, display_name, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) process_id, route_id, callback_context))); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate::NotificationPermissionInfoBarDelegate( 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* notification_service, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ConfirmInfoBarDelegate(infobar_service), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_(origin), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_name_(display_name), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_service_(notification_service), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_id_(process_id), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id_(route_id), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_context_(callback_context), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_taken_(false) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationPermissionInfoBarDelegate:: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~NotificationPermissionInfoBarDelegate() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!action_taken_) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Ignored", 1); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = RenderViewHost::FromID(process_id_, route_id_); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->DesktopNotificationPermissionRequestDone(callback_context_); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int NotificationPermissionInfoBarDelegate::GetIconID() const { 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return IDR_INFOBAR_DESKTOP_NOTIFICATIONS; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfoBarDelegate::Type 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationPermissionInfoBarDelegate::GetInfoBarType() const { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PAGE_ACTION_TYPE; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetMessageText() const { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_NOTIFICATION_PERMISSIONS, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_name_); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NotificationPermissionInfoBarDelegate::GetButtonLabel( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InfoBarButton button) const { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16((button == BUTTON_OK) ? 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_NOTIFICATION_PERMISSION_YES : IDS_NOTIFICATION_PERMISSION_NO); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Accept() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Allowed", 1); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_service_->GrantPermission(origin_); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_taken_ = true; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NotificationPermissionInfoBarDelegate::Cancel() { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Denied", 1); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_service_->DenyPermission(origin_); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_taken_ = true; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopNotificationService ------------------------------------------------- 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::RegisterUserPrefs( 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(prefs::kMessageCenterDisabledExtensionIds, 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterListPref(prefs::kMessageCenterDisabledSystemComponentIds, 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, const string16& title, const string16& body, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection dir) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resource; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> subst; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon_url.is_valid()) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource = IDR_NOTIFICATION_ICON_HTML; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(icon_url.spec()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title))); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body))); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icon float position 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ? 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "right" : "left"); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (title.empty() || body.empty()) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource = IDR_NOTIFICATION_1LINE_HTML; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 line = title.empty() ? body : title; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strings are div names in the template file. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 line_name = title.empty() ? ASCIIToUTF16("description") 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ASCIIToUTF16("title"); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line_name))); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(line))); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource = IDR_NOTIFICATION_2LINE_HTML; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(title))); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(net::EscapeForHTML(UTF16ToUTF8(body))); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // body text direction 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subst.push_back(dir == WebKit::WebTextDirectionRightToLeft ? 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rtl" : "ltr"); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDataUrl(resource, subst); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DesktopNotificationService::CreateDataUrl( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resource, const std::vector<std::string>& subst) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece template_html( 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::GetSharedInstance().GetRawDataResource( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template_html.empty()) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "unable to load template. ID: " << resource; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string16(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data = ReplaceStringPlaceholders(template_html, subst, NULL); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UTF8ToUTF16("data:text/html;charset=utf-8," + 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::EscapeQueryParamValue(data, false)); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddNotification( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin_url, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& replace_id, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDelegate* delegate, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) { 299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (message_center::IsRichNotificationEnabled()) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For message center create a non-HTML notification with |icon_url|. 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Notification notification(origin_url, icon_url, title, message, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebTextDirectionDefault, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), replace_id, delegate); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->notification_ui_manager()->Add(notification, profile); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notification.notification_id(); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a data URL embedding the icon URL, title, and message. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL content_url(CreateDataUrl( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_url, title, message, WebKit::WebTextDirectionDefault)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notification notification( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), content_url, string16(), replace_id, delegate); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->notification_ui_manager()->Add(notification, profile); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification.notification_id(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DesktopNotificationService::AddIconNotification( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin_url, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Image& icon, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& replace_id, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDelegate* delegate, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (message_center::IsRichNotificationEnabled()) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For message center create a non-HTML notification with |icon|. 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Notification notification(origin_url, icon, title, message, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebTextDirectionDefault, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), replace_id, delegate); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->notification_ui_manager()->Add(notification, profile); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notification.notification_id(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!icon.IsEmpty()) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_url = GURL(webui::GetBitmapDataUrl(*icon.ToSkBitmap())); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AddNotification( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_url, title, message, icon_url, replace_id, delegate, profile); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RemoveNotification( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& notification_id) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->notification_ui_manager()->CancelById(notification_id); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DesktopNotificationService::DesktopNotificationService( 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationUIManager* ui_manager) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_manager_(ui_manager) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDisabledExtensionIdsChanged(); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnDisabledSystemComponentIdsChanged(); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_extension_id_pref_.Init( 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kMessageCenterDisabledExtensionIds, 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_->GetPrefs(), 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &DesktopNotificationService::OnDisabledExtensionIdsChanged, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disabled_system_component_id_pref_.Init( 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMessageCenterDisabledSystemComponentIds, 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetPrefs(), 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind( 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &DesktopNotificationService::OnDisabledSystemComponentIdsChanged, 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::Source<Profile>(profile_)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopNotificationService::~DesktopNotificationService() { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GrantPermission(const GURL& origin) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern primary_pattern = 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(origin); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->SetContentSetting( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_pattern, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ALLOW); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::DenyPermission(const GURL& origin) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern primary_pattern = 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(origin); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->SetContentSetting( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_pattern, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_BLOCK); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetDefaultContentSetting( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* provider_id) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, provider_id); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::SetDefaultContentSetting( 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, setting); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetToDefaultContentSetting() { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, CONTENT_SETTING_DEFAULT); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::GetNotificationsSettings( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsForOneType* settings) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->GetSettingsForOneType( 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ClearSetting( 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContentSettingsPattern& pattern) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->SetContentSetting( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pattern, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_DEFAULT); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ResetAllOrigins() { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap()->ClearSettingsForOneType( 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting DesktopNotificationService::GetContentSetting( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_->GetHostContentSettingsMap()->GetContentSetting( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::RequestPermission( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin, int process_id, int route_id, int callback_context, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |origin| hasn't been seen before and the default content setting for 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications is "ask", show an infobar. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache can only answer queries on the IO thread once it's initialized, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so don't ask the cache. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting = GetContentSetting(origin); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setting == CONTENT_SETTING_ASK) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show an info bar requesting permission. 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service = 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::FromWebContents(contents); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |infobar_service| may be NULL, e.g., if this request originated in a 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser action popup, extension background page, or any HTML that runs 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // outside of a tab. 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (infobar_service) { 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationPermissionInfoBarDelegate::Create( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_service, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(contents->GetBrowserContext())), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisplayNameForOriginInProcessId(origin, process_id), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_id, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id, 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_context); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify renderer immediately. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = RenderViewHost::FromID(process_id, route_id); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->DesktopNotificationPermissionRequestDone(callback_context); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::ShowNotification( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Notification& notification) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUIManager()->Add(notification, profile_); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::CancelDesktopNotification( 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, int route_id, int notification_id) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<NotificationObjectProxy> proxy( 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new NotificationObjectProxy(process_id, route_id, notification_id, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUIManager()->CancelById(proxy->id()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_WIN 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopNotificationService::ShowDesktopNotification( 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ShowDesktopNotificationHostMsgParams& params, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, int route_id, DesktopNotificationSource source) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin = params.origin; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationObjectProxy* proxy = 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new NotificationObjectProxy(process_id, route_id, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.notification_id, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source == WorkerNotification); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 display_source = DisplayNameForOriginInProcessId(origin, process_id); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.is_html) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowNotification(Notification(origin, params.contents_url, display_source, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.replace_id, proxy)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Notification notification(origin, params.icon_url, params.title, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.body, params.direction, display_source, params.replace_id, 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy); 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The webkit notification doesn't timeout. 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notification.set_never_timeout(true); 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowNotification(notification); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 DesktopNotificationService::DisplayNameForOriginInProcessId( 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& origin, int process_id) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the source is an extension, lookup the display name. 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Message center prefers to use extension name if the notification 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is allowed by an extension. 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NotificationUIManager::DelegatesToMessageCenter() || 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin.SchemeIs(extensions::kExtensionScheme)) { 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionInfoMap* extension_info_map = 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(profile_)->info_map(); 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension_info_map) { 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin, process_id, extensions::APIPermission::kNotification, 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &extensions); 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ExtensionSet::const_iterator iter = extensions.begin(); 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != extensions.end(); ++iter) { 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsExtensionEnabled((*iter)->id())) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return UTF8ToUTF16((*iter)->name()); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UTF8ToUTF16(origin.host()); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopNotificationService::NotifySettingsChange() { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_DESKTOP_NOTIFICATION_SETTINGS_CHANGED, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<DesktopNotificationService>(this), 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationUIManager* DesktopNotificationService::GetUIManager() { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We defer setting ui_manager_ to the global singleton until we need it 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in order to avoid UI dependent construction during startup. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ui_manager_) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_manager_ = g_browser_process->notification_ui_manager(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_manager_; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DesktopNotificationService::IsExtensionEnabled(const std::string& id) { 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return disabled_extension_ids_.find(id) == disabled_extension_ids_.end(); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::SetExtensionEnabled( 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, bool enabled) { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do not touch |disabled_extension_ids_|. It will be updated at 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnDisabledExtensionIdsChanged() which will be called when the pref changes. 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToggleListPrefItem( 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetPrefs(), 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMessageCenterDisabledExtensionIds, 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id, 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !enabled); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopNotificationService::OnDisabledExtensionIdsChanged() { 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopySetFromPrefToMemory(profile_->GetPrefs(), 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMessageCenterDisabledExtensionIds, 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &disabled_extension_ids_); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DesktopNotificationService::IsSystemComponentEnabled( 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_center::Notifier::SystemComponentNotifierType type) { 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return disabled_system_component_ids_.find(message_center::ToString(type)) == 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disabled_system_component_ids_.end(); 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::SetSystemComponentEnabled( 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_center::Notifier::SystemComponentNotifierType type, bool enabled) { 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Do not touch |disabled_extension_ids_|. It will be updated at 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnDisabledExtensionIdsChanged() which will be called when the pref changes. 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToggleListPrefItem( 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetPrefs(), 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMessageCenterDisabledSystemComponentIds, 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_center::ToString(type), 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !enabled); 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DesktopNotificationService::OnDisabledSystemComponentIdsChanged() { 599b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) disabled_system_component_ids_.clear(); 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopySetFromPrefToMemory(profile_->GetPrefs(), 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMessageCenterDisabledSystemComponentIds, 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &disabled_system_component_ids_); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService::HasPermission(const GURL& origin) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* host_content_settings_map = 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting = host_content_settings_map->GetContentSetting( 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_RESOURCE_IDENTIFIER); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setting == CONTENT_SETTING_ALLOW) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setting == CONTENT_SETTING_BLOCK) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionDenied; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setting == CONTENT_SETTING_ASK) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionNotAllowed; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Invalid notifications settings value: " << setting; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionNotAllowed; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void DesktopNotificationService::Observe( 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int type, 62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const content::NotificationSource& source, 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const content::NotificationDetails& details) { 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNINSTALLED, type); 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extensions::Extension* extension = 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::Details<extensions::Extension>(details).ptr(); 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsExtensionEnabled(extension->id())) 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetExtensionEnabled(extension->id(), true); 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 639