| 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" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "ppapi/c/pp_bool.h" | 14 #include "ppapi/c/pp_bool.h" |
| 15 #include "ppapi/c/pp_var.h" | 15 #include "ppapi/c/pp_var.h" |
| 16 #include "ppapi/shared_impl/array_var.h" |
| 16 #include "ppapi/shared_impl/dictionary_var.h" | 17 #include "ppapi/shared_impl/dictionary_var.h" |
| 17 #include "ppapi/shared_impl/ppapi_globals.h" | 18 #include "ppapi/shared_impl/ppapi_globals.h" |
| 18 #include "ppapi/shared_impl/proxy_lock.h" | 19 #include "ppapi/shared_impl/proxy_lock.h" |
| 19 #include "ppapi/shared_impl/scoped_pp_var.h" | 20 #include "ppapi/shared_impl/scoped_pp_var.h" |
| 20 #include "ppapi/shared_impl/test_globals.h" | 21 #include "ppapi/shared_impl/test_globals.h" |
| 21 #include "ppapi/shared_impl/var.h" | 22 #include "ppapi/shared_impl/var.h" |
| 22 #include "ppapi/shared_impl/var_tracker.h" | 23 #include "ppapi/shared_impl/var_tracker.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 25 |
| 25 namespace ppapi { | 26 namespace ppapi { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 ++non_undefined_count; | 88 ++non_undefined_count; |
| 88 const base::Value* sub_value = NULL; | 89 const base::Value* sub_value = NULL; |
| 89 if (!dict_value.GetWithoutPathExpansion(iter->first, &sub_value) || | 90 if (!dict_value.GetWithoutPathExpansion(iter->first, &sub_value) || |
| 90 !Equals(*sub_value, iter->second.get())) { | 91 !Equals(*sub_value, iter->second.get())) { |
| 91 return false; | 92 return false; |
| 92 } | 93 } |
| 93 } | 94 } |
| 94 return non_undefined_count == dict_value.size(); | 95 return non_undefined_count == dict_value.size(); |
| 95 } | 96 } |
| 96 case base::Value::TYPE_LIST: { | 97 case base::Value::TYPE_LIST: { |
| 97 // TODO(yzshen): add support once array var is supported. | 98 const base::ListValue& list_value = |
| 98 return false; | 99 static_cast<const base::ListValue&>(value); |
| 100 ArrayVar* array_var = ArrayVar::FromPPVar(var); |
| 101 if (!array_var || list_value.GetSize() != array_var->elements().size()) |
| 102 return false; |
| 103 |
| 104 base::ListValue::const_iterator value_iter = list_value.begin(); |
| 105 ArrayVar::ElementVector::const_iterator var_iter = |
| 106 array_var->elements().begin(); |
| 107 for (; value_iter != list_value.end() && |
| 108 var_iter != array_var->elements().end(); |
| 109 ++value_iter, ++var_iter) { |
| 110 if (!Equals(**value_iter, var_iter->get())) |
| 111 return false; |
| 112 } |
| 113 return true; |
| 99 } | 114 } |
| 100 } | 115 } |
| 101 NOTREACHED(); | 116 NOTREACHED(); |
| 102 return false; | 117 return false; |
| 103 } | 118 } |
| 104 | 119 |
| 105 class VarValueConversionsTest : public testing::Test { | 120 class VarValueConversionsTest : public testing::Test { |
| 106 public: | 121 public: |
| 107 VarValueConversionsTest() { | 122 VarValueConversionsTest() { |
| 108 } | 123 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 120 | 135 |
| 121 private: | 136 private: |
| 122 TestGlobals globals_; | 137 TestGlobals globals_; |
| 123 }; | 138 }; |
| 124 | 139 |
| 125 } // namespace | 140 } // namespace |
| 126 | 141 |
| 127 TEST_F(VarValueConversionsTest, CreateValueFromVar) { | 142 TEST_F(VarValueConversionsTest, CreateValueFromVar) { |
| 128 { | 143 { |
| 129 // Var holding a ref to itself is not a valid input. | 144 // Var holding a ref to itself is not a valid input. |
| 130 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 145 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 131 ScopedPPVar var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 146 ScopedPPVar var_1(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 132 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 147 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 133 ScopedPPVar var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 148 ScopedPPVar var_2(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 134 | 149 |
| 135 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_1", var_2.get())); | 150 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", var_2.get())); |
| 136 scoped_ptr<base::Value> value(CreateValueFromVar(var_1.get())); | 151 scoped_ptr<base::Value> value(CreateValueFromVar(var_1.get())); |
| 137 ASSERT_TRUE(value.get()); | 152 ASSERT_TRUE(value.get()); |
| 138 | 153 |
| 139 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_2", var_1.get())); | 154 ASSERT_TRUE(array_var->Set(0, var_1.get())); |
| 140 value.reset(CreateValueFromVar(var_1.get())); | 155 value.reset(CreateValueFromVar(var_1.get())); |
| 141 ASSERT_EQ(NULL, value.get()); | 156 ASSERT_EQ(NULL, value.get()); |
| 142 | 157 |
| 143 // Make sure |var_1| doesn't indirectly hold a ref to itself, otherwise it | 158 // Make sure |var_1| doesn't indirectly hold a ref to itself, otherwise it |
| 144 // is leaked. | 159 // is leaked. |
| 145 dict_var_1->DeleteWithStringKey("key_1"); | 160 dict_var->DeleteWithStringKey("key_1"); |
| 146 } | 161 } |
| 147 | 162 |
| 148 // Vars of null or undefined type are converted to null values. | 163 // Vars of null or undefined type are converted to null values. |
| 149 { | 164 { |
| 150 scoped_ptr<base::Value> value(CreateValueFromVar(PP_MakeNull())); | 165 scoped_ptr<base::Value> value(CreateValueFromVar(PP_MakeNull())); |
| 151 ASSERT_TRUE(value.get()); | 166 ASSERT_TRUE(value.get()); |
| 152 ASSERT_TRUE(Equals(*value, PP_MakeNull())); | 167 ASSERT_TRUE(Equals(*value, PP_MakeNull())); |
| 153 | 168 |
| 154 value.reset(CreateValueFromVar(PP_MakeUndefined())); | 169 value.reset(CreateValueFromVar(PP_MakeUndefined())); |
| 155 ASSERT_TRUE(value.get()); | 170 ASSERT_TRUE(value.get()); |
| 156 ASSERT_TRUE(Equals(*value, PP_MakeUndefined())); | 171 ASSERT_TRUE(Equals(*value, PP_MakeUndefined())); |
| 157 } | 172 } |
| 158 | 173 |
| 159 { | 174 { |
| 175 // Test empty dictionary. |
| 176 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 177 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 178 |
| 179 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); |
| 180 ASSERT_TRUE(value.get()); |
| 181 ASSERT_TRUE(Equals(*value, var.get())); |
| 182 } |
| 183 |
| 184 { |
| 160 // Key-value pairs whose value is undefined are ignored. | 185 // Key-value pairs whose value is undefined are ignored. |
| 161 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 186 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 162 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", PP_MakeUndefined())); | 187 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", PP_MakeUndefined())); |
| 163 ASSERT_TRUE(dict_var->SetWithStringKey("key_2", PP_MakeInt32(1))); | 188 ASSERT_TRUE(dict_var->SetWithStringKey("key_2", PP_MakeInt32(1))); |
| 164 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 189 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 165 | 190 |
| 166 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); | 191 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); |
| 167 ASSERT_TRUE(value.get()); | 192 ASSERT_TRUE(value.get()); |
| 168 ASSERT_TRUE(Equals(*value, var.get())); | 193 ASSERT_TRUE(Equals(*value, var.get())); |
| 169 } | 194 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 181 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_2", dict_pp_var_2.get())); | 206 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_2", dict_pp_var_2.get())); |
| 182 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_3", string_pp_var.get())); | 207 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_3", string_pp_var.get())); |
| 183 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_4", string_pp_var.get())); | 208 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_4", string_pp_var.get())); |
| 184 | 209 |
| 185 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 210 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); |
| 186 ASSERT_TRUE(value.get()); | 211 ASSERT_TRUE(value.get()); |
| 187 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | 212 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); |
| 188 } | 213 } |
| 189 | 214 |
| 190 { | 215 { |
| 216 // Test basic cases for array. |
| 217 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 218 ScopedPPVar var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 219 |
| 220 scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); |
| 221 ASSERT_TRUE(value.get()); |
| 222 ASSERT_TRUE(Equals(*value, var.get())); |
| 223 |
| 224 ASSERT_TRUE(array_var->Set(0, PP_MakeDouble(1))); |
| 225 value.reset(CreateValueFromVar(var.get())); |
| 226 ASSERT_TRUE(value.get()); |
| 227 ASSERT_TRUE(Equals(*value, var.get())); |
| 228 } |
| 229 |
| 230 { |
| 191 // Test more complex inputs. | 231 // Test more complex inputs. |
| 192 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 232 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); |
| 193 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 233 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); |
| 194 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 234 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); |
| 195 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 235 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); |
| 236 scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| 237 ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); |
| 196 scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 238 scoped_refptr<StringVar> string_var(new StringVar("string_value")); |
| 197 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 239 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); |
| 198 | 240 |
| 199 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); | 241 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); |
| 200 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", | 242 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", |
| 201 string_pp_var.get())); | 243 string_pp_var.get())); |
| 202 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); | 244 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); |
| 203 | 245 |
| 204 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", | 246 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", |
| 205 PP_MakeUndefined())); | 247 PP_MakeUndefined())); |
| 206 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); | 248 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); |
| 207 ASSERT_TRUE(dict_var_2->SetWithStringKey("int_key", PP_MakeInt32(2))); | 249 ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); |
| 208 ASSERT_TRUE(dict_var_2->SetWithStringKey("bool_key", PP_MakeBool(PP_TRUE))); | 250 |
| 251 ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); |
| 252 ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); |
| 253 ASSERT_TRUE(array_var->SetLength(4)); |
| 209 | 254 |
| 210 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 255 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); |
| 211 ASSERT_TRUE(value.get()); | 256 ASSERT_TRUE(value.get()); |
| 212 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | 257 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); |
| 213 } | 258 } |
| 214 | 259 |
| 215 { | 260 { |
| 216 // Test that dictionary keys containing '.' are handled correctly. | 261 // Test that dictionary keys containing '.' are handled correctly. |
| 217 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 262 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); |
| 218 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 263 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); |
| 219 | 264 |
| 220 ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); | 265 ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); |
| 221 ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); | 266 ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); |
| 222 | 267 |
| 223 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get())); | 268 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get())); |
| 224 ASSERT_TRUE(value.get()); | 269 ASSERT_TRUE(value.get()); |
| 225 ASSERT_TRUE(Equals(*value, dict_pp_var.get())); | 270 ASSERT_TRUE(Equals(*value, dict_pp_var.get())); |
| 226 } | 271 } |
| 227 } | 272 } |
| 228 | 273 |
| 229 TEST_F(VarValueConversionsTest, CreateVarFromValue) { | 274 TEST_F(VarValueConversionsTest, CreateVarFromValue) { |
| 230 base::DictionaryValue dict_value; | 275 { |
| 231 dict_value.Set("null_key", base::Value::CreateNullValue()); | 276 // Test basic cases for dictionary. |
| 232 dict_value.SetString("string_key", "string_value"); | 277 base::DictionaryValue dict_value; |
| 233 dict_value.SetDouble("dict_key.double_key", 1); | 278 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); |
| 234 dict_value.SetInteger("dict_key.int_key", 2); | 279 ASSERT_TRUE(Equals(dict_value, var.get())); |
| 235 dict_value.SetBoolean("dict_key.bool_key", true); | |
| 236 | 280 |
| 237 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 281 dict_value.SetInteger("int_key", 1); |
| 238 ASSERT_TRUE(Equals(dict_value, var.get())); | 282 var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); |
| 283 ASSERT_TRUE(Equals(dict_value, var.get())); |
| 284 } |
| 285 |
| 286 { |
| 287 // Test basic cases for array. |
| 288 base::ListValue list_value; |
| 289 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); |
| 290 ASSERT_TRUE(Equals(list_value, var.get())); |
| 291 |
| 292 list_value.AppendInteger(1); |
| 293 var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); |
| 294 ASSERT_TRUE(Equals(list_value, var.get())); |
| 295 } |
| 296 |
| 297 { |
| 298 // Test more complex inputs. |
| 299 base::DictionaryValue dict_value; |
| 300 dict_value.Set("null_key", base::Value::CreateNullValue()); |
| 301 dict_value.SetString("string_key", "string_value"); |
| 302 dict_value.SetDouble("dict_key.double_key", 1); |
| 303 |
| 304 scoped_ptr<base::ListValue> list_value(new base::ListValue()); |
| 305 list_value->AppendInteger(2); |
| 306 list_value->AppendBoolean(true); |
| 307 list_value->Append(base::Value::CreateNullValue()); |
| 308 |
| 309 dict_value.Set("dict_key.array_key", list_value.release()); |
| 310 |
| 311 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); |
| 312 ASSERT_TRUE(Equals(dict_value, var.get())); |
| 313 } |
| 239 } | 314 } |
| 240 | 315 |
| 241 } // namespace ppapi | 316 } // namespace ppapi |
| OLD | NEW |