| 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;
|
| +}
|
|
|