Index: fpdfsdk/src/javascript/JS_Runtime.cpp |
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp |
index 8b0475b85110d3c09d9325b6e499685372f0b5d9..ecb53d2d724fe8e6a5d767d5e89f70b83a57d431 100644 |
--- a/fpdfsdk/src/javascript/JS_Runtime.cpp |
+++ b/fpdfsdk/src/javascript/JS_Runtime.cpp |
@@ -245,12 +245,20 @@ FX_BOOL CJS_Runtime::GetHValueByName(const CFX_ByteStringC& utf8Name, |
v8::Locker lock(GetIsolate()); |
v8::Isolate::Scope isolate_scope(GetIsolate()); |
v8::HandleScope handle_scope(GetIsolate()); |
+ v8::Local<v8::Context> old_context = GetIsolate()->GetCurrentContext(); |
v8::Local<v8::Context> context = |
v8::Local<v8::Context>::New(GetIsolate(), m_context); |
v8::Context::Scope context_scope(context); |
- // v8::Local<v8::Context> tmpCotext = |
- // v8::Local<v8::Context>::New(GetIsolate(), m_context); |
+ // Caution: We're about to hand to XFA an object that in order to invoke |
+ // methods will require that the current v8::Context always has a pointer |
+ // to a CJS_Runtime in its embedder data slot. Unfortunately, XFA creates |
+ // its own v8::Context which has not initialized the embedder data slot. |
+ // Do so now. |
+ // TODO(tsepez): redesign PDF-side objects to not rely on v8::Context's |
+ // embedder data slots, and/or to always use the right context. |
+ FXJS_SetRuntimeForV8Context(old_context, this); |
+ |
v8::Local<v8::Value> propvalue = |
context->Global()->Get(v8::String::NewFromUtf8( |
GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); |