| // Copyright (c) 2013 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/shared_impl/array_var.h" |
| |
| #include <limits> |
| |
| #include "base/logging.h" |
| #include "base/memory/ref_counted.h" |
| #include "ppapi/shared_impl/ppapi_globals.h" |
| #include "ppapi/shared_impl/var_tracker.h" |
| |
| namespace ppapi { |
| |
| ArrayVar::ArrayVar() {} |
| |
| ArrayVar::~ArrayVar() {} |
| |
| // static |
| ArrayVar* ArrayVar::FromPPVar(const PP_Var& var) { |
| if (var.type != PP_VARTYPE_ARRAY) |
| return NULL; |
| |
| scoped_refptr<Var> var_object( |
| PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); |
| if (!var_object.get()) |
| return NULL; |
| return var_object->AsArrayVar(); |
| } |
| |
| ArrayVar* ArrayVar::AsArrayVar() { return this; } |
| |
| PP_VarType ArrayVar::GetType() const { return PP_VARTYPE_ARRAY; } |
| |
| PP_Var ArrayVar::Get(uint32_t index) const { |
| if (index >= elements_.size()) |
| return PP_MakeUndefined(); |
| |
| const PP_Var& element = elements_[index].get(); |
| if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(element)) |
| return element; |
| else |
| return PP_MakeUndefined(); |
| } |
| |
| PP_Bool ArrayVar::Set(uint32_t index, const PP_Var& value) { |
| if (index == std::numeric_limits<uint32_t>::max()) |
| return PP_FALSE; |
| |
| if (index >= elements_.size()) { |
| // Insert ScopedPPVars of type PP_VARTYPE_UNDEFINED to reach the new size |
| // (index + 1). |
| elements_.resize(index + 1); |
| } |
| |
| elements_[index] = value; |
| return PP_TRUE; |
| } |
| |
| uint32_t ArrayVar::GetLength() const { |
| if (elements_.size() > std::numeric_limits<uint32_t>::max()) { |
| CHECK(false); |
| return 0; |
| } |
| |
| return static_cast<uint32_t>(elements_.size()); |
| } |
| |
| PP_Bool ArrayVar::SetLength(uint32_t length) { |
| // If |length| is larger than the current size, ScopedPPVars of type |
| // PP_VARTYPE_UNDEFINED will be inserted to reach the new length. |
| elements_.resize(length); |
| return PP_TRUE; |
| } |
| |
| } // namespace ppapi |