| 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() != NULL); | 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() != NULL); | 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() != NULL); | 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() != NULL); | 192     ASSERT_TRUE(value.get()); | 
| 168     ASSERT_TRUE(Equals(*value, var.get())); | 193     ASSERT_TRUE(Equals(*value, var.get())); | 
| 169   } | 194   } | 
| 170 | 195 | 
|  | 196   { | 
|  | 197     // Test basic cases for array. | 
|  | 198     scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 
|  | 199     ScopedPPVar var(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 
|  | 200 | 
|  | 201     scoped_ptr<base::Value> value(CreateValueFromVar(var.get())); | 
|  | 202     ASSERT_TRUE(value.get()); | 
|  | 203     ASSERT_TRUE(Equals(*value, var.get())); | 
|  | 204 | 
|  | 205     ASSERT_TRUE(array_var->Set(0, PP_MakeDouble(1))); | 
|  | 206     value.reset(CreateValueFromVar(var.get())); | 
|  | 207     ASSERT_TRUE(value.get()); | 
|  | 208     ASSERT_TRUE(Equals(*value, var.get())); | 
|  | 209   } | 
|  | 210 | 
| 171   { | 211   { | 
| 172     // Test more complex inputs. | 212     // Test more complex inputs. | 
| 173     scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 213     scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar()); | 
| 174     ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 214     ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar()); | 
| 175     scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 215     scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar()); | 
| 176     ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 216     ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar()); | 
|  | 217     scoped_refptr<ArrayVar> array_var(new ArrayVar()); | 
|  | 218     ScopedPPVar array_pp_var(ScopedPPVar::PassRef(), array_var->GetPPVar()); | 
| 177     scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 219     scoped_refptr<StringVar> string_var(new StringVar("string_value")); | 
| 178     ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 220     ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar()); | 
| 179 | 221 | 
| 180     ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); | 222     ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull())); | 
| 181     ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", | 223     ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key", | 
| 182                                              string_pp_var.get())); | 224                                              string_pp_var.get())); | 
| 183     ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); | 225     ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get())); | 
| 184 | 226 | 
| 185     ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", | 227     ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key", | 
| 186                                              PP_MakeUndefined())); | 228                                              PP_MakeUndefined())); | 
| 187     ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); | 229     ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1))); | 
| 188     ASSERT_TRUE(dict_var_2->SetWithStringKey("int_key", PP_MakeInt32(2))); | 230     ASSERT_TRUE(dict_var_2->SetWithStringKey("array_key", array_pp_var.get())); | 
| 189     ASSERT_TRUE(dict_var_2->SetWithStringKey("bool_key", PP_MakeBool(PP_TRUE))); | 231 | 
|  | 232     ASSERT_TRUE(array_var->Set(0, PP_MakeInt32(2))); | 
|  | 233     ASSERT_TRUE(array_var->Set(1, PP_MakeBool(PP_TRUE))); | 
|  | 234     ASSERT_TRUE(array_var->SetLength(4)); | 
| 190 | 235 | 
| 191     scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 236     scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get())); | 
| 192     ASSERT_TRUE(value.get() != NULL); | 237     ASSERT_TRUE(value.get()); | 
| 193     ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | 238     ASSERT_TRUE(Equals(*value, dict_pp_var_1.get())); | 
| 194   } | 239   } | 
| 195 | 240 | 
| 196   { | 241   { | 
| 197     // Test that dictionary keys containing '.' are handled correctly. | 242     // Test that dictionary keys containing '.' are handled correctly. | 
| 198     scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 243     scoped_refptr<DictionaryVar> dict_var(new DictionaryVar()); | 
| 199     ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 244     ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar()); | 
| 200 | 245 | 
| 201     ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); | 246     ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1))); | 
| 202     ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); | 247     ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2))); | 
| 203 | 248 | 
| 204     scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get())); | 249     scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get())); | 
| 205     ASSERT_TRUE(value.get() != NULL); | 250     ASSERT_TRUE(value.get()); | 
| 206     ASSERT_TRUE(Equals(*value, dict_pp_var.get())); | 251     ASSERT_TRUE(Equals(*value, dict_pp_var.get())); | 
| 207   } | 252   } | 
| 208 } | 253 } | 
| 209 | 254 | 
| 210 TEST_F(VarValueConversionsTest, CreateVarFromValue) { | 255 TEST_F(VarValueConversionsTest, CreateVarFromValue) { | 
| 211   base::DictionaryValue dict_value; | 256   { | 
| 212   dict_value.Set("null_key", base::Value::CreateNullValue()); | 257     // Test basic cases for dictionary. | 
| 213   dict_value.SetString("string_key", "string_value"); | 258     base::DictionaryValue dict_value; | 
| 214   dict_value.SetDouble("dict_key.double_key", 1); | 259     ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 
| 215   dict_value.SetInteger("dict_key.int_key", 2); | 260     ASSERT_TRUE(Equals(dict_value, var.get())); | 
| 216   dict_value.SetBoolean("dict_key.bool_key", true); |  | 
| 217 | 261 | 
| 218   ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 262     dict_value.SetInteger("int_key", 1); | 
| 219   ASSERT_TRUE(Equals(dict_value, var.get())); | 263     var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 
|  | 264     ASSERT_TRUE(Equals(dict_value, var.get())); | 
|  | 265   } | 
|  | 266 | 
|  | 267   { | 
|  | 268     // Test basic cases for array. | 
|  | 269     base::ListValue list_value; | 
|  | 270     ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); | 
|  | 271     ASSERT_TRUE(Equals(list_value, var.get())); | 
|  | 272 | 
|  | 273     list_value.AppendInteger(1); | 
|  | 274     var = ScopedPPVar(ScopedPPVar::PassRef(), CreateVarFromValue(list_value)); | 
|  | 275     ASSERT_TRUE(Equals(list_value, var.get())); | 
|  | 276   } | 
|  | 277 | 
|  | 278   { | 
|  | 279     // Test more complex inputs. | 
|  | 280     base::DictionaryValue dict_value; | 
|  | 281     dict_value.Set("null_key", base::Value::CreateNullValue()); | 
|  | 282     dict_value.SetString("string_key", "string_value"); | 
|  | 283     dict_value.SetDouble("dict_key.double_key", 1); | 
|  | 284 | 
|  | 285     scoped_ptr<base::ListValue> list_value(new base::ListValue()); | 
|  | 286     list_value->AppendInteger(2); | 
|  | 287     list_value->AppendBoolean(true); | 
|  | 288     list_value->Append(base::Value::CreateNullValue()); | 
|  | 289 | 
|  | 290     dict_value.Set("dict_key.array_key", list_value.release()); | 
|  | 291 | 
|  | 292     ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value)); | 
|  | 293     ASSERT_TRUE(Equals(dict_value, var.get())); | 
|  | 294   } | 
| 220 } | 295 } | 
| 221 | 296 | 
| 222 }  // namespace ppapi | 297 }  // namespace ppapi | 
| OLD | NEW | 
|---|