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/worker_resource_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <vector> 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/resource_provider.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/worker_service.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/process_type.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WorkerService; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace task_manager { 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Objects of this class are created on the IO thread and then passed to the UI 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread where they are passed to the task manager. All methods must be called 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only on the UI thread. Destructor may be called on any thread. 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SharedWorkerResource : public Resource { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SharedWorkerResource(const GURL& url, 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const string16& name, 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int process_id, 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int routing_id, 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::ProcessHandle process_handle); 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~SharedWorkerResource(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Matches(int process_id, int routing_id) const; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateProcessHandle(base::ProcessHandle handle); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle handle() const { return handle_; } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id() const { return process_id_; } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Resource methods: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetTitle() const OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetProfileName() const OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::ImageSkia GetIcon() const OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::ProcessHandle GetProcess() const OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetUniqueChildProcessId() const OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Type GetType() const OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanInspect() const OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Inspect() const OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SupportNetworkUsage() const OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetSupportNetworkUsage() OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle handle_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static gfx::ImageSkia* default_icon_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SharedWorkerResource); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::ImageSkia* SharedWorkerResource::default_icon_ = NULL; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SharedWorkerResource::SharedWorkerResource( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle process_handle) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : process_id_(process_id), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_(routing_id), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_(process_handle) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_ = UTF8ToUTF16(url.spec()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name.empty()) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_ += ASCIIToUTF16(" (") + name + ASCIIToUTF16(")"); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)SharedWorkerResource::~SharedWorkerResource() { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool SharedWorkerResource::Matches(int process_id, 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int routing_id) const { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return process_id_ == process_id && routing_id_ == routing_id; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SharedWorkerResource::UpdateProcessHandle(base::ProcessHandle handle) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_ = handle; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 SharedWorkerResource::GetTitle() const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_WORKER_PREFIX, title_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 SharedWorkerResource::GetProfileName() const { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string16(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::ImageSkia SharedWorkerResource::GetIcon() const { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!default_icon_) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jabdelmalek): use different icon for web workers. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *default_icon_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)base::ProcessHandle SharedWorkerResource::GetProcess() const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handle_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int SharedWorkerResource::GetUniqueChildProcessId() const { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return process_id_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Resource::Type SharedWorkerResource::GetType() const { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WORKER; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool SharedWorkerResource::CanInspect() const { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SharedWorkerResource::Inspect() const { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yurys): would be better to get profile from one of the tabs connected 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the worker. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = ProfileManager::GetLastUsedProfile(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent_host( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevToolsAgentHost::GetForWorker(process_id_, routing_id_)); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DevToolsWindow::OpenDevToolsWindowForWorker(profile, agent_host.get()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool SharedWorkerResource::SupportNetworkUsage() const { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SharedWorkerResource::SetSupportNetworkUsage() { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is needed to ensure that all resources in WorkerResourceList are 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// deleted if corresponding task is posted to but not executed on the UI 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread. 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WorkerResourceProvider::WorkerResourceListHolder { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceListHolder() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~WorkerResourceListHolder() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&resources_); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceList* resources() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &resources_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceList resources_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WorkerResourceProvider:: 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WorkerResourceProvider(TaskManager* task_manager) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : updating_(false), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager_(task_manager) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WorkerResourceProvider::~WorkerResourceProvider() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteAllResources(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Resource* WorkerResourceProvider::GetResource( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int origin_pid, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_host_id, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::StartUpdating() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!updating_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updating_ = true; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get existing workers. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, base::Bind( 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WorkerResourceProvider::StartObservingWorkers, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this)); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserChildProcessObserver::Add(this); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::StopUpdating() { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(updating_); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updating_ = false; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launching_workers_.clear(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteAllResources(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, base::Bind( 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WorkerResourceProvider::StopObservingWorkers, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this)); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserChildProcessObserver::Remove(this); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::BrowserChildProcessHostConnected( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::ChildProcessData& data) { 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(updating_); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data.process_type != content::PROCESS_TYPE_WORKER) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProcessIdToWorkerResources::iterator it(launching_workers_.find(data.id)); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it == launching_workers_.end()) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WorkerResourceList& resources = it->second; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (WorkerResourceList::iterator r = resources.begin(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r != resources.end(); ++r) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*r)->UpdateProcessHandle(data.handle); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_manager_->AddResource(*r); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launching_workers_.erase(it); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::BrowserChildProcessHostDisconnected( 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::ChildProcessData& data) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(updating_); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data.process_type != content::PROCESS_TYPE_WORKER) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Worker process may be destroyed before WorkerMsg_TerminateWorkerContex 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // message is handled and WorkerDestroyed is fired. In this case we won't 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // get WorkerDestroyed notification and have to clear resources for such 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // workers here when the worker process has been destroyed. 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (WorkerResourceList::iterator it = resources_.begin(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != resources_.end();) { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*it)->process_id() == data.id) { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_manager_->RemoveResource(*it); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete *it; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = resources_.erase(it); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!ContainsKey(launching_workers_, data.id)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::WorkerCreated( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) { 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SharedWorkerResource* resource = new SharedWorkerResource( 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, name, process_id, route_id, base::kNullProcessHandle); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&WorkerResourceProvider::NotifyWorkerCreated, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, base::Owned(new WorkerResourceHolder(resource)))); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::WorkerDestroyed(int process_id, int route_id) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, base::Bind( 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WorkerResourceProvider::NotifyWorkerDestroyed, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, process_id, route_id)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::NotifyWorkerCreated( 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceHolder* resource_holder) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!updating_) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResource(resource_holder->release()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::NotifyWorkerDestroyed( 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, int routing_id) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!updating_) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (WorkerResourceList::iterator it = resources_.begin(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it !=resources_.end(); ++it) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*it)->Matches(process_id, routing_id)) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager_->RemoveResource(*it); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *it; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_.erase(it); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::StartObservingWorkers() { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkerResourceListHolder> holder(new WorkerResourceListHolder); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WorkerService::WorkerInfo> worker_info = 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->GetWorkers(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < worker_info.size(); ++i) { 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) holder->resources()->push_back(new SharedWorkerResource( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_info[i].url, worker_info[i].name, worker_info[i].process_id, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_info[i].route_id, worker_info[i].handle)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WorkerResourceProvider::AddWorkerResourceList, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, base::Owned(holder.release()))); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->AddObserver(this); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::StopObservingWorkers() { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->RemoveObserver(this); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::AddWorkerResourceList( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceListHolder* resource_list_holder) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!updating_) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerResourceList* resources = resource_list_holder->resources(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (WorkerResourceList::iterator it = resources->begin(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it !=resources->end(); ++it) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddResource(*it); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources->clear(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::AddResource(SharedWorkerResource* resource) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(updating_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_.push_back(resource); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resource->handle() == base::kNullProcessHandle) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id = resource->process_id(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launching_workers_[process_id].push_back(resource); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_manager_->AddResource(resource); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WorkerResourceProvider::DeleteAllResources() { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&resources_); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace task_manager 360