Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / content / renderer / pepper / host_var_tracker.h
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.
4
5 #ifndef CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
6 #define CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
7
8 #include <map>
9
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"
22
23 namespace ppapi {
24 class ArrayBufferVar;
25 class V8ObjectVar;
26 class Var;
27 }
28
29 namespace content {
30
31 class HostVarTracker : public ppapi::VarTracker {
32  public:
33   HostVarTracker();
34   ~HostVarTracker() override;
35
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::Handle<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);
47
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;
55
56   int TrackSharedMemoryHandle(PP_Instance instance,
57                               base::SharedMemoryHandle file,
58                               uint32 size_in_bytes) override;
59   bool StopTrackingSharedMemoryHandle(int id,
60                                       PP_Instance instance,
61                                       base::SharedMemoryHandle* handle,
62                                       uint32* size_in_bytes) override;
63
64  private:
65   // VarTracker private implementation.
66   ppapi::ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) override;
67   ppapi::ArrayBufferVar* CreateShmArrayBuffer(
68       uint32 size_in_bytes,
69       base::SharedMemoryHandle handle) override;
70
71   // Clear the reference count of the given object and remove it from
72   // live_vars_.
73   void ForceReleaseV8Object(ppapi::V8ObjectVar* object_var);
74
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::Handle<v8::Object> object);
80     ~V8ObjectVarKey();
81
82     bool operator<(const V8ObjectVarKey& other) const;
83
84     PP_Instance instance;
85     int hash;
86   };
87   typedef std::multimap<V8ObjectVarKey, ppapi::V8ObjectVar*> ObjectMap;
88
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::Handle<v8::Object> object);
93
94
95   // A multimap of V8ObjectVarKey -> ObjectMap.
96   ObjectMap object_map_;
97
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;
103   };
104   typedef std::map<int, SharedMemoryMapEntry> SharedMemoryMap;
105   SharedMemoryMap shared_memory_map_;
106   uint32_t last_shared_memory_map_id_;
107
108   DISALLOW_COPY_AND_ASSIGN(HostVarTracker);
109 };
110
111 }  // namespace content
112
113 #endif  // CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_