15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/notification_resource_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_host.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/notifications/balloon_notification_ui_manager.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace task_manager {
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class NotificationResource : public Resource {
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit NotificationResource(BalloonHost* balloon_host);
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~NotificationResource();
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Resource interface
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual string16 GetTitle() const OVERRIDE;
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual string16 GetProfileName() const OVERRIDE;
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::ImageSkia GetIcon() const OVERRIDE;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual base::ProcessHandle GetProcess() const OVERRIDE;
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetUniqueChildProcessId() const OVERRIDE;
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual Type GetType() const OVERRIDE;
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool CanInspect() const OVERRIDE;
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Inspect() const OVERRIDE;
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool SupportNetworkUsage() const OVERRIDE;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetSupportNetworkUsage() OVERRIDE { }
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The icon painted for notifications.       .
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static gfx::ImageSkia* default_icon_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Non-owned pointer to the balloon host.
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BalloonHost* balloon_host_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Cached data about the balloon host.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::ProcessHandle process_handle_;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int pid_;
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int unique_process_id_;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  string16 title_;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationResource);
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::ImageSkia* NotificationResource::default_icon_ = NULL;
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResource::NotificationResource(BalloonHost* balloon_host)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : balloon_host_(balloon_host) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!default_icon_) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_handle_ =
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      balloon_host_->web_contents()->GetRenderProcessHost()->GetHandle();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unique_process_id_ =
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      balloon_host_->web_contents()->GetRenderProcessHost()->GetID();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pid_ = base::GetProcId(process_handle_);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_ = l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_NOTIFICATION_PREFIX,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      balloon_host_->GetSource());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResource::~NotificationResource() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 NotificationResource::GetTitle() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return title_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 NotificationResource::GetProfileName() const {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::ImageSkia NotificationResource::GetIcon() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *default_icon_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)base::ProcessHandle NotificationResource::GetProcess() const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return process_handle_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int NotificationResource::GetUniqueChildProcessId() const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return unique_process_id_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Resource::Type NotificationResource::GetType() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NOTIFICATION;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NotificationResource::CanInspect() const {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResource::Inspect() const {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DevToolsWindow::OpenDevToolsWindow(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      balloon_host_->web_contents()->GetRenderViewHost());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NotificationResource::SupportNetworkUsage() const {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// NotificationResourceProvider class
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResourceProvider*
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResourceProvider::Create(TaskManager* task_manager) {
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return new NotificationResourceProvider(task_manager);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResourceProvider::
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NotificationResourceProvider(TaskManager* task_manager)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : task_manager_(task_manager),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      updating_(false) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NotificationResourceProvider::~NotificationResourceProvider() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Resource* NotificationResourceProvider::GetResource(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int origin_pid,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_host_id,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int routing_id) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(johnnyg): provide resources by pid if necessary.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResourceProvider::StartUpdating() {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // MessageCenter does not use Balloons.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (NotificationUIManager::DelegatesToMessageCenter())
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!updating_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updating_ = true;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add all the existing BalloonHosts.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BalloonNotificationUIManager* balloon_manager =
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<BalloonNotificationUIManager*>(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          g_browser_process->notification_ui_manager());
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BalloonCollection* collection = balloon_manager->balloon_collection();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const BalloonCollection::Balloons& balloons =
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      collection->GetActiveBalloons();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (BalloonCollection::Balloons::const_iterator it = balloons.begin();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != balloons.end(); ++it) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BalloonHost* balloon_host = (*it)->balloon_view()->GetHost();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (balloon_host)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddToTaskManager(balloon_host);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register for notifications about extension process changes.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResourceProvider::StopUpdating() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // MessageCenter does not use Balloons.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (NotificationUIManager::DelegatesToMessageCenter())
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(updating_);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updating_ = false;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister for notifications about extension process changes.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Remove(this, chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content::NotificationService::AllSources());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Remove(this, chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content::NotificationService::AllSources());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete all the resources.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resources_.clear();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResourceProvider::Observe(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddToTaskManager(content::Source<BalloonHost>(source).ptr());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RemoveFromTaskManager(content::Source<BalloonHost>(source).ptr());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unexpected notification.";
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResourceProvider::AddToTaskManager(
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BalloonHost* balloon_host) {
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NotificationResource* resource = new NotificationResource(balloon_host);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(resources_.find(balloon_host) == resources_.end());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resources_[balloon_host] = resource;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager_->AddResource(resource);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NotificationResourceProvider::RemoveFromTaskManager(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BalloonHost* balloon_host) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!updating_)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::map<BalloonHost*, NotificationResource*>::iterator iter =
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resources_.find(balloon_host);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == resources_.end())
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the resource from the Task Manager.
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NotificationResource* resource = iter->second;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager_->RemoveResource(resource);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove it from the map.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resources_.erase(iter);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finally, delete the resource.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete resource;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace task_manager
235