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