summaryrefslogtreecommitdiffstats
path: root/ppapi/shared_impl
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/shared_impl')
-rw-r--r--ppapi/shared_impl/api_id.h1
-rw-r--r--ppapi/shared_impl/ppb_var_shared.cc40
-rw-r--r--ppapi/shared_impl/ppb_var_shared.h2
-rw-r--r--ppapi/shared_impl/test_globals.h11
-rw-r--r--ppapi/shared_impl/var.cc55
-rw-r--r--ppapi/shared_impl/var.h39
-rw-r--r--ppapi/shared_impl/var_tracker.cc9
-rw-r--r--ppapi/shared_impl/var_tracker.h12
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);
};