1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ppapi/shared_impl/array_var.h" 6 7 #include <limits> 8 9 #include "base/logging.h" 10 #include "base/memory/ref_counted.h" 11 #include "ppapi/shared_impl/ppapi_globals.h" 12 #include "ppapi/shared_impl/var_tracker.h" 13 14 namespace ppapi { 15 16 ArrayVar::ArrayVar() { 17 } 18 19 ArrayVar::~ArrayVar() { 20 } 21 22 // static 23 ArrayVar* ArrayVar::FromPPVar(const PP_Var& var) { 24 if (var.type != PP_VARTYPE_ARRAY) 25 return NULL; 26 27 scoped_refptr<Var> var_object( 28 PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); 29 if (!var_object.get()) 30 return NULL; 31 return var_object->AsArrayVar(); 32 } 33 34 ArrayVar* ArrayVar::AsArrayVar() { 35 return this; 36 } 37 38 PP_VarType ArrayVar::GetType() const { 39 return PP_VARTYPE_ARRAY; 40 } 41 42 PP_Var ArrayVar::Get(uint32_t index) const { 43 if (index >= elements_.size()) 44 return PP_MakeUndefined(); 45 46 const PP_Var& element = elements_[index].get(); 47 if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(element)) 48 return element; 49 else 50 return PP_MakeUndefined(); 51 } 52 53 PP_Bool ArrayVar::Set(uint32_t index, const PP_Var& value) { 54 if (index == std::numeric_limits<uint32_t>::max()) 55 return PP_FALSE; 56 57 if (index >= elements_.size()) { 58 // Insert ScopedPPVars of type PP_VARTYPE_UNDEFINED to reach the new size 59 // (index + 1). 60 elements_.resize(index + 1); 61 } 62 63 elements_[index] = value; 64 return PP_TRUE; 65 } 66 67 uint32_t ArrayVar::GetLength() const { 68 if (elements_.size() > std::numeric_limits<uint32_t>::max()) { 69 CHECK(false); 70 return 0; 71 } 72 73 return static_cast<uint32_t>(elements_.size()); 74 } 75 76 PP_Bool ArrayVar::SetLength(uint32_t length) { 77 // If |length| is larger than the current size, ScopedPPVars of type 78 // PP_VARTYPE_UNDEFINED will be inserted to reach the new length. 79 elements_.resize(length); 80 return PP_TRUE; 81 } 82 83 } // namespace ppapi 84