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