diff options
Diffstat (limited to 'ppapi/shared_impl')
-rw-r--r-- | ppapi/shared_impl/api_id.h | 1 | ||||
-rw-r--r-- | ppapi/shared_impl/ppb_var_shared.cc | 40 | ||||
-rw-r--r-- | ppapi/shared_impl/ppb_var_shared.h | 2 | ||||
-rw-r--r-- | ppapi/shared_impl/test_globals.h | 11 | ||||
-rw-r--r-- | ppapi/shared_impl/var.cc | 55 | ||||
-rw-r--r-- | ppapi/shared_impl/var.h | 39 | ||||
-rw-r--r-- | ppapi/shared_impl/var_tracker.cc | 9 | ||||
-rw-r--r-- | ppapi/shared_impl/var_tracker.h | 12 |
8 files changed, 152 insertions, 17 deletions
diff --git a/ppapi/shared_impl/api_id.h b/ppapi/shared_impl/api_id.h index 73654b0..0813354 100644 --- a/ppapi/shared_impl/api_id.h +++ b/ppapi/shared_impl/api_id.h @@ -45,6 +45,7 @@ enum ApiID { API_ID_PPB_UDPSOCKET_PRIVATE, API_ID_PPB_URL_LOADER, API_ID_PPB_URL_RESPONSE_INFO, + API_ID_PPB_VAR_ARRAY_BUFFER, API_ID_PPB_VAR_DEPRECATED, API_ID_PPB_VIDEO_CAPTURE_DEV, API_ID_PPB_VIDEO_DECODER_DEV, diff --git a/ppapi/shared_impl/ppb_var_shared.cc b/ppapi/shared_impl/ppb_var_shared.cc index c548ba7..5549818 100644 --- a/ppapi/shared_impl/ppb_var_shared.cc +++ b/ppapi/shared_impl/ppb_var_shared.cc @@ -6,6 +6,7 @@ #include <limits> +#include "ppapi/c/dev/ppb_var_array_buffer_dev.h" #include "ppapi/c/ppb_var.h" #include "ppapi/c/pp_var.h" #include "ppapi/shared_impl/ppapi_globals.h" @@ -17,6 +18,10 @@ using ppapi::PpapiGlobals; using ppapi::StringVar; namespace ppapi { +namespace { + + +// PPB_Var methods ------------------------------------------------------------- void AddRefVar(PP_Var var) { ppapi::ProxyAutoLock lock; @@ -48,7 +53,6 @@ const char* VarToUtf8(PP_Var var, uint32_t* len) { return NULL; } -namespace { const PPB_Var var_interface = { &AddRefVar, &ReleaseVar, @@ -62,6 +66,35 @@ const PPB_Var_1_0 var_interface1_0 = { &VarFromUtf8_1_0, &VarToUtf8 }; + + +// PPB_VarArrayBuffer_Dev methods ---------------------------------------------- + +PP_Var CreateArrayBufferVar(uint32_t size_in_bytes) { + return PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( + size_in_bytes); +} + +uint32_t ByteLength(struct PP_Var array) { + ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array); + if (!buffer) + return 0; + return buffer->ByteLength(); +} + +void* Map(struct PP_Var array) { + ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array); + if (!buffer) + return NULL; + return buffer->Map(); +} + +const PPB_VarArrayBuffer_Dev var_arraybuffer_interface = { + &CreateArrayBufferVar, + &ByteLength, + &Map +}; + } // namespace // static @@ -74,5 +107,10 @@ const PPB_Var_1_0* PPB_Var_Shared::GetVarInterface1_0() { return &var_interface1_0; } +// static +const PPB_VarArrayBuffer_Dev* PPB_Var_Shared::GetVarArrayBufferInterface() { + return &var_arraybuffer_interface; +} + } // namespace ppapi diff --git a/ppapi/shared_impl/ppb_var_shared.h b/ppapi/shared_impl/ppb_var_shared.h index dfdf472..5865d46 100644 --- a/ppapi/shared_impl/ppb_var_shared.h +++ b/ppapi/shared_impl/ppb_var_shared.h @@ -12,6 +12,7 @@ struct PP_Var; struct PPB_Var; struct PPB_Var_1_0; +struct PPB_VarArrayBuffer_Dev; namespace ppapi { @@ -19,6 +20,7 @@ class PPAPI_SHARED_EXPORT PPB_Var_Shared { public: static const PPB_Var* GetVarInterface(); static const PPB_Var_1_0* GetVarInterface1_0(); + static const PPB_VarArrayBuffer_Dev* GetVarArrayBufferInterface(); }; } // namespace ppapi diff --git a/ppapi/shared_impl/test_globals.h b/ppapi/shared_impl/test_globals.h index d5d1439..49f189f 100644 --- a/ppapi/shared_impl/test_globals.h +++ b/ppapi/shared_impl/test_globals.h @@ -12,6 +12,15 @@ namespace ppapi { +class TestVarTracker : public VarTracker { + public: + TestVarTracker() {} + virtual ~TestVarTracker() {} + virtual ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) OVERRIDE { + return NULL; + } +}; + // Implementation of PpapiGlobals for tests that don't need either the host- or // plugin-specific implementations. class TestGlobals : public PpapiGlobals { @@ -28,7 +37,7 @@ class TestGlobals : public PpapiGlobals { private: ResourceTracker resource_tracker_; - VarTracker var_tracker_; + TestVarTracker var_tracker_; DISALLOW_COPY_AND_ASSIGN(TestGlobals); }; diff --git a/ppapi/shared_impl/var.cc b/ppapi/shared_impl/var.cc index 3bec5ce..60d439b 100644 --- a/ppapi/shared_impl/var.cc +++ b/ppapi/shared_impl/var.cc @@ -65,6 +65,10 @@ StringVar* Var::AsStringVar() { return NULL; } +ArrayBufferVar* Var::AsArrayBufferVar() { + return NULL; +} + NPObjectVar* Var::AsNPObjectVar() { return NULL; } @@ -73,6 +77,18 @@ ProxyObjectVar* Var::AsProxyObjectVar() { return NULL; } +PP_Var Var::GetPPVar() { + int32 id = GetOrCreateVarID(); + if (!id) + return PP_MakeNull(); + + PP_Var result; + result.type = GetType(); + result.padding = 0; + result.value.as_id = id; + return result; +} + int32 Var::GetExistingVarID() const { return var_id_; } @@ -112,18 +128,6 @@ StringVar* StringVar::AsStringVar() { return this; } -PP_Var StringVar::GetPPVar() { - int32 id = GetOrCreateVarID(); - if (!id) - return PP_MakeNull(); - - PP_Var result; - result.type = PP_VARTYPE_STRING; - result.padding = 0; - result.value.as_id = id; - return result; -} - PP_VarType StringVar::GetType() const { return PP_VARTYPE_STRING; } @@ -152,5 +156,32 @@ StringVar* StringVar::FromPPVar(PP_Var var) { return var_object->AsStringVar(); } +// ArrayBufferVar -------------------------------------------------------------- + +ArrayBufferVar::ArrayBufferVar() { +} + +ArrayBufferVar::~ArrayBufferVar() { +} + +ArrayBufferVar* ArrayBufferVar::AsArrayBufferVar() { + return this; +} + +PP_VarType ArrayBufferVar::GetType() const { + return PP_VARTYPE_ARRAY_BUFFER; +} + +// static +ArrayBufferVar* ArrayBufferVar::FromPPVar(PP_Var var) { + if (var.type != PP_VARTYPE_ARRAY_BUFFER) + return NULL; + scoped_refptr<Var> var_object( + PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); + if (!var_object) + return NULL; + return var_object->AsArrayBufferVar(); +} + } // namespace ppapi diff --git a/ppapi/shared_impl/var.h b/ppapi/shared_impl/var.h index 49b9272..d41d00e 100644 --- a/ppapi/shared_impl/var.h +++ b/ppapi/shared_impl/var.h @@ -14,6 +14,7 @@ namespace ppapi { +class ArrayBufferVar; class NPObjectVar; class ProxyObjectVar; class StringVar; @@ -30,12 +31,13 @@ class PPAPI_SHARED_EXPORT Var : public base::RefCounted<Var> { static std::string PPVarToLogString(PP_Var var); virtual StringVar* AsStringVar(); + virtual ArrayBufferVar* AsArrayBufferVar(); virtual NPObjectVar* AsNPObjectVar(); virtual ProxyObjectVar* AsProxyObjectVar(); // Creates a PP_Var corresponding to this object. The return value will have // one reference addrefed on behalf of the caller. - virtual PP_Var GetPPVar() = 0; + PP_Var GetPPVar(); // Returns the type of this var. virtual PP_VarType GetType() const = 0; @@ -97,7 +99,6 @@ class PPAPI_SHARED_EXPORT StringVar : public Var { // Var override. virtual StringVar* AsStringVar() OVERRIDE; - virtual PP_Var GetPPVar() OVERRIDE; virtual PP_VarType GetType() const OVERRIDE; // Helper function to create a PP_Var of type string that contains a copy of @@ -119,6 +120,40 @@ class PPAPI_SHARED_EXPORT StringVar : public Var { DISALLOW_COPY_AND_ASSIGN(StringVar); }; +// ArrayBufferVar -------------------------------------------------------------- + +// Represents an array buffer Var. +// +// Note this is an abstract class. To create an appropriate concrete one, you +// need to use the VarTracker: +// VarArrayBuffer* buf = +// PpapiGlobals::Get()->GetVarTracker()->CreateArrayBuffer(size); +// +// Converting a PP_Var to an ArrayBufferVar: +// ArrayBufferVar* array = ArrayBufferVar::FromPPVar(var); +// if (!array) +// return false; // Not an ArrayBuffer or an invalid var. +// DoSomethingWithTheBuffer(array); +class PPAPI_SHARED_EXPORT ArrayBufferVar : public Var { + public: + ArrayBufferVar(); + virtual ~ArrayBufferVar(); + + virtual void* Map() = 0; + virtual uint32 ByteLength() = 0; + + // Var override. + virtual ArrayBufferVar* AsArrayBufferVar() OVERRIDE; + virtual PP_VarType GetType() const OVERRIDE; + + // Helper function that converts a PP_Var to an ArrayBufferVar. This will + // return NULL if the PP_Var is not of ArrayBuffer type. + static ArrayBufferVar* FromPPVar(PP_Var var); + + private: + DISALLOW_COPY_AND_ASSIGN(ArrayBufferVar); +}; + } // namespace ppapi #endif // PPAPI_SHARED_IMPL_VAR_H_ diff --git a/ppapi/shared_impl/var_tracker.cc b/ppapi/shared_impl/var_tracker.cc index d95a759..852d586 100644 --- a/ppapi/shared_impl/var_tracker.cc +++ b/ppapi/shared_impl/var_tracker.cc @@ -139,7 +139,14 @@ VarTracker::VarMap::const_iterator VarTracker::GetLiveVar( } bool VarTracker::IsVarTypeRefcounted(PP_VarType type) const { - return type == PP_VARTYPE_STRING || type == PP_VARTYPE_OBJECT; + return type >= PP_VARTYPE_STRING; +} + +PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes) { + scoped_refptr<ArrayBufferVar> array_buffer(CreateArrayBuffer(size_in_bytes)); + if (!array_buffer) + return PP_MakeNull(); + return array_buffer->GetPPVar(); } void VarTracker::TrackedObjectGettingOneRef(VarMap::const_iterator obj) { diff --git a/ppapi/shared_impl/var_tracker.h b/ppapi/shared_impl/var_tracker.h index f91c209..a2debe0 100644 --- a/ppapi/shared_impl/var_tracker.h +++ b/ppapi/shared_impl/var_tracker.h @@ -8,11 +8,13 @@ #include "base/basictypes.h" #include "base/hash_tables.h" #include "base/memory/ref_counted.h" +#include "ppapi/c/pp_module.h" #include "ppapi/c/pp_var.h" #include "ppapi/shared_impl/ppapi_shared_export.h" namespace ppapi { +class ArrayBufferVar; class Var; // Tracks non-POD (refcounted) var objects held by a plugin. @@ -54,6 +56,10 @@ class PPAPI_SHARED_EXPORT VarTracker { bool ReleaseVar(int32 var_id); bool ReleaseVar(const PP_Var& var); + // Create a new array buffer of size |size_in_bytes|. Return a PP_Var that + // that references it and has an initial reference-count of 1. + PP_Var MakeArrayBufferPPVar(uint32 size_in_bytes); + protected: struct VarInfo { VarInfo(); @@ -126,6 +132,12 @@ class PPAPI_SHARED_EXPORT VarTracker { // Last assigned var ID. int32 last_var_id_; + private: + // Create and return a new ArrayBufferVar size_in_bytes bytes long. This is + // implemented by the Host and Plugin tracker separately, so that it can be + // a real WebKit ArrayBuffer on the host side. + virtual ArrayBufferVar* CreateArrayBuffer(uint32 size_in_bytes) = 0; + DISALLOW_COPY_AND_ASSIGN(VarTracker); }; |