diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp
index 5b2358c..d00f8d0 100644
--- a/fxjs/cjs_app.cpp
+++ b/fxjs/cjs_app.cpp
@@ -220,7 +220,7 @@
 
 CJS_Result CJS_App::alert(CJS_Runtime* pRuntime,
                           pdfium::span<v8::Local<v8::Value>> params) {
-  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
+  v8::LocalVector<v8::Value> newParams = ExpandKeywordParams(
       pRuntime, params, 4, "cMsg", "nIcon", "nType", "cTitle");
 
   if (!IsExpandedParamKnown(newParams[0]))
@@ -423,7 +423,7 @@
 
 CJS_Result CJS_App::mailMsg(CJS_Runtime* pRuntime,
                             pdfium::span<v8::Local<v8::Value>> params) {
-  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
+  v8::LocalVector<v8::Value> newParams = ExpandKeywordParams(
       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
 
   if (!IsExpandedParamKnown(newParams[0]))
@@ -519,7 +519,7 @@
 
 CJS_Result CJS_App::response(CJS_Runtime* pRuntime,
                              pdfium::span<v8::Local<v8::Value>> params) {
-  std::vector<v8::Local<v8::Value>> newParams =
+  v8::LocalVector<v8::Value> newParams =
       ExpandKeywordParams(pRuntime, params, 5, "cQuestion", "cTitle",
                           "cDefault", "bPassword", "cLabel");
 
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index cbb3598..4336ce2 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -315,7 +315,7 @@
   if (!m_pFormFillEnv)
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
-  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
+  v8::LocalVector<v8::Value> newParams = ExpandKeywordParams(
       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
 
   bool bUI = true;
@@ -366,7 +366,7 @@
   if (sTextBuf.IsEmpty())
     return CJS_Result::Failure(L"Bad FDF format.");
 
-  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
+  v8::LocalVector<v8::Value> newParams = ExpandKeywordParams(
       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
 
   bool bUI = true;
@@ -402,7 +402,7 @@
 
 CJS_Result CJS_Document::print(CJS_Runtime* pRuntime,
                                pdfium::span<v8::Local<v8::Value>> params) {
-  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
+  v8::LocalVector<v8::Value> newParams = ExpandKeywordParams(
       pRuntime, params, 8, "bUI", "nStart", "nEnd", "bSilent", "bShrinkToFit",
       "bPrintAsImage", "bReverse", "bAnnotations");
 
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index 9ac0476..0377d93 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -153,7 +153,7 @@
   if (!pRuntime)
     return;
 
-  std::vector<v8::Local<v8::Value>> parameters;
+  v8::LocalVector<v8::Value> parameters(info.GetIsolate());
   for (int i = 0; i < info.Length(); ++i)
     parameters.push_back(info[i]);
 
@@ -993,7 +993,7 @@
 
   int iIndex =
       WithinBoundsOrZero(pRuntime->ToInt32(params[0]), std::size(kDateFormats));
-  std::vector<v8::Local<v8::Value>> newParams;
+  v8::LocalVector<v8::Value> newParams(pRuntime->GetIsolate());
   newParams.push_back(pRuntime->NewString(kDateFormats[iIndex]));
   return AFDate_FormatEx(pRuntime, newParams);
 }
@@ -1007,7 +1007,7 @@
 
   int iIndex =
       WithinBoundsOrZero(pRuntime->ToInt32(params[0]), std::size(kDateFormats));
-  std::vector<v8::Local<v8::Value>> newParams;
+  v8::LocalVector<v8::Value> newParams(pRuntime->GetIsolate());
   newParams.push_back(pRuntime->NewString(kDateFormats[iIndex]));
   return AFDate_KeystrokeEx(pRuntime, newParams);
 }
@@ -1021,7 +1021,7 @@
 
   int iIndex =
       WithinBoundsOrZero(pRuntime->ToInt32(params[0]), std::size(kTimeFormats));
-  std::vector<v8::Local<v8::Value>> newParams;
+  v8::LocalVector<v8::Value> newParams(pRuntime->GetIsolate());
   newParams.push_back(pRuntime->NewString(kTimeFormats[iIndex]));
   return AFDate_FormatEx(pRuntime, newParams);
 }
@@ -1034,7 +1034,7 @@
 
   int iIndex =
       WithinBoundsOrZero(pRuntime->ToInt32(params[0]), std::size(kTimeFormats));
-  std::vector<v8::Local<v8::Value>> newParams;
+  v8::LocalVector<v8::Value> newParams(pRuntime->GetIsolate());
   newParams.push_back(pRuntime->NewString(kTimeFormats[iIndex]));
   return AFDate_KeystrokeEx(pRuntime, newParams);
 }
@@ -1199,7 +1199,7 @@
       break;
   }
 
-  std::vector<v8::Local<v8::Value>> params2;
+  v8::LocalVector<v8::Value> params2(pRuntime->GetIsolate());
   params2.push_back(pRuntime->NewString(cFormat));
   return AFSpecial_KeystrokeEx(pRuntime, params2);
 }
diff --git a/fxjs/cjs_publicmethods_embeddertest.cpp b/fxjs/cjs_publicmethods_embeddertest.cpp
index 5a1a6e7..3184a56 100644
--- a/fxjs/cjs_publicmethods_embeddertest.cpp
+++ b/fxjs/cjs_publicmethods_embeddertest.cpp
@@ -203,7 +203,7 @@
   runtime.PutArrayElement(ary, 0, runtime.NewString("Calc1_A"));
   runtime.PutArrayElement(ary, 1, runtime.NewString("Calc1_B"));
 
-  std::vector<v8::Local<v8::Value>> params;
+  v8::LocalVector<v8::Value> params(runtime.GetIsolate());
   params.push_back(runtime.NewString("SUM"));
   params.push_back(ary);
 
@@ -244,7 +244,7 @@
   handler->SetSelStart(0);
   handler->SetSelEnd(0);
 
-  std::vector<v8::Local<v8::Value>> params;
+  v8::LocalVector<v8::Value> params(runtime.GetIsolate());
   params.push_back(runtime.NewString("-10"));
   params.push_back(runtime.NewString(""));
 
diff --git a/fxjs/js_define.cpp b/fxjs/js_define.cpp
index 2664cb8..2e2087a 100644
--- a/fxjs/js_define.cpp
+++ b/fxjs/js_define.cpp
@@ -60,14 +60,14 @@
   return isfinite(date) ? FX_LocalTime(date) : date;
 }
 
-std::vector<v8::Local<v8::Value>> ExpandKeywordParams(
+v8::LocalVector<v8::Value> ExpandKeywordParams(
     CJS_Runtime* pRuntime,
     pdfium::span<v8::Local<v8::Value>> originals,
     size_t nKeywords,
     ...) {
   DCHECK(nKeywords);
 
-  std::vector<v8::Local<v8::Value>> result(nKeywords, v8::Local<v8::Value>());
+  v8::LocalVector<v8::Value> result(pRuntime->GetIsolate(), nKeywords);
   size_t size = std::min(originals.size(), nKeywords);
   for (size_t i = 0; i < size; ++i)
     result[i] = originals[i];
diff --git a/fxjs/js_define.h b/fxjs/js_define.h
index d9264c0..045cce1 100644
--- a/fxjs/js_define.h
+++ b/fxjs/js_define.h
@@ -8,7 +8,6 @@
 #define FXJS_JS_DEFINE_H_
 
 #include <memory>
-#include <vector>
 
 #include "core/fxcrt/unowned_ptr.h"
 #include "fxjs/cfxjs_engine.h"
@@ -16,6 +15,7 @@
 #include "fxjs/cjs_runtime.h"
 #include "fxjs/js_resources.h"
 #include "third_party/base/containers/span.h"
+#include "v8/include/v8-local-handle.h"
 
 class CJS_Object;
 
@@ -27,7 +27,7 @@
 // names as wchar_t string literals corresponding to each positional argument.
 // The result will always contain |nKeywords| value, check for the unspecified
 // ones in the result using IsExpandedParamKnown() below.
-std::vector<v8::Local<v8::Value>> ExpandKeywordParams(
+v8::LocalVector<v8::Value> ExpandKeywordParams(
     CJS_Runtime* pRuntime,
     pdfium::span<v8::Local<v8::Value>> originals,
     size_t nKeywords,
@@ -123,7 +123,7 @@
   if (!pRuntime)
     return;
 
-  std::vector<v8::Local<v8::Value>> parameters;
+  v8::LocalVector<v8::Value> parameters(info.GetIsolate());
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++)
     parameters.push_back(info[i]);
 
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index ecb8c96..1d47de6 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -25,6 +25,7 @@
 #include "third_party/base/containers/contains.h"
 #include "v8/include/v8-function-callback.h"
 #include "v8/include/v8-function.h"
+#include "v8/include/v8-local-handle.h"
 #include "v8/include/v8-object.h"
 #include "xfa/fxfa/cxfa_eventparam.h"
 #include "xfa/fxfa/cxfa_ffdoc.h"
@@ -543,7 +544,7 @@
   CFXJSE_Engine* pScriptContext = pObject->GetDocument()->GetScriptContext();
   pObject = pScriptContext->GetVariablesThis(pObject);
 
-  std::vector<v8::Local<v8::Value>> parameters;
+  v8::LocalVector<v8::Value> parameters(info.GetIsolate());
   for (int i = 0; i < info.Length(); i++)
     parameters.push_back(info[i]);
 
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 82a5097..8172b33 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -35,6 +35,7 @@
 #include "third_party/base/numerics/safe_conversions.h"
 #include "v8/include/v8-container.h"
 #include "v8/include/v8-function-callback.h"
+#include "v8/include/v8-local-handle.h"
 #include "v8/include/v8-object.h"
 #include "v8/include/v8-primitive.h"
 #include "xfa/fgas/crt/cfgas_decimal.h"
@@ -1186,9 +1187,9 @@
   return fxv8::IsNull(firstValue) && fxv8::IsNull(secondValue);
 }
 
-std::vector<v8::Local<v8::Value>> UnfoldArgs(
+v8::LocalVector<v8::Value> UnfoldArgs(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  std::vector<v8::Local<v8::Value>> results;
+  v8::LocalVector<v8::Value> results(info.GetIsolate());
   v8::Isolate* pIsolate = info.GetIsolate();
   for (int i = 1; i < info.Length(); ++i) {
     v8::Local<v8::Value> arg = info[i];
@@ -1303,14 +1304,14 @@
                                         dwFlags);
 }
 
-std::vector<v8::Local<v8::Value>> ParseResolveResult(
+v8::LocalVector<v8::Value> ParseResolveResult(
     CFXJSE_HostObject* pHostObject,
     const CFXJSE_Engine::ResolveResult& resolveNodeRS,
     v8::Local<v8::Value> pParentValue,
     bool* bAttribute) {
-  std::vector<v8::Local<v8::Value>> resultValues;
   CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pHostObject);
   v8::Isolate* pIsolate = pContext->GetIsolate();
+  v8::LocalVector<v8::Value> resultValues(pIsolate);
 
   if (resolveNodeRS.type == CFXJSE_Engine::ResolveResult::Type::kNodes) {
     *bAttribute = false;
@@ -3016,7 +3017,7 @@
     return;
   }
 
-  std::vector<v8::Local<v8::Value>> values(3);
+  v8::LocalVector<v8::Value> values(info.GetIsolate(), 3);
   int intVal = 3;
   if (fxv8::IsNull(argOne)) {
     // TODO(dsinclair): Why is this 4 when the others are all 3?
@@ -4900,7 +4901,7 @@
   }
 
   if (iFlags == 4) {
-    std::vector<v8::Local<v8::Value>> values(3);
+    v8::LocalVector<v8::Value> values(info.GetIsolate(), 3);
     values[0] = fxv8::NewNumberHelper(info.GetIsolate(), 3);
     values[1] = fxv8::NewNullHelper(info.GetIsolate());
     values[2] = fxv8::NewNullHelper(info.GetIsolate());
@@ -4922,7 +4923,7 @@
     CFXJSE_HostObject* pThis,
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Isolate* pIsolate = ToFormCalcContext(pThis)->GetIsolate();
-  std::vector<v8::Local<v8::Value>> returnValues;
+  v8::LocalVector<v8::Value> returnValues(pIsolate);
   for (int i = 0; i < info.Length(); ++i) {
     if (fxv8::IsArray(info[i])) {
       v8::Local<v8::Array> arr = info[i].As<v8::Array>();
@@ -5053,7 +5054,10 @@
       return;
     }
 
-    std::vector<std::vector<v8::Local<v8::Value>>> resolveValues(iLength - 2);
+    // TODO(crbug.com/pdfium/2090) - doublecheck use of std::vector
+    std::vector<v8::LocalVector<v8::Value>> resolveValues(
+        iLength - 2, v8::LocalVector<v8::Value>(info.GetIsolate()));
+
     bool bAttribute = false;
     bool bAllEmpty = true;
     for (uint32_t i = 2; i < iLength; i++) {
@@ -5074,7 +5078,7 @@
       return;
     }
 
-    std::vector<v8::Local<v8::Value>> values;
+    v8::LocalVector<v8::Value> values(pIsolate);
     values.push_back(fxv8::NewNumberHelper(pIsolate, 1));
     values.push_back(
         bAttribute ? fxv8::NewStringHelper(pIsolate, bsName.AsStringView())
@@ -5111,10 +5115,10 @@
   }
 
   bool bAttribute = false;
-  std::vector<v8::Local<v8::Value>> resolveValues =
+  v8::LocalVector<v8::Value> resolveValues =
       ParseResolveResult(pThis, maybeResult.value(), argAccessor, &bAttribute);
 
-  std::vector<v8::Local<v8::Value>> values(resolveValues.size() + 2);
+  v8::LocalVector<v8::Value> values(pIsolate, resolveValues.size() + 2);
   values[0] = fxv8::NewNumberHelper(pIsolate, 1);
   values[1] = bAttribute
                   ? fxv8::NewStringHelper(pIsolate, bsName.AsStringView())
diff --git a/fxjs/xfa/cfxjse_value.cpp b/fxjs/xfa/cfxjse_value.cpp
index 112a648..64c2015 100644
--- a/fxjs/xfa/cfxjse_value.cpp
+++ b/fxjs/xfa/cfxjse_value.cpp
@@ -16,6 +16,7 @@
 #include "v8/include/v8-container.h"
 #include "v8/include/v8-exception.h"
 #include "v8/include/v8-function.h"
+#include "v8/include/v8-local-handle.h"
 #include "v8/include/v8-primitive.h"
 #include "v8/include/v8-script.h"
 
@@ -97,7 +98,7 @@
     v8::Isolate* pIsolate,
     const std::vector<std::unique_ptr<CFXJSE_Value>>& values) {
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  std::vector<v8::Local<v8::Value>> local_values;
+  v8::LocalVector<v8::Value> local_values(pIsolate);
   local_values.reserve(values.size());
   for (auto& v : values) {
     if (v->IsEmpty())
