Index: fpdfsdk/jsapi/fxjs_v8_embeddertest.cpp |
diff --git a/fpdfsdk/jsapi/fxjs_v8_embeddertest.cpp b/fpdfsdk/jsapi/fxjs_v8_embeddertest.cpp |
index b7700c8b602a697c6b4d74e8a3ad75e7edb44fda..e89bb28113b7bc463d3bcc51257aa5a4025043f8 100644 |
--- a/fpdfsdk/jsapi/fxjs_v8_embeddertest.cpp |
+++ b/fpdfsdk/jsapi/fxjs_v8_embeddertest.cpp |
@@ -7,11 +7,32 @@ |
namespace { |
-const wchar_t kScript[] = L"fred = 7"; |
+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 {}; |
+class FXJSV8EmbedderTest : public JSEmbedderTest { |
+ public: |
+ void ExecuteInCurrentContext(const wchar_t* script) { |
+ FXJSErr error; |
+ int sts = FXJS_Execute(isolate(), nullptr, 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()); |
@@ -21,11 +42,48 @@ TEST_F(FXJSV8EmbedderTest, Getters) { |
v8::HandleScope handle_scope(isolate()); |
v8::Context::Scope context_scope(GetV8Context()); |
- FXJSErr error; |
- int sts = FXJS_Execute(isolate(), nullptr, kScript, &error); |
- EXPECT_EQ(0, sts); |
+ ExecuteInCurrentContext(kScript1); |
+ CheckAssignmentInCurrentContext(kExpected1); |
+} |
+ |
+TEST_F(FXJSV8EmbedderTest, MultipleRutimes) { |
+ v8::Isolate::Scope isolate_scope(isolate()); |
+#ifdef PDF_ENABLE_XFA |
+ v8::Locker locker(isolate()); |
+#endif // PDF_ENABLE_XFA |
+ 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(kScript0); |
+ CheckAssignmentInCurrentContext(kExpected0); |
+ |
+ { |
+ v8::Local<v8::Context> context1 = |
+ v8::Local<v8::Context>::New(isolate(), global_context1); |
+ v8::Context::Scope context_scope(context1); |
+ ExecuteInCurrentContext(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_scope(context2); |
+ ExecuteInCurrentContext(kScript2); |
+ CheckAssignmentInCurrentContext(kExpected2); |
+ } |
+ FXJS_ReleaseRuntime(isolate(), &global_context2, &static_objects2); |
- v8::Local<v8::Object> This = FXJS_GetThisObj(isolate()); |
- v8::Local<v8::Value> fred = FXJS_GetObjectElement(isolate(), This, L"fred"); |
- EXPECT_TRUE(fred->IsNumber()); |
+ CheckAssignmentInCurrentContext(kExpected0); |
} |