| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ | 5 #ifndef CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ |
| 6 #define CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ | 6 #define CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/containers/hash_tables.h" | 12 #include "base/containers/hash_tables.h" |
| 13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
| 14 #include "base/memory/linked_ptr.h" | 14 #include "base/memory/linked_ptr.h" |
| 15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 16 #include "content/common/content_export.h" | 16 #include "content/common/content_export.h" |
| 17 #include "ppapi/c/pp_instance.h" | 17 #include "ppapi/c/pp_instance.h" |
| 18 #include "ppapi/shared_impl/host_resource.h" | 18 #include "ppapi/shared_impl/host_resource.h" |
| 19 #include "ppapi/shared_impl/resource_tracker.h" | 19 #include "ppapi/shared_impl/resource_tracker.h" |
| 20 #include "ppapi/shared_impl/var_tracker.h" | 20 #include "ppapi/shared_impl/var_tracker.h" |
| 21 #include "v8/include/v8.h" | 21 #include "v8/include/v8.h" |
| 22 | 22 |
| 23 typedef struct NPObject NPObject; |
| 24 |
| 23 namespace ppapi { | 25 namespace ppapi { |
| 24 class ArrayBufferVar; | 26 class ArrayBufferVar; |
| 27 class NPObjectVar; |
| 25 class V8ObjectVar; | 28 class V8ObjectVar; |
| 26 class Var; | 29 class Var; |
| 27 } | 30 } |
| 28 | 31 |
| 29 namespace content { | 32 namespace content { |
| 30 | 33 |
| 34 // Adds NPObject var tracking to the standard PPAPI VarTracker for use in the |
| 35 // renderer. |
| 31 class HostVarTracker : public ppapi::VarTracker { | 36 class HostVarTracker : public ppapi::VarTracker { |
| 32 public: | 37 public: |
| 33 HostVarTracker(); | 38 HostVarTracker(); |
| 34 virtual ~HostVarTracker(); | 39 virtual ~HostVarTracker(); |
| 35 | 40 |
| 41 // Tracks all live NPObjectVar. This is so we can map between instance + |
| 42 // NPObject and get the NPObjectVar corresponding to it. This Add/Remove |
| 43 // function is called by the NPObjectVar when it is created and |
| 44 // destroyed. |
| 45 void AddNPObjectVar(ppapi::NPObjectVar* object_var); |
| 46 void RemoveNPObjectVar(ppapi::NPObjectVar* object_var); |
| 47 |
| 48 // Looks up a previously registered NPObjectVar for the given NPObject and |
| 49 // instance. Returns NULL if there is no NPObjectVar corresponding to the |
| 50 // given NPObject for the given instance. See AddNPObjectVar above. |
| 51 ppapi::NPObjectVar* NPObjectVarForNPObject(PP_Instance instance, |
| 52 NPObject* np_object); |
| 53 |
| 54 // Returns the number of NPObjectVar's associated with the given instance. |
| 55 // Returns 0 if the instance isn't known. |
| 56 CONTENT_EXPORT int GetLiveNPObjectVarsForInstance(PP_Instance instance) const; |
| 57 |
| 36 // Tracks all live V8ObjectVar. This is so we can map between instance + | 58 // Tracks all live V8ObjectVar. This is so we can map between instance + |
| 37 // V8Object and get the V8ObjectVar corresponding to it. This Add/Remove | 59 // V8Object and get the V8ObjectVar corresponding to it. This Add/Remove |
| 38 // function is called by the V8ObjectVar when it is created and destroyed. | 60 // function is called by the V8ObjectVar when it is created and destroyed. |
| 39 void AddV8ObjectVar(ppapi::V8ObjectVar* object_var); | 61 void AddV8ObjectVar(ppapi::V8ObjectVar* object_var) { NOTIMPLEMENTED(); } |
| 40 void RemoveV8ObjectVar(ppapi::V8ObjectVar* object_var); | 62 void RemoveV8ObjectVar(ppapi::V8ObjectVar* object_var) { NOTIMPLEMENTED(); } |
| 41 // Creates or retrieves a V8ObjectVar. | 63 // Creates or retrieves a V8ObjectVar. |
| 42 PP_Var V8ObjectVarForV8Object(PP_Instance instance, | 64 PP_Var V8ObjectVarForV8Object(PP_Instance instance, |
| 43 v8::Handle<v8::Object> object); | 65 v8::Handle<v8::Object> object) { |
| 44 // Returns the number of V8ObjectVars associated with the given instance. | 66 NOTIMPLEMENTED(); |
| 45 // Returns 0 if the instance isn't known. | 67 return PP_MakeUndefined(); |
| 46 CONTENT_EXPORT int GetLiveV8ObjectVarsForTest(PP_Instance instance); | 68 } |
| 47 | 69 |
| 48 // VarTracker public implementation. | 70 // VarTracker public implementation. |
| 49 virtual PP_Var MakeResourcePPVarFromMessage( | 71 virtual PP_Var MakeResourcePPVarFromMessage( |
| 50 PP_Instance instance, | 72 PP_Instance instance, |
| 51 const IPC::Message& creation_message, | 73 const IPC::Message& creation_message, |
| 52 int pending_renderer_id, | 74 int pending_renderer_id, |
| 53 int pending_browser_id) OVERRIDE; | 75 int pending_browser_id) OVERRIDE; |
| 54 virtual ppapi::ResourceVar* MakeResourceVar(PP_Resource pp_resource) OVERRIDE; | 76 virtual ppapi::ResourceVar* MakeResourceVar(PP_Resource pp_resource) OVERRIDE; |
| 55 virtual void DidDeleteInstance(PP_Instance pp_instance) OVERRIDE; | 77 virtual void DidDeleteInstance(PP_Instance instance) OVERRIDE; |
| 56 | 78 |
| 57 virtual int TrackSharedMemoryHandle(PP_Instance instance, | 79 virtual int TrackSharedMemoryHandle(PP_Instance instance, |
| 58 base::SharedMemoryHandle file, | 80 base::SharedMemoryHandle file, |
| 59 uint32 size_in_bytes) OVERRIDE; | 81 uint32 size_in_bytes) OVERRIDE; |
| 60 virtual bool StopTrackingSharedMemoryHandle(int id, | 82 virtual bool StopTrackingSharedMemoryHandle(int id, |
| 61 PP_Instance instance, | 83 PP_Instance instance, |
| 62 base::SharedMemoryHandle* handle, | 84 base::SharedMemoryHandle* handle, |
| 63 uint32* size_in_bytes) OVERRIDE; | 85 uint32* size_in_bytes) OVERRIDE; |
| 64 | 86 |
| 65 private: | 87 private: |
| 66 // VarTracker private implementation. | 88 // VarTracker private implementation. |
| 67 virtual ppapi::ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) | 89 virtual ppapi::ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) |
| 68 OVERRIDE; | 90 OVERRIDE; |
| 69 virtual ppapi::ArrayBufferVar* CreateShmArrayBuffer( | 91 virtual ppapi::ArrayBufferVar* CreateShmArrayBuffer( |
| 70 uint32 size_in_bytes, | 92 uint32 size_in_bytes, |
| 71 base::SharedMemoryHandle handle) OVERRIDE; | 93 base::SharedMemoryHandle handle) OVERRIDE; |
| 72 | 94 |
| 73 // Clear the reference count of the given object and remove it from | 95 // Clear the reference count of the given object and remove it from |
| 74 // live_vars_. | 96 // live_vars_. |
| 75 void ForceReleaseV8Object(ppapi::V8ObjectVar* object_var); | 97 void ForceReleaseNPObject(ppapi::NPObjectVar* object_var); |
| 76 | 98 |
| 77 // A non-unique, ordered key for a V8ObjectVar. Contains the hash of the v8 | 99 typedef std::map<NPObject*, ppapi::NPObjectVar*> NPObjectToNPObjectVarMap; |
| 78 // and the instance it is associated with. | |
| 79 struct V8ObjectVarKey { | |
| 80 explicit V8ObjectVarKey(ppapi::V8ObjectVar* object_var); | |
| 81 V8ObjectVarKey(PP_Instance i, v8::Handle<v8::Object> object); | |
| 82 ~V8ObjectVarKey(); | |
| 83 | 100 |
| 84 bool operator<(const V8ObjectVarKey& other) const; | 101 // Lists all known NPObjects, first indexed by the corresponding instance, |
| 85 | 102 // then by the NPObject*. This allows us to look up an NPObjectVar given |
| 86 PP_Instance instance; | 103 // these two pieces of information. |
| 87 int hash; | 104 // |
| 88 }; | 105 // The instance map is lazily managed, so we'll add the |
| 89 typedef std::multimap<V8ObjectVarKey, ppapi::V8ObjectVar*> ObjectMap; | 106 // NPObjectToNPObjectVarMap lazily when the first NPObject var is created, |
| 90 | 107 // and delete it when it's empty. |
| 91 // Returns an iterator into |object_map| which points to V8Object which | 108 typedef std::map<PP_Instance, linked_ptr<NPObjectToNPObjectVarMap> > |
| 92 // is associated with the given instance and object. | 109 InstanceMap; |
| 93 ObjectMap::iterator GetForV8Object(PP_Instance instance, | 110 InstanceMap instance_map_; |
| 94 v8::Handle<v8::Object> object); | |
| 95 | |
| 96 | |
| 97 // A multimap of V8ObjectVarKey -> ObjectMap. | |
| 98 ObjectMap object_map_; | |
| 99 | 111 |
| 100 // Tracks all shared memory handles used for transmitting array buffers. | 112 // Tracks all shared memory handles used for transmitting array buffers. |
| 101 struct SharedMemoryMapEntry { | 113 struct SharedMemoryMapEntry { |
| 102 PP_Instance instance; | 114 PP_Instance instance; |
| 103 base::SharedMemoryHandle handle; | 115 base::SharedMemoryHandle handle; |
| 104 uint32 size_in_bytes; | 116 uint32 size_in_bytes; |
| 105 }; | 117 }; |
| 106 typedef std::map<int, SharedMemoryMapEntry> SharedMemoryMap; | 118 typedef std::map<int, SharedMemoryMapEntry> SharedMemoryMap; |
| 107 SharedMemoryMap shared_memory_map_; | 119 SharedMemoryMap shared_memory_map_; |
| 108 uint32_t last_shared_memory_map_id_; | 120 uint32_t last_shared_memory_map_id_; |
| 109 | 121 |
| 110 DISALLOW_COPY_AND_ASSIGN(HostVarTracker); | 122 DISALLOW_COPY_AND_ASSIGN(HostVarTracker); |
| 111 }; | 123 }; |
| 112 | 124 |
| 113 } // namespace content | 125 } // namespace content |
| 114 | 126 |
| 115 #endif // CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ | 127 #endif // CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_ |
| OLD | NEW |