summaryrefslogtreecommitdiffstats
path: root/webkit/glue/plugins/pepper_resource_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/plugins/pepper_resource_tracker.cc')
-rw-r--r--webkit/glue/plugins/pepper_resource_tracker.cc73
1 files changed, 37 insertions, 36 deletions
diff --git a/webkit/glue/plugins/pepper_resource_tracker.cc b/webkit/glue/plugins/pepper_resource_tracker.cc
index c8779e4..8aa94d2 100644
--- a/webkit/glue/plugins/pepper_resource_tracker.cc
+++ b/webkit/glue/plugins/pepper_resource_tracker.cc
@@ -4,57 +4,58 @@
#include "webkit/glue/plugins/pepper_resource_tracker.h"
+#include <limits>
#include <set>
#include "base/logging.h"
#include "third_party/ppapi/c/pp_resource.h"
-#include "webkit/glue/plugins/pepper_buffer.h"
-#include "webkit/glue/plugins/pepper_device_context_2d.h"
-#include "webkit/glue/plugins/pepper_directory_reader.h"
-#include "webkit/glue/plugins/pepper_file_chooser.h"
-#include "webkit/glue/plugins/pepper_file_io.h"
-#include "webkit/glue/plugins/pepper_file_ref.h"
-#include "webkit/glue/plugins/pepper_image_data.h"
#include "webkit/glue/plugins/pepper_resource.h"
-#include "webkit/glue/plugins/pepper_url_loader.h"
-#include "webkit/glue/plugins/pepper_url_request_info.h"
-#include "webkit/glue/plugins/pepper_url_response_info.h"
namespace pepper {
-ResourceTracker::ResourceTracker() {
-}
-
-ResourceTracker::~ResourceTracker() {
-}
-
-// static
-ResourceTracker* ResourceTracker::Get() {
- return Singleton<ResourceTracker>::get();
-}
-
scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const {
- AutoLock lock(lock_);
- Resource* resource = reinterpret_cast<Resource*>(res);
- if (live_resources_.find(resource) == live_resources_.end())
+ ResourceMap::const_iterator result = live_resources_.find(res);
+ if (result == live_resources_.end()) {
return scoped_refptr<Resource>();
- return scoped_refptr<Resource>(resource);
+ }
+ return result->second.first;
}
-void ResourceTracker::AddResource(Resource* resource) {
- AutoLock lock(lock_);
- DCHECK(live_resources_.find(resource) == live_resources_.end());
- live_resources_.insert(resource);
+PP_Resource ResourceTracker::AddResource(Resource* resource) {
+ // If the plugin manages to create 4B resources...
+ if (last_id_ == std::numeric_limits<PP_Resource>::max()) {
+ return 0;
+ }
+ // Add the resource with plugin use-count 1.
+ ++last_id_;
+ live_resources_.insert(std::make_pair(last_id_, std::make_pair(resource, 1)));
+ return last_id_;
+}
+
+bool ResourceTracker::AddRefResource(PP_Resource res) {
+ ResourceMap::iterator i = live_resources_.find(res);
+ if (i != live_resources_.end()) {
+ // We don't protect against overflow, since a plugin as malicious as to ref
+ // once per every byte in the address space could have just as well unrefed
+ // one time too many.
+ ++i->second.second;
+ return true;
+ } else {
+ return false;
+ }
}
-void ResourceTracker::DeleteResource(Resource* resource) {
- AutoLock lock(lock_);
- ResourceSet::iterator found = live_resources_.find(resource);
- if (found == live_resources_.end()) {
- NOTREACHED();
- return;
+bool ResourceTracker::UnrefResource(PP_Resource res) {
+ ResourceMap::iterator i = live_resources_.find(res);
+ if (i != live_resources_.end()) {
+ if (!--i->second.second) {
+ i->second.first->StoppedTracking();
+ live_resources_.erase(i);
+ }
+ return true;
+ } else {
+ return false;
}
- live_resources_.erase(found);
}
} // namespace pepper