diff options
-rw-r--r-- | content/renderer/v8_value_converter_impl.cc | 67 | ||||
-rw-r--r-- | content/renderer/v8_value_converter_impl.h | 11 | ||||
-rw-r--r-- | content/renderer/v8_value_converter_impl_unittest.cc | 72 | ||||
-rw-r--r-- | content/test/unittest_test_suite.cc | 3 |
4 files changed, 24 insertions, 129 deletions
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc index 20923cc..993ee37 100644 --- a/content/renderer/v8_value_converter_impl.cc +++ b/content/renderer/v8_value_converter_impl.cc @@ -19,12 +19,14 @@ using base::ListValue; using base::StringValue; using base::Value; + namespace content { V8ValueConverter* V8ValueConverter::create() { return new V8ValueConverterImpl(); } -} // namespace content + +} V8ValueConverterImpl::V8ValueConverterImpl() : undefined_allowed_(false), @@ -77,8 +79,7 @@ Value* V8ValueConverterImpl::FromV8Value( v8::Handle<v8::Context> context) const { v8::Context::Scope context_scope(context); v8::HandleScope handle_scope; - std::set<int> unique_set; - return FromV8ValueImpl(val, &unique_set); + return FromV8ValueImpl(val); } v8::Handle<v8::Value> V8ValueConverterImpl::ToV8ValueImpl( @@ -179,8 +180,7 @@ v8::Handle<v8::Value> V8ValueConverterImpl::ToArrayBuffer( return buffer.toV8Value(); } -Value* V8ValueConverterImpl::FromV8ValueImpl(v8::Handle<v8::Value> val, - std::set<int>* unique_set) const { +Value* V8ValueConverterImpl::FromV8ValueImpl(v8::Handle<v8::Value> val) const { CHECK(!val.IsEmpty()); if (val->IsNull()) @@ -215,37 +215,22 @@ Value* V8ValueConverterImpl::FromV8ValueImpl(v8::Handle<v8::Value> val, // v8::Value doesn't have a ToArray() method for some reason. if (val->IsArray()) - return FromV8Array(val.As<v8::Array>(), unique_set); + return FromV8Array(val.As<v8::Array>()); if (val->IsObject()) { BinaryValue* binary_value = FromV8Buffer(val); if (binary_value) { return binary_value; } else { - return FromV8Object(val->ToObject(), unique_set); + return FromV8Object(val->ToObject()); } } LOG(ERROR) << "Unexpected v8 value type encountered."; return Value::CreateNullValue(); } -Value* V8ValueConverterImpl::FromV8Array(v8::Handle<v8::Array> val, - std::set<int>* unique_set) const { - if (unique_set && unique_set->count(val->GetIdentityHash())) - return Value::CreateNullValue(); - - scoped_ptr<v8::Context::Scope> scope; - // If val was created in a different context than our current one, change to - // that context, but change back after val is converted. - if (!val->CreationContext().IsEmpty() && - val->CreationContext() != v8::Context::GetCurrent()) - scope.reset(new v8::Context::Scope(val->CreationContext())); - +ListValue* V8ValueConverterImpl::FromV8Array(v8::Handle<v8::Array> val) const { ListValue* result = new ListValue(); - - if (unique_set) - unique_set->insert(val->GetIdentityHash()); - // Only fields with integer keys are carried over to the ListValue. for (uint32 i = 0; i < val->Length(); ++i) { v8::TryCatch try_catch; v8::Handle<v8::Value> child_v8 = val->Get(i); @@ -254,10 +239,12 @@ Value* V8ValueConverterImpl::FromV8Array(v8::Handle<v8::Array> val, child_v8 = v8::Null(); } + // TODO(aa): It would be nice to support getters, but we need + // http://code.google.com/p/v8/issues/detail?id=1342 to do it properly. if (!val->HasRealIndexedProperty(i)) continue; - Value* child = FromV8ValueImpl(child_v8, unique_set); + Value* child = FromV8ValueImpl(child_v8); CHECK(child); result->Append(child); @@ -290,42 +277,29 @@ base::BinaryValue* V8ValueConverterImpl::FromV8Buffer( return NULL; } -Value* V8ValueConverterImpl::FromV8Object( - v8::Handle<v8::Object> val, - std::set<int>* unique_set) const { - if (unique_set && unique_set->count(val->GetIdentityHash())) - return Value::CreateNullValue(); - scoped_ptr<v8::Context::Scope> scope; - // If val was created in a different context than our current one, change to - // that context, but change back after val is converted. - if (!val->CreationContext().IsEmpty() && - val->CreationContext() != v8::Context::GetCurrent()) - scope.reset(new v8::Context::Scope(val->CreationContext())); - +DictionaryValue* V8ValueConverterImpl::FromV8Object( + v8::Handle<v8::Object> val) const { scoped_ptr<DictionaryValue> result(new DictionaryValue()); v8::Handle<v8::Array> property_names(val->GetPropertyNames()); - - if (unique_set) - unique_set->insert(val->GetIdentityHash()); - for (uint32 i = 0; i < property_names->Length(); ++i) { - v8::Handle<v8::Value> key(property_names->Get(i)); + v8::Handle<v8::String> name(property_names->Get(i).As<v8::String>()); - if (!key->IsString() || !val->HasRealNamedProperty(key->ToString())) + // TODO(aa): It would be nice to support getters, but we need + // http://code.google.com/p/v8/issues/detail?id=1342 to do it properly. + if (!val->HasRealNamedProperty(name)) continue; - v8::String::Utf8Value name_utf8(key->ToString()); + v8::String::Utf8Value name_utf8(name->ToString()); v8::TryCatch try_catch; - v8::Handle<v8::Value> child_v8 = val->Get(key); - + v8::Handle<v8::Value> child_v8 = val->Get(name); if (try_catch.HasCaught()) { LOG(ERROR) << "Getter for property " << *name_utf8 << " threw an exception."; child_v8 = v8::Null(); } - scoped_ptr<Value> child(FromV8ValueImpl(child_v8, unique_set)); + scoped_ptr<Value> child(FromV8ValueImpl(child_v8)); CHECK(child.get()); // Strip null if asked (and since undefined is turned into null, undefined @@ -354,6 +328,5 @@ Value* V8ValueConverterImpl::FromV8Object( result->SetWithoutPathExpansion(std::string(*name_utf8, name_utf8.length()), child.release()); } - return result.release(); } diff --git a/content/renderer/v8_value_converter_impl.h b/content/renderer/v8_value_converter_impl.h index baf061a..7f75899 100644 --- a/content/renderer/v8_value_converter_impl.h +++ b/content/renderer/v8_value_converter_impl.h @@ -5,8 +5,6 @@ #ifndef CONTENT_RENDERER_V8_VALUE_CONVERTER_IMPL_H_ #define CONTENT_RENDERER_V8_VALUE_CONVERTER_IMPL_H_ -#include <set> - #include "base/compiler_specific.h" #include "content/common/content_export.h" #include "content/public/renderer/v8_value_converter.h" @@ -45,18 +43,15 @@ class CONTENT_EXPORT V8ValueConverterImpl : public content::V8ValueConverter { const base::DictionaryValue* dictionary) const; v8::Handle<v8::Value> ToArrayBuffer(const base::BinaryValue* value) const; - base::Value* FromV8ValueImpl(v8::Handle<v8::Value> value, - std::set<int>* unique_set) const; - base::Value* FromV8Array(v8::Handle<v8::Array> array, - std::set<int>* unique_set) const; + base::Value* FromV8ValueImpl(v8::Handle<v8::Value> value) const; + base::ListValue* FromV8Array(v8::Handle<v8::Array> array) const; // This will convert objects of type ArrayBuffer or any of the // ArrayBufferView subclasses. The return value will be NULL if |value| is // not one of these types. base::BinaryValue* FromV8Buffer(v8::Handle<v8::Value> value) const; - base::Value* FromV8Object(v8::Handle<v8::Object> object, - std::set<int>* unique_set) const; + base::DictionaryValue* FromV8Object(v8::Handle<v8::Object> object) const; // If true, we will convert undefined JavaScript values to null. bool undefined_allowed_; diff --git a/content/renderer/v8_value_converter_impl_unittest.cc b/content/renderer/v8_value_converter_impl_unittest.cc index a4e461f..a56941a 100644 --- a/content/renderer/v8_value_converter_impl_unittest.cc +++ b/content/renderer/v8_value_converter_impl_unittest.cc @@ -113,7 +113,6 @@ class V8ValueConverterImplTest : public testing::Test { static_cast<DictionaryValue*>( converter.FromV8Value(object, context_))); ASSERT_TRUE(dictionary.get()); - Value* temp = NULL; ASSERT_TRUE(dictionary->Get("test", &temp)); EXPECT_EQ(expected_type, temp->GetType()); @@ -347,74 +346,3 @@ TEST_F(V8ValueConverterImplTest, StripNullFromObjects) { ASSERT_TRUE(result.get()); EXPECT_EQ(0u, result->size()); } - -TEST_F(V8ValueConverterImplTest, RecursiveObjects) { - v8::Context::Scope context_scope(context_); - v8::HandleScope handle_scope; - - V8ValueConverterImpl converter; - - v8::Handle<v8::Object> object = v8::Object::New().As<v8::Object>(); - ASSERT_FALSE(object.IsEmpty()); - object->Set(v8::String::New("foo"), v8::String::New("bar")); - object->Set(v8::String::New("obj"), object); - - scoped_ptr<DictionaryValue> object_result( - static_cast<DictionaryValue*>(converter.FromV8Value(object, context_))); - ASSERT_TRUE(object_result.get()); - EXPECT_EQ(2u, object_result->size()); - EXPECT_TRUE(IsNull(object_result.get(), "obj")); - - v8::Handle<v8::Array> array = v8::Array::New().As<v8::Array>(); - ASSERT_FALSE(array.IsEmpty()); - array->Set(0, v8::String::New("1")); - array->Set(1, array); - - scoped_ptr<ListValue> list_result( - static_cast<ListValue*>(converter.FromV8Value(array, context_))); - ASSERT_TRUE(list_result.get()); - EXPECT_EQ(2u, list_result->GetSize()); - EXPECT_TRUE(IsNull(list_result.get(), 1)); -} - -TEST_F(V8ValueConverterImplTest, ObjectGetters) { - v8::Context::Scope context_scope(context_); - v8::HandleScope handle_scope; - - const char* source = "(function() {" - "var a = {};" - "a.__defineGetter__('foo', function() { return 'bar'; });" - "return a;" - "})();"; - - v8::Handle<v8::Script> script(v8::Script::New(v8::String::New(source))); - v8::Handle<v8::Object> object = script->Run().As<v8::Object>(); - ASSERT_FALSE(object.IsEmpty()); - - V8ValueConverterImpl converter; - scoped_ptr<DictionaryValue> result( - static_cast<DictionaryValue*>(converter.FromV8Value(object, context_))); - ASSERT_TRUE(result.get()); - EXPECT_EQ(1u, result->size()); -} - -TEST_F(V8ValueConverterImplTest, ArrayGetters) { - v8::Context::Scope context_scope(context_); - v8::HandleScope handle_scope; - - const char* source = "(function() {" - "var a = [0];" - "a.__defineGetter__(1, function() { return 'bar'; });" - "return a;" - "})();"; - - v8::Handle<v8::Script> script(v8::Script::New(v8::String::New(source))); - v8::Handle<v8::Array> array = script->Run().As<v8::Array>(); - ASSERT_FALSE(array.IsEmpty()); - - V8ValueConverterImpl converter; - scoped_ptr<ListValue> result( - static_cast<ListValue*>(converter.FromV8Value(array, context_))); - ASSERT_TRUE(result.get()); - EXPECT_EQ(2u, result->GetSize()); -} diff --git a/content/test/unittest_test_suite.cc b/content/test/unittest_test_suite.cc index fdcd49a..85597d5 100644 --- a/content/test/unittest_test_suite.cc +++ b/content/test/unittest_test_suite.cc @@ -5,7 +5,6 @@ #include "content/public/test/unittest_test_suite.h" #include "base/logging.h" -#include "base/rand_util.h" #include "base/test/test_suite.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebKitPlatformSupport.h" @@ -20,7 +19,7 @@ class UnitTestTestSuite::UnitTestWebKitPlatformSupport virtual ~UnitTestWebKitPlatformSupport() {} virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) OVERRIDE { - base::RandBytes(buffer, length); + memset(buffer, 0, length); } virtual const unsigned char* getTraceCategoryEnabledFlag( const char* categoryName) { |