| 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 "webkit/plugins/ppapi/resource_tracker.h" | 5 #include "webkit/plugins/ppapi/resource_tracker.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/rand_util.h" | 11 #include "base/rand_util.h" |
| 12 #include "ppapi/c/pp_resource.h" | 12 #include "ppapi/c/pp_resource.h" |
| 13 #include "ppapi/c/pp_var.h" | 13 #include "ppapi/c/pp_var.h" |
| 14 #include "ppapi/shared_impl/function_group_base.h" | 14 #include "ppapi/shared_impl/function_group_base.h" |
| 15 #include "ppapi/shared_impl/id_assignment.h" |
| 15 #include "ppapi/shared_impl/tracker_base.h" | 16 #include "ppapi/shared_impl/tracker_base.h" |
| 16 #include "webkit/plugins/ppapi/npobject_var.h" | 17 #include "webkit/plugins/ppapi/npobject_var.h" |
| 17 #include "webkit/plugins/ppapi/plugin_module.h" | 18 #include "webkit/plugins/ppapi/plugin_module.h" |
| 18 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 19 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
| 19 #include "webkit/plugins/ppapi/ppb_char_set_impl.h" | 20 #include "webkit/plugins/ppapi/ppb_char_set_impl.h" |
| 20 #include "webkit/plugins/ppapi/ppb_cursor_control_impl.h" | 21 #include "webkit/plugins/ppapi/ppb_cursor_control_impl.h" |
| 21 #include "webkit/plugins/ppapi/ppb_find_impl.h" | 22 #include "webkit/plugins/ppapi/ppb_find_impl.h" |
| 22 #include "webkit/plugins/ppapi/ppb_font_impl.h" | 23 #include "webkit/plugins/ppapi/ppb_font_impl.h" |
| 23 #include "webkit/plugins/ppapi/resource.h" | 24 #include "webkit/plugins/ppapi/resource.h" |
| 24 #include "webkit/plugins/ppapi/resource_creation_impl.h" | 25 #include "webkit/plugins/ppapi/resource_creation_impl.h" |
| 25 | 26 |
| 27 using ppapi::CheckIdType; |
| 28 using ppapi::MakeTypedId; |
| 26 using ppapi::NPObjectVar; | 29 using ppapi::NPObjectVar; |
| 30 using ppapi::PPIdType; |
| 27 using ppapi::Var; | 31 using ppapi::Var; |
| 28 | 32 |
| 29 enum PPIdType { | |
| 30 PP_ID_TYPE_MODULE, | |
| 31 PP_ID_TYPE_INSTANCE, | |
| 32 PP_ID_TYPE_RESOURCE, | |
| 33 PP_ID_TYPE_VAR, | |
| 34 PP_ID_TYPE_COUNT | |
| 35 }; | |
| 36 | |
| 37 static const unsigned int kPPIdTypeBits = 2; | |
| 38 COMPILE_ASSERT(PP_ID_TYPE_COUNT <= (1<<kPPIdTypeBits), | |
| 39 kPPIdTypeBits_is_too_small_for_all_id_types); | |
| 40 | |
| 41 static const int32 kMaxPPIdType = | |
| 42 std::numeric_limits<int32>::max() >> kPPIdTypeBits; | |
| 43 | |
| 44 template <typename T> static inline T MakeTypedId(T value, PPIdType type) { | |
| 45 return (value << kPPIdTypeBits) | static_cast<T>(type); | |
| 46 } | |
| 47 | |
| 48 template <typename T> static inline bool CheckIdType(T id, PPIdType type) { | |
| 49 // 0 is a valid resource. | |
| 50 if (!id) | |
| 51 return true; | |
| 52 const T mask = (static_cast<T>(1) << kPPIdTypeBits) - 1; | |
| 53 return (id & mask) == type; | |
| 54 } | |
| 55 | |
| 56 namespace webkit { | 33 namespace webkit { |
| 57 namespace ppapi { | 34 namespace ppapi { |
| 58 | 35 |
| 59 namespace { | 36 namespace { |
| 60 | 37 |
| 61 ::ppapi::TrackerBase* GetTrackerBase() { | 38 ::ppapi::TrackerBase* GetTrackerBase() { |
| 62 return ResourceTracker::Get(); | 39 return ResourceTracker::Get(); |
| 63 } | 40 } |
| 64 | 41 |
| 65 } // namespace | 42 } // namespace |
| (...skipping 16 matching lines...) Expand all Loading... |
| 82 // instance goes away when there are still refs. These are non-owning | 59 // instance goes away when there are still refs. These are non-owning |
| 83 // references. | 60 // references. |
| 84 NPObjectToNPObjectVarMap np_object_to_object_var; | 61 NPObjectToNPObjectVarMap np_object_to_object_var; |
| 85 | 62 |
| 86 // Lazily allocated function proxies for the different interfaces. | 63 // Lazily allocated function proxies for the different interfaces. |
| 87 scoped_ptr< ::ppapi::FunctionGroupBase > | 64 scoped_ptr< ::ppapi::FunctionGroupBase > |
| 88 function_proxies[::pp::proxy::INTERFACE_ID_COUNT]; | 65 function_proxies[::pp::proxy::INTERFACE_ID_COUNT]; |
| 89 }; | 66 }; |
| 90 | 67 |
| 91 scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const { | 68 scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const { |
| 92 DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) | 69 DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) |
| 93 << res << " is not a PP_Resource."; | 70 << res << " is not a PP_Resource."; |
| 94 ResourceMap::const_iterator result = live_resources_.find(res); | 71 ResourceMap::const_iterator result = live_resources_.find(res); |
| 95 if (result == live_resources_.end()) { | 72 if (result == live_resources_.end()) { |
| 96 return scoped_refptr<Resource>(); | 73 return scoped_refptr<Resource>(); |
| 97 } | 74 } |
| 98 return result->second.first; | 75 return result->second.first; |
| 99 } | 76 } |
| 100 | 77 |
| 101 // static | 78 // static |
| 102 ResourceTracker* ResourceTracker::global_tracker_ = NULL; | 79 ResourceTracker* ResourceTracker::global_tracker_ = NULL; |
| 103 ResourceTracker* ResourceTracker::singleton_override_ = NULL; | 80 ResourceTracker* ResourceTracker::singleton_override_ = NULL; |
| 104 | 81 |
| 105 ResourceTracker::ResourceTracker() | 82 ResourceTracker::ResourceTracker() |
| 106 : last_resource_id_(0), | 83 : last_resource_id_(0) { |
| 107 last_var_id_(0) { | |
| 108 // Wire up the new shared resource tracker base to use our implementation. | 84 // Wire up the new shared resource tracker base to use our implementation. |
| 109 ::ppapi::TrackerBase::Init(&GetTrackerBase); | 85 ::ppapi::TrackerBase::Init(&GetTrackerBase); |
| 110 } | 86 } |
| 111 | 87 |
| 112 ResourceTracker::~ResourceTracker() { | 88 ResourceTracker::~ResourceTracker() { |
| 113 } | 89 } |
| 114 | 90 |
| 115 // static | 91 // static |
| 116 ResourceTracker* ResourceTracker::Get() { | 92 ResourceTracker* ResourceTracker::Get() { |
| 117 if (singleton_override_) | 93 if (singleton_override_) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 138 PP_Instance pp_instance = resource->instance()->pp_instance(); | 114 PP_Instance pp_instance = resource->instance()->pp_instance(); |
| 139 DCHECK(pp_instance); | 115 DCHECK(pp_instance); |
| 140 DCHECK(instance_map_.find(pp_instance) != instance_map_.end()); | 116 DCHECK(instance_map_.find(pp_instance) != instance_map_.end()); |
| 141 | 117 |
| 142 instance_map_[pp_instance]->assoc_resources.erase(resource); | 118 instance_map_[pp_instance]->assoc_resources.erase(resource); |
| 143 } | 119 } |
| 144 | 120 |
| 145 PP_Resource ResourceTracker::AddResource(Resource* resource) { | 121 PP_Resource ResourceTracker::AddResource(Resource* resource) { |
| 146 // If the plugin manages to create 1 billion resources, don't do crazy stuff. | 122 // If the plugin manages to create 1 billion resources, don't do crazy stuff. |
| 147 if (last_resource_id_ == | 123 if (last_resource_id_ == |
| 148 (std::numeric_limits<PP_Resource>::max() >> kPPIdTypeBits)) | 124 (std::numeric_limits<PP_Resource>::max() >> ::ppapi::kPPIdTypeBits)) |
| 149 return 0; | 125 return 0; |
| 150 | 126 |
| 151 // Add the resource with plugin use-count 1. | 127 // Add the resource with plugin use-count 1. |
| 152 PP_Resource new_id = MakeTypedId(++last_resource_id_, PP_ID_TYPE_RESOURCE); | 128 PP_Resource new_id = MakeTypedId(++last_resource_id_, |
| 129 ::ppapi::PP_ID_TYPE_RESOURCE); |
| 153 live_resources_.insert(std::make_pair(new_id, std::make_pair(resource, 1))); | 130 live_resources_.insert(std::make_pair(new_id, std::make_pair(resource, 1))); |
| 154 | 131 |
| 155 // Track associated with the instance. | 132 // Track associated with the instance. |
| 156 PP_Instance pp_instance = resource->instance()->pp_instance(); | 133 PP_Instance pp_instance = resource->instance()->pp_instance(); |
| 157 DCHECK(instance_map_.find(pp_instance) != instance_map_.end()); | 134 DCHECK(instance_map_.find(pp_instance) != instance_map_.end()); |
| 158 instance_map_[pp_instance]->ref_resources.insert(new_id); | 135 instance_map_[pp_instance]->ref_resources.insert(new_id); |
| 159 return new_id; | 136 return new_id; |
| 160 } | 137 } |
| 161 | 138 |
| 162 bool ResourceTracker::AddRefResource(PP_Resource res) { | 139 bool ResourceTracker::AddRefResource(PP_Resource res) { |
| 163 DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) | 140 DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) |
| 164 << res << " is not a PP_Resource."; | 141 << res << " is not a PP_Resource."; |
| 165 ResourceMap::iterator i = live_resources_.find(res); | 142 ResourceMap::iterator i = live_resources_.find(res); |
| 166 if (i != live_resources_.end()) { | 143 if (i != live_resources_.end()) { |
| 167 // We don't protect against overflow, since a plugin as malicious as to ref | 144 // We don't protect against overflow, since a plugin as malicious as to ref |
| 168 // once per every byte in the address space could have just as well unrefed | 145 // once per every byte in the address space could have just as well unrefed |
| 169 // one time too many. | 146 // one time too many. |
| 170 ++i->second.second; | 147 ++i->second.second; |
| 171 return true; | 148 return true; |
| 172 } else { | 149 } else { |
| 173 return false; | 150 return false; |
| 174 } | 151 } |
| 175 } | 152 } |
| 176 | 153 |
| 177 bool ResourceTracker::UnrefResource(PP_Resource res) { | 154 bool ResourceTracker::UnrefResource(PP_Resource res) { |
| 178 DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) | 155 DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) |
| 179 << res << " is not a PP_Resource."; | 156 << res << " is not a PP_Resource."; |
| 180 ResourceMap::iterator i = live_resources_.find(res); | 157 ResourceMap::iterator i = live_resources_.find(res); |
| 181 if (i != live_resources_.end()) { | 158 if (i != live_resources_.end()) { |
| 182 if (!--i->second.second) { | 159 if (!--i->second.second) { |
| 183 Resource* to_release = i->second.first; | 160 Resource* to_release = i->second.first; |
| 184 // LastPluginRefWasDeleted will clear the instance pointer, so save it | 161 // LastPluginRefWasDeleted will clear the instance pointer, so save it |
| 185 // first. | 162 // first. |
| 186 PP_Instance instance = to_release->instance()->pp_instance(); | 163 PP_Instance instance = to_release->instance()->pp_instance(); |
| 187 to_release->LastPluginRefWasDeleted(); | 164 to_release->LastPluginRefWasDeleted(); |
| 188 | 165 |
| 189 instance_map_[instance]->ref_resources.erase(res); | 166 instance_map_[instance]->ref_resources.erase(res); |
| 190 live_resources_.erase(i); | 167 live_resources_.erase(i); |
| 191 } | 168 } |
| 192 return true; | 169 return true; |
| 193 } else { | 170 } else { |
| 194 return false; | 171 return false; |
| 195 } | 172 } |
| 196 } | 173 } |
| 197 | 174 |
| 198 void ResourceTracker::CleanupInstanceData(PP_Instance instance, | 175 void ResourceTracker::CleanupInstanceData(PP_Instance instance, |
| 199 bool delete_instance) { | 176 bool delete_instance) { |
| 200 DLOG_IF(ERROR, !CheckIdType(instance, PP_ID_TYPE_INSTANCE)) | 177 DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE)) |
| 201 << instance << " is not a PP_Instance."; | 178 << instance << " is not a PP_Instance."; |
| 202 InstanceMap::iterator found = instance_map_.find(instance); | 179 InstanceMap::iterator found = instance_map_.find(instance); |
| 203 if (found == instance_map_.end()) { | 180 if (found == instance_map_.end()) { |
| 204 NOTREACHED(); | 181 NOTREACHED(); |
| 205 return; | 182 return; |
| 206 } | 183 } |
| 207 InstanceData& data = *found->second; | 184 InstanceData& data = *found->second; |
| 208 | 185 |
| 209 // Force release all plugin references to resources associated with the | 186 // Force release all plugin references to resources associated with the |
| 210 // deleted instance. | 187 // deleted instance. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 PP_Instance instance) const { | 240 PP_Instance instance) const { |
| 264 InstanceMap::const_iterator found = instance_map_.find(instance); | 241 InstanceMap::const_iterator found = instance_map_.find(instance); |
| 265 if (found == instance_map_.end()) | 242 if (found == instance_map_.end()) |
| 266 return 0; | 243 return 0; |
| 267 return static_cast<uint32>(found->second->ref_resources.size() + | 244 return static_cast<uint32>(found->second->ref_resources.size() + |
| 268 found->second->np_object_to_object_var.size()); | 245 found->second->np_object_to_object_var.size()); |
| 269 } | 246 } |
| 270 | 247 |
| 271 ::ppapi::ResourceObjectBase* ResourceTracker::GetResourceAPI( | 248 ::ppapi::ResourceObjectBase* ResourceTracker::GetResourceAPI( |
| 272 PP_Resource res) { | 249 PP_Resource res) { |
| 273 DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) | 250 DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) |
| 274 << res << " is not a PP_Resource."; | 251 << res << " is not a PP_Resource."; |
| 275 ResourceMap::const_iterator result = live_resources_.find(res); | 252 ResourceMap::const_iterator result = live_resources_.find(res); |
| 276 if (result == live_resources_.end()) | 253 if (result == live_resources_.end()) |
| 277 return NULL; | 254 return NULL; |
| 278 return result->second.first.get(); | 255 return result->second.first.get(); |
| 279 } | 256 } |
| 280 | 257 |
| 281 ::ppapi::FunctionGroupBase* ResourceTracker::GetFunctionAPI( | 258 ::ppapi::FunctionGroupBase* ResourceTracker::GetFunctionAPI( |
| 282 PP_Instance pp_instance, | 259 PP_Instance pp_instance, |
| 283 pp::proxy::InterfaceID id) { | 260 pp::proxy::InterfaceID id) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 return proxy.get(); | 297 return proxy.get(); |
| 321 } | 298 } |
| 322 | 299 |
| 323 PP_Instance ResourceTracker::GetInstanceForResource(PP_Resource pp_resource) { | 300 PP_Instance ResourceTracker::GetInstanceForResource(PP_Resource pp_resource) { |
| 324 scoped_refptr<Resource> resource(GetResource(pp_resource)); | 301 scoped_refptr<Resource> resource(GetResource(pp_resource)); |
| 325 if (!resource.get()) | 302 if (!resource.get()) |
| 326 return 0; | 303 return 0; |
| 327 return resource->instance()->pp_instance(); | 304 return resource->instance()->pp_instance(); |
| 328 } | 305 } |
| 329 | 306 |
| 330 int32 ResourceTracker::AddVar(Var* var) { | 307 ::ppapi::VarTracker* ResourceTracker::GetVarTracker() { |
| 331 // If the plugin manages to create 1B strings... | 308 return &var_tracker_; |
| 332 if (last_var_id_ == kMaxPPIdType) | |
| 333 return 0; | |
| 334 | |
| 335 // Validate the module. | |
| 336 if (!GetModule(var->pp_module())) | |
| 337 return 0; | |
| 338 | |
| 339 // Add the resource with plugin use-count 1. | |
| 340 int32 new_id = MakeTypedId(++last_var_id_, PP_ID_TYPE_VAR); | |
| 341 live_vars_.insert(std::make_pair(new_id, std::make_pair(var, 1))); | |
| 342 | |
| 343 return new_id; | |
| 344 } | |
| 345 | |
| 346 scoped_refptr<Var> ResourceTracker::GetVar(int32 var_id) const { | |
| 347 DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) | |
| 348 << var_id << " is not a PP_Var ID."; | |
| 349 VarMap::const_iterator result = live_vars_.find(var_id); | |
| 350 if (result == live_vars_.end()) | |
| 351 return scoped_refptr<Var>(); | |
| 352 return result->second.first; | |
| 353 } | |
| 354 | |
| 355 bool ResourceTracker::AddRefVar(int32 var_id) { | |
| 356 DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) | |
| 357 << var_id << " is not a PP_Var ID."; | |
| 358 VarMap::iterator i = live_vars_.find(var_id); | |
| 359 if (i != live_vars_.end()) { | |
| 360 // We don't protect against overflow, since a plugin as malicious as to ref | |
| 361 // once per every byte in the address space could have just as well unrefed | |
| 362 // one time too many. | |
| 363 ++i->second.second; | |
| 364 return true; | |
| 365 } | |
| 366 return false; | |
| 367 } | |
| 368 | |
| 369 bool ResourceTracker::UnrefVar(int32 var_id) { | |
| 370 DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) | |
| 371 << var_id << " is not a PP_Var ID."; | |
| 372 VarMap::iterator i = live_vars_.find(var_id); | |
| 373 if (i != live_vars_.end()) { | |
| 374 if (!--i->second.second) | |
| 375 live_vars_.erase(i); | |
| 376 return true; | |
| 377 } | |
| 378 return false; | |
| 379 } | 309 } |
| 380 | 310 |
| 381 void ResourceTracker::AddNPObjectVar(NPObjectVar* object_var) { | 311 void ResourceTracker::AddNPObjectVar(NPObjectVar* object_var) { |
| 382 DCHECK(instance_map_.find(object_var->pp_instance()) != instance_map_.end()); | 312 DCHECK(instance_map_.find(object_var->pp_instance()) != instance_map_.end()); |
| 383 InstanceData& data = *instance_map_[object_var->pp_instance()].get(); | 313 InstanceData& data = *instance_map_[object_var->pp_instance()].get(); |
| 384 | 314 |
| 385 DCHECK(data.np_object_to_object_var.find(object_var->np_object()) == | 315 DCHECK(data.np_object_to_object_var.find(object_var->np_object()) == |
| 386 data.np_object_to_object_var.end()) << "NPObjectVar already in map"; | 316 data.np_object_to_object_var.end()) << "NPObjectVar already in map"; |
| 387 data.np_object_to_object_var[object_var->np_object()] = object_var; | 317 data.np_object_to_object_var[object_var->np_object()] = object_var; |
| 388 } | 318 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 419 PP_Instance ResourceTracker::AddInstance(PluginInstance* instance) { | 349 PP_Instance ResourceTracker::AddInstance(PluginInstance* instance) { |
| 420 DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end()); | 350 DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end()); |
| 421 | 351 |
| 422 // Use a random number for the instance ID. This helps prevent some | 352 // Use a random number for the instance ID. This helps prevent some |
| 423 // accidents. See also AddModule below. | 353 // accidents. See also AddModule below. |
| 424 // | 354 // |
| 425 // Need to make sure the random number isn't a duplicate or 0. | 355 // Need to make sure the random number isn't a duplicate or 0. |
| 426 PP_Instance new_instance; | 356 PP_Instance new_instance; |
| 427 do { | 357 do { |
| 428 new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()), | 358 new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()), |
| 429 PP_ID_TYPE_INSTANCE); | 359 ::ppapi::PP_ID_TYPE_INSTANCE); |
| 430 } while (!new_instance || | 360 } while (!new_instance || |
| 431 instance_map_.find(new_instance) != instance_map_.end() || | 361 instance_map_.find(new_instance) != instance_map_.end() || |
| 432 !instance->module()->ReserveInstanceID(new_instance)); | 362 !instance->module()->ReserveInstanceID(new_instance)); |
| 433 | 363 |
| 434 instance_map_[new_instance] = linked_ptr<InstanceData>(new InstanceData); | 364 instance_map_[new_instance] = linked_ptr<InstanceData>(new InstanceData); |
| 435 instance_map_[new_instance]->instance = instance; | 365 instance_map_[new_instance]->instance = instance; |
| 436 return new_instance; | 366 return new_instance; |
| 437 } | 367 } |
| 438 | 368 |
| 439 void ResourceTracker::InstanceDeleted(PP_Instance instance) { | 369 void ResourceTracker::InstanceDeleted(PP_Instance instance) { |
| 440 CleanupInstanceData(instance, true); | 370 CleanupInstanceData(instance, true); |
| 441 } | 371 } |
| 442 | 372 |
| 443 void ResourceTracker::InstanceCrashed(PP_Instance instance) { | 373 void ResourceTracker::InstanceCrashed(PP_Instance instance) { |
| 444 CleanupInstanceData(instance, false); | 374 CleanupInstanceData(instance, false); |
| 445 } | 375 } |
| 446 | 376 |
| 447 PluginInstance* ResourceTracker::GetInstance(PP_Instance instance) { | 377 PluginInstance* ResourceTracker::GetInstance(PP_Instance instance) { |
| 448 DLOG_IF(ERROR, !CheckIdType(instance, PP_ID_TYPE_INSTANCE)) | 378 DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE)) |
| 449 << instance << " is not a PP_Instance."; | 379 << instance << " is not a PP_Instance."; |
| 450 InstanceMap::iterator found = instance_map_.find(instance); | 380 InstanceMap::iterator found = instance_map_.find(instance); |
| 451 if (found == instance_map_.end()) | 381 if (found == instance_map_.end()) |
| 452 return NULL; | 382 return NULL; |
| 453 return found->second->instance; | 383 return found->second->instance; |
| 454 } | 384 } |
| 455 | 385 |
| 456 PP_Module ResourceTracker::AddModule(PluginModule* module) { | 386 PP_Module ResourceTracker::AddModule(PluginModule* module) { |
| 457 #ifndef NDEBUG | 387 #ifndef NDEBUG |
| 458 // Make sure we're not adding one more than once. | 388 // Make sure we're not adding one more than once. |
| 459 for (ModuleMap::const_iterator i = module_map_.begin(); | 389 for (ModuleMap::const_iterator i = module_map_.begin(); |
| 460 i != module_map_.end(); ++i) | 390 i != module_map_.end(); ++i) |
| 461 DCHECK(i->second != module); | 391 DCHECK(i->second != module); |
| 462 #endif | 392 #endif |
| 463 | 393 |
| 464 // See AddInstance above. | 394 // See AddInstance above. |
| 465 PP_Module new_module; | 395 PP_Module new_module; |
| 466 do { | 396 do { |
| 467 new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()), | 397 new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()), |
| 468 PP_ID_TYPE_MODULE); | 398 ::ppapi::PP_ID_TYPE_MODULE); |
| 469 } while (!new_module || | 399 } while (!new_module || |
| 470 module_map_.find(new_module) != module_map_.end()); | 400 module_map_.find(new_module) != module_map_.end()); |
| 471 module_map_[new_module] = module; | 401 module_map_[new_module] = module; |
| 472 return new_module; | 402 return new_module; |
| 473 } | 403 } |
| 474 | 404 |
| 475 void ResourceTracker::ModuleDeleted(PP_Module module) { | 405 void ResourceTracker::ModuleDeleted(PP_Module module) { |
| 476 DLOG_IF(ERROR, !CheckIdType(module, PP_ID_TYPE_MODULE)) | 406 DLOG_IF(ERROR, !CheckIdType(module, ::ppapi::PP_ID_TYPE_MODULE)) |
| 477 << module << " is not a PP_Module."; | 407 << module << " is not a PP_Module."; |
| 478 ModuleMap::iterator found = module_map_.find(module); | 408 ModuleMap::iterator found = module_map_.find(module); |
| 479 if (found == module_map_.end()) { | 409 if (found == module_map_.end()) { |
| 480 NOTREACHED(); | 410 NOTREACHED(); |
| 481 return; | 411 return; |
| 482 } | 412 } |
| 483 module_map_.erase(found); | 413 module_map_.erase(found); |
| 484 } | 414 } |
| 485 | 415 |
| 486 PluginModule* ResourceTracker::GetModule(PP_Module module) { | 416 PluginModule* ResourceTracker::GetModule(PP_Module module) { |
| 487 DLOG_IF(ERROR, !CheckIdType(module, PP_ID_TYPE_MODULE)) | 417 DLOG_IF(ERROR, !CheckIdType(module, ::ppapi::PP_ID_TYPE_MODULE)) |
| 488 << module << " is not a PP_Module."; | 418 << module << " is not a PP_Module."; |
| 489 ModuleMap::iterator found = module_map_.find(module); | 419 ModuleMap::iterator found = module_map_.find(module); |
| 490 if (found == module_map_.end()) | 420 if (found == module_map_.end()) |
| 491 return NULL; | 421 return NULL; |
| 492 return found->second; | 422 return found->second; |
| 493 } | 423 } |
| 494 | 424 |
| 495 // static | 425 // static |
| 496 void ResourceTracker::SetSingletonOverride(ResourceTracker* tracker) { | 426 void ResourceTracker::SetSingletonOverride(ResourceTracker* tracker) { |
| 497 DCHECK(!singleton_override_); | 427 DCHECK(!singleton_override_); |
| 498 singleton_override_ = tracker; | 428 singleton_override_ = tracker; |
| 499 } | 429 } |
| 500 | 430 |
| 501 // static | 431 // static |
| 502 void ResourceTracker::ClearSingletonOverride() { | 432 void ResourceTracker::ClearSingletonOverride() { |
| 503 DCHECK(singleton_override_); | 433 DCHECK(singleton_override_); |
| 504 singleton_override_ = NULL; | 434 singleton_override_ = NULL; |
| 505 } | 435 } |
| 506 | 436 |
| 507 } // namespace ppapi | 437 } // namespace ppapi |
| 508 } // namespace webkit | 438 } // namespace webkit |
| 509 | 439 |
| OLD | NEW |