| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/notifications/message_center_notification_manager.h" | 5 #include "chrome/browser/notifications/message_center_notification_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/prefs/pref_registry_simple.h" | 9 #include "base/prefs/pref_registry_simple.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 // default message center (extension_id.empty()). | 139 // default message center (extension_id.empty()). |
| 140 | 140 |
| 141 // If there exist apps/extensions that have notificationProvider permission, | 141 // If there exist apps/extensions that have notificationProvider permission, |
| 142 // route notifications to one of the apps/extensions. | 142 // route notifications to one of the apps/extensions. |
| 143 std::string extension_id = GetExtensionTakingOverNotifications(profile); | 143 std::string extension_id = GetExtensionTakingOverNotifications(profile); |
| 144 if (!extension_id.empty()) | 144 if (!extension_id.empty()) |
| 145 profile_notification->AddToAlternateProvider(extension_id); | 145 profile_notification->AddToAlternateProvider(extension_id); |
| 146 | 146 |
| 147 message_center_->AddNotification(make_scoped_ptr( | 147 message_center_->AddNotification(make_scoped_ptr( |
| 148 new message_center::Notification(profile_notification->notification()))); | 148 new message_center::Notification(profile_notification->notification()))); |
| 149 profile_notification->StartDownloads(); | |
| 150 } | 149 } |
| 151 | 150 |
| 152 bool MessageCenterNotificationManager::Update(const Notification& notification, | 151 bool MessageCenterNotificationManager::Update(const Notification& notification, |
| 153 Profile* profile) { | 152 Profile* profile) { |
| 154 const base::string16& replace_id = notification.replace_id(); | 153 const base::string16& replace_id = notification.replace_id(); |
| 155 if (replace_id.empty()) | 154 if (replace_id.empty()) |
| 156 return false; | 155 return false; |
| 157 | 156 |
| 158 const GURL origin_url = notification.origin_url(); | 157 const GURL origin_url = notification.origin_url(); |
| 159 DCHECK(origin_url.is_valid()); | 158 DCHECK(origin_url.is_valid()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 184 // providers. | 183 // providers. |
| 185 | 184 |
| 186 // WARNING: You MUST use AddProfileNotification or update the message | 185 // WARNING: You MUST use AddProfileNotification or update the message |
| 187 // center via the notification within a ProfileNotification object or the | 186 // center via the notification within a ProfileNotification object or the |
| 188 // profile ID will not be correctly set for ChromeOS. | 187 // profile ID will not be correctly set for ChromeOS. |
| 189 message_center_->UpdateNotification( | 188 message_center_->UpdateNotification( |
| 190 old_id, | 189 old_id, |
| 191 make_scoped_ptr(new message_center::Notification( | 190 make_scoped_ptr(new message_center::Notification( |
| 192 new_notification->notification()))); | 191 new_notification->notification()))); |
| 193 | 192 |
| 194 new_notification->StartDownloads(); | |
| 195 return true; | 193 return true; |
| 196 } | 194 } |
| 197 } | 195 } |
| 198 return false; | 196 return false; |
| 199 } | 197 } |
| 200 | 198 |
| 201 const Notification* MessageCenterNotificationManager::FindById( | 199 const Notification* MessageCenterNotificationManager::FindById( |
| 202 const std::string& id) const { | 200 const std::string& id) const { |
| 203 NotificationMap::const_iterator iter = profile_notifications_.find(id); | 201 NotificationMap::const_iterator iter = profile_notifications_.find(id); |
| 204 if (iter == profile_notifications_.end()) | 202 if (iter == profile_notifications_.end()) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 const content::NotificationDetails& details) { | 327 const content::NotificationDetails& details) { |
| 330 if (type == chrome::NOTIFICATION_FULLSCREEN_CHANGED) { | 328 if (type == chrome::NOTIFICATION_FULLSCREEN_CHANGED) { |
| 331 const bool is_fullscreen = *content::Details<bool>(details).ptr(); | 329 const bool is_fullscreen = *content::Details<bool>(details).ptr(); |
| 332 | 330 |
| 333 if (is_fullscreen && tray_.get() && tray_->GetMessageCenterTray()) | 331 if (is_fullscreen && tray_.get() && tray_->GetMessageCenterTray()) |
| 334 tray_->GetMessageCenterTray()->HidePopupBubble(); | 332 tray_->GetMessageCenterTray()->HidePopupBubble(); |
| 335 } | 333 } |
| 336 } | 334 } |
| 337 | 335 |
| 338 //////////////////////////////////////////////////////////////////////////////// | 336 //////////////////////////////////////////////////////////////////////////////// |
| 339 // ImageDownloads | |
| 340 | |
| 341 MessageCenterNotificationManager::ImageDownloads::ImageDownloads( | |
| 342 message_center::MessageCenter* message_center, | |
| 343 ImageDownloadsObserver* observer) | |
| 344 : message_center_(message_center), | |
| 345 pending_downloads_(0), | |
| 346 observer_(observer) { | |
| 347 } | |
| 348 | |
| 349 MessageCenterNotificationManager::ImageDownloads::~ImageDownloads() { } | |
| 350 | |
| 351 void MessageCenterNotificationManager::ImageDownloads::StartDownloads( | |
| 352 const Notification& notification) { | |
| 353 // In case all downloads are synchronous, assume a pending download. | |
| 354 AddPendingDownload(); | |
| 355 | |
| 356 // Notification image. | |
| 357 StartDownloadWithImage( | |
| 358 notification, | |
| 359 NULL, | |
| 360 notification.image_url(), | |
| 361 base::Bind(&message_center::MessageCenter::SetNotificationImage, | |
| 362 base::Unretained(message_center_), | |
| 363 notification.delegate_id())); | |
| 364 | |
| 365 // Notification button icons. | |
| 366 StartDownloadWithImage( | |
| 367 notification, | |
| 368 NULL, | |
| 369 notification.button_one_icon_url(), | |
| 370 base::Bind(&message_center::MessageCenter::SetNotificationButtonIcon, | |
| 371 base::Unretained(message_center_), | |
| 372 notification.delegate_id(), | |
| 373 0)); | |
| 374 StartDownloadWithImage( | |
| 375 notification, | |
| 376 NULL, | |
| 377 notification.button_two_icon_url(), | |
| 378 base::Bind(&message_center::MessageCenter::SetNotificationButtonIcon, | |
| 379 base::Unretained(message_center_), | |
| 380 notification.delegate_id(), | |
| 381 1)); | |
| 382 | |
| 383 // This should tell the observer we're done if everything was synchronous. | |
| 384 PendingDownloadCompleted(); | |
| 385 } | |
| 386 | |
| 387 void MessageCenterNotificationManager::ImageDownloads::StartDownloadWithImage( | |
| 388 const Notification& notification, | |
| 389 const gfx::Image* image, | |
| 390 const GURL& url, | |
| 391 const SetImageCallback& callback) { | |
| 392 // Set the image directly if we have it. | |
| 393 if (image && !image->IsEmpty()) { | |
| 394 callback.Run(*image); | |
| 395 return; | |
| 396 } | |
| 397 | |
| 398 // Leave the image null if there's no URL. | |
| 399 if (url.is_empty()) | |
| 400 return; | |
| 401 | |
| 402 content::WebContents* contents = notification.GetWebContents(); | |
| 403 if (!contents) { | |
| 404 LOG(WARNING) << "Notification needs an image but has no WebContents"; | |
| 405 return; | |
| 406 } | |
| 407 | |
| 408 AddPendingDownload(); | |
| 409 | |
| 410 contents->DownloadImage( | |
| 411 url, | |
| 412 false, // Not a favicon | |
| 413 0, // No maximum size | |
| 414 base::Bind( | |
| 415 &MessageCenterNotificationManager::ImageDownloads::DownloadComplete, | |
| 416 AsWeakPtr(), | |
| 417 callback)); | |
| 418 } | |
| 419 | |
| 420 void MessageCenterNotificationManager::ImageDownloads::DownloadComplete( | |
| 421 const SetImageCallback& callback, | |
| 422 int download_id, | |
| 423 int http_status_code, | |
| 424 const GURL& image_url, | |
| 425 const std::vector<SkBitmap>& bitmaps, | |
| 426 const std::vector<gfx::Size>& original_bitmap_sizes) { | |
| 427 PendingDownloadCompleted(); | |
| 428 | |
| 429 if (bitmaps.empty()) | |
| 430 return; | |
| 431 gfx::Image image = gfx::Image::CreateFrom1xBitmap(bitmaps[0]); | |
| 432 callback.Run(image); | |
| 433 } | |
| 434 | |
| 435 // Private methods. | |
| 436 | |
| 437 void MessageCenterNotificationManager::ImageDownloads::AddPendingDownload() { | |
| 438 ++pending_downloads_; | |
| 439 } | |
| 440 | |
| 441 void | |
| 442 MessageCenterNotificationManager::ImageDownloads::PendingDownloadCompleted() { | |
| 443 DCHECK(pending_downloads_ > 0); | |
| 444 if (--pending_downloads_ == 0 && observer_) | |
| 445 observer_->OnDownloadsCompleted(); | |
| 446 } | |
| 447 | |
| 448 //////////////////////////////////////////////////////////////////////////////// | |
| 449 // ProfileNotification | 337 // ProfileNotification |
| 450 | 338 |
| 451 MessageCenterNotificationManager::ProfileNotification::ProfileNotification( | 339 MessageCenterNotificationManager::ProfileNotification::ProfileNotification( |
| 452 Profile* profile, | 340 Profile* profile, |
| 453 const Notification& notification, | 341 const Notification& notification, |
| 454 message_center::MessageCenter* message_center) | 342 message_center::MessageCenter* message_center) |
| 455 : profile_(profile), | 343 : profile_(profile), |
| 456 notification_(notification), | 344 notification_(notification) { |
| 457 downloads_(new ImageDownloads(message_center, this)) { | |
| 458 DCHECK(profile); | 345 DCHECK(profile); |
| 459 #if defined(OS_CHROMEOS) | 346 #if defined(OS_CHROMEOS) |
| 460 notification_.set_profile_id(multi_user_util::GetUserIDFromProfile(profile)); | 347 notification_.set_profile_id(multi_user_util::GetUserIDFromProfile(profile)); |
| 461 #endif | 348 #endif |
| 462 } | 349 } |
| 463 | 350 |
| 464 MessageCenterNotificationManager::ProfileNotification::~ProfileNotification() { | 351 MessageCenterNotificationManager::ProfileNotification::~ProfileNotification() { |
| 465 } | 352 } |
| 466 | 353 |
| 467 void MessageCenterNotificationManager::ProfileNotification::StartDownloads() { | |
| 468 downloads_->StartDownloads(notification_); | |
| 469 } | |
| 470 | |
| 471 void | |
| 472 MessageCenterNotificationManager::ProfileNotification::OnDownloadsCompleted() { | |
| 473 notification_.DoneRendering(); | |
| 474 } | |
| 475 | |
| 476 void | 354 void |
| 477 MessageCenterNotificationManager::ProfileNotification::AddToAlternateProvider( | 355 MessageCenterNotificationManager::ProfileNotification::AddToAlternateProvider( |
| 478 const std::string extension_id) { | 356 const std::string extension_id) { |
| 479 // Convert data from Notification type to NotificationOptions type. | 357 // Convert data from Notification type to NotificationOptions type. |
| 480 extensions::api::notifications::NotificationOptions options; | 358 extensions::api::notifications::NotificationOptions options; |
| 481 NotificationConversionHelper::NotificationToNotificationOptions(notification_, | 359 NotificationConversionHelper::NotificationToNotificationOptions(notification_, |
| 482 &options); | 360 &options); |
| 483 | 361 |
| 484 // Send the notification to the alternate provider extension/app. | 362 // Send the notification to the alternate provider extension/app. |
| 485 extensions::NotificationProviderEventRouter event_router(profile_); | 363 extensions::NotificationProviderEventRouter event_router(profile_); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 it != registry->enabled_extensions().end(); | 409 it != registry->enabled_extensions().end(); |
| 532 ++it) { | 410 ++it) { |
| 533 if ((*it->get()).permissions_data()->HasAPIPermission( | 411 if ((*it->get()).permissions_data()->HasAPIPermission( |
| 534 extensions::APIPermission::ID::kNotificationProvider)) { | 412 extensions::APIPermission::ID::kNotificationProvider)) { |
| 535 extension_id = (*it->get()).id(); | 413 extension_id = (*it->get()).id(); |
| 536 return extension_id; | 414 return extension_id; |
| 537 } | 415 } |
| 538 } | 416 } |
| 539 return extension_id; | 417 return extension_id; |
| 540 } | 418 } |
| OLD | NEW |