| // Copyright 2015 PDFium 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 "testing/gtest/include/gtest/gtest.h" |
| #include "testing/js_embedder_test.h" |
| |
| namespace { |
| |
| const double kExpected0 = 6.0; |
| const double kExpected1 = 7.0; |
| const double kExpected2 = 8.0; |
| |
| const wchar_t kScript0[] = L"fred = 6"; |
| const wchar_t kScript1[] = L"fred = 7"; |
| const wchar_t kScript2[] = L"fred = 8"; |
| |
| } // namespace |
| |
| class FXJSV8EmbedderTest : public JSEmbedderTest { |
| public: |
| void ExecuteInCurrentContext(const CFX_WideString& script) { |
| FXJSErr error; |
| int sts = FXJS_Execute(isolate(), script, &error); |
| EXPECT_EQ(0, sts); |
| } |
| void CheckAssignmentInCurrentContext(double expected) { |
| v8::Local<v8::Object> This = FXJS_GetThisObj(isolate()); |
| v8::Local<v8::Value> fred = FXJS_GetObjectElement(isolate(), This, L"fred"); |
| EXPECT_TRUE(fred->IsNumber()); |
| EXPECT_EQ(expected, fred->ToNumber(isolate()->GetCurrentContext()) |
| .ToLocalChecked() |
| ->Value()); |
| } |
| }; |
| |
| TEST_F(FXJSV8EmbedderTest, Getters) { |
| v8::Isolate::Scope isolate_scope(isolate()); |
| v8::HandleScope handle_scope(isolate()); |
| v8::Context::Scope context_scope(GetV8Context()); |
| |
| ExecuteInCurrentContext(CFX_WideString(kScript1)); |
| CheckAssignmentInCurrentContext(kExpected1); |
| } |
| |
| TEST_F(FXJSV8EmbedderTest, MultipleRutimes) { |
| v8::Isolate::Scope isolate_scope(isolate()); |
| v8::HandleScope handle_scope(isolate()); |
| |
| v8::Global<v8::Context> global_context1; |
| std::vector<v8::Global<v8::Object>*> static_objects1; |
| FXJS_InitializeRuntime(isolate(), nullptr, &global_context1, |
| &static_objects1); |
| |
| v8::Global<v8::Context> global_context2; |
| std::vector<v8::Global<v8::Object>*> static_objects2; |
| FXJS_InitializeRuntime(isolate(), nullptr, &global_context2, |
| &static_objects2); |
| |
| v8::Context::Scope context_scope(GetV8Context()); |
| ExecuteInCurrentContext(CFX_WideString(kScript0)); |
| CheckAssignmentInCurrentContext(kExpected0); |
| |
| { |
| v8::Local<v8::Context> context1 = |
| v8::Local<v8::Context>::New(isolate(), global_context1); |
| v8::Context::Scope context_scope1(context1); |
| ExecuteInCurrentContext(CFX_WideString(kScript1)); |
| CheckAssignmentInCurrentContext(kExpected1); |
| } |
| FXJS_ReleaseRuntime(isolate(), &global_context1, &static_objects1); |
| |
| { |
| v8::Local<v8::Context> context2 = |
| v8::Local<v8::Context>::New(isolate(), global_context2); |
| v8::Context::Scope context_scope2(context2); |
| ExecuteInCurrentContext(CFX_WideString(kScript2)); |
| CheckAssignmentInCurrentContext(kExpected2); |
| } |
| FXJS_ReleaseRuntime(isolate(), &global_context2, &static_objects2); |
| |
| CheckAssignmentInCurrentContext(kExpected0); |
| } |