OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "ppapi/proxy/plugin_var_tracker.h" | 5 #include "ppapi/proxy/plugin_var_tracker.h" |
6 | 6 |
7 #include "base/ref_counted.h" | 7 #include "base/ref_counted.h" |
8 #include "base/singleton.h" | 8 #include "base/singleton.h" |
9 #include "ppapi/c/ppb_var.h" | 9 #include "ppapi/c/ppb_var.h" |
10 #include "ppapi/proxy/ppapi_messages.h" | 10 #include "ppapi/proxy/ppapi_messages.h" |
11 #include "ppapi/proxy/interface_id.h" | 11 #include "ppapi/proxy/interface_id.h" |
12 | 12 |
13 namespace pp { | 13 namespace pp { |
14 namespace proxy { | 14 namespace proxy { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
| 18 // When non-NULL, this object overrides the VarTrackerSingleton. |
| 19 PluginVarTracker* var_tracker_override = NULL; |
| 20 |
18 class RefCountedString : public base::RefCounted<RefCountedString> { | 21 class RefCountedString : public base::RefCounted<RefCountedString> { |
19 public: | 22 public: |
20 RefCountedString() { | 23 RefCountedString() { |
21 } | 24 } |
22 RefCountedString(const std::string& str) : value_(str) { | 25 RefCountedString(const std::string& str) : value_(str) { |
23 } | 26 } |
24 RefCountedString(const char* data, size_t len) | 27 RefCountedString(const char* data, size_t len) |
25 : value_(data, len) { | 28 : value_(data, len) { |
26 } | 29 } |
27 | 30 |
(...skipping 29 matching lines...) Expand all Loading... |
57 ref_count(0), | 60 ref_count(0), |
58 track_with_no_reference_count(0) { | 61 track_with_no_reference_count(0) { |
59 } | 62 } |
60 | 63 |
61 PluginVarTracker::PluginVarTracker() : last_plugin_object_id_(0) { | 64 PluginVarTracker::PluginVarTracker() : last_plugin_object_id_(0) { |
62 } | 65 } |
63 | 66 |
64 PluginVarTracker::~PluginVarTracker() { | 67 PluginVarTracker::~PluginVarTracker() { |
65 } | 68 } |
66 | 69 |
| 70 // static |
| 71 void PluginVarTracker::SetInstanceForTest(PluginVarTracker* tracker) { |
| 72 var_tracker_override = tracker; |
| 73 } |
| 74 |
| 75 // static |
67 PluginVarTracker* PluginVarTracker::GetInstance() { | 76 PluginVarTracker* PluginVarTracker::GetInstance() { |
| 77 if (var_tracker_override) |
| 78 return var_tracker_override; |
68 return Singleton<PluginVarTracker>::get(); | 79 return Singleton<PluginVarTracker>::get(); |
69 } | 80 } |
70 | 81 |
71 PluginVarTracker::VarID PluginVarTracker::MakeString(const std::string& str) { | 82 PluginVarTracker::VarID PluginVarTracker::MakeString(const std::string& str) { |
72 RefCountedString* out = new RefCountedString(str); | 83 RefCountedString* out = new RefCountedString(str); |
73 out->AddRef(); | 84 out->AddRef(); |
74 return static_cast<VarID>(reinterpret_cast<intptr_t>(out)); | 85 return static_cast<VarID>(reinterpret_cast<intptr_t>(out)); |
75 } | 86 } |
76 | 87 |
77 PluginVarTracker::VarID PluginVarTracker::MakeString(const char* str, | 88 PluginVarTracker::VarID PluginVarTracker::MakeString(const char* str, |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 if (found == plugin_var_info_.end()) { | 225 if (found == plugin_var_info_.end()) { |
215 NOTREACHED(); | 226 NOTREACHED(); |
216 return PP_MakeUndefined(); | 227 return PP_MakeUndefined(); |
217 } | 228 } |
218 PP_Var ret; | 229 PP_Var ret; |
219 ret.type = PP_VARTYPE_OBJECT; | 230 ret.type = PP_VARTYPE_OBJECT; |
220 ret.value.as_id = found->second.host_var.host_object_id; | 231 ret.value.as_id = found->second.host_var.host_object_id; |
221 return ret; | 232 return ret; |
222 } | 233 } |
223 | 234 |
| 235 void PluginVarTracker::ReleaseHostObject(Sender* sender, |
| 236 const PP_Var& host_object) { |
| 237 // Convert the host object to a normal var valid in the plugin. |
| 238 DCHECK(host_object.type == PP_VARTYPE_OBJECT); |
| 239 HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find( |
| 240 HostVar(sender, host_object.value.as_id)); |
| 241 if (found == host_var_to_plugin_var_.end()) { |
| 242 NOTREACHED(); |
| 243 return; |
| 244 } |
| 245 |
| 246 // Now just release the object like normal. |
| 247 PP_Var plugin_object; |
| 248 plugin_object.type = PP_VARTYPE_OBJECT; |
| 249 plugin_object.value.as_id = found->second; |
| 250 Release(plugin_object); |
| 251 } |
| 252 |
224 int PluginVarTracker::GetRefCountForObject(const PP_Var& plugin_object) { | 253 int PluginVarTracker::GetRefCountForObject(const PP_Var& plugin_object) { |
225 PluginVarInfoMap::iterator found = plugin_var_info_.find( | 254 PluginVarInfoMap::iterator found = plugin_var_info_.find( |
226 plugin_object.value.as_id); | 255 plugin_object.value.as_id); |
227 if (found == plugin_var_info_.end()) | 256 if (found == plugin_var_info_.end()) |
228 return -1; | 257 return -1; |
229 return found->second.ref_count; | 258 return found->second.ref_count; |
230 } | 259 } |
231 | 260 |
232 int PluginVarTracker::GetTrackedWithNoReferenceCountForObject( | 261 int PluginVarTracker::GetTrackedWithNoReferenceCountForObject( |
233 const PP_Var& plugin_object) { | 262 const PP_Var& plugin_object) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 | 306 |
278 // Object ref counts are all zero, delete from both maps. | 307 // Object ref counts are all zero, delete from both maps. |
279 DCHECK(host_var_to_plugin_var_.find(iter->second.host_var) != | 308 DCHECK(host_var_to_plugin_var_.find(iter->second.host_var) != |
280 host_var_to_plugin_var_.end()); | 309 host_var_to_plugin_var_.end()); |
281 host_var_to_plugin_var_.erase(iter->second.host_var); | 310 host_var_to_plugin_var_.erase(iter->second.host_var); |
282 plugin_var_info_.erase(iter); | 311 plugin_var_info_.erase(iter); |
283 } | 312 } |
284 | 313 |
285 } // namesace proxy | 314 } // namesace proxy |
286 } // namespace pp | 315 } // namespace pp |
OLD | NEW |