190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef CHROME_BROWSER_TASK_MANAGER_RESOURCE_PROVIDER_H_ 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define CHROME_BROWSER_TASK_MANAGER_RESOURCE_PROVIDER_H_ 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/ref_counted.h" 10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_handle.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCache.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class PrefRegistrySimple; 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TaskManagerModel; 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace content { 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContents; 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace extensions { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Extension; 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gfx { 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ImageSkia; 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace task_manager { 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define TASKMANAGER_RESOURCE_TYPE_LIST(def) \ 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(BROWSER) /* The main browser process. */ \ 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(RENDERER) /* A normal WebContents renderer process. */ \ 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(EXTENSION) /* An extension or app process. */ \ 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(NOTIFICATION) /* A notification process. */ \ 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(GUEST) /* A browser plugin guest process. */ \ 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(PLUGIN) /* A plugin process. */ \ 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(WORKER) /* A web worker process. */ \ 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(NACL) /* A NativeClient loader or broker process. */ \ 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(UTILITY) /* A browser utility process. */ \ 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(ZYGOTE) /* A Linux zygote process. */ \ 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(SANDBOX_HELPER) /* A sandbox helper process. */ \ 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(GPU) /* A graphics process. */ 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define TASKMANAGER_RESOURCE_TYPE_LIST_ENUM(a) a, 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING(a) case a: return #a; 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// A resource represents one row in the task manager. 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Resources from similar processes are grouped together by the task manager. 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Resource { 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~Resource() {} 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) enum Type { 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UNKNOWN = 0, 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TASKMANAGER_RESOURCE_TYPE_LIST(TASKMANAGER_RESOURCE_TYPE_LIST_ENUM) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetTitle() const = 0; 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetProfileName() const = 0; 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual gfx::ImageSkia GetIcon() const = 0; 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual base::ProcessHandle GetProcess() const = 0; 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetUniqueChildProcessId() const = 0; 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual Type GetType() const = 0; 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetRoutingID() const; 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsCacheStats() const; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebCache::ResourceTypeStats GetWebCoreCacheStats() const; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsSqliteMemoryUsed() const; 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t SqliteMemoryUsedBytes() const; 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsV8MemoryStats() const; 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t GetV8MemoryAllocated() const; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t GetV8MemoryUsed() const; 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // A helper function for ActivateProcess when selected resource refers 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to a Tab or other window containing web contents. Returns NULL by 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // default because not all resources have an associated web contents. 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual content::WebContents* GetWebContents() const; 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Whether this resource does report the network usage accurately. 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This controls whether 0 or N/A is displayed when no bytes have been 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // reported as being read. This is because some plugins do not report the 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // bytes read and we don't want to display a misleading 0 value in that 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // case. 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool SupportNetworkUsage() const = 0; 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called when some bytes have been read and support_network_usage returns 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // false (meaning we do have network usage support). 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetSupportNetworkUsage() = 0; 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The TaskManagerModel periodically refreshes its data and call this 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // on all live resources. 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Refresh() {} 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void NotifyResourceTypeStats( 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebCache::ResourceTypeStats& stats) {} 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void NotifyV8HeapStats(size_t v8_memory_allocated, 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t v8_memory_used) {} 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static const char* GetResourceTypeAsString(const Type type) { 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (type) { 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TASKMANAGER_RESOURCE_TYPE_LIST(TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING) 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: return "UNKNOWN"; 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Resource() {} 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Resource); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST_ENUM 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ResourceProviders are responsible for adding/removing resources to the task 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// manager. The task manager notifies the ResourceProvider that it is ready 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// to receive resource creation/termination notifications with a call to 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// StartUpdating(). At that point, the resource provider should call 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// AddResource with all the existing resources, and after that it should call 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// AddResource/RemoveResource as resources are created/terminated. 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The provider remains the owner of the resource objects and is responsible 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// for deleting them (when StopUpdating() is called). 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// After StopUpdating() is called the provider should also stop reporting 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// notifications to the task manager. 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Note: ResourceProviders have to be ref counted as they are used in 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// MessageLoop::InvokeLater(). 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ResourceProvider : public base::RefCountedThreadSafe<ResourceProvider> { 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Should return the resource associated to the specified ids, or NULL if 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the resource does not belong to this provider. 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual Resource* GetResource(int origin_pid, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int child_id, 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int route_id) = 0; 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void StartUpdating() = 0; 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void StopUpdating() = 0; 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class base::RefCountedThreadSafe<ResourceProvider>; 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ResourceProvider() {} 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace task_manager 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // CHROME_BROWSER_TASK_MANAGER_RESOURCE_PROVIDER_H_ 151