| // 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 |