| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 array_buffer_var->Unmap(); | 70 array_buffer_var->Unmap(); |
| 71 return result; | 71 return result; |
| 72 } | 72 } |
| 73 case base::Value::TYPE_DICTIONARY: { | 73 case base::Value::TYPE_DICTIONARY: { |
| 74 const base::DictionaryValue& dict_value = | 74 const base::DictionaryValue& dict_value = |
| 75 static_cast<const base::DictionaryValue&>(value); | 75 static_cast<const base::DictionaryValue&>(value); |
| 76 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); | 76 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); |
| 77 if (!dict_var) | 77 if (!dict_var) |
| 78 return false; | 78 return false; |
| 79 | 79 |
| 80 size_t non_undefined_count = 0; | 80 size_t count = 0; |
| 81 for (DictionaryVar::KeyValueMap::const_iterator iter = | 81 for (DictionaryVar::KeyValueMap::const_iterator iter = |
| 82 dict_var->key_value_map().begin(); | 82 dict_var->key_value_map().begin(); |
| 83 iter != dict_var->key_value_map().end(); | 83 iter != dict_var->key_value_map().end(); |
| 84 ++iter) { | 84 ++iter) { |
| 85 if (iter->second.get().type == PP_VARTYPE_UNDEFINED) | 85 if (iter->second.get().type == PP_VARTYPE_UNDEFINED || |
| 86 iter->second.get().type == PP_VARTYPE_NULL) { |
| 86 continue; | 87 continue; |
| 88 } |
| 87 | 89 |
| 88 ++non_undefined_count; | 90 ++count; |
| 89 const base::Value* sub_value = NULL; | 91 const base::Value* sub_value = NULL; |
| 90 if (!dict_value.GetWithoutPathExpansion(iter->first, &sub_value) || | 92 if (!dict_value.GetWithoutPathExpansion(iter->first, &sub_value) || |
| 91 !Equals(*sub_value, iter->second.get())) { | 93 !Equals(*sub_value, iter->second.get())) { |
| 92 return false; | 94 return false; |
| 93 } | 95 } |
| 94 } | 96 } |
| 95 return non_undefined_count == dict_value.size(); | 97 return count == dict_value.size(); |
| 96 } | 98 } |
| 97 case base::Value::TYPE_LIST: { | 99 case base::Value::TYPE_LIST: { |
| 98 const base::ListValue& list_value = | 100 const base::ListValue& list_value = |
| 99 static_cast<const base::ListValue&>(value); | 101 static_cast<const base::ListValue&>(value); |
| 100 ArrayVar* array_var = ArrayVar::FromPPVar(var); | 102 ArrayVar* array_var = ArrayVar::FromPPVar(var); |
| 101 if (!array_var || list_value.GetSize() != array_var->elements().size()) | 103 if (!array_var || list_value.GetSize() != array_var->elements().size()) |
| 102 return false; | 104 return false; |
| 103 | 105 |
| 104 base::ListValue::const_iterator value_iter = list_value.begin(); | 106 base::ListValue::const_iterator value_iter = list_value.begin(); |
| 105 ArrayVar::ElementVector::const_iterator var_iter = | 107 ArrayVar::ElementVector::const_iterator var_iter = |
| 106 array_var->elements().begin(); | 108 array_var->elements().begin(); |
| 107 for (; value_iter != list_value.end() && | 109 for (; value_iter != list_value.end() && |
| 108 var_iter != array_var->elements().end(); | 110 var_iter != array_var->elements().end(); |
| 109 ++value_iter, ++var_iter) { | 111 ++value_iter, ++var_iter) { |
| 110 if (!Equals(**value_iter, var_iter->get())) | 112 if (!Equals(**value_iter, var_iter->get())) |
| 111 return false; | 113 return false; |
| 112 } | 114 } |
| 113 return true; | 115 return true; |
| 114 } | 116 } |
| 115 } | 117 } |
| 116 NOTREACHED(); | 118 NOTREACHED(); |
| 117 return false; | 119 return false; |
| 118 } | 120 } |
| 119 | 121 |
| 122 bool ConvertVarAndVerify(const PP_Var& var) { |
| 123 scoped_ptr<base::Value> value(CreateValueFromVar(var)); |
| 124 if (value.get()) |
| 125 return Equals(*value, var); |
| 126 return false; |
| 127 } |
| 128 |
| 129 bool ConvertValueAndVerify(const base::Value& value) { |
| 130 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(value)); |
| 131 if (var.get().type != PP_VARTYPE_UNDEFINED) |
| 132 return Equals(value, var.get()); |
| 133 return false; |
| 134 } |
| 135 |
| 120 class VarValueConversionsTest : public testing::Test { | 136 class VarValueConversionsTest : public testing::Test { |
| 121 public: | 137 public: |
| 122 VarValueConversionsTest() { | 138 VarValueConversionsTest() { |
| 123 } | 139 } |
| 124 virtual ~VarValueConversionsTest() { | 140 virtual ~VarValueConversionsTest() { |
| 125 } | 141 } |
| 126 | 142 |
| 127 // testing::Test implementation. | 143 // testing::Test implementation. |
| 128 virtual void SetUp() { | 144 virtual void SetUp() { |
| 129 ProxyLock::Acquire(); | 145 ProxyLock::Acquire(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 141 | 157 |
| 142 TEST_F(VarValueConversionsTest, CreateValueFromVar) { | 158 TEST_F(VarValueConversionsTest, CreateValueFromVar) { |
| 143 { | 159 { |
| 144 // Var holding a ref to itself is not a valid input. | 160 // Var holding a ref to itself is not a valid input. |
| 145 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 161 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 146 ScopedPPVar var_1(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 162 ScopedPPVar var_1(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 147 scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 163 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 148 ScopedPPVar var_2(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 164 ScopedPPVar var_2(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 149 | 165 |
| 150 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", var_2.get())); | 166 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", var_2.get())); |
| 151 scoped_ptr<base::Value> value(CreateValueFromVar(var_1.get())); | 167 ASSERT_TRUE(ConvertVarAndVerify(var_1.get())); |
| 152 ASSERT_TRUE(value.get()); | |
| 153 | 168 |
| 154 ASSERT_TRUE(array_var->Set(0, var_1.get())); | 169 ASSERT_TRUE(array_var->Set(0, var_1.get())); |
| 155 value.reset(CreateValueFromVar(var_1.get())); | 170 scoped_ptr<base::Value> value(CreateValueFromVar(var_1.get())); |
| 156 ASSERT_EQ(NULL, value.get()); | 171 ASSERT_EQ(NULL, value.get()); |
| 157 | 172 |
| 158 // Make sure |var_1| doesn't indirectly hold a ref to itself, otherwise it | 173 // Make sure |var_1| doesn't indirectly hold a ref to itself, otherwise it |
| 159 // is leaked. | 174 // is leaked. |
| 160 dict_var->DeleteWithStringKey("key_1"); | 175 dict_var->DeleteWithStringKey("key_1"); |
| 161 } | 176 } |
| 162 | 177 |
| 163 // Vars of null or undefined type are converted to null values. | 178 // Vars of null or undefined type are converted to null values. |
| 164 { | 179 { |
| 165 scoped_ptr<base::Value> value(CreateValueFromVar(PP_MakeNull())); | 180 ASSERT_TRUE(ConvertVarAndVerify(PP_MakeNull())); |
| 166 ASSERT_TRUE(value.get()); | 181 ASSERT_TRUE(ConvertVarAndVerify(PP_MakeUndefined())); |
| 167 ASSERT_TRUE(Equals(*value, PP_MakeNull())); | |
| 168 | |
| 169 value.reset(CreateValueFromVar(PP_MakeUndefined())); | |
| 170 ASSERT_TRUE(value.get()); | |
| 171 ASSERT_TRUE(Equals(*value, PP_MakeUndefined())); | |
| 172 } | 182 } |
| 173 | 183 |
| 174 { | 184 { |
| 175 // Test empty dictionary. | 185 // Test empty dictionary. |
| 176 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 186 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 177 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 187 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 178 | 188 |
| 179 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); | 189 ASSERT_TRUE(ConvertVarAndVerify(var.get())); |
| 180 ASSERT_TRUE(value.get()); | |
| 181 ASSERT_TRUE(Equals(*value, var.get())); | |
| 182 } | 190 } |
| 183 | 191 |
| 184 { | 192 { |
| 185 // Key-value pairs whose value is undefined are ignored. | 193 // Key-value pairs whose value is undefined or null are ignored. |
| 186 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 194 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 187 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", PP_MakeUndefined())); | 195 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", PP_MakeUndefined())); |
| 188 ASSERT_TRUE(dict_var->SetWithStringKey("key_2", PP_MakeInt32(1))); | 196 ASSERT_TRUE(dict_var->SetWithStringKey("key_2", PP_MakeInt32(1))); |
| 197 ASSERT_TRUE(dict_var->SetWithStringKey("key_3", PP_MakeNull())); |
| 189 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 198 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 190 | 199 |
| 191 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); | 200 ASSERT_TRUE(ConvertVarAndVerify(var.get())); |
| 192 ASSERT_TRUE(value.get()); | |
| 193 ASSERT_TRUE(Equals(*value, var.get())); | |
| 194 } | 201 } |
| 195 | 202 |
| 196 { | 203 { |
| 197 // The same PP_Var is allowed to appear multiple times. | 204 // The same PP_Var is allowed to appear multiple times. |
| 198 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 205 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); |
| 199 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 206 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); |
| 200 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 207 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); |
| 201 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 208 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); |
| 202 scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 209 scoped_refptr<StringVar> string_var(new StringVar("string_value")); |
| 203 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 210 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); |
| 204 | 211 |
| 205 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_1", dict_pp_var_2.get())); | 212 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_1", dict_pp_var_2.get())); |
| 206 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_2", dict_pp_var_2.get())); | 213 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_2", dict_pp_var_2.get())); |
| 207 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_3", string_pp_var.get())); | 214 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_3", string_pp_var.get())); |
| 208 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_4", string_pp_var.get())); | 215 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_4", string_pp_var.get())); |
| 209 | 216 |
| 210 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 217 ASSERT_TRUE(ConvertVarAndVerify(dict_pp_var_1.get())); |
| 211 ASSERT_TRUE(value.get()); | |
| 212 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | |
| 213 } | 218 } |
| 214 | 219 |
| 215 { | 220 { |
| 216 // Test basic cases for array. | 221 // Test basic cases for array. |
| 217 scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 222 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 218 ScopedPPVar var(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 223 ScopedPPVar var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 219 | 224 |
| 220 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); | 225 ASSERT_TRUE(ConvertVarAndVerify(var.get())); |
| 221 ASSERT_TRUE(value.get()); | |
| 222 ASSERT_TRUE(Equals(*value, var.get())); | |
| 223 | 226 |
| 224 ASSERT_TRUE(array_var->Set(0, PP_MakeDouble(1))); | 227 ASSERT_TRUE(array_var->Set(0, PP_MakeDouble(1))); |
| 225 value.reset(CreateValueFromVar(var.get())); | 228 |
| 226 ASSERT_TRUE(value.get()); | 229 ASSERT_TRUE(ConvertVarAndVerify(var.get())); |
| 227 ASSERT_TRUE(Equals(*value, var.get())); | |
| 228 } | 230 } |
| 229 | 231 |
| 230 { | 232 { |
| 231 // Test more complex inputs. | 233 // Test more complex inputs. |
| 232 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 234 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); |
| 233 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 235 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); |
| 234 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 236 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); |
| 235 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 237 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); |
| 236 scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 238 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 237 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 239 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 238 scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 240 scoped_refptr<StringVar> string_var(new StringVar("string_value")); |
| 239 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 241 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); |
| 240 | 242 |
| 241 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); | 243 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); |
| 242 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", | 244 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", |
| 243 string_pp_var.get())); | 245 string_pp_var.get())); |
| 244 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); | 246 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); |
| 245 | 247 |
| 246 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", | 248 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", |
| 247 PP_MakeUndefined())); | 249 PP_MakeUndefined())); |
| 248 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); | 250 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); |
| 249 ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); | 251 ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); |
| 250 | 252 |
| 251 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); | 253 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); |
| 252 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); | 254 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); |
| 253 ASSERT_TRUE(array_var->SetLength(4)); | 255 ASSERT_TRUE(array_var->SetLength(4)); |
| 254 | 256 |
| 255 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 257 ASSERT_TRUE(ConvertVarAndVerify(dict_pp_var_1.get())); |
| 256 ASSERT_TRUE(value.get()); | |
| 257 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | |
| 258 } | 258 } |
| 259 | 259 |
| 260 { | 260 { |
| 261 // Test that dictionary keys containing '.' are handled correctly. | 261 // Test that dictionary keys containing '.' are handled correctly. |
| 262 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 262 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 263 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 263 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 264 | 264 |
| 265 ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); | 265 ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); |
| 266 ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); | 266 ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); |
| 267 | 267 |
| 268 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get())); | 268 ASSERT_TRUE(ConvertVarAndVerify(dict_pp_var.get())); |
| 269 ASSERT_TRUE(value.get()); | |
| 270 ASSERT_TRUE(Equals(*value, dict_pp_var.get())); | |
| 271 } | 269 } |
| 272 } | 270 } |
| 273 | 271 |
| 274 TEST_F(VarValueConversionsTest, CreateVarFromValue) { | 272 TEST_F(VarValueConversionsTest, CreateVarFromValue) { |
| 275 { | 273 { |
| 276 // Test basic cases for dictionary. | 274 // Test basic cases for dictionary. |
| 277 base::DictionaryValue dict_value; | 275 base::DictionaryValue dict_value; |
| 278 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 276 ASSERT_TRUE(ConvertValueAndVerify(dict_value)); |
| 279 ASSERT_TRUE(Equals(dict_value, var.get())); | |
| 280 | 277 |
| 281 dict_value.SetInteger("int_key", 1); | 278 dict_value.SetInteger("int_key", 1); |
| 282 var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 279 ASSERT_TRUE(ConvertValueAndVerify(dict_value)); |
| 283 ASSERT_TRUE(Equals(dict_value, var.get())); | |
| 284 } | 280 } |
| 285 | 281 |
| 286 { | 282 { |
| 287 // Test basic cases for array. | 283 // Test basic cases for array. |
| 288 base::ListValue list_value; | 284 base::ListValue list_value; |
| 289 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); | 285 ASSERT_TRUE(ConvertValueAndVerify(list_value)); |
| 290 ASSERT_TRUE(Equals(list_value, var.get())); | |
| 291 | 286 |
| 292 list_value.AppendInteger(1); | 287 list_value.AppendInteger(1); |
| 293 var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); | 288 ASSERT_TRUE(ConvertValueAndVerify(list_value)); |
| 294 ASSERT_TRUE(Equals(list_value, var.get())); | |
| 295 } | 289 } |
| 296 | 290 |
| 297 { | 291 { |
| 298 // Test more complex inputs. | 292 // Test more complex inputs. |
| 299 base::DictionaryValue dict_value; | 293 base::DictionaryValue dict_value; |
| 300 dict_value.Set("null_key", base::Value::CreateNullValue()); | |
| 301 dict_value.SetString("string_key", "string_value"); | 294 dict_value.SetString("string_key", "string_value"); |
| 302 dict_value.SetDouble("dict_key.double_key", 1); | 295 dict_value.SetDouble("dict_key.double_key", 1); |
| 303 | 296 |
| 304 scoped_ptr<base::ListValue> list_value(new base::ListValue()); | 297 scoped_ptr<base::ListValue> list_value(new base::ListValue()); |
| 305 list_value->AppendInteger(2); | 298 list_value->AppendInteger(2); |
| 306 list_value->AppendBoolean(true); | 299 list_value->AppendBoolean(true); |
| 307 list_value->Append(base::Value::CreateNullValue()); | 300 list_value->Append(base::Value::CreateNullValue()); |
| 308 | 301 |
| 309 dict_value.Set("dict_key.array_key", list_value.release()); | 302 dict_value.Set("dict_key.array_key", list_value.release()); |
| 310 | 303 |
| 311 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 304 ASSERT_TRUE(ConvertValueAndVerify(dict_value)); |
| 312 ASSERT_TRUE(Equals(dict_value, var.get())); | |
| 313 } | 305 } |
| 314 } | 306 } |
| 315 | 307 |
| 308 TEST_F(VarValueConversionsTest, CreateListValueFromVarVector) { |
| 309 { |
| 310 // Test empty var vector. |
| 311 scoped_ptr<base::ListValue> list_value( |
| 312 CreateListValueFromVarVector(std::vector<PP_Var>())); |
| 313 ASSERT_TRUE(list_value.get()); |
| 314 ASSERT_EQ(0u, list_value->GetSize()); |
| 315 } |
| 316 |
| 317 { |
| 318 // Test more complex inputs. |
| 319 scoped_refptr<StringVar> string_var(new StringVar("string_value")); |
| 320 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); |
| 321 |
| 322 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 323 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 324 ASSERT_TRUE(dict_var->SetWithStringKey("null_key", PP_MakeNull())); |
| 325 ASSERT_TRUE(dict_var->SetWithStringKey("string_key", string_pp_var.get())); |
| 326 |
| 327 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 328 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 329 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); |
| 330 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); |
| 331 ASSERT_TRUE(array_var->SetLength(4)); |
| 332 |
| 333 std::vector<PP_Var> vars; |
| 334 vars.push_back(dict_pp_var.get()); |
| 335 vars.push_back(string_pp_var.get()); |
| 336 vars.push_back(array_pp_var.get()); |
| 337 vars.push_back(PP_MakeDouble(1)); |
| 338 vars.push_back(PP_MakeUndefined()); |
| 339 vars.push_back(PP_MakeNull()); |
| 340 |
| 341 scoped_ptr<base::ListValue> list_value(CreateListValueFromVarVector(vars)); |
| 342 |
| 343 ASSERT_TRUE(list_value.get()); |
| 344 ASSERT_EQ(vars.size(), list_value->GetSize()); |
| 345 |
| 346 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 347 const base::Value* value = NULL; |
| 348 ASSERT_TRUE(list_value->Get(i, &value)); |
| 349 ASSERT_TRUE(Equals(*value, vars[i])); |
| 350 } |
| 351 } |
| 352 } |
| 353 |
| 354 TEST_F(VarValueConversionsTest, CreateVarVectorFromListValue) { |
| 355 { |
| 356 // Test empty list. |
| 357 base::ListValue list_value; |
| 358 std::vector<PP_Var> vars; |
| 359 ASSERT_TRUE(CreateVarVectorFromListValue(list_value, &vars)); |
| 360 ASSERT_EQ(0u, vars.size()); |
| 361 } |
| 362 |
| 363 { |
| 364 // Test more complex inputs. |
| 365 base::ListValue list_value; |
| 366 |
| 367 scoped_ptr<base::DictionaryValue> dict_value(new base::DictionaryValue()); |
| 368 dict_value->SetString("string_key", "string_value"); |
| 369 |
| 370 scoped_ptr<base::ListValue> sub_list_value(new base::ListValue()); |
| 371 sub_list_value->AppendInteger(2); |
| 372 sub_list_value->AppendBoolean(true); |
| 373 |
| 374 list_value.Append(dict_value.release()); |
| 375 list_value.AppendString("string_value"); |
| 376 list_value.Append(sub_list_value.release()); |
| 377 list_value.AppendDouble(1); |
| 378 list_value.Append(base::Value::CreateNullValue()); |
| 379 |
| 380 std::vector<PP_Var> vars; |
| 381 ASSERT_TRUE(CreateVarVectorFromListValue(list_value, &vars)); |
| 382 |
| 383 ASSERT_EQ(list_value.GetSize(), vars.size()); |
| 384 |
| 385 for (size_t i = 0; i < list_value.GetSize(); ++i) { |
| 386 const base::Value* value = NULL; |
| 387 ASSERT_TRUE(list_value.Get(i, &value)); |
| 388 ASSERT_TRUE(Equals(*value, vars[i])); |
| 389 |
| 390 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(vars[i]); |
| 391 } |
| 392 } |
| 393 } |
| 394 |
| 316 } // namespace ppapi | 395 } // namespace ppapi |
| OLD | NEW |