diff options
author | Andras Becsi <andras.becsi@digia.com> | 2014-03-18 13:16:26 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-03-20 15:55:39 +0100 |
commit | 3f0f86b0caed75241fa71c95a5d73bc0164348c5 (patch) | |
tree | 92b9fb00f2e9e90b0be2262093876d4f43b6cd13 /chromium/gin/wrappable_unittest.cc | |
parent | e90d7c4b152c56919d963987e2503f9909a666d2 (diff) | |
download | qtwebengine-chromium-3f0f86b0caed75241fa71c95a5d73bc0164348c5.tar.gz |
Update to new stable branch 1750
This also includes an updated ninja and chromium dependencies
needed on Windows.
Change-Id: Icd597d80ed3fa4425933c9f1334c3c2e31291c42
Reviewed-by: Zoltan Arvai <zarvai@inf.u-szeged.hu>
Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'chromium/gin/wrappable_unittest.cc')
-rw-r--r-- | chromium/gin/wrappable_unittest.cc | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/chromium/gin/wrappable_unittest.cc b/chromium/gin/wrappable_unittest.cc new file mode 100644 index 00000000000..3499eedcc18 --- /dev/null +++ b/chromium/gin/wrappable_unittest.cc @@ -0,0 +1,149 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/logging.h" +#include "gin/arguments.h" +#include "gin/handle.h" +#include "gin/object_template_builder.h" +#include "gin/per_isolate_data.h" +#include "gin/public/isolate_holder.h" +#include "gin/test/v8_test.h" +#include "gin/try_catch.h" +#include "gin/wrappable.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace gin { + +class MyObject : public Wrappable<MyObject> { + public: + static WrapperInfo kWrapperInfo; + + static gin::Handle<MyObject> Create(v8::Isolate* isolate) { + return CreateHandle(isolate, new MyObject()); + } + + int value() const { return value_; } + void set_value(int value) { value_ = value; } + + private: + MyObject() : value_(0) {} + virtual ~MyObject() {} + + int value_; +}; + +class MyObject2 : public Wrappable<MyObject2> { + public: + static WrapperInfo kWrapperInfo; +}; + +class MyObjectBlink : public Wrappable<MyObjectBlink> { + public: + static WrapperInfo kWrapperInfo; +}; + +WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin }; +WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; +WrapperInfo MyObjectBlink::kWrapperInfo = { kEmbedderNativeGin }; + +void RegisterTemplates(v8::Isolate* isolate) { + PerIsolateData* data = PerIsolateData::From(isolate); + DCHECK(data->GetObjectTemplate(&MyObject::kWrapperInfo).IsEmpty()); + + v8::Handle<v8::ObjectTemplate> templ = ObjectTemplateBuilder(isolate) + .SetProperty("value", &MyObject::value, &MyObject::set_value) + .Build(); + templ->SetInternalFieldCount(kNumberOfInternalFields); + data->SetObjectTemplate(&MyObject::kWrapperInfo, templ); + + templ = v8::ObjectTemplate::New(isolate); + templ->SetInternalFieldCount(kNumberOfInternalFields); + data->SetObjectTemplate(&MyObject2::kWrapperInfo, templ); + + templ = v8::ObjectTemplate::New(isolate); + templ->SetInternalFieldCount(kNumberOfInternalFields); + data->SetObjectTemplate(&MyObjectBlink::kWrapperInfo, templ); +} + +typedef V8Test WrappableTest; + +TEST_F(WrappableTest, WrapAndUnwrap) { + v8::Isolate* isolate = instance_->isolate(); + v8::HandleScope handle_scope(isolate); + + RegisterTemplates(isolate); + Handle<MyObject> obj = MyObject::Create(isolate); + + v8::Handle<v8::Value> wrapper = ConvertToV8(isolate, obj.get()); + EXPECT_FALSE(wrapper.IsEmpty()); + + MyObject* unwrapped = NULL; + EXPECT_TRUE(ConvertFromV8(isolate, wrapper, &unwrapped)); + EXPECT_EQ(obj.get(), unwrapped); +} + +TEST_F(WrappableTest, UnwrapFailures) { + v8::Isolate* isolate = instance_->isolate(); + v8::HandleScope handle_scope(isolate); + + RegisterTemplates(isolate); + + // Something that isn't an object. + v8::Handle<v8::Value> thing = v8::Number::New(42); + MyObject* unwrapped = NULL; + EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); + EXPECT_FALSE(unwrapped); + + // An object that's not wrapping anything. + thing = v8::Object::New(isolate); + EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); + EXPECT_FALSE(unwrapped); + + // An object that's wrapping a C++ object from Blink. + thing.Clear(); + thing = ConvertToV8(isolate, new MyObjectBlink()); + EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); + EXPECT_FALSE(unwrapped); + + // An object that's wrapping a C++ object of the wrong type. + thing.Clear(); + thing = ConvertToV8(isolate, new MyObject2()); + EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); + EXPECT_FALSE(unwrapped); +} + +TEST_F(WrappableTest, GetAndSetProperty) { + v8::Isolate* isolate = instance_->isolate(); + v8::HandleScope handle_scope(isolate); + + RegisterTemplates(isolate); + gin::Handle<MyObject> obj = MyObject::Create(isolate); + + obj->set_value(42); + EXPECT_EQ(42, obj->value()); + + v8::Handle<v8::String> source = StringToV8(isolate, + "(function (obj) {" + " if (obj.value !== 42) throw 'FAIL';" + " else obj.value = 191; })"); + EXPECT_FALSE(source.IsEmpty()); + + gin::TryCatch try_catch; + v8::Handle<v8::Script> script = v8::Script::New(source); + EXPECT_FALSE(script.IsEmpty()); + v8::Handle<v8::Value> val = script->Run(); + EXPECT_FALSE(val.IsEmpty()); + v8::Handle<v8::Function> func; + EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); + v8::Handle<v8::Value> argv[] = { + ConvertToV8(isolate, obj.get()), + }; + func->Call(v8::Undefined(isolate), 1, argv); + EXPECT_FALSE(try_catch.HasCaught()); + EXPECT_EQ("", try_catch.GetStackTrace()); + + EXPECT_EQ(191, obj->value()); +} + +} // namespace gin |