| // 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/private/var_private.h" | |
| #include <stddef.h> | |
| #include "ppapi/c/dev/ppb_memory_dev.h" | |
| #include "ppapi/c/dev/ppb_var_deprecated.h" | |
| #include "ppapi/cpp/instance_handle.h" | |
| #include "ppapi/cpp/private/instance_private.h" | |
| #include "ppapi/cpp/logging.h" | |
| #include "ppapi/cpp/module_impl.h" | |
| #include "ppapi/cpp/dev/scriptable_object_deprecated.h" | |
| namespace pp { | |
| namespace { | |
| template <> const char* interface_name<PPB_Var_Deprecated>() { | |
| return PPB_VAR_DEPRECATED_INTERFACE; | |
| } | |
| } // namespace | |
| using namespace deprecated; | |
| VarPrivate::VarPrivate(const InstanceHandle& instance, | |
| ScriptableObject* object) { | |
| if (has_interface<PPB_Var_Deprecated>()) { | |
| var_ = get_interface<PPB_Var_Deprecated>()->CreateObject( | |
| instance.pp_instance(), object->GetClass(), object); | |
| } else { | |
| var_.type = PP_VARTYPE_NULL; | |
| var_.padding = 0; | |
| } | |
| is_managed_ = true; | |
| } | |
| ScriptableObject* VarPrivate::AsScriptableObject() const { | |
| if (!is_object()) { | |
| PP_NOTREACHED(); | |
| } else if (has_interface<PPB_Var_Deprecated>()) { | |
| void* object = NULL; | |
| if (get_interface<PPB_Var_Deprecated>()->IsInstanceOf( | |
| var_, ScriptableObject::GetClass(), &object)) { | |
| return reinterpret_cast<ScriptableObject*>(object); | |
| } | |
| } | |
| return NULL; | |
| } | |
| bool VarPrivate::HasProperty(const Var& name, Var* exception) const { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return false; | |
| return get_interface<PPB_Var_Deprecated>()->HasProperty( | |
| var_, name.pp_var(), OutException(exception).get()); | |
| } | |
| bool VarPrivate::HasMethod(const Var& name, Var* exception) const { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return false; | |
| return get_interface<PPB_Var_Deprecated>()->HasMethod( | |
| var_, name.pp_var(), OutException(exception).get()); | |
| } | |
| VarPrivate VarPrivate::GetProperty(const Var& name, Var* exception) const { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->GetProperty( | |
| var_, name.pp_var(), OutException(exception).get())); | |
| } | |
| void VarPrivate::GetAllPropertyNames(std::vector<Var>* properties, | |
| Var* exception) const { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return; | |
| PP_Var* props = NULL; | |
| uint32_t prop_count = 0; | |
| get_interface<PPB_Var_Deprecated>()->GetAllPropertyNames( | |
| var_, &prop_count, &props, OutException(exception).get()); | |
| if (!prop_count) | |
| return; | |
| properties->resize(prop_count); | |
| for (uint32_t i = 0; i < prop_count; ++i) { | |
| Var temp(PassRef(), props[i]); | |
| (*properties)[i] = temp; | |
| } | |
| const PPB_Memory_Dev* memory_if = static_cast<const PPB_Memory_Dev*>( | |
| pp::Module::Get()->GetBrowserInterface(PPB_MEMORY_DEV_INTERFACE)); | |
| memory_if->MemFree(props); | |
| } | |
| void VarPrivate::SetProperty(const Var& name, const Var& value, | |
| Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return; | |
| get_interface<PPB_Var_Deprecated>()->SetProperty( | |
| var_, name.pp_var(), value.pp_var(), OutException(exception).get()); | |
| } | |
| void VarPrivate::RemoveProperty(const Var& name, Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return; | |
| get_interface<PPB_Var_Deprecated>()->RemoveProperty( | |
| var_, name.pp_var(), OutException(exception).get()); | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, uint32_t argc, Var* argv, | |
| Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| if (argc > 0) { | |
| std::vector<PP_Var> args; | |
| args.reserve(argc); | |
| for (size_t i = 0; i < argc; i++) | |
| args.push_back(argv[i].pp_var()); | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), argc, &args[0], | |
| OutException(exception).get())); | |
| } else { | |
| // Don't try to get the address of a vector if it's empty. | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 0, NULL, | |
| OutException(exception).get())); | |
| } | |
| } | |
| VarPrivate VarPrivate::Construct(uint32_t argc, Var* argv, | |
| Var* exception) const { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| if (argc > 0) { | |
| std::vector<PP_Var> args; | |
| args.reserve(argc); | |
| for (size_t i = 0; i < argc; i++) | |
| args.push_back(argv[i].pp_var()); | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct( | |
| var_, argc, &args[0], OutException(exception).get())); | |
| } else { | |
| // Don't try to get the address of a vector if it's empty. | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct( | |
| var_, 0, NULL, OutException(exception).get())); | |
| } | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 0, NULL, OutException(exception).get())); | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, | |
| Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| PP_Var args[1] = {arg1.pp_var()}; | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 1, args, OutException(exception).get())); | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, | |
| const Var& arg2, Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| PP_Var args[2] = {arg1.pp_var(), arg2.pp_var()}; | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 2, args, OutException(exception).get())); | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, | |
| const Var& arg2, const Var& arg3, Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| PP_Var args[3] = {arg1.pp_var(), arg2.pp_var(), arg3.pp_var()}; | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 3, args, OutException(exception).get())); | |
| } | |
| VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, | |
| const Var& arg2, const Var& arg3, const Var& arg4, | |
| Var* exception) { | |
| if (!has_interface<PPB_Var_Deprecated>()) | |
| return Var(); | |
| PP_Var args[4] = {arg1.pp_var(), arg2.pp_var(), arg3.pp_var(), arg4.pp_var()}; | |
| return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( | |
| var_, method_name.pp_var(), 4, args, OutException(exception).get())); | |
| } | |
| } // namespace pp |