| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/thread.h" | 10 #include "base/thread.h" |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 // Whether the user clicked one of the buttons. | 208 // Whether the user clicked one of the buttons. |
| 209 bool action_taken_; | 209 bool action_taken_; |
| 210 | 210 |
| 211 DISALLOW_COPY_AND_ASSIGN(NotificationPermissionInfoBarDelegate); | 211 DISALLOW_COPY_AND_ASSIGN(NotificationPermissionInfoBarDelegate); |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 DesktopNotificationService::DesktopNotificationService(Profile* profile, | 214 DesktopNotificationService::DesktopNotificationService(Profile* profile, |
| 215 NotificationUIManager* ui_manager) | 215 NotificationUIManager* ui_manager) |
| 216 : profile_(profile), | 216 : profile_(profile), |
| 217 ui_manager_(ui_manager) { | 217 ui_manager_(ui_manager) { |
| 218 registrar_.Init(profile_->GetPrefs()); | 218 prefs_registrar_.Init(profile_->GetPrefs()); |
| 219 InitPrefs(); | 219 InitPrefs(); |
| 220 StartObserving(); | 220 StartObserving(); |
| 221 } | 221 } |
| 222 | 222 |
| 223 DesktopNotificationService::~DesktopNotificationService() { | 223 DesktopNotificationService::~DesktopNotificationService() { |
| 224 StopObserving(); | 224 StopObserving(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 void DesktopNotificationService::RegisterUserPrefs(PrefService* user_prefs) { | 227 void DesktopNotificationService::RegisterUserPrefs(PrefService* user_prefs) { |
| 228 if (!user_prefs->FindPreference( | 228 if (!user_prefs->FindPreference( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 253 | 253 |
| 254 prefs_cache_ = new NotificationsPrefsCache(); | 254 prefs_cache_ = new NotificationsPrefsCache(); |
| 255 prefs_cache_->SetCacheDefaultContentSetting(default_content_setting); | 255 prefs_cache_->SetCacheDefaultContentSetting(default_content_setting); |
| 256 prefs_cache_->SetCacheAllowedOrigins(allowed_origins); | 256 prefs_cache_->SetCacheAllowedOrigins(allowed_origins); |
| 257 prefs_cache_->SetCacheDeniedOrigins(denied_origins); | 257 prefs_cache_->SetCacheDeniedOrigins(denied_origins); |
| 258 prefs_cache_->set_is_initialized(true); | 258 prefs_cache_->set_is_initialized(true); |
| 259 } | 259 } |
| 260 | 260 |
| 261 void DesktopNotificationService::StartObserving() { | 261 void DesktopNotificationService::StartObserving() { |
| 262 if (!profile_->IsOffTheRecord()) { | 262 if (!profile_->IsOffTheRecord()) { |
| 263 registrar_.Add(prefs::kDesktopNotificationDefaultContentSetting, this); | 263 prefs_registrar_.Add(prefs::kDesktopNotificationDefaultContentSetting, |
| 264 registrar_.Add(prefs::kDesktopNotificationAllowedOrigins, this); | 264 this); |
| 265 registrar_.Add(prefs::kDesktopNotificationDeniedOrigins, this); | 265 prefs_registrar_.Add(prefs::kDesktopNotificationAllowedOrigins, this); |
| 266 prefs_registrar_.Add(prefs::kDesktopNotificationDeniedOrigins, this); |
| 267 |
| 268 notification_registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, |
| 269 NotificationService::AllSources()); |
| 266 } | 270 } |
| 267 } | 271 } |
| 268 | 272 |
| 269 void DesktopNotificationService::StopObserving() { | 273 void DesktopNotificationService::StopObserving() { |
| 270 if (!profile_->IsOffTheRecord()) { | 274 if (!profile_->IsOffTheRecord()) { |
| 271 registrar_.RemoveAll(); | 275 prefs_registrar_.RemoveAll(); |
| 276 notification_registrar_.RemoveAll(); |
| 272 } | 277 } |
| 273 } | 278 } |
| 274 | 279 |
| 275 void DesktopNotificationService::GrantPermission(const GURL& origin) { | 280 void DesktopNotificationService::GrantPermission(const GURL& origin) { |
| 276 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 281 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 277 PersistPermissionChange(origin, true); | 282 PersistPermissionChange(origin, true); |
| 278 | 283 |
| 279 // Schedule a cache update on the IO thread. | 284 // Schedule a cache update on the IO thread. |
| 280 BrowserThread::PostTask( | 285 BrowserThread::PostTask( |
| 281 BrowserThread::IO, FROM_HERE, | 286 BrowserThread::IO, FROM_HERE, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 292 BrowserThread::PostTask( | 297 BrowserThread::PostTask( |
| 293 BrowserThread::IO, FROM_HERE, | 298 BrowserThread::IO, FROM_HERE, |
| 294 NewRunnableMethod( | 299 NewRunnableMethod( |
| 295 prefs_cache_.get(), &NotificationsPrefsCache::CacheDeniedOrigin, | 300 prefs_cache_.get(), &NotificationsPrefsCache::CacheDeniedOrigin, |
| 296 origin)); | 301 origin)); |
| 297 } | 302 } |
| 298 | 303 |
| 299 void DesktopNotificationService::Observe(NotificationType type, | 304 void DesktopNotificationService::Observe(NotificationType type, |
| 300 const NotificationSource& source, | 305 const NotificationSource& source, |
| 301 const NotificationDetails& details) { | 306 const NotificationDetails& details) { |
| 302 DCHECK(NotificationType::PREF_CHANGED == type); | 307 if (NotificationType::PREF_CHANGED == type) { |
| 308 const std::string& name = *Details<std::string>(details).ptr(); |
| 309 OnPrefsChanged(name); |
| 310 } else if (NotificationType::EXTENSION_UNLOADED) { |
| 311 // Remove all notifications currently shown or queued by the extension |
| 312 // which was unloaded. |
| 313 Extension* extension = Details<Extension>(details).ptr(); |
| 314 if (extension) |
| 315 ui_manager_->CancelAllBySourceOrigin(extension->url()); |
| 316 } |
| 317 } |
| 318 |
| 319 void DesktopNotificationService::OnPrefsChanged(const std::string& pref_name) { |
| 303 PrefService* prefs = profile_->GetPrefs(); | 320 PrefService* prefs = profile_->GetPrefs(); |
| 304 const std::string& name = *Details<std::string>(details).ptr(); | |
| 305 | 321 |
| 306 if (name == prefs::kDesktopNotificationAllowedOrigins) { | 322 if (pref_name == prefs::kDesktopNotificationAllowedOrigins) { |
| 307 NotificationService::current()->Notify( | 323 NotificationService::current()->Notify( |
| 308 NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED, | 324 NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED, |
| 309 Source<DesktopNotificationService>(this), | 325 Source<DesktopNotificationService>(this), |
| 310 NotificationService::NoDetails()); | 326 NotificationService::NoDetails()); |
| 311 | 327 |
| 312 std::vector<GURL> allowed_origins(GetAllowedOrigins()); | 328 std::vector<GURL> allowed_origins(GetAllowedOrigins()); |
| 313 // Schedule a cache update on the IO thread. | 329 // Schedule a cache update on the IO thread. |
| 314 BrowserThread::PostTask( | 330 BrowserThread::PostTask( |
| 315 BrowserThread::IO, FROM_HERE, | 331 BrowserThread::IO, FROM_HERE, |
| 316 NewRunnableMethod( | 332 NewRunnableMethod( |
| 317 prefs_cache_.get(), | 333 prefs_cache_.get(), |
| 318 &NotificationsPrefsCache::SetCacheAllowedOrigins, | 334 &NotificationsPrefsCache::SetCacheAllowedOrigins, |
| 319 allowed_origins)); | 335 allowed_origins)); |
| 320 } else if (name == prefs::kDesktopNotificationDeniedOrigins) { | 336 } else if (pref_name == prefs::kDesktopNotificationDeniedOrigins) { |
| 321 NotificationService::current()->Notify( | 337 NotificationService::current()->Notify( |
| 322 NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED, | 338 NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED, |
| 323 Source<DesktopNotificationService>(this), | 339 Source<DesktopNotificationService>(this), |
| 324 NotificationService::NoDetails()); | 340 NotificationService::NoDetails()); |
| 325 | 341 |
| 326 std::vector<GURL> denied_origins(GetBlockedOrigins()); | 342 std::vector<GURL> denied_origins(GetBlockedOrigins()); |
| 327 // Schedule a cache update on the IO thread. | 343 // Schedule a cache update on the IO thread. |
| 328 BrowserThread::PostTask( | 344 BrowserThread::PostTask( |
| 329 BrowserThread::IO, FROM_HERE, | 345 BrowserThread::IO, FROM_HERE, |
| 330 NewRunnableMethod( | 346 NewRunnableMethod( |
| 331 prefs_cache_.get(), | 347 prefs_cache_.get(), |
| 332 &NotificationsPrefsCache::SetCacheDeniedOrigins, | 348 &NotificationsPrefsCache::SetCacheDeniedOrigins, |
| 333 denied_origins)); | 349 denied_origins)); |
| 334 } else if (name == prefs::kDesktopNotificationDefaultContentSetting) { | 350 } else if (pref_name == prefs::kDesktopNotificationDefaultContentSetting) { |
| 335 NotificationService::current()->Notify( | 351 NotificationService::current()->Notify( |
| 336 NotificationType::DESKTOP_NOTIFICATION_DEFAULT_CHANGED, | 352 NotificationType::DESKTOP_NOTIFICATION_DEFAULT_CHANGED, |
| 337 Source<DesktopNotificationService>(this), | 353 Source<DesktopNotificationService>(this), |
| 338 NotificationService::NoDetails()); | 354 NotificationService::NoDetails()); |
| 339 | 355 |
| 340 const ContentSetting default_content_setting = IntToContentSetting( | 356 const ContentSetting default_content_setting = IntToContentSetting( |
| 341 prefs->GetInteger(prefs::kDesktopNotificationDefaultContentSetting)); | 357 prefs->GetInteger(prefs::kDesktopNotificationDefaultContentSetting)); |
| 342 | 358 |
| 343 // Schedule a cache update on the IO thread. | 359 // Schedule a cache update on the IO thread. |
| 344 BrowserThread::PostTask( | 360 BrowserThread::PostTask( |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 void DesktopNotificationService::ShowNotification( | 572 void DesktopNotificationService::ShowNotification( |
| 557 const Notification& notification) { | 573 const Notification& notification) { |
| 558 ui_manager_->Add(notification, profile_); | 574 ui_manager_->Add(notification, profile_); |
| 559 } | 575 } |
| 560 | 576 |
| 561 bool DesktopNotificationService::CancelDesktopNotification( | 577 bool DesktopNotificationService::CancelDesktopNotification( |
| 562 int process_id, int route_id, int notification_id) { | 578 int process_id, int route_id, int notification_id) { |
| 563 scoped_refptr<NotificationObjectProxy> proxy( | 579 scoped_refptr<NotificationObjectProxy> proxy( |
| 564 new NotificationObjectProxy(process_id, route_id, notification_id, | 580 new NotificationObjectProxy(process_id, route_id, notification_id, |
| 565 false)); | 581 false)); |
| 566 // TODO(johnnyg): clean up this "empty" notification. | 582 return ui_manager_->CancelById(proxy->id()); |
| 567 Notification notif(GURL(), GURL(), string16(), string16(), proxy); | |
| 568 return ui_manager_->Cancel(notif); | |
| 569 } | 583 } |
| 570 | 584 |
| 571 | 585 |
| 572 bool DesktopNotificationService::ShowDesktopNotification( | 586 bool DesktopNotificationService::ShowDesktopNotification( |
| 573 const ViewHostMsg_ShowNotification_Params& params, | 587 const ViewHostMsg_ShowNotification_Params& params, |
| 574 int process_id, int route_id, DesktopNotificationSource source) { | 588 int process_id, int route_id, DesktopNotificationSource source) { |
| 575 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 589 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 576 const GURL& origin = params.origin; | 590 const GURL& origin = params.origin; |
| 577 NotificationObjectProxy* proxy = | 591 NotificationObjectProxy* proxy = |
| 578 new NotificationObjectProxy(process_id, route_id, | 592 new NotificationObjectProxy(process_id, route_id, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 600 if (origin.SchemeIs(chrome::kExtensionScheme)) { | 614 if (origin.SchemeIs(chrome::kExtensionScheme)) { |
| 601 ExtensionsService* ext_service = profile_->GetExtensionsService(); | 615 ExtensionsService* ext_service = profile_->GetExtensionsService(); |
| 602 if (ext_service) { | 616 if (ext_service) { |
| 603 const Extension* extension = ext_service->GetExtensionByURL(origin); | 617 const Extension* extension = ext_service->GetExtensionByURL(origin); |
| 604 if (extension) | 618 if (extension) |
| 605 return UTF8ToUTF16(extension->name()); | 619 return UTF8ToUTF16(extension->name()); |
| 606 } | 620 } |
| 607 } | 621 } |
| 608 return UTF8ToUTF16(origin.host()); | 622 return UTF8ToUTF16(origin.host()); |
| 609 } | 623 } |
| OLD | NEW |