1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
6 #define CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/containers/hash_tables.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/linked_ptr.h"
15 #include "base/memory/ref_counted.h"
16 #include "content/common/content_export.h"
17 #include "ppapi/c/pp_instance.h"
18 #include "ppapi/shared_impl/host_resource.h"
19 #include "ppapi/shared_impl/resource_tracker.h"
20 #include "ppapi/shared_impl/var_tracker.h"
21 #include "v8/include/v8.h"
31 class HostVarTracker
: public ppapi::VarTracker
{
34 ~HostVarTracker() override
;
36 // Tracks all live V8ObjectVar. This is so we can map between instance +
37 // V8Object and get the V8ObjectVar corresponding to it. This Add/Remove
38 // function is called by the V8ObjectVar when it is created and destroyed.
39 void AddV8ObjectVar(ppapi::V8ObjectVar
* object_var
);
40 void RemoveV8ObjectVar(ppapi::V8ObjectVar
* object_var
);
41 // Creates or retrieves a V8ObjectVar.
42 PP_Var
V8ObjectVarForV8Object(PP_Instance instance
,
43 v8::Local
<v8::Object
> object
);
44 // Returns the number of V8ObjectVars associated with the given instance.
45 // Returns 0 if the instance isn't known.
46 CONTENT_EXPORT
int GetLiveV8ObjectVarsForTest(PP_Instance instance
);
48 // VarTracker public implementation.
49 PP_Var
MakeResourcePPVarFromMessage(PP_Instance instance
,
50 const IPC::Message
& creation_message
,
51 int pending_renderer_id
,
52 int pending_browser_id
) override
;
53 ppapi::ResourceVar
* MakeResourceVar(PP_Resource pp_resource
) override
;
54 void DidDeleteInstance(PP_Instance pp_instance
) override
;
56 int TrackSharedMemoryHandle(PP_Instance instance
,
57 base::SharedMemoryHandle file
,
58 uint32 size_in_bytes
) override
;
59 bool StopTrackingSharedMemoryHandle(int id
,
61 base::SharedMemoryHandle
* handle
,
62 uint32
* size_in_bytes
) override
;
65 // VarTracker private implementation.
66 ppapi::ArrayBufferVar
* CreateArrayBuffer(uint32 size_in_bytes
) override
;
67 ppapi::ArrayBufferVar
* CreateShmArrayBuffer(
69 base::SharedMemoryHandle handle
) override
;
71 // Clear the reference count of the given object and remove it from
73 void ForceReleaseV8Object(ppapi::V8ObjectVar
* object_var
);
75 // A non-unique, ordered key for a V8ObjectVar. Contains the hash of the v8
76 // and the instance it is associated with.
77 struct V8ObjectVarKey
{
78 explicit V8ObjectVarKey(ppapi::V8ObjectVar
* object_var
);
79 V8ObjectVarKey(PP_Instance i
, v8::Local
<v8::Object
> object
);
82 bool operator<(const V8ObjectVarKey
& other
) const;
87 typedef std::multimap
<V8ObjectVarKey
, ppapi::V8ObjectVar
*> ObjectMap
;
89 // Returns an iterator into |object_map| which points to V8Object which
90 // is associated with the given instance and object.
91 ObjectMap::iterator
GetForV8Object(PP_Instance instance
,
92 v8::Local
<v8::Object
> object
);
95 // A multimap of V8ObjectVarKey -> ObjectMap.
96 ObjectMap object_map_
;
98 // Tracks all shared memory handles used for transmitting array buffers.
99 struct SharedMemoryMapEntry
{
100 PP_Instance instance
;
101 base::SharedMemoryHandle handle
;
102 uint32 size_in_bytes
;
104 typedef std::map
<int, SharedMemoryMapEntry
> SharedMemoryMap
;
105 SharedMemoryMap shared_memory_map_
;
106 uint32_t last_shared_memory_map_id_
;
108 DISALLOW_COPY_AND_ASSIGN(HostVarTracker
);
111 } // namespace content
113 #endif // CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_