resource_provider.h revision 868fa2fe829687343ffae624259930155e16dbd8
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" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/process_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/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(PROFILE_IMPORT) /* A profile import process. */ \ 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(ZYGOTE) /* A Linux zygote process. */ \ 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(SANDBOX_HELPER) /* A sandbox helper process. */ \ 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) def(GPU) /* A graphics process. */ 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define TASKMANAGER_RESOURCE_TYPE_LIST_ENUM(a) a, 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING(a) case a: return #a; 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// A resource represents one row in the task manager. 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Resources from similar processes are grouped together by the task manager. 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Resource { 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~Resource() {} 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) enum Type { 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UNKNOWN = 0, 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TASKMANAGER_RESOURCE_TYPE_LIST(TASKMANAGER_RESOURCE_TYPE_LIST_ENUM) 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual string16 GetTitle() const = 0; 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual string16 GetProfileName() const = 0; 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual gfx::ImageSkia GetIcon() const = 0; 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual base::ProcessHandle GetProcess() const = 0; 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetUniqueChildProcessId() const = 0; 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual Type GetType() const = 0; 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetRoutingID() const; 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsCacheStats() const; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual WebKit::WebCache::ResourceTypeStats GetWebCoreCacheStats() const; 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsFPS() const; 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual float GetFPS() const; 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsSqliteMemoryUsed() const; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t SqliteMemoryUsedBytes() const; 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Return extension associated with the resource, or NULL if not applicable. 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual const extensions::Extension* GetExtension() const; 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ReportsV8MemoryStats() const; 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t GetV8MemoryAllocated() const; 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual size_t GetV8MemoryUsed() const; 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns true if this resource can be inspected using developer tools. 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool CanInspect() const; 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Invokes or reveals developer tools window for this resource. 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Inspect() const {} 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // A helper function for ActivateProcess when selected resource refers 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to a Tab or other window containing web contents. Returns NULL by 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // default because not all resources have an associated web contents. 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual content::WebContents* GetWebContents() const; 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Whether this resource does report the network usage accurately. 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This controls whether 0 or N/A is displayed when no bytes have been 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // reported as being read. This is because some plugins do not report the 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // bytes read and we don't want to display a misleading 0 value in that 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // case. 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool SupportNetworkUsage() const = 0; 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called when some bytes have been read and support_network_usage returns 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // false (meaning we do have network usage support). 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetSupportNetworkUsage() = 0; 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The TaskManagerModel periodically refreshes its data and call this 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // on all live resources. 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Refresh() {} 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void NotifyResourceTypeStats( 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebKit::WebCache::ResourceTypeStats& stats) {} 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void NotifyFPS(float fps) {} 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void NotifyV8HeapStats(size_t v8_memory_allocated, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t v8_memory_used) {} 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns true if this resource is not visible to the user because it lives 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // in the background (e.g. extension background page, background contents). 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool IsBackground() const; 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static const char* GetResourceTypeAsString(const Type type) { 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (type) { 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TASKMANAGER_RESOURCE_TYPE_LIST(TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: return "UNKNOWN"; 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns resource identifier that is unique within single task manager 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // session (between StartUpdating and StopUpdating). 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int get_unique_id() { return unique_id_; } 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Resource() : unique_id_(0) {} 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class ::TaskManagerModel; 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int unique_id_; 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Resource); 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST_ENUM 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#undef TASKMANAGER_RESOURCE_TYPE_LIST_AS_STRING 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ResourceProviders are responsible for adding/removing resources to the task 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// manager. The task manager notifies the ResourceProvider that it is ready 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// to receive resource creation/termination notifications with a call to 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// StartUpdating(). At that point, the resource provider should call 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// AddResource with all the existing resources, and after that it should call 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// AddResource/RemoveResource as resources are created/terminated. 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The provider remains the owner of the resource objects and is responsible 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// for deleting them (when StopUpdating() is called). 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// After StopUpdating() is called the provider should also stop reporting 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// notifications to the task manager. 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Note: ResourceProviders have to be ref counted as they are used in 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// MessageLoop::InvokeLater(). 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ResourceProvider : public base::RefCountedThreadSafe<ResourceProvider> { 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Should return the resource associated to the specified ids, or NULL if 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the resource does not belong to this provider. 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual Resource* GetResource(int process_id, 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int render_process_host_id, 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int routing_id) = 0; 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void StartUpdating() = 0; 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void StopUpdating() = 0; 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class base::RefCountedThreadSafe<ResourceProvider>; 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ResourceProvider() {} 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namepace task_manager 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // CHROME_BROWSER_TASK_MANAGER_RESOURCE_PROVIDER_H_ 176