| // Copyright (c) 2011 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. | |
| #include "ppapi/cpp/dev/scriptable_object_deprecated.h" | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include "ppapi/c/dev/ppb_memory_dev.h" | |
| #include "ppapi/c/dev/ppp_class_deprecated.h" | |
| #include "ppapi/cpp/module.h" | |
| #include "ppapi/cpp/var.h" | |
| namespace pp { | |
| namespace deprecated { | |
| namespace { | |
| // Allows converting an output param of a Var to an output param of a PP_Var | |
| // for exceptions. The object is only copied if it is not void, which we | |
| // take to mean an exception occurred. | |
| class ExceptionConverter { | |
| public: | |
| ExceptionConverter(PP_Var* out) : out_(out) { | |
| } | |
| ~ExceptionConverter() { | |
| if (!exception_.is_undefined()) | |
| *out_ = exception_.Detach(); | |
| } | |
| Var* Get() { return &exception_; } | |
| private: | |
| PP_Var* out_; | |
| Var exception_; | |
| }; | |
| // Used internally to convert a C-style array of PP_Var to a vector of Var. | |
| void ArgListToVector(uint32_t argc, PP_Var* argv, std::vector<Var>* output) { | |
| output->reserve(argc); | |
| for (size_t i = 0; i < argc; i++) | |
| output->push_back(Var(Var::DontManage(), argv[i])); | |
| } | |
| bool HasProperty(void* object, PP_Var name, PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| return static_cast<ScriptableObject*>(object)->HasProperty( | |
| Var(Var::DontManage(), name), e.Get()); | |
| } | |
| bool HasMethod(void* object, PP_Var name, PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| return static_cast<ScriptableObject*>(object)->HasMethod( | |
| Var(Var::DontManage(), name), e.Get()); | |
| } | |
| PP_Var GetProperty(void* object, | |
| PP_Var name, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| return static_cast<ScriptableObject*>(object)->GetProperty( | |
| Var(Var::DontManage(), name), e.Get()).Detach(); | |
| } | |
| void GetAllPropertyNames(void* object, | |
| uint32_t* property_count, | |
| PP_Var** properties, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| std::vector<Var> props; | |
| static_cast<ScriptableObject*>(object)->GetAllPropertyNames(&props, e.Get()); | |
| if (props.empty()) | |
| return; | |
| *property_count = static_cast<uint32_t>(props.size()); | |
| const PPB_Memory_Dev* memory_if = static_cast<const PPB_Memory_Dev*>( | |
| pp::Module::Get()->GetBrowserInterface(PPB_MEMORY_DEV_INTERFACE)); | |
| *properties = static_cast<PP_Var*>(memory_if->MemAlloc( | |
| static_cast<uint32_t>(sizeof(PP_Var) * props.size()))); | |
| for (size_t i = 0; i < props.size(); ++i) | |
| (*properties)[i] = props[i].Detach(); | |
| } | |
| void SetProperty(void* object, | |
| PP_Var name, | |
| PP_Var value, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| static_cast<ScriptableObject*>(object)->SetProperty( | |
| Var(Var::DontManage(), name), Var(Var::DontManage(), value), e.Get()); | |
| } | |
| void RemoveProperty(void* object, | |
| PP_Var name, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| static_cast<ScriptableObject*>(object)->RemoveProperty( | |
| Var(Var::DontManage(), name), e.Get()); | |
| } | |
| PP_Var Call(void* object, | |
| PP_Var method_name, | |
| uint32_t argc, | |
| PP_Var* argv, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| std::vector<Var> args; | |
| ArgListToVector(argc, argv, &args); | |
| return static_cast<ScriptableObject*>(object)->Call( | |
| Var(Var::DontManage(), method_name), args, e.Get()).Detach(); | |
| } | |
| PP_Var Construct(void* object, | |
| uint32_t argc, | |
| PP_Var* argv, | |
| PP_Var* exception) { | |
| ExceptionConverter e(exception); | |
| std::vector<Var> args; | |
| ArgListToVector(argc, argv, &args); | |
| return static_cast<ScriptableObject*>(object)->Construct( | |
| args, e.Get()).Detach(); | |
| } | |
| void Deallocate(void* object) { | |
| delete static_cast<ScriptableObject*>(object); | |
| } | |
| PPP_Class_Deprecated plugin_class = { | |
| &HasProperty, | |
| &HasMethod, | |
| &GetProperty, | |
| &GetAllPropertyNames, | |
| &SetProperty, | |
| &RemoveProperty, | |
| &Call, | |
| &Construct, | |
| &Deallocate | |
| }; | |
| } // namespace | |
| bool ScriptableObject::HasProperty(const Var& /*name*/, Var* /*exception*/) { | |
| return false; | |
| } | |
| bool ScriptableObject::HasMethod(const Var& /*name*/, Var* /*exception*/) { | |
| return false; | |
| } | |
| Var ScriptableObject::GetProperty(const Var& /*name*/, Var* exception) { | |
| *exception = Var("Property does not exist on ScriptableObject"); | |
| return Var(); | |
| } | |
| void ScriptableObject::GetAllPropertyNames(std::vector<Var>* /*properties*/, | |
| Var* /*exception*/) { | |
| } | |
| void ScriptableObject::SetProperty(const Var& /*name*/, | |
| const Var& /*value*/, | |
| Var* exception) { | |
| *exception = Var("Property can not be set on ScriptableObject"); | |
| } | |
| void ScriptableObject::RemoveProperty(const Var& /*name*/, | |
| Var* exception) { | |
| *exception = Var( | |
| "Property does does not exist to be removed in ScriptableObject"); | |
| } | |
| Var ScriptableObject::Call(const Var& /*method_name*/, | |
| const std::vector<Var>& /*args*/, | |
| Var* exception) { | |
| *exception = Var("Method does not exist to call in ScriptableObject"); | |
| return Var(); | |
| } | |
| Var ScriptableObject::Construct(const std::vector<Var>& /*args*/, | |
| Var* exception) { | |
| *exception = Var("Construct method does not exist in ScriptableObject"); | |
| return Var(); | |
| } | |
| // static | |
| const PPP_Class_Deprecated* ScriptableObject::GetClass() { | |
| return &plugin_class; | |
| } | |
| } // namespace deprecated | |
| } // namespace pp |