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