Index: chrome/browser/task_manager/task_manager_notification_resource_provider.cc |
diff --git a/chrome/browser/task_manager/task_manager_notification_resource_provider.cc b/chrome/browser/task_manager/task_manager_notification_resource_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..457d8a24cfa54548c889cbba124511f36018ee66 |
--- /dev/null |
+++ b/chrome/browser/task_manager/task_manager_notification_resource_provider.cc |
@@ -0,0 +1,171 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/task_manager/task_manager_resource_providers.h" |
+ |
+#include "base/basictypes.h" |
+#include "base/stl_util-inl.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/notifications/balloon_collection.h" |
+#include "chrome/browser/notifications/balloon_host.h" |
+#include "chrome/browser/notifications/notification_ui_manager.h" |
+#include "content/browser/renderer_host/render_process_host.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/common/notification_service.h" |
+#include "grit/generated_resources.h" |
+#include "grit/theme_resources.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// TaskManagerNotificationResource class |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+SkBitmap* TaskManagerNotificationResource::default_icon_ = NULL; |
+ |
+TaskManagerNotificationResource::TaskManagerNotificationResource( |
+ BalloonHost* balloon_host) |
+ : balloon_host_(balloon_host) { |
+ if (!default_icon_) { |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); |
+ } |
+ process_handle_ = balloon_host_->render_view_host()->process()->GetHandle(); |
+ pid_ = base::GetProcId(process_handle_); |
+ title_ = l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_NOTIFICATION_PREFIX, |
+ balloon_host_->GetSource()); |
+} |
+ |
+TaskManagerNotificationResource::~TaskManagerNotificationResource() { |
+} |
+ |
+string16 TaskManagerNotificationResource::GetTitle() const { |
+ return title_; |
+} |
+ |
+SkBitmap TaskManagerNotificationResource::GetIcon() const { |
+ return *default_icon_; |
+} |
+ |
+base::ProcessHandle TaskManagerNotificationResource::GetProcess() const { |
+ return process_handle_; |
+} |
+ |
+TaskManager::Resource::Type TaskManagerNotificationResource::GetType() const { |
+ return NOTIFICATION; |
+} |
+ |
+bool TaskManagerNotificationResource::SupportNetworkUsage() const { |
+ return false; |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// TaskManagerNotificationResourceProvider class |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+// static |
+TaskManagerNotificationResourceProvider* |
+TaskManagerNotificationResourceProvider::Create(TaskManager* task_manager) { |
+ return new TaskManagerNotificationResourceProvider(task_manager); |
+} |
+ |
+TaskManagerNotificationResourceProvider:: |
+ TaskManagerNotificationResourceProvider(TaskManager* task_manager) |
+ : task_manager_(task_manager), |
+ updating_(false) { |
+} |
+ |
+TaskManagerNotificationResourceProvider:: |
+ ~TaskManagerNotificationResourceProvider() { |
+} |
+ |
+TaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource( |
+ int origin_pid, |
+ int render_process_host_id, |
+ int routing_id) { |
+ // TODO(johnnyg): provide resources by pid if necessary. |
+ return NULL; |
+} |
+ |
+void TaskManagerNotificationResourceProvider::StartUpdating() { |
+ DCHECK(!updating_); |
+ updating_ = true; |
+ |
+ // Add all the existing BalloonHosts. |
+ BalloonCollection* collection = |
+ g_browser_process->notification_ui_manager()->balloon_collection(); |
+ const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); |
+ for (BalloonCollection::Balloons::const_iterator it = balloons.begin(); |
+ it != balloons.end(); ++it) { |
+ AddToTaskManager((*it)->view()->GetHost()); |
+ } |
+ |
+ // Register for notifications about extension process changes. |
+ registrar_.Add(this, NotificationType::NOTIFY_BALLOON_CONNECTED, |
+ NotificationService::AllSources()); |
+ registrar_.Add(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, |
+ NotificationService::AllSources()); |
+} |
+ |
+void TaskManagerNotificationResourceProvider::StopUpdating() { |
+ DCHECK(updating_); |
+ updating_ = false; |
+ |
+ // Unregister for notifications about extension process changes. |
+ registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_CONNECTED, |
+ NotificationService::AllSources()); |
+ registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, |
+ NotificationService::AllSources()); |
+ |
+ // Delete all the resources. |
+ STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); |
+ resources_.clear(); |
+} |
+ |
+void TaskManagerNotificationResourceProvider::Observe( |
+ NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ switch (type.value) { |
+ case NotificationType::NOTIFY_BALLOON_CONNECTED: |
+ AddToTaskManager(Source<BalloonHost>(source).ptr()); |
+ break; |
+ case NotificationType::NOTIFY_BALLOON_DISCONNECTED: |
+ RemoveFromTaskManager(Source<BalloonHost>(source).ptr()); |
+ break; |
+ default: |
+ NOTREACHED() << "Unexpected notification."; |
+ return; |
+ } |
+} |
+ |
+void TaskManagerNotificationResourceProvider::AddToTaskManager( |
+ BalloonHost* balloon_host) { |
+ TaskManagerNotificationResource* resource = |
+ new TaskManagerNotificationResource(balloon_host); |
+ DCHECK(resources_.find(balloon_host) == resources_.end()); |
+ resources_[balloon_host] = resource; |
+ task_manager_->AddResource(resource); |
+} |
+ |
+void TaskManagerNotificationResourceProvider::RemoveFromTaskManager( |
+ BalloonHost* balloon_host) { |
+ if (!updating_) |
+ return; |
+ std::map<BalloonHost*, TaskManagerNotificationResource*>::iterator iter = |
+ resources_.find(balloon_host); |
+ if (iter == resources_.end()) |
+ return; |
+ |
+ // Remove the resource from the Task Manager. |
+ TaskManagerNotificationResource* resource = iter->second; |
+ task_manager_->RemoveResource(resource); |
+ |
+ // Remove it from the map. |
+ resources_.erase(iter); |
+ |
+ // Finally, delete the resource. |
+ delete resource; |
+} |