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

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

Issue 385058: When extensions use notifications, display the name of the extension in UI ra... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/resource_bundle.h" 8 #include "app/resource_bundle.h"
9 #include "base/string_piece.h" 9 #include "base/string_piece.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "base/thread.h" 11 #include "base/thread.h"
12 #include "chrome/browser/browser_list.h" 12 #include "chrome/browser/browser_list.h"
13 #include "chrome/browser/chrome_thread.h" 13 #include "chrome/browser/chrome_thread.h"
14 #include "chrome/browser/extensions/extensions_service.h"
14 #include "chrome/browser/notifications/notification.h" 15 #include "chrome/browser/notifications/notification.h"
15 #include "chrome/browser/notifications/notification_object_proxy.h" 16 #include "chrome/browser/notifications/notification_object_proxy.h"
16 #include "chrome/browser/notifications/notification_ui_manager.h" 17 #include "chrome/browser/notifications/notification_ui_manager.h"
17 #include "chrome/browser/notifications/notifications_prefs_cache.h" 18 #include "chrome/browser/notifications/notifications_prefs_cache.h"
18 #include "chrome/browser/profile.h" 19 #include "chrome/browser/profile.h"
19 #include "chrome/browser/renderer_host/render_process_host.h" 20 #include "chrome/browser/renderer_host/render_process_host.h"
20 #include "chrome/browser/renderer_host/render_view_host.h" 21 #include "chrome/browser/renderer_host/render_view_host.h"
21 #include "chrome/browser/renderer_host/site_instance.h" 22 #include "chrome/browser/renderer_host/site_instance.h"
22 #include "chrome/browser/tab_contents/infobar_delegate.h" 23 #include "chrome/browser/tab_contents/infobar_delegate.h"
23 #include "chrome/browser/tab_contents/tab_contents.h" 24 #include "chrome/browser/tab_contents/tab_contents.h"
24 #include "chrome/browser/worker_host/worker_process_host.h" 25 #include "chrome/browser/worker_host/worker_process_host.h"
25 #include "chrome/common/child_process_host.h" 26 #include "chrome/common/child_process_host.h"
26 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
27 #include "chrome/common/pref_service.h" 28 #include "chrome/common/pref_service.h"
28 #include "chrome/common/render_messages.h" 29 #include "chrome/common/render_messages.h"
30 #include "chrome/common/url_constants.h"
29 #include "grit/browser_resources.h" 31 #include "grit/browser_resources.h"
30 #include "grit/chromium_strings.h" 32 #include "grit/chromium_strings.h"
31 #include "grit/generated_resources.h" 33 #include "grit/generated_resources.h"
32 #include "grit/theme_resources.h" 34 #include "grit/theme_resources.h"
33 #include "webkit/api/public/WebNotificationPresenter.h" 35 #include "webkit/api/public/WebNotificationPresenter.h"
34 36
35 using WebKit::WebNotificationPresenter; 37 using WebKit::WebNotificationPresenter;
36 38
37 // Creates a data:xxxx URL which contains the full HTML for a notification 39 // Creates a data:xxxx URL which contains the full HTML for a notification
38 // using supplied icon, title, and text, run through a template which contains 40 // using supplied icon, title, and text, run through a template which contains
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 int route_id_; 95 int route_id_;
94 int request_id_; 96 int request_id_;
95 }; 97 };
96 98
97 // The delegate for the infobar shown when an origin requests notification 99 // The delegate for the infobar shown when an origin requests notification
98 // permissions. 100 // permissions.
99 class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate { 101 class NotificationPermissionInfoBarDelegate : public ConfirmInfoBarDelegate {
100 public: 102 public:
101 NotificationPermissionInfoBarDelegate(TabContents* contents, 103 NotificationPermissionInfoBarDelegate(TabContents* contents,
102 const GURL& origin, 104 const GURL& origin,
105 const std::wstring& display_name,
103 int process_id, 106 int process_id,
104 int route_id, 107 int route_id,
105 int callback_context) 108 int callback_context)
106 : ConfirmInfoBarDelegate(contents), 109 : ConfirmInfoBarDelegate(contents),
107 origin_(origin), 110 origin_(origin),
111 display_name_(display_name),
108 profile_(contents->profile()), 112 profile_(contents->profile()),
109 process_id_(process_id), 113 process_id_(process_id),
110 route_id_(route_id), 114 route_id_(route_id),
111 callback_context_(callback_context), 115 callback_context_(callback_context),
112 action_taken_(false) { 116 action_taken_(false) {
113 } 117 }
114 118
115 // Overridden from ConfirmInfoBarDelegate: 119 // Overridden from ConfirmInfoBarDelegate:
116 virtual void InfoBarClosed() { 120 virtual void InfoBarClosed() {
117 if (!action_taken_) 121 if (!action_taken_)
118 UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Ignored", 1); 122 UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Ignored", 1);
119 123
120 ChromeThread::PostTask( 124 ChromeThread::PostTask(
121 ChromeThread::IO, FROM_HERE, 125 ChromeThread::IO, FROM_HERE,
122 new NotificationPermissionCallbackTask( 126 new NotificationPermissionCallbackTask(
123 process_id_, route_id_, callback_context_)); 127 process_id_, route_id_, callback_context_));
124 128
125 delete this; 129 delete this;
126 } 130 }
127 131
128 virtual std::wstring GetMessageText() const { 132 virtual std::wstring GetMessageText() const {
129 return l10n_util::GetStringF(IDS_NOTIFICATION_PERMISSIONS, 133 return l10n_util::GetStringF(IDS_NOTIFICATION_PERMISSIONS, display_name_);
130 UTF8ToWide(origin_.spec()));
131 } 134 }
132 135
133 virtual SkBitmap* GetIcon() const { 136 virtual SkBitmap* GetIcon() const {
134 return ResourceBundle::GetSharedInstance().GetBitmapNamed( 137 return ResourceBundle::GetSharedInstance().GetBitmapNamed(
135 IDR_PRODUCT_ICON_32); 138 IDR_PRODUCT_ICON_32);
136 } 139 }
137 140
138 virtual int GetButtons() const { 141 virtual int GetButtons() const {
139 return BUTTON_OK | BUTTON_CANCEL | BUTTON_OK_DEFAULT; 142 return BUTTON_OK | BUTTON_CANCEL | BUTTON_OK_DEFAULT;
140 } 143 }
(...skipping 15 matching lines...) Expand all
156 UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Denied", 1); 159 UMA_HISTOGRAM_COUNTS("NotificationPermissionRequest.Denied", 1);
157 profile_->GetDesktopNotificationService()->DenyPermission(origin_); 160 profile_->GetDesktopNotificationService()->DenyPermission(origin_);
158 action_taken_ = true; 161 action_taken_ = true;
159 return true; 162 return true;
160 } 163 }
161 164
162 private: 165 private:
163 // The origin we are asking for permissions on. 166 // The origin we are asking for permissions on.
164 GURL origin_; 167 GURL origin_;
165 168
169 // The display name for the origin to be displayed. Will be different from
170 // origin_ for extensions.
171 std::wstring display_name_;
172
166 // The Profile that we restore sessions from. 173 // The Profile that we restore sessions from.
167 Profile* profile_; 174 Profile* profile_;
168 175
169 // The callback information that tells us how to respond to javascript via 176 // The callback information that tells us how to respond to javascript via
170 // the correct RenderView. 177 // the correct RenderView.
171 int process_id_; 178 int process_id_;
172 int route_id_; 179 int route_id_;
173 int callback_context_; 180 int callback_context_;
174 181
175 // Whether the user clicked one of the buttons. 182 // Whether the user clicked one of the buttons.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 260 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
254 // Show an info bar requesting permission. 261 // Show an info bar requesting permission.
255 Browser* browser = BrowserList::GetLastActive(); 262 Browser* browser = BrowserList::GetLastActive();
256 if (!browser) { 263 if (!browser) {
257 // Reached during ui tests. 264 // Reached during ui tests.
258 return; 265 return;
259 } 266 }
260 TabContents* tab = browser->GetSelectedTabContents(); 267 TabContents* tab = browser->GetSelectedTabContents();
261 if (!tab) 268 if (!tab)
262 return; 269 return;
270
271 std::wstring display_name = DisplayNameForOrigin(origin);
272
263 tab->AddInfoBar(new NotificationPermissionInfoBarDelegate( 273 tab->AddInfoBar(new NotificationPermissionInfoBarDelegate(
264 tab, origin, process_id, route_id, callback_context)); 274 tab, origin, display_name, process_id, route_id, callback_context));
265 } 275 }
266 276
267 void DesktopNotificationService::ShowNotification( 277 void DesktopNotificationService::ShowNotification(
268 const Notification& notification) { 278 const Notification& notification) {
269 ui_manager_->Add(notification, profile_); 279 ui_manager_->Add(notification, profile_);
270 } 280 }
271 281
272 bool DesktopNotificationService::CancelDesktopNotification( 282 bool DesktopNotificationService::CancelDesktopNotification(
273 int process_id, int route_id, int notification_id) { 283 int process_id, int route_id, int notification_id) {
274 scoped_refptr<NotificationObjectProxy> proxy( 284 scoped_refptr<NotificationObjectProxy> proxy(
275 new NotificationObjectProxy(process_id, route_id, notification_id, 285 new NotificationObjectProxy(process_id, route_id, notification_id,
276 false)); 286 false));
277 Notification notif(GURL(), GURL(), proxy); 287 Notification notif(GURL(), GURL(), L"", proxy);
278 return ui_manager_->Cancel(notif); 288 return ui_manager_->Cancel(notif);
279 } 289 }
280 290
281 291
282 bool DesktopNotificationService::ShowDesktopNotification( 292 bool DesktopNotificationService::ShowDesktopNotification(
283 const GURL& origin, const GURL& url, int process_id, int route_id, 293 const GURL& origin, const GURL& url, int process_id, int route_id,
284 NotificationSource source, int notification_id) { 294 NotificationSource source, int notification_id) {
285 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 295 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
286 NotificationObjectProxy* proxy = 296 NotificationObjectProxy* proxy =
287 new NotificationObjectProxy(process_id, route_id, 297 new NotificationObjectProxy(process_id, route_id,
288 notification_id, 298 notification_id,
289 source == WorkerNotification); 299 source == WorkerNotification);
290 Notification notif(origin, url, proxy); 300 Notification notif(origin, url, DisplayNameForOrigin(origin), proxy);
291 ShowNotification(notif); 301 ShowNotification(notif);
292 return true; 302 return true;
293 } 303 }
294 304
295 bool DesktopNotificationService::ShowDesktopNotificationText( 305 bool DesktopNotificationService::ShowDesktopNotificationText(
296 const GURL& origin, const GURL& icon, const string16& title, 306 const GURL& origin, const GURL& icon, const string16& title,
297 const string16& text, int process_id, int route_id, 307 const string16& text, int process_id, int route_id,
298 NotificationSource source, int notification_id) { 308 NotificationSource source, int notification_id) {
299 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 309 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
300 NotificationObjectProxy* proxy = 310 NotificationObjectProxy* proxy =
301 new NotificationObjectProxy(process_id, route_id, 311 new NotificationObjectProxy(process_id, route_id,
302 notification_id, 312 notification_id,
303 source == WorkerNotification); 313 source == WorkerNotification);
304 // "upconvert" the string parameters to a data: URL. 314 // "upconvert" the string parameters to a data: URL.
305 string16 data_url = CreateDataUrl(icon, title, text); 315 string16 data_url = CreateDataUrl(icon, title, text);
306 Notification notif(origin, GURL(data_url), proxy); 316 Notification notif(
317 origin, GURL(data_url), DisplayNameForOrigin(origin), proxy);
307 ShowNotification(notif); 318 ShowNotification(notif);
308 return true; 319 return true;
309 } 320 }
321
322 std::wstring DesktopNotificationService::DisplayNameForOrigin(
323 const GURL& origin) {
324 // If the source is an extension, lookup the display name.
325 if (origin.SchemeIs(chrome::kExtensionScheme)) {
326 ExtensionsService* ext_service = profile_->GetExtensionsService();
327 if (ext_service) {
328 Extension* extension = ext_service->GetExtensionByURL(origin);
329 if (extension)
330 return ASCIIToWide(extension->name());
331 }
332 }
333 return UTF8ToWide(origin.spec());
334 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698