summaryrefslogtreecommitdiffstats
path: root/webkit/glue/plugins/pepper_resource.h
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-07-29 17:14:53 +0100
committerBen Murdoch <benm@google.com>2010-08-04 14:29:45 +0100
commitc407dc5cd9bdc5668497f21b26b09d988ab439de (patch)
tree7eaf8707c0309516bdb042ad976feedaf72b0bb1 /webkit/glue/plugins/pepper_resource.h
parent0998b1cdac5733f299c12d88bc31ef9c8035b8fa (diff)
downloadexternal_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.zip
external_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.tar.gz
external_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.tar.bz2
Merge Chromium src@r53293
Change-Id: Ia79acf8670f385cee48c45b0a75371d8e950af34
Diffstat (limited to 'webkit/glue/plugins/pepper_resource.h')
-rw-r--r--webkit/glue/plugins/pepper_resource.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/webkit/glue/plugins/pepper_resource.h b/webkit/glue/plugins/pepper_resource.h
new file mode 100644
index 0000000..417a06b
--- /dev/null
+++ b/webkit/glue/plugins/pepper_resource.h
@@ -0,0 +1,135 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_
+#define WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_
+
+#include "base/logging.h"
+#include "base/basictypes.h"
+#include "base/ref_counted.h"
+#include "third_party/ppapi/c/pp_resource.h"
+#include "webkit/glue/plugins/pepper_resource_tracker.h"
+
+namespace pepper {
+
+class Buffer;
+class DeviceContext2D;
+class DirectoryReader;
+class FileChooser;
+class FileIO;
+class FileRef;
+class Font;
+class ImageData;
+class PluginModule;
+class Scrollbar;
+class URLLoader;
+class URLRequestInfo;
+class URLResponseInfo;
+class Widget;
+
+class Resource : public base::RefCountedThreadSafe<Resource> {
+ public:
+ explicit Resource(PluginModule* module) : resource_id_(0), module_(module) {}
+ virtual ~Resource() {}
+
+ // Returns NULL if the resource is invalid or is a different type.
+ template<typename T>
+ static scoped_refptr<T> GetAs(PP_Resource res) {
+ scoped_refptr<Resource> resource = ResourceTracker::Get()->GetResource(res);
+ return resource ? resource->Cast<T>() : NULL;
+ }
+
+ PluginModule* module() const { return module_; }
+
+ // Cast the resource into a specified type. This will return NULL if the
+ // resource does not match the specified type. Specializations of this
+ // template call into As* functions.
+ template <typename T> T* Cast() { return NULL; }
+
+ // Returns an resource id of this object. If the object doesn't have a
+ // resource id, new one is created with plugin refcount of 1. If it does,
+ // the refcount is incremented. Use this when you need to return a new
+ // reference to the plugin.
+ PP_Resource GetReference();
+
+ // When you need to ensure that a resource has a reference, but you do not
+ // want to increase the refcount (for example, if you need to call a plugin
+ // callback function with a reference), you can use this class. For example:
+ //
+ // plugin_callback(.., ScopedResourceId(resource).id, ...);
+ class ScopedResourceId {
+ public:
+ explicit ScopedResourceId(Resource* resource)
+ : id(resource->GetReference()) {}
+ ~ScopedResourceId() {
+ ResourceTracker::Get()->UnrefResource(id);
+ }
+ const PP_Resource id;
+ };
+
+ private:
+ // Type-specific getters for individual resource types. These will return
+ // NULL if the resource does not match the specified type. Used by the Cast()
+ // function.
+ virtual Buffer* AsBuffer() { return NULL; }
+ virtual DeviceContext2D* AsDeviceContext2D() { return NULL; }
+ virtual DirectoryReader* AsDirectoryReader() { return NULL; }
+ virtual FileChooser* AsFileChooser() { return NULL; }
+ virtual FileIO* AsFileIO() { return NULL; }
+ virtual FileRef* AsFileRef() { return NULL; }
+ virtual Font* AsFont() { return NULL; }
+ virtual ImageData* AsImageData() { return NULL; }
+ virtual Scrollbar* AsScrollbar() { return NULL; }
+ virtual URLLoader* AsURLLoader() { return NULL; }
+ virtual URLRequestInfo* AsURLRequestInfo() { return NULL; }
+ virtual URLResponseInfo* AsURLResponseInfo() { return NULL; }
+ virtual Widget* AsWidget() { return NULL; }
+
+ private:
+ // If referenced by a plugin, holds the id of this resource object. Do not
+ // access this member directly, because it is possible that the plugin holds
+ // no references to the object, and therefore the resource_id_ is zero. Use
+ // either GetReference() to obtain a new resource_id and increase the
+ // refcount, or TemporaryReference when you do not want to increase the
+ // refcount.
+ PP_Resource resource_id_;
+
+ // Non-owning pointer to our module.
+ PluginModule* module_;
+
+ // Called by the resource tracker when the last plugin reference has been
+ // dropped.
+ friend class ResourceTracker;
+ void StoppedTracking() {
+ DCHECK(resource_id_ != 0);
+ resource_id_ = 0;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(Resource);
+};
+
+// Cast() specializations.
+#define DEFINE_RESOURCE_CAST(Type) \
+ template <> inline Type* Resource::Cast<Type>() { \
+ return As##Type(); \
+ }
+
+DEFINE_RESOURCE_CAST(Buffer)
+DEFINE_RESOURCE_CAST(DeviceContext2D)
+DEFINE_RESOURCE_CAST(DirectoryReader)
+DEFINE_RESOURCE_CAST(FileChooser)
+DEFINE_RESOURCE_CAST(FileIO)
+DEFINE_RESOURCE_CAST(FileRef)
+DEFINE_RESOURCE_CAST(Font)
+DEFINE_RESOURCE_CAST(ImageData)
+DEFINE_RESOURCE_CAST(Scrollbar)
+DEFINE_RESOURCE_CAST(URLLoader)
+DEFINE_RESOURCE_CAST(URLRequestInfo)
+DEFINE_RESOURCE_CAST(URLResponseInfo)
+DEFINE_RESOURCE_CAST(Widget)
+
+#undef DEFINE_RESOURCE_CAST
+} // namespace pepper
+
+#endif // WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_