OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/pepper/v8_var_converter.h" | 5 #include "content/renderer/pepper/v8_var_converter.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 bool Equals(const PP_Var& var, | 76 bool Equals(const PP_Var& var, |
77 v8::Handle<v8::Value> val, | 77 v8::Handle<v8::Value> val, |
78 VarHandleMap* visited_ids) { | 78 VarHandleMap* visited_ids) { |
79 if (ppapi::VarTracker::IsVarTypeRefcounted(var.type)) { | 79 if (ppapi::VarTracker::IsVarTypeRefcounted(var.type)) { |
80 VarHandleMap::iterator it = visited_ids->find(var.value.as_id); | 80 VarHandleMap::iterator it = visited_ids->find(var.value.as_id); |
81 if (it != visited_ids->end()) | 81 if (it != visited_ids->end()) |
82 return it->second == val; | 82 return it->second == val; |
83 (*visited_ids)[var.value.as_id] = val; | 83 (*visited_ids)[var.value.as_id] = val; |
84 } | 84 } |
85 | 85 |
| 86 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
86 if (val->IsUndefined()) { | 87 if (val->IsUndefined()) { |
87 return var.type == PP_VARTYPE_UNDEFINED; | 88 return var.type == PP_VARTYPE_UNDEFINED; |
88 } else if (val->IsNull()) { | 89 } else if (val->IsNull()) { |
89 return var.type == PP_VARTYPE_NULL; | 90 return var.type == PP_VARTYPE_NULL; |
90 } else if (val->IsBoolean() || val->IsBooleanObject()) { | 91 } else if (val->IsBoolean() || val->IsBooleanObject()) { |
91 return var.type == PP_VARTYPE_BOOL && | 92 return var.type == PP_VARTYPE_BOOL && |
92 PP_FromBool(val->ToBoolean()->Value()) == var.value.as_bool; | 93 PP_FromBool(val->ToBoolean(isolate)->Value()) == var.value.as_bool; |
93 } else if (val->IsInt32()) { | 94 } else if (val->IsInt32()) { |
94 return var.type == PP_VARTYPE_INT32 && | 95 return var.type == PP_VARTYPE_INT32 && |
95 val->ToInt32()->Value() == var.value.as_int; | 96 val->ToInt32(isolate)->Value() == var.value.as_int; |
96 } else if (val->IsNumber() || val->IsNumberObject()) { | 97 } else if (val->IsNumber() || val->IsNumberObject()) { |
97 return var.type == PP_VARTYPE_DOUBLE && | 98 return var.type == PP_VARTYPE_DOUBLE && |
98 fabs(val->ToNumber()->Value() - var.value.as_double) <= 1.0e-4; | 99 fabs(val->ToNumber(isolate)->Value() - var.value.as_double) <= |
| 100 1.0e-4; |
99 } else if (val->IsString() || val->IsStringObject()) { | 101 } else if (val->IsString() || val->IsStringObject()) { |
100 if (var.type != PP_VARTYPE_STRING) | 102 if (var.type != PP_VARTYPE_STRING) |
101 return false; | 103 return false; |
102 StringVar* string_var = StringVar::FromPPVar(var); | 104 StringVar* string_var = StringVar::FromPPVar(var); |
103 DCHECK(string_var); | 105 DCHECK(string_var); |
104 v8::String::Utf8Value utf8(val->ToString()); | 106 v8::String::Utf8Value utf8(val); |
105 return std::string(*utf8, utf8.length()) == string_var->value(); | 107 return std::string(*utf8, utf8.length()) == string_var->value(); |
106 } else if (val->IsArray()) { | 108 } else if (val->IsArray()) { |
107 if (var.type != PP_VARTYPE_ARRAY) | 109 if (var.type != PP_VARTYPE_ARRAY) |
108 return false; | 110 return false; |
109 ArrayVar* array_var = ArrayVar::FromPPVar(var); | 111 ArrayVar* array_var = ArrayVar::FromPPVar(var); |
110 DCHECK(array_var); | 112 DCHECK(array_var); |
111 v8::Handle<v8::Array> v8_array = val.As<v8::Array>(); | 113 v8::Handle<v8::Array> v8_array = val.As<v8::Array>(); |
112 if (v8_array->Length() != array_var->elements().size()) | 114 if (v8_array->Length() != array_var->elements().size()) |
113 return false; | 115 return false; |
114 for (uint32 i = 0; i < v8_array->Length(); ++i) { | 116 for (uint32 i = 0; i < v8_array->Length(); ++i) { |
115 v8::Handle<v8::Value> child_v8 = v8_array->Get(i); | 117 v8::Handle<v8::Value> child_v8 = v8_array->Get(i); |
116 if (!Equals(array_var->elements()[i].get(), child_v8, visited_ids)) | 118 if (!Equals(array_var->elements()[i].get(), child_v8, visited_ids)) |
117 return false; | 119 return false; |
118 } | 120 } |
119 return true; | 121 return true; |
120 } else if (val->IsObject()) { | 122 } else if (val->IsObject()) { |
121 if (var.type == PP_VARTYPE_ARRAY_BUFFER) { | 123 if (var.type == PP_VARTYPE_ARRAY_BUFFER) { |
122 // TODO(raymes): Implement this when we have tests for array buffers. | 124 // TODO(raymes): Implement this when we have tests for array buffers. |
123 NOTIMPLEMENTED(); | 125 NOTIMPLEMENTED(); |
124 return false; | 126 return false; |
125 } else { | 127 } else { |
126 v8::Handle<v8::Object> v8_object = val->ToObject(); | 128 v8::Handle<v8::Object> v8_object = val.As<v8::Object>(); |
127 if (var.type != PP_VARTYPE_DICTIONARY) | 129 if (var.type != PP_VARTYPE_DICTIONARY) |
128 return false; | 130 return false; |
129 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); | 131 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var); |
130 DCHECK(dict_var); | 132 DCHECK(dict_var); |
131 v8::Handle<v8::Array> property_names(v8_object->GetOwnPropertyNames()); | 133 v8::Handle<v8::Array> property_names(v8_object->GetOwnPropertyNames()); |
132 if (property_names->Length() != dict_var->key_value_map().size()) | 134 if (property_names->Length() != dict_var->key_value_map().size()) |
133 return false; | 135 return false; |
134 for (uint32 i = 0; i < property_names->Length(); ++i) { | 136 for (uint32 i = 0; i < property_names->Length(); ++i) { |
135 v8::Handle<v8::Value> key(property_names->Get(i)); | 137 v8::Handle<v8::Value> key(property_names->Get(i)); |
136 | 138 |
137 if (!key->IsString() && !key->IsNumber()) | 139 if (!key->IsString() && !key->IsNumber()) |
138 return false; | 140 return false; |
139 v8::Handle<v8::Value> child_v8 = v8_object->Get(key); | 141 v8::Handle<v8::Value> child_v8 = v8_object->Get(key); |
140 | 142 |
141 v8::String::Utf8Value name_utf8(key->ToString()); | 143 v8::String::Utf8Value name_utf8(key); |
142 ScopedPPVar release_key(ScopedPPVar::PassRef(), | 144 ScopedPPVar release_key(ScopedPPVar::PassRef(), |
143 StringVar::StringToPPVar(std::string( | 145 StringVar::StringToPPVar(std::string( |
144 *name_utf8, name_utf8.length()))); | 146 *name_utf8, name_utf8.length()))); |
145 if (!dict_var->HasKey(release_key.get())) | 147 if (!dict_var->HasKey(release_key.get())) |
146 return false; | 148 return false; |
147 ScopedPPVar release_value(ScopedPPVar::PassRef(), | 149 ScopedPPVar release_value(ScopedPPVar::PassRef(), |
148 dict_var->Get(release_key.get())); | 150 dict_var->Get(release_key.get())); |
149 if (!Equals(release_value.get(), child_v8, visited_ids)) | 151 if (!Equals(release_value.get(), child_v8, visited_ids)) |
150 return false; | 152 return false; |
151 } | 153 } |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 expected->SetWithStringKey("null", quux.get()); | 437 expected->SetWithStringKey("null", quux.get()); |
436 ScopedPPVar oops(ScopedPPVar::PassRef(), StringVar::StringToPPVar("oops")); | 438 ScopedPPVar oops(ScopedPPVar::PassRef(), StringVar::StringToPPVar("oops")); |
437 expected->SetWithStringKey("undefined", oops.get()); | 439 expected->SetWithStringKey("undefined", oops.get()); |
438 ScopedPPVar release_expected(ScopedPPVar::PassRef(), expected->GetPPVar()); | 440 ScopedPPVar release_expected(ScopedPPVar::PassRef(), expected->GetPPVar()); |
439 | 441 |
440 ASSERT_TRUE(TestEqual(release_expected.get(), release_actual.get(), true)); | 442 ASSERT_TRUE(TestEqual(release_expected.get(), release_actual.get(), true)); |
441 } | 443 } |
442 } | 444 } |
443 | 445 |
444 } // namespace content | 446 } // namespace content |
OLD | NEW |