diff --git a/fpdfsdk/include/javascript/JS_Define.h b/fpdfsdk/include/javascript/JS_Define.h
index 3b5798e..adf69ec 100644
--- a/fpdfsdk/include/javascript/JS_Define.h
+++ b/fpdfsdk/include/javascript/JS_Define.h
@@ -79,13 +79,18 @@
                   v8::Local<v8::String> property,
                   const v8::PropertyCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
-  CJS_PropValue value(isolate);
-  value.StartGetting();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder());
   C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
   CFX_WideString sError;
+  CJS_PropValue value(isolate);
+  value.StartGetting();
   if (!(pObj->*M)(pRuntimeContext, value, sError)) {
     FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string,
                                             sError));
@@ -102,13 +107,18 @@
                   v8::Local<v8::Value> value,
                   const v8::PropertyCallbackInfo<void>& info) {
   v8::Isolate* isolate = info.GetIsolate();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
-  CJS_PropValue propValue(CJS_Value(isolate, value, CJS_Value::VT_unknown));
-  propValue.StartSetting();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder());
   C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
   CFX_WideString sError;
+  CJS_PropValue propValue(CJS_Value(isolate, value, CJS_Value::VT_unknown));
+  propValue.StartSetting();
   if (!(pObj->*M)(pRuntimeContext, propValue, sError)) {
     FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string,
                                             sError));
@@ -141,8 +151,13 @@
               const char* class_name_string,
               const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Parameters parameters;
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
     parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown));
@@ -268,8 +283,12 @@
                       const v8::PropertyCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Object* pJSObj =
       reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder()));
   Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
@@ -293,8 +312,12 @@
                       const v8::PropertyCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Object* pJSObj =
       reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder()));
   Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
@@ -315,8 +338,12 @@
                       const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   v8::Isolate* isolate = info.GetIsolate();
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Object* pJSObj =
       reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder()));
   Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
@@ -421,8 +448,13 @@
 void JSGlobalFunc(const char* func_name_string,
                   const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* isolate = info.GetIsolate();
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(isolate);
-  IFXJS_Context* pRuntimeContext = pData->m_pFXJSRuntime->GetCurrentContext();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Value> v = context->GetEmbedderData(1);
+  if (v.IsEmpty())
+    return;
+  v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v);
+  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();
+  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
   CJS_Parameters parameters;
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
     parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown));
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
index a1e3e59..0b51332 100644
--- a/fpdfsdk/include/jsapi/fxjs_v8.h
+++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -39,12 +39,10 @@
   static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate);
 
   CFX_PtrArray m_ObjectDefnArray;
-  IFXJS_Runtime* m_pFXJSRuntime;
   CFXJSE_RuntimeData* m_pFXJSERuntimeData;
 
  protected:
-  FXJS_PerIsolateData()
-      : m_pFXJSRuntime(nullptr), m_pFXJSERuntimeData(nullptr) {}
+  FXJS_PerIsolateData() : m_pFXJSERuntimeData(nullptr) {}
 };
 
 extern const wchar_t kFXJSValueNameString[];
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 1c9bb87..d7868f1 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -269,8 +269,8 @@
   v8::Context::Scope context_scope(v8Context);
 
   FXJS_PerIsolateData::SetUp(pIsolate);
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
-  pData->m_pFXJSRuntime = pFXRuntime;
+  v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime);
+  v8Context->SetEmbedderData(1, ptr);
 
   int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
   for (int i = 0; i < maxID; ++i) {
