diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index ea77e1c..a55bf81 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -615,17 +615,17 @@
   } else if (v.GetType() == CJS_Value::VT_object) {
     v8::Local<v8::Object> pObj = params[0].ToV8Object(pIsolate);
     v8::Local<v8::Value> pValue =
-        FXJS_GetObjectElement(pIsolate, pObj, L"cURL");
+        FXJS_GetObjectProperty(pIsolate, pObj, L"cURL");
     if (!pValue.IsEmpty())
       strURL = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"bFDF");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"bFDF");
     bFDF = CJS_Value(pRuntime, pValue).ToBool(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"bEmpty");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"bEmpty");
     bEmpty = CJS_Value(pRuntime, pValue).ToBool(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"aFields");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"aFields");
     aFields.Attach(CJS_Value(pRuntime, pValue).ToV8Array(pIsolate));
   }
 
@@ -712,22 +712,23 @@
   if (params.size() >= 1 && params[0].GetType() == CJS_Value::VT_object) {
     v8::Local<v8::Object> pObj = params[0].ToV8Object(pIsolate);
 
-    v8::Local<v8::Value> pValue = FXJS_GetObjectElement(pIsolate, pObj, L"bUI");
+    v8::Local<v8::Value> pValue =
+        FXJS_GetObjectProperty(pIsolate, pObj, L"bUI");
     bUI = CJS_Value(pRuntime, pValue).ToInt(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"cTo");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"cTo");
     cTo = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"cCc");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"cCc");
     cCc = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"cBcc");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"cBcc");
     cBcc = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"cSubject");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"cSubject");
     cSubject = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
 
-    pValue = FXJS_GetObjectElement(pIsolate, pObj, L"cMsg");
+    pValue = FXJS_GetObjectProperty(pIsolate, pObj, L"cMsg");
     cMsg = CJS_Value(pRuntime, pValue).ToCFXWideString(pIsolate);
   }
 
diff --git a/fpdfsdk/javascript/JS_Value.cpp b/fpdfsdk/javascript/JS_Value.cpp
index 8f448a9..b719835 100644
--- a/fpdfsdk/javascript/JS_Value.cpp
+++ b/fpdfsdk/javascript/JS_Value.cpp
@@ -771,7 +771,7 @@
   for (size_t i = 0; i < nKeywords; ++i) {
     const wchar_t* property = va_arg(ap, const wchar_t*);
     v8::Local<v8::Value> v8Value =
-        FXJS_GetObjectElement(pRuntime->GetIsolate(), pObj, property);
+        FXJS_GetObjectProperty(pRuntime->GetIsolate(), pObj, property);
     if (!v8Value->IsUndefined())
       result[i] = CJS_Value(pRuntime, v8Value);
   }
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index 10bab26..5ffc559 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -273,13 +273,11 @@
                                       CJS_GlobalVariableArray& array) {
   v8::Isolate* isolate = pObj->GetIsolate();
   CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
-  v8::Local<v8::Array> pKeyList = FXJS_GetObjectElementNames(isolate, pObj);
-  int nObjElements = pKeyList->Length();
-  for (int i = 0; i < nObjElements; i++) {
-    CFX_WideString ws =
-        FXJS_ToString(isolate, FXJS_GetArrayElement(isolate, pKeyList, i));
+  std::vector<CFX_WideString> pKeyList =
+      FXJS_GetObjectPropertyNames(isolate, pObj);
+  for (const auto& ws : pKeyList) {
     CFX_ByteString sKey = ws.UTF8Encode();
-    v8::Local<v8::Value> v = FXJS_GetObjectElement(isolate, pObj, ws);
+    v8::Local<v8::Value> v = FXJS_GetObjectProperty(isolate, pObj, ws);
     switch (CJS_Value::GetValueType(v)) {
       case CJS_Value::VT_number: {
         CJS_KeyValue* pObjElement = new CJS_KeyValue;
diff --git a/fxjs/fxjs_v8.cpp b/fxjs/fxjs_v8.cpp
index d161af6..92207fd 100644
--- a/fxjs/fxjs_v8.cpp
+++ b/fxjs/fxjs_v8.cpp
@@ -596,7 +596,7 @@
       .ToLocalChecked();
 }
 
-v8::Local<v8::Value> FXJS_GetObjectElement(
+v8::Local<v8::Value> FXJS_GetObjectProperty(
     v8::Isolate* pIsolate,
     v8::Local<v8::Object> pObj,
     const CFX_WideString& wsPropertyName) {
@@ -610,14 +610,23 @@
   return val;
 }
 
-v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Object> pObj) {
+std::vector<CFX_WideString> FXJS_GetObjectPropertyNames(
+    v8::Isolate* pIsolate,
+    v8::Local<v8::Object> pObj) {
   if (pObj.IsEmpty())
-    return v8::Local<v8::Array>();
+    return std::vector<CFX_WideString>();
+
   v8::Local<v8::Array> val;
   if (!pObj->GetPropertyNames(pIsolate->GetCurrentContext()).ToLocal(&val))
-    return v8::Local<v8::Array>();
-  return val;
+    return std::vector<CFX_WideString>();
+
+  std::vector<CFX_WideString> result;
+  for (uint32_t i = 0; i < val->Length(); ++i) {
+    result.push_back(FXJS_ToString(
+        pIsolate, val->Get(pIsolate->GetCurrentContext(), i).ToLocalChecked()));
+  }
+
+  return result;
 }
 
 void FXJS_PutObjectString(v8::Isolate* pIsolate,
diff --git a/fxjs/fxjs_v8_embeddertest.cpp b/fxjs/fxjs_v8_embeddertest.cpp
index b33ddca..71b004c 100644
--- a/fxjs/fxjs_v8_embeddertest.cpp
+++ b/fxjs/fxjs_v8_embeddertest.cpp
@@ -26,7 +26,8 @@
   }
   void CheckAssignmentInCurrentContext(double expected) {
     v8::Local<v8::Object> This = FXJS_GetThisObj(isolate());
-    v8::Local<v8::Value> fred = FXJS_GetObjectElement(isolate(), This, L"fred");
+    v8::Local<v8::Value> fred =
+        FXJS_GetObjectProperty(isolate(), This, L"fred");
     EXPECT_TRUE(fred->IsNumber());
     EXPECT_EQ(expected, fred->ToNumber(isolate()->GetCurrentContext())
                             .ToLocalChecked()
diff --git a/fxjs/include/fxjs_v8.h b/fxjs/include/fxjs_v8.h
index cd4d7c4..5e12b08 100644
--- a/fxjs/include/fxjs_v8.h
+++ b/fxjs/include/fxjs_v8.h
@@ -211,16 +211,19 @@
 
 v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate,
                                         const CFX_WideString& wsPropertyName);
-v8::Local<v8::Value> FXJS_GetObjectElement(v8::Isolate* pIsolate,
-                                           v8::Local<v8::Object> pObj,
-                                           const CFX_WideString& PropertyName);
-v8::Local<v8::Array> FXJS_GetObjectElementNames(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Object> pObj);
+
+std::vector<CFX_WideString> FXJS_GetObjectPropertyNames(
+    v8::Isolate* pIsolate,
+    v8::Local<v8::Object> pObj);
+v8::Local<v8::Value> FXJS_GetObjectProperty(v8::Isolate* pIsolate,
+                                            v8::Local<v8::Object> pObj,
+                                            const CFX_WideString& PropertyName);
+
+unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray);
 v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate,
                                           v8::Local<v8::Array> pArray,
                                           unsigned index);
 
-unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray);
 void FXJS_PutObjectString(v8::Isolate* pIsolate,
                           v8::Local<v8::Object> pObj,
                           const CFX_WideString& wsPropertyName,
