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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_
6 #define CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_
12 #include "base/basictypes.h"
13 #include "base/callback_forward.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/prefs/pref_member.h"
17 #include "base/strings/string16.h"
18 #include "chrome/browser/content_settings/content_settings_provider.h"
19 #include "chrome/browser/notifications/extension_welcome_notification.h"
20 #include "chrome/common/content_settings.h"
21 #include "components/keyed_service/core/keyed_service.h"
22 #include "content/public/browser/notification_observer.h"
23 #include "content/public/browser/notification_registrar.h"
24 #include "third_party/WebKit/public/web/WebNotificationPresenter.h"
25 #include "third_party/WebKit/public/web/WebTextDirection.h"
26 #include "ui/message_center/notifier_settings.h"
29 class ContentSettingsPattern
;
31 class NotificationDelegate
;
32 class NotificationUIManager
;
36 class DesktopNotificationDelegate
;
37 class RenderFrameHost
;
38 struct ShowDesktopNotificationHostMsgParams
;
45 namespace user_prefs
{
46 class PrefRegistrySyncable
;
49 // The DesktopNotificationService is an object, owned by the Profile,
50 // which provides the creation of desktop "toasts" to web pages and workers.
51 class DesktopNotificationService
: public KeyedService
,
52 public content::NotificationObserver
{
54 // Register profile-specific prefs of notifications.
55 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable
* prefs
);
57 DesktopNotificationService(Profile
* profile
,
58 NotificationUIManager
* ui_manager
);
59 virtual ~DesktopNotificationService();
61 // Requests permission for a given origin. |callback| is run when the UI
63 void RequestPermission(const GURL
& origin
,
64 content::RenderFrameHost
* render_frame_host
,
65 const base::Closure
& callback
);
67 // Show a desktop notification. If |cancel_callback| is non-null, it's set to
68 // a callback which can be used to cancel the notification.
69 void ShowDesktopNotification(
70 const content::ShowDesktopNotificationHostMsgParams
& params
,
71 content::RenderFrameHost
* render_frame_host
,
72 content::DesktopNotificationDelegate
* delegate
,
73 base::Closure
* cancel_callback
);
75 // Methods to setup and modify permission preferences.
76 void GrantPermission(const GURL
& origin
);
77 void DenyPermission(const GURL
& origin
);
79 // Creates a data:xxxx URL which contains the full HTML for a notification
80 // using supplied icon, title, and text, run through a template which contains
81 // the standard formatting for notifications.
82 static base::string16
CreateDataUrl(const GURL
& icon_url
,
83 const base::string16
& title
,
84 const base::string16
& body
,
85 blink::WebTextDirection dir
);
87 // Creates a data:xxxx URL which contains the full HTML for a notification
88 // using resource template which contains the standard formatting for
90 static base::string16
CreateDataUrl(int resource
,
91 const std::vector
<std::string
>& subst
);
93 // Add a desktop notification.
94 static std::string
AddIconNotification(const GURL
& origin_url
,
95 const base::string16
& title
,
96 const base::string16
& message
,
97 const gfx::Image
& icon
,
98 const base::string16
& replace_id
,
99 NotificationDelegate
* delegate
,
102 // The default content setting determines how to handle origins that haven't
103 // been allowed or denied yet. If |provider_id| is not NULL, the id of the
104 // provider which provided the default setting is assigned to it.
105 ContentSetting
GetDefaultContentSetting(std::string
* provider_id
);
106 void SetDefaultContentSetting(ContentSetting setting
);
108 // NOTE: This should only be called on the UI thread.
109 void ResetToDefaultContentSetting();
111 // Returns all notifications settings. |settings| is cleared before
112 // notifications setting are passed to it.
113 void GetNotificationsSettings(ContentSettingsForOneType
* settings
);
115 // Clears the notifications setting for the given pattern.
116 void ClearSetting(const ContentSettingsPattern
& pattern
);
118 // Clears the sets of explicitly allowed and denied origins.
119 void ResetAllOrigins();
121 ContentSetting
GetContentSetting(const GURL
& origin
);
123 // Returns true if the notifier with |notifier_id| is allowed to send
125 bool IsNotifierEnabled(const message_center::NotifierId
& notifier_id
);
127 // Updates the availability of the notifier.
128 void SetNotifierEnabled(const message_center::NotifierId
& notifier_id
,
131 // Adds in a the welcome notification if required for components built
132 // into Chrome that show notifications like Chrome Now.
133 void ShowWelcomeNotificationIfNecessary(const Notification
& notification
);
136 // Returns a display name for an origin in the process id, to be used in
137 // permission infobar or on the frame of the notification toast. Different
138 // from the origin itself when dealing with extensions.
139 base::string16
DisplayNameForOriginInProcessId(const GURL
& origin
,
142 // Notifies the observers when permissions settings change.
143 void NotifySettingsChange();
145 NotificationUIManager
* GetUIManager();
147 // Called when the string list pref has been changed.
148 void OnStringListPrefChanged(
149 const char* pref_name
, std::set
<std::string
>* ids_field
);
151 // Called when the disabled_extension_id pref has been changed.
152 void OnDisabledExtensionIdsChanged();
154 // Called when the disabled_system_component_id pref has been changed.
155 void OnDisabledSystemComponentIdsChanged();
157 // Called when the enabled_sync_notifier_id pref has been changed.
158 void OnEnabledSyncNotifierIdsChanged();
160 void FirePermissionLevelChangedEvent(
161 const message_center::NotifierId
& notifier_id
,
164 // content::NotificationObserver:
165 virtual void Observe(int type
,
166 const content::NotificationSource
& source
,
167 const content::NotificationDetails
& details
) OVERRIDE
;
169 // The profile which owns this object.
172 // Non-owned pointer to the notification manager which manages the
173 // UI for desktop toasts.
174 NotificationUIManager
* ui_manager_
;
176 // Prefs listener for disabled_extension_id.
177 StringListPrefMember disabled_extension_id_pref_
;
179 // Prefs listener for disabled_system_component_id.
180 StringListPrefMember disabled_system_component_id_pref_
;
182 // Prefs listener for enabled_sync_notifier_id.
183 StringListPrefMember enabled_sync_notifier_id_pref_
;
185 // On-memory data for the availability of extensions.
186 std::set
<std::string
> disabled_extension_ids_
;
188 // On-memory data for the availability of system_component.
189 std::set
<std::string
> disabled_system_component_ids_
;
191 // On-memory data for the availability of sync notifiers.
192 std::set
<std::string
> enabled_sync_notifier_ids_
;
194 // Registrar for the other kind of notifications (event signaling).
195 content::NotificationRegistrar registrar_
;
197 // Welcome Notification
198 scoped_ptr
<ExtensionWelcomeNotification
> chrome_now_welcome_notification_
;
200 DISALLOW_COPY_AND_ASSIGN(DesktopNotificationService
);
203 #endif // CHROME_BROWSER_NOTIFICATIONS_DESKTOP_NOTIFICATION_SERVICE_H_