| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/shared_impl/var_value_conversions.h" | 5 #include "ppapi/shared_impl/var_value_conversions.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 namespace ppapi { | 26 namespace ppapi { |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 bool Equals(const base::Value& value, const PP_Var& var) { | 29 bool Equals(const base::Value& value, const PP_Var& var) { |
| 30 switch (value.GetType()) { | 30 switch (value.GetType()) { |
| 31 case base::Value::TYPE_NULL: { | 31 case base::Value::TYPE_NULL: { |
| 32 return var.type == PP_VARTYPE_NULL || var.type == PP_VARTYPE_UNDEFINED; | 32 return var.type == PP_VARTYPE_NULL || var.type == PP_VARTYPE_UNDEFINED; |
| 33 } | 33 } |
| 34 case base::Value::TYPE_BOOLEAN: { | 34 case base::Value::TYPE_BOOLEAN: { |
| 35 bool result = false; | 35 bool result = false; |
| 36 return var.type == PP_VARTYPE_BOOL && | 36 return var.type == PP_VARTYPE_BOOL && value.GetAsBoolean(&result) && |
| 37 value.GetAsBoolean(&result) && | |
| 38 result == PP_ToBool(var.value.as_bool); | 37 result == PP_ToBool(var.value.as_bool); |
| 39 } | 38 } |
| 40 case base::Value::TYPE_INTEGER: { | 39 case base::Value::TYPE_INTEGER: { |
| 41 int result = 0; | 40 int result = 0; |
| 42 return var.type == PP_VARTYPE_INT32 && | 41 return var.type == PP_VARTYPE_INT32 && value.GetAsInteger(&result) && |
| 43 value.GetAsInteger(&result) && | |
| 44 result == var.value.as_int; | 42 result == var.value.as_int; |
| 45 } | 43 } |
| 46 case base::Value::TYPE_DOUBLE: { | 44 case base::Value::TYPE_DOUBLE: { |
| 47 double result = 0; | 45 double result = 0; |
| 48 return var.type == PP_VARTYPE_DOUBLE && | 46 return var.type == PP_VARTYPE_DOUBLE && value.GetAsDouble(&result) && |
| 49 value.GetAsDouble(&result) && | |
| 50 fabs(result - var.value.as_double) < 1.0e-4; | 47 fabs(result - var.value.as_double) < 1.0e-4; |
| 51 } | 48 } |
| 52 case base::Value::TYPE_STRING: { | 49 case base::Value::TYPE_STRING: { |
| 53 std::string result; | 50 std::string result; |
| 54 StringVar* string_var = StringVar::FromPPVar(var); | 51 StringVar* string_var = StringVar::FromPPVar(var); |
| 55 return string_var && | 52 return string_var && value.GetAsString(&result) && |
| 56 value.GetAsString(&result) && | |
| 57 result == string_var->value(); | 53 result == string_var->value(); |
| 58 } | 54 } |
| 59 case base::Value::TYPE_BINARY: { | 55 case base::Value::TYPE_BINARY: { |
| 60 const base::BinaryValue& binary_value = | 56 const base::BinaryValue& binary_value = |
| 61 static_cast<const base::BinaryValue&>(value); | 57 static_cast<const base::BinaryValue&>(value); |
| 62 ArrayBufferVar* array_buffer_var = ArrayBufferVar::FromPPVar(var); | 58 ArrayBufferVar* array_buffer_var = ArrayBufferVar::FromPPVar(var); |
| 63 if (!array_buffer_var || | 59 if (!array_buffer_var || |
| 64 binary_value.GetSize() != array_buffer_var->ByteLength()) { | 60 binary_value.GetSize() != array_buffer_var->ByteLength()) { |
| 65 return false; | 61 return false; |
| 66 } | 62 } |
| 67 | 63 |
| 68 bool result = !memcmp(binary_value.GetBuffer(), array_buffer_var->Map(), | 64 bool result = !memcmp(binary_value.GetBuffer(), |
| 65 array_buffer_var->Map(), |
| 69 binary_value.GetSize()); | 66 binary_value.GetSize()); |
| 70 array_buffer_var->Unmap(); | 67 array_buffer_var->Unmap(); |
| 71 return result; | 68 return result; |
| 72 } | 69 } |
| 73 case base::Value::TYPE_DICTIONARY: { | 70 case base::Value::TYPE_DICTIONARY: { |
| 74 const base::DictionaryValue& dict_value = | 71 const base::DictionaryValue& dict_value = |
| 75 static_cast<const base::DictionaryValue&>(value); | 72 static_cast<const base::DictionaryValue&>(value); |
| 76 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); | 73 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); |
| 77 if (!dict_var) | 74 if (!dict_var) |
| 78 return false; | 75 return false; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 125 |
| 129 bool ConvertValueAndVerify(const base::Value& value) { | 126 bool ConvertValueAndVerify(const base::Value& value) { |
| 130 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(value)); | 127 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(value)); |
| 131 if (var.get().type != PP_VARTYPE_UNDEFINED) | 128 if (var.get().type != PP_VARTYPE_UNDEFINED) |
| 132 return Equals(value, var.get()); | 129 return Equals(value, var.get()); |
| 133 return false; | 130 return false; |
| 134 } | 131 } |
| 135 | 132 |
| 136 class VarValueConversionsTest : public testing::Test { | 133 class VarValueConversionsTest : public testing::Test { |
| 137 public: | 134 public: |
| 138 VarValueConversionsTest() { | 135 VarValueConversionsTest() {} |
| 139 } | 136 virtual ~VarValueConversionsTest() {} |
| 140 virtual ~VarValueConversionsTest() { | |
| 141 } | |
| 142 | 137 |
| 143 // testing::Test implementation. | 138 // testing::Test implementation. |
| 144 virtual void SetUp() { | 139 virtual void SetUp() { |
| 145 ProxyLock::EnableLockingOnThreadForTest(); | 140 ProxyLock::EnableLockingOnThreadForTest(); |
| 146 ProxyLock::Acquire(); | 141 ProxyLock::Acquire(); |
| 147 } | 142 } |
| 148 virtual void TearDown() { | 143 virtual void TearDown() { |
| 149 ASSERT_TRUE(PpapiGlobals::Get()->GetVarTracker()->GetLiveVars().empty()); | 144 ASSERT_TRUE(PpapiGlobals::Get()->GetVarTracker()->GetLiveVars().empty()); |
| 150 ProxyLock::Release(); | 145 ProxyLock::Release(); |
| 151 } | 146 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 230 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); |
| 236 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 231 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); |
| 237 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 232 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); |
| 238 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 233 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); |
| 239 scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 234 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 240 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 235 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 241 scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 236 scoped_refptr<StringVar> string_var(new StringVar("string_value")); |
| 242 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 237 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); |
| 243 | 238 |
| 244 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); | 239 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); |
| 245 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", | 240 ASSERT_TRUE( |
| 246 string_pp_var.get())); | 241 dict_var_1->SetWithStringKey("string_key", string_pp_var.get())); |
| 247 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); | 242 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); |
| 248 | 243 |
| 249 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", | 244 ASSERT_TRUE( |
| 250 PP_MakeUndefined())); | 245 dict_var_2->SetWithStringKey("undefined_key", PP_MakeUndefined())); |
| 251 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); | 246 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); |
| 252 ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); | 247 ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); |
| 253 | 248 |
| 254 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); | 249 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); |
| 255 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); | 250 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); |
| 256 ASSERT_TRUE(array_var->SetLength(4)); | 251 ASSERT_TRUE(array_var->SetLength(4)); |
| 257 | 252 |
| 258 ASSERT_TRUE(ConvertVarAndVerify(dict_pp_var_1.get())); | 253 ASSERT_TRUE(ConvertVarAndVerify(dict_pp_var_1.get())); |
| 259 } | 254 } |
| 260 | 255 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 const base::Value* value = NULL; | 382 const base::Value* value = NULL; |
| 388 ASSERT_TRUE(list_value.Get(i, &value)); | 383 ASSERT_TRUE(list_value.Get(i, &value)); |
| 389 ASSERT_TRUE(Equals(*value, vars[i])); | 384 ASSERT_TRUE(Equals(*value, vars[i])); |
| 390 | 385 |
| 391 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(vars[i]); | 386 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(vars[i]); |
| 392 } | 387 } |
| 393 } | 388 } |
| 394 } | 389 } |
| 395 | 390 |
| 396 } // namespace ppapi | 391 } // namespace ppapi |
| OLD | NEW |