| 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 PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ | 5 #ifndef PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ |
| 6 #define PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ | 6 #define PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | |
| 12 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/macros.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "base/memory/shared_memory.h" | 14 #include "base/memory/shared_memory.h" |
| 15 #include "ppapi/c/pp_stdint.h" | 15 #include "ppapi/c/pp_stdint.h" |
| 16 #include "ppapi/c/pp_var.h" | 16 #include "ppapi/c/pp_var.h" |
| 17 #include "ppapi/proxy/ppapi_proxy_export.h" | 17 #include "ppapi/proxy/ppapi_proxy_export.h" |
| 18 #include "ppapi/shared_impl/var_tracker.h" | 18 #include "ppapi/shared_impl/var_tracker.h" |
| 19 | 19 |
| 20 namespace base { | 20 namespace base { |
| 21 template<typename T> struct DefaultSingletonTraits; | 21 template<typename T> struct DefaultSingletonTraits; |
| 22 } | 22 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 | 63 |
| 64 // VarTracker public overrides. | 64 // VarTracker public overrides. |
| 65 PP_Var MakeResourcePPVarFromMessage(PP_Instance instance, | 65 PP_Var MakeResourcePPVarFromMessage(PP_Instance instance, |
| 66 const IPC::Message& creation_message, | 66 const IPC::Message& creation_message, |
| 67 int pending_renderer_id, | 67 int pending_renderer_id, |
| 68 int pending_browser_id) override; | 68 int pending_browser_id) override; |
| 69 ResourceVar* MakeResourceVar(PP_Resource pp_resource) override; | 69 ResourceVar* MakeResourceVar(PP_Resource pp_resource) override; |
| 70 void DidDeleteInstance(PP_Instance instance) override; | 70 void DidDeleteInstance(PP_Instance instance) override; |
| 71 int TrackSharedMemoryHandle(PP_Instance instance, | 71 int TrackSharedMemoryHandle(PP_Instance instance, |
| 72 base::SharedMemoryHandle file, | 72 base::SharedMemoryHandle file, |
| 73 uint32 size_in_bytes) override; | 73 uint32_t size_in_bytes) override; |
| 74 bool StopTrackingSharedMemoryHandle(int id, | 74 bool StopTrackingSharedMemoryHandle(int id, |
| 75 PP_Instance instance, | 75 PP_Instance instance, |
| 76 base::SharedMemoryHandle* handle, | 76 base::SharedMemoryHandle* handle, |
| 77 uint32* size_in_bytes) override; | 77 uint32_t* size_in_bytes) override; |
| 78 | 78 |
| 79 // Notification that a plugin-implemented object (PPP_Class) was created by | 79 // Notification that a plugin-implemented object (PPP_Class) was created by |
| 80 // the plugin or deallocated by WebKit over IPC. | 80 // the plugin or deallocated by WebKit over IPC. |
| 81 void PluginImplementedObjectCreated(PP_Instance instance, | 81 void PluginImplementedObjectCreated(PP_Instance instance, |
| 82 const PP_Var& created_var, | 82 const PP_Var& created_var, |
| 83 const PPP_Class_Deprecated* ppp_class, | 83 const PPP_Class_Deprecated* ppp_class, |
| 84 void* ppp_class_data); | 84 void* ppp_class_data); |
| 85 void PluginImplementedObjectDestroyed(void* ppp_class_data); | 85 void PluginImplementedObjectDestroyed(void* ppp_class_data); |
| 86 | 86 |
| 87 // Returns true if there is an object implemented by the plugin with the | 87 // Returns true if there is an object implemented by the plugin with the |
| 88 // given user_data that has not been deallocated yet. Call this when | 88 // given user_data that has not been deallocated yet. Call this when |
| 89 // receiving a scripting call to the plugin to validate that the object | 89 // receiving a scripting call to the plugin to validate that the object |
| 90 // receiving the call is still alive (see user_data_to_plugin_ below). | 90 // receiving the call is still alive (see user_data_to_plugin_ below). |
| 91 bool IsPluginImplementedObjectAlive(void* user_data); | 91 bool IsPluginImplementedObjectAlive(void* user_data); |
| 92 | 92 |
| 93 // Validates that the given class/user_data pair corresponds to a currently | 93 // Validates that the given class/user_data pair corresponds to a currently |
| 94 // living plugin object. | 94 // living plugin object. |
| 95 bool ValidatePluginObjectCall(const PPP_Class_Deprecated* ppp_class, | 95 bool ValidatePluginObjectCall(const PPP_Class_Deprecated* ppp_class, |
| 96 void* user_data); | 96 void* user_data); |
| 97 | 97 |
| 98 void DidDeleteDispatcher(PluginDispatcher* dispatcher); | 98 void DidDeleteDispatcher(PluginDispatcher* dispatcher); |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 // VarTracker protected overrides. | 101 // VarTracker protected overrides. |
| 102 int32 AddVarInternal(Var* var, AddVarRefMode mode) override; | 102 int32_t AddVarInternal(Var* var, AddVarRefMode mode) override; |
| 103 void TrackedObjectGettingOneRef(VarMap::const_iterator iter) override; | 103 void TrackedObjectGettingOneRef(VarMap::const_iterator iter) override; |
| 104 void ObjectGettingZeroRef(VarMap::iterator iter) override; | 104 void ObjectGettingZeroRef(VarMap::iterator iter) override; |
| 105 bool DeleteObjectInfoIfNecessary(VarMap::iterator iter) override; | 105 bool DeleteObjectInfoIfNecessary(VarMap::iterator iter) override; |
| 106 ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) override; | 106 ArrayBufferVar* CreateArrayBuffer(uint32_t size_in_bytes) override; |
| 107 ArrayBufferVar* CreateShmArrayBuffer( | 107 ArrayBufferVar* CreateShmArrayBuffer( |
| 108 uint32 size_in_bytes, | 108 uint32_t size_in_bytes, |
| 109 base::SharedMemoryHandle handle) override; | 109 base::SharedMemoryHandle handle) override; |
| 110 | 110 |
| 111 private: | 111 private: |
| 112 friend struct base::DefaultSingletonTraits<PluginVarTracker>; | 112 friend struct base::DefaultSingletonTraits<PluginVarTracker>; |
| 113 friend class PluginProxyTestHarness; | 113 friend class PluginProxyTestHarness; |
| 114 | 114 |
| 115 // Represents a var as received from the host. | 115 // Represents a var as received from the host. |
| 116 struct HostVar { | 116 struct HostVar { |
| 117 HostVar(PluginDispatcher* d, int32 i); | 117 HostVar(PluginDispatcher* d, int32_t i); |
| 118 | 118 |
| 119 bool operator<(const HostVar& other) const; | 119 bool operator<(const HostVar& other) const; |
| 120 | 120 |
| 121 // The dispatcher that sent us this object. This is used so we know how to | 121 // The dispatcher that sent us this object. This is used so we know how to |
| 122 // send back requests on this object. | 122 // send back requests on this object. |
| 123 PluginDispatcher* dispatcher; | 123 PluginDispatcher* dispatcher; |
| 124 | 124 |
| 125 // The object ID that the host generated to identify the object. This is | 125 // The object ID that the host generated to identify the object. This is |
| 126 // unique only within that host: different hosts could give us different | 126 // unique only within that host: different hosts could give us different |
| 127 // objects with the same ID. | 127 // objects with the same ID. |
| 128 int32 host_object_id; | 128 int32_t host_object_id; |
| 129 }; | 129 }; |
| 130 | 130 |
| 131 struct PluginImplementedVar { | 131 struct PluginImplementedVar { |
| 132 const PPP_Class_Deprecated* ppp_class; | 132 const PPP_Class_Deprecated* ppp_class; |
| 133 | 133 |
| 134 // The instance that created this Var. This will be 0 if the instance has | 134 // The instance that created this Var. This will be 0 if the instance has |
| 135 // been destroyed but the object is still alive. | 135 // been destroyed but the object is still alive. |
| 136 PP_Instance instance; | 136 PP_Instance instance; |
| 137 | 137 |
| 138 // Represents the plugin var ID for the var corresponding to this object. | 138 // Represents the plugin var ID for the var corresponding to this object. |
| 139 // If the plugin does not have a ref to the object but it's still alive | 139 // If the plugin does not have a ref to the object but it's still alive |
| 140 // (the DOM could be holding a ref keeping it alive) this will be 0. | 140 // (the DOM could be holding a ref keeping it alive) this will be 0. |
| 141 // | 141 // |
| 142 // There is an obscure corner case. If the plugin returns an object to the | 142 // There is an obscure corner case. If the plugin returns an object to the |
| 143 // renderer and releases all of its refs, the object will still be alive | 143 // renderer and releases all of its refs, the object will still be alive |
| 144 // but there will be no plugin refs. It's possible for the plugin to get | 144 // but there will be no plugin refs. It's possible for the plugin to get |
| 145 // this same object again through the DOM, and we'll lose the correlation | 145 // this same object again through the DOM, and we'll lose the correlation |
| 146 // between plugin implemented object and car. This means we won't know when | 146 // between plugin implemented object and car. This means we won't know when |
| 147 // the plugin releases its last refs and may call Deallocate when the | 147 // the plugin releases its last refs and may call Deallocate when the |
| 148 // plugin is still holding a ref. | 148 // plugin is still holding a ref. |
| 149 // | 149 // |
| 150 // However, for the plugin to be depending on holding a ref to an object | 150 // However, for the plugin to be depending on holding a ref to an object |
| 151 // that it implements that it previously released but got again through | 151 // that it implements that it previously released but got again through |
| 152 // indirect means would be extremely rare, and we only allow var scripting | 152 // indirect means would be extremely rare, and we only allow var scripting |
| 153 // in limited cases anyway. | 153 // in limited cases anyway. |
| 154 int32 plugin_object_id; | 154 int32_t plugin_object_id; |
| 155 }; | 155 }; |
| 156 | 156 |
| 157 // Returns the existing var ID for the given object var, creating and | 157 // Returns the existing var ID for the given object var, creating and |
| 158 // assigning an ID to it if necessary. This does not affect the reference | 158 // assigning an ID to it if necessary. This does not affect the reference |
| 159 // count, so in the creation case the refcount will be 0. It's assumed in | 159 // count, so in the creation case the refcount will be 0. It's assumed in |
| 160 // this case the caller will either adjust the refcount or the | 160 // this case the caller will either adjust the refcount or the |
| 161 // track_with_no_reference_count. | 161 // track_with_no_reference_count. |
| 162 PP_Var GetOrCreateObjectVarID(ProxyObjectVar* object); | 162 PP_Var GetOrCreateObjectVarID(ProxyObjectVar* object); |
| 163 | 163 |
| 164 // Sends an addref or release message to the browser for the given object ID. | 164 // Sends an addref or release message to the browser for the given object ID. |
| 165 void SendAddRefObjectMsg(const ProxyObjectVar& proxy_object); | 165 void SendAddRefObjectMsg(const ProxyObjectVar& proxy_object); |
| 166 void SendReleaseObjectMsg(const ProxyObjectVar& proxy_object); | 166 void SendReleaseObjectMsg(const ProxyObjectVar& proxy_object); |
| 167 | 167 |
| 168 // Looks up the given host var. If we already know about it, returns a | 168 // Looks up the given host var. If we already know about it, returns a |
| 169 // reference to the already-tracked object. If it doesn't creates a new one | 169 // reference to the already-tracked object. If it doesn't creates a new one |
| 170 // and returns it. If it's created, it's not added to the map. | 170 // and returns it. If it's created, it's not added to the map. |
| 171 scoped_refptr<ProxyObjectVar> FindOrMakePluginVarFromHostVar( | 171 scoped_refptr<ProxyObjectVar> FindOrMakePluginVarFromHostVar( |
| 172 const PP_Var& var, | 172 const PP_Var& var, |
| 173 PluginDispatcher* dispatcher); | 173 PluginDispatcher* dispatcher); |
| 174 | 174 |
| 175 // Maps host vars in the host to IDs in the plugin process. | 175 // Maps host vars in the host to IDs in the plugin process. |
| 176 typedef std::map<HostVar, int32> HostVarToPluginVarMap; | 176 typedef std::map<HostVar, int32_t> HostVarToPluginVarMap; |
| 177 HostVarToPluginVarMap host_var_to_plugin_var_; | 177 HostVarToPluginVarMap host_var_to_plugin_var_; |
| 178 | 178 |
| 179 // Maps "user data" for plugin implemented objects (PPP_Class) that are | 179 // Maps "user data" for plugin implemented objects (PPP_Class) that are |
| 180 // alive to various tracking info. | 180 // alive to various tracking info. |
| 181 // | 181 // |
| 182 // This is tricky because there may not actually be any vars in the plugin | 182 // This is tricky because there may not actually be any vars in the plugin |
| 183 // associated with a plugin-implemented object, so they won't all have | 183 // associated with a plugin-implemented object, so they won't all have |
| 184 // entries in our HostVarToPluginVarMap or the base class VarTracker's map. | 184 // entries in our HostVarToPluginVarMap or the base class VarTracker's map. |
| 185 // | 185 // |
| 186 // All objects that the plugin has created using CreateObject that have not | 186 // All objects that the plugin has created using CreateObject that have not |
| (...skipping 17 matching lines...) Expand all Loading... |
| 204 UserDataToPluginImplementedVarMap; | 204 UserDataToPluginImplementedVarMap; |
| 205 UserDataToPluginImplementedVarMap user_data_to_plugin_; | 205 UserDataToPluginImplementedVarMap user_data_to_plugin_; |
| 206 | 206 |
| 207 DISALLOW_COPY_AND_ASSIGN(PluginVarTracker); | 207 DISALLOW_COPY_AND_ASSIGN(PluginVarTracker); |
| 208 }; | 208 }; |
| 209 | 209 |
| 210 } // namespace proxy | 210 } // namespace proxy |
| 211 } // namespace ppapi | 211 } // namespace ppapi |
| 212 | 212 |
| 213 #endif // PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ | 213 #endif // PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ |
| OLD | NEW |