| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/memory/ref_counted.h" |
| 11 #include "ppapi/c/pp_stdint.h" | 12 #include "ppapi/c/pp_stdint.h" |
| 12 #include "ppapi/c/pp_var.h" | 13 #include "ppapi/c/pp_var.h" |
| 13 | 14 |
| 14 struct PPB_Var; | 15 struct PPB_Var; |
| 15 | 16 |
| 16 template<typename T> struct DefaultSingletonTraits; | 17 template<typename T> struct DefaultSingletonTraits; |
| 17 | 18 |
| 18 namespace pp { | 19 namespace pp { |
| 19 namespace proxy { | 20 namespace proxy { |
| 20 | 21 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 44 // across tests. | 45 // across tests. |
| 45 static void SetInstanceForTest(PluginVarTracker* tracker); | 46 static void SetInstanceForTest(PluginVarTracker* tracker); |
| 46 | 47 |
| 47 // Returns the global var tracker for the plugin object. | 48 // Returns the global var tracker for the plugin object. |
| 48 static PluginVarTracker* GetInstance(); | 49 static PluginVarTracker* GetInstance(); |
| 49 | 50 |
| 50 // Allocates a string and returns the ID of it. The refcount will be 1. | 51 // Allocates a string and returns the ID of it. The refcount will be 1. |
| 51 VarID MakeString(const std::string& str); | 52 VarID MakeString(const std::string& str); |
| 52 VarID MakeString(const char* str, uint32_t len); | 53 VarID MakeString(const char* str, uint32_t len); |
| 53 | 54 |
| 54 // Returns the string associated with the given string var. The var must be | |
| 55 // of type string and must be valid or this function will crash. | |
| 56 std::string GetString(const PP_Var& plugin_var) const; | |
| 57 | |
| 58 // Returns a pointer to the given string if it exists, or NULL if the var | 55 // Returns a pointer to the given string if it exists, or NULL if the var |
| 59 // isn't a string var. | 56 // isn't a string var. |
| 60 const std::string* GetExistingString(const PP_Var& plugin_var) const; | 57 const std::string* GetExistingString(const PP_Var& plugin_var) const; |
| 61 | 58 |
| 62 void AddRef(const PP_Var& plugin_var); | 59 void AddRef(const PP_Var& plugin_var); |
| 63 void Release(const PP_Var& plugin_var); | 60 void Release(const PP_Var& plugin_var); |
| 64 | 61 |
| 65 // Manages tracking for receiving a VARTYPE_OBJECT from the remote side | 62 // Manages tracking for receiving a VARTYPE_OBJECT from the remote side |
| 66 // (either the plugin or the renderer) that has already had its reference | 63 // (either the plugin or the renderer) that has already had its reference |
| 67 // count incremented on behalf of the caller. | 64 // count incremented on behalf of the caller. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 86 // Retrieves the internal reference counts for testing. Returns 0 if we | 83 // Retrieves the internal reference counts for testing. Returns 0 if we |
| 87 // know about the object but the corresponding value is 0, or -1 if the | 84 // know about the object but the corresponding value is 0, or -1 if the |
| 88 // given object ID isn't in our map. | 85 // given object ID isn't in our map. |
| 89 int GetRefCountForObject(const PP_Var& plugin_object); | 86 int GetRefCountForObject(const PP_Var& plugin_object); |
| 90 int GetTrackedWithNoReferenceCountForObject(const PP_Var& plugin_object); | 87 int GetTrackedWithNoReferenceCountForObject(const PP_Var& plugin_object); |
| 91 | 88 |
| 92 private: | 89 private: |
| 93 friend struct DefaultSingletonTraits<PluginVarTracker>; | 90 friend struct DefaultSingletonTraits<PluginVarTracker>; |
| 94 friend class PluginProxyTest; | 91 friend class PluginProxyTest; |
| 95 | 92 |
| 93 class RefCountedString : public base::RefCounted<RefCountedString> { |
| 94 public: |
| 95 RefCountedString() { |
| 96 } |
| 97 RefCountedString(const std::string& str) : value_(str) { |
| 98 } |
| 99 RefCountedString(const char* data, size_t len) |
| 100 : value_(data, len) { |
| 101 } |
| 102 |
| 103 const std::string& value() const { return value_; } |
| 104 |
| 105 private: |
| 106 std::string value_; |
| 107 |
| 108 // Ensure only base::RefCounted can delete a RefCountedString. |
| 109 friend void base::RefCounted<RefCountedString>::Release() const; |
| 110 virtual ~RefCountedString() {} |
| 111 }; |
| 112 typedef scoped_refptr<RefCountedString> RefCountedStringPtr; |
| 113 |
| 96 // Represents a var as received from the host. | 114 // Represents a var as received from the host. |
| 97 struct HostVar { | 115 struct HostVar { |
| 98 HostVar(PluginDispatcher* d, int64_t i); | 116 HostVar(PluginDispatcher* d, int64_t i); |
| 99 | 117 |
| 100 bool operator<(const HostVar& other) const; | 118 bool operator<(const HostVar& other) const; |
| 101 | 119 |
| 102 // The dispatcher that sent us this object. This is used so we know how to | 120 // The dispatcher that sent us this object. This is used so we know how to |
| 103 // send back requests on this object. | 121 // send back requests on this object. |
| 104 PluginDispatcher* dispatcher; | 122 PluginDispatcher* dispatcher; |
| 105 | 123 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 void DeletePluginVarInfoIfNecessary(PluginVarInfoMap::iterator iter); | 171 void DeletePluginVarInfoIfNecessary(PluginVarInfoMap::iterator iter); |
| 154 | 172 |
| 155 // Tracks all information about plugin vars. | 173 // Tracks all information about plugin vars. |
| 156 PluginVarInfoMap plugin_var_info_; | 174 PluginVarInfoMap plugin_var_info_; |
| 157 | 175 |
| 158 // Maps host vars to plugin vars. This allows us to know if we've previously | 176 // Maps host vars to plugin vars. This allows us to know if we've previously |
| 159 // seen a host var and re-use the information. | 177 // seen a host var and re-use the information. |
| 160 typedef std::map<HostVar, VarID> HostVarToPluginVarMap; | 178 typedef std::map<HostVar, VarID> HostVarToPluginVarMap; |
| 161 HostVarToPluginVarMap host_var_to_plugin_var_; | 179 HostVarToPluginVarMap host_var_to_plugin_var_; |
| 162 | 180 |
| 163 // The last plugin object ID we've handed out. This must be unique for the | 181 // Maps plugin var IDs to ref counted strings. |
| 182 typedef std::map<VarID, RefCountedStringPtr> VarIDStringMap; |
| 183 VarIDStringMap var_id_to_string_; |
| 184 |
| 185 // The last plugin PP_Var ID we've handed out. This must be unique for the |
| 164 // process. | 186 // process. |
| 165 VarID last_plugin_object_id_; | 187 VarID last_plugin_var_id_; |
| 188 |
| 189 // Get a new Var ID and increment last_plugin_var_id_. |
| 190 VarID GetNewVarID(); |
| 166 }; | 191 }; |
| 167 | 192 |
| 168 } // namespace proxy | 193 } // namespace proxy |
| 169 } // namespace pp | 194 } // namespace pp |
| 170 | 195 |
| 171 #endif // PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ | 196 #endif // PPAPI_PROXY_PLUGIN_VAR_TRACKER_H_ |
| OLD | NEW |