blob: f788c6c135b6989e86d0b82b892fea920e4c0bd9 [file] [log] [blame]
[email protected]4614f192011-01-21 00:26:431// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]c2932f5e2010-11-03 03:22:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_
6#define PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_
7
8#include <map>
[email protected]f24448db2011-01-27 20:40:399#include <utility>
[email protected]c2932f5e2010-11-03 03:22:3310
[email protected]cd910b92011-06-01 07:19:3111#include "base/compiler_specific.h"
[email protected]c2932f5e2010-11-03 03:22:3312#include "ppapi/c/pp_completion_callback.h"
[email protected]f24448db2011-01-27 20:40:3913#include "ppapi/c/pp_instance.h"
[email protected]c2932f5e2010-11-03 03:22:3314#include "ppapi/c/pp_stdint.h"
15#include "ppapi/c/pp_resource.h"
16#include "ppapi/c/pp_var.h"
[email protected]2bbd2c672011-08-09 23:14:1317#include "ppapi/proxy/plugin_var_tracker.h"
[email protected]be0a84b2011-08-13 04:18:4418#include "ppapi/shared_impl/host_resource.h"
[email protected]6239d342011-05-06 22:55:4719#include "ppapi/shared_impl/tracker_base.h"
[email protected]c2932f5e2010-11-03 03:22:3320
[email protected]4614f192011-01-21 00:26:4321template<typename T> struct DefaultSingletonTraits;
22
[email protected]ce701cd2011-08-01 21:47:0423namespace ppapi {
24class Var;
25}
26
[email protected]c2932f5e2010-11-03 03:22:3327namespace pp {
28namespace proxy {
29
30class PluginDispatcher;
31class PluginResource;
32
[email protected]55cdf6052011-05-13 19:22:5333class PluginResourceTracker : public ::ppapi::TrackerBase {
[email protected]c2932f5e2010-11-03 03:22:3334 public:
[email protected]f24448db2011-01-27 20:40:3935 // Called by tests that want to specify a specific ResourceTracker. This
36 // allows them to use a unique one each time and avoids singletons sticking
37 // around across tests.
38 static void SetInstanceForTest(PluginResourceTracker* tracker);
39
[email protected]4614f192011-01-21 00:26:4340 // Returns the global singleton resource tracker for the plugin.
41 static PluginResourceTracker* GetInstance();
[email protected]55cdf6052011-05-13 19:22:5342 static ::ppapi::TrackerBase* GetTrackerBaseInstance();
[email protected]c2932f5e2010-11-03 03:22:3343
44 // Returns the object associated with the given resource ID, or NULL if
45 // there isn't one.
46 PluginResource* GetResourceObject(PP_Resource pp_resource);
47
[email protected]f24448db2011-01-27 20:40:3948 // Adds the given resource object to the tracked list, and returns the
49 // plugin-local PP_Resource ID that identifies the resource. Note that this
50 // PP_Resource is not valid to send to the host, use
51 // PluginResource.host_resource() to get that.
[email protected]51e1aec2011-08-11 04:48:3052 //
53 // The resource tracker will take a reference to the given object.
54 PP_Resource AddResource(PluginResource* object);
[email protected]c2932f5e2010-11-03 03:22:3355
56 void AddRefResource(PP_Resource resource);
57 void ReleaseResource(PP_Resource resource);
58
[email protected]f24448db2011-01-27 20:40:3959 // Given a host resource, maps it to an existing plugin resource ID if it
60 // exists, or returns 0 on failure.
61 PP_Resource PluginResourceForHostResource(
[email protected]be0a84b2011-08-13 04:18:4462 const ppapi::HostResource& resource) const;
[email protected]799d1ab2010-11-09 17:16:2863
[email protected]2bbd2c672011-08-09 23:14:1364 PluginVarTracker& var_tracker() {
65 return var_tracker_test_override_ ? *var_tracker_test_override_
66 : var_tracker_;
67 }
68
69 void set_var_tracker_test_override(PluginVarTracker* t) {
70 var_tracker_test_override_ = t;
71 }
72
[email protected]6239d342011-05-06 22:55:4773 // TrackerBase.
[email protected]2bbd2c672011-08-09 23:14:1374 virtual ppapi::ResourceObjectBase* GetResourceAPI(
[email protected]cd910b92011-06-01 07:19:3175 PP_Resource res) OVERRIDE;
[email protected]2bbd2c672011-08-09 23:14:1376 virtual ppapi::FunctionGroupBase* GetFunctionAPI(
[email protected]6239d342011-05-06 22:55:4777 PP_Instance inst,
[email protected]cd910b92011-06-01 07:19:3178 pp::proxy::InterfaceID id) OVERRIDE;
79 virtual PP_Instance GetInstanceForResource(PP_Resource resource) OVERRIDE;
[email protected]2bbd2c672011-08-09 23:14:1380 virtual ppapi::VarTracker* GetVarTracker() OVERRIDE;
[email protected]6239d342011-05-06 22:55:4781
[email protected]c2932f5e2010-11-03 03:22:3382 private:
[email protected]4614f192011-01-21 00:26:4383 friend struct DefaultSingletonTraits<PluginResourceTracker>;
[email protected]f24448db2011-01-27 20:40:3984 friend class PluginResourceTrackerTest;
[email protected]912f3d6c2011-06-29 18:26:3685 friend class PluginProxyTestHarness;
[email protected]4614f192011-01-21 00:26:4386
87 PluginResourceTracker();
[email protected]35343fe72011-06-08 02:20:2188 virtual ~PluginResourceTracker();
[email protected]4614f192011-01-21 00:26:4389
[email protected]c2932f5e2010-11-03 03:22:3390 struct ResourceInfo {
91 ResourceInfo();
[email protected]51e1aec2011-08-11 04:48:3092 ResourceInfo(int ref_count, PluginResource* r);
[email protected]c2932f5e2010-11-03 03:22:3393 ResourceInfo(const ResourceInfo& other);
94 ~ResourceInfo();
95
96 ResourceInfo& operator=(const ResourceInfo& other);
97
98 int ref_count;
[email protected]51e1aec2011-08-11 04:48:3099 scoped_refptr<PluginResource> resource; // May be NULL.
[email protected]c2932f5e2010-11-03 03:22:33100 };
101
102 void ReleasePluginResourceRef(const PP_Resource& var,
103 bool notify_browser_on_release);
104
[email protected]2bbd2c672011-08-09 23:14:13105 // Use the var_tracker_test_override_ instead if it's non-NULL.
106 //
107 // TODO(brettw) this should be somehow separated out from here. I'm thinking
108 // of some global object that manages PPAPI globals, including separate var
109 // and resource trackers.
110 PluginVarTracker var_tracker_;
111
112 // Non-owning pointer to a var tracker mock used by tests. NULL when no
113 // test implementation is provided.
114 PluginVarTracker* var_tracker_test_override_;
115
[email protected]f24448db2011-01-27 20:40:39116 // Map of plugin resource IDs to the information tracking that resource.
[email protected]c2932f5e2010-11-03 03:22:33117 typedef std::map<PP_Resource, ResourceInfo> ResourceMap;
118 ResourceMap resource_map_;
[email protected]f24448db2011-01-27 20:40:39119
120 // Map of host instance/resource pairs to a plugin resource ID.
[email protected]be0a84b2011-08-13 04:18:44121 typedef std::map<ppapi::HostResource, PP_Resource> HostResourceMap;
[email protected]f24448db2011-01-27 20:40:39122 HostResourceMap host_resource_map_;
123
124 // Tracks the last ID we've sent out as a plugin resource so we don't send
125 // duplicates.
126 PP_Resource last_resource_id_;
127
128 DISALLOW_COPY_AND_ASSIGN(PluginResourceTracker);
[email protected]c2932f5e2010-11-03 03:22:33129};
130
131} // namespace proxy
132} // namespace pp
133
134#endif // PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_