- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / shared_impl / array_var.cc
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