Index: gin/arguments_unittest.cc |
diff --git a/gin/arguments_unittest.cc b/gin/arguments_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d2b51361995cdc2f38a9cb4ccc5481833422ab96 |
--- /dev/null |
+++ b/gin/arguments_unittest.cc |
@@ -0,0 +1,67 @@ |
+// Copyright 2017 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 "gin/arguments.h" |
+ |
+#include "base/bind.h" |
+#include "gin/converter.h" |
+#include "gin/object_template_builder.h" |
+#include "gin/public/isolate_holder.h" |
+#include "gin/test/v8_test.h" |
+#include "v8/include/v8.h" |
+ |
+namespace gin { |
+ |
+using ArgumentsTest = V8Test; |
+ |
+// Test that Arguments::GetHolderCreationContext returns the proper context. |
+TEST_F(ArgumentsTest, TestArgumentsHolderCreationContext) { |
+ v8::Isolate* isolate = instance_->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ v8::Local<v8::Context> creation_context = context_.Get(instance_->isolate()); |
+ |
+ auto check_creation_context = [](v8::Local<v8::Context> expected_context, |
+ gin::Arguments* arguments) { |
+ EXPECT_EQ(expected_context, arguments->GetHolderCreationContext()); |
+ }; |
+ |
+ // Create an object that will compare GetHolderCreationContext() with |
+ // |creation_context|. |
+ v8::Local<v8::ObjectTemplate> object_template = |
+ ObjectTemplateBuilder(isolate) |
+ .SetMethod("checkCreationContext", |
+ base::Bind(check_creation_context, creation_context)) |
+ .Build(); |
+ |
+ v8::Local<v8::Object> object = |
+ object_template->NewInstance(creation_context).ToLocalChecked(); |
+ |
+ // Call checkCreationContext() on the generated object using the passed-in |
+ // context as the current context. |
+ auto test_context = [object, isolate](v8::Local<v8::Context> context) { |
+ v8::Context::Scope context_scope(context); |
+ const char kCallFunction[] = "(function(o) { o.checkCreationContext(); })"; |
+ v8::Local<v8::Script> script = |
+ v8::Script::Compile(context, StringToV8(isolate, kCallFunction)) |
+ .ToLocalChecked(); |
+ v8::Local<v8::Function> function; |
+ ASSERT_TRUE(ConvertFromV8(isolate, script->Run(), &function)); |
+ v8::Local<v8::Value> args[] = {object}; |
+ function->Call(v8::Undefined(isolate), arraysize(args), args); |
+ }; |
+ |
+ // Test calling in the creation context. |
+ test_context(creation_context); |
+ |
+ { |
+ // Create a second context, and test calling in that. The creation context |
+ // should be the same (even though the current context has changed). |
+ v8::Local<v8::Context> second_context = |
+ v8::Context::New(isolate, nullptr, v8::Local<v8::ObjectTemplate>()); |
+ test_context(second_context); |
+ } |
+} |
+ |
+} // namespace gin |