diff --git a/fxjs/BUILD.gn b/fxjs/BUILD.gn
index f4fbe5f..8f6225f 100644
--- a/fxjs/BUILD.gn
+++ b/fxjs/BUILD.gn
@@ -89,6 +89,8 @@
       "cjs_zoomtype.h",
       "fx_date_helpers.cpp",
       "fx_date_helpers.h",
+      "fxv8.cpp",
+      "fxv8.h",
       "global_timer.cpp",
       "global_timer.h",
       "js_define.cpp",
diff --git a/fxjs/cfx_v8.cpp b/fxjs/cfx_v8.cpp
index 972f4f7..8972158 100644
--- a/fxjs/cfx_v8.cpp
+++ b/fxjs/cfx_v8.cpp
@@ -7,6 +7,7 @@
 #include "fxjs/cfx_v8.h"
 
 #include "core/fxcrt/fx_memory.h"
+#include "fxjs/fxv8.h"
 #include "third_party/base/allocator/partition_allocator/partition_alloc.h"
 
 CFX_V8::CFX_V8(v8::Isolate* isolate) : m_pIsolate(isolate) {}
@@ -110,7 +111,7 @@
 
 v8::Local<v8::String> CFX_V8::NewString(ByteStringView str) {
   v8::Isolate* pIsolate = m_pIsolate ? GetIsolate() : v8::Isolate::GetCurrent();
-  return NewStringHelper(pIsolate, str);
+  return fxv8::NewStringHelper(pIsolate, str);
 }
 
 v8::Local<v8::String> CFX_V8::NewString(WideStringView str) {
@@ -135,23 +136,23 @@
 }
 
 int CFX_V8::ToInt32(v8::Local<v8::Value> pValue) {
-  return ReentrantToInt32Helper(m_pIsolate.Get(), pValue);
+  return fxv8::ReentrantToInt32Helper(m_pIsolate.Get(), pValue);
 }
 
 bool CFX_V8::ToBoolean(v8::Local<v8::Value> pValue) {
-  return ReentrantToBooleanHelper(m_pIsolate.Get(), pValue);
+  return fxv8::ReentrantToBooleanHelper(m_pIsolate.Get(), pValue);
 }
 
 double CFX_V8::ToDouble(v8::Local<v8::Value> pValue) {
-  return ReentrantToDoubleHelper(m_pIsolate.Get(), pValue);
+  return fxv8::ReentrantToDoubleHelper(m_pIsolate.Get(), pValue);
 }
 
 WideString CFX_V8::ToWideString(v8::Local<v8::Value> pValue) {
-  return ReentrantToWideStringHelper(m_pIsolate.Get(), pValue);
+  return fxv8::ReentrantToWideStringHelper(m_pIsolate.Get(), pValue);
 }
 
 ByteString CFX_V8::ToByteString(v8::Local<v8::Value> pValue) {
-  return ReentrantToByteStringHelper(m_pIsolate.Get(), pValue);
+  return fxv8::ReentrantToByteStringHelper(m_pIsolate.Get(), pValue);
 }
 
 v8::Local<v8::Object> CFX_V8::ToObject(v8::Local<v8::Value> pValue) {
@@ -168,70 +169,6 @@
   return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked());
 }
 
-// static
-v8::Local<v8::String> CFX_V8::NewStringHelper(v8::Isolate* pIsolate,
-                                              ByteStringView str) {
-  return v8::String::NewFromUtf8(pIsolate, str.unterminated_c_str(),
-                                 v8::NewStringType::kNormal, str.GetLength())
-      .ToLocalChecked();
-}
-
-// static
-v8::Local<v8::String> CFX_V8::NewStringHelper(v8::Isolate* pIsolate,
-                                              WideStringView str) {
-  return NewStringHelper(pIsolate, FX_UTF8Encode(str).AsStringView());
-}
-
-// static
-int CFX_V8::ReentrantToInt32Helper(v8::Isolate* pIsolate,
-                                   v8::Local<v8::Value> pValue) {
-  if (pValue.IsEmpty())
-    return 0;
-  return pValue->Int32Value(pIsolate->GetCurrentContext()).FromMaybe(0);
-}
-
-// static
-bool CFX_V8::ReentrantToBooleanHelper(v8::Isolate* pIsolate,
-                                      v8::Local<v8::Value> pValue) {
-  if (pValue.IsEmpty())
-    return false;
-  return pValue->BooleanValue(pIsolate);
-}
-
-// static
-double CFX_V8::ReentrantToDoubleHelper(v8::Isolate* pIsolate,
-                                       v8::Local<v8::Value> pValue) {
-  if (pValue.IsEmpty())
-    return 0.0;
-  return pValue->NumberValue(pIsolate->GetCurrentContext()).FromMaybe(0.0);
-}
-
-// static
-WideString CFX_V8::ReentrantToWideStringHelper(v8::Isolate* pIsolate,
-                                               v8::Local<v8::Value> pValue) {
-  if (pValue.IsEmpty())
-    return WideString();
-  v8::MaybeLocal<v8::String> maybe_string =
-      pValue->ToString(pIsolate->GetCurrentContext());
-  if (maybe_string.IsEmpty())
-    return WideString();
-  v8::String::Utf8Value s(pIsolate, maybe_string.ToLocalChecked());
-  return WideString::FromUTF8(ByteStringView(*s, s.length()));
-}
-
-// static
-ByteString CFX_V8::ReentrantToByteStringHelper(v8::Isolate* pIsolate,
-                                               v8::Local<v8::Value> pValue) {
-  if (pValue.IsEmpty())
-    return ByteString();
-  v8::MaybeLocal<v8::String> maybe_string =
-      pValue->ToString(pIsolate->GetCurrentContext());
-  if (maybe_string.IsEmpty())
-    return ByteString();
-  v8::String::Utf8Value s(pIsolate, maybe_string.ToLocalChecked());
-  return ByteString(*s);
-}
-
 void* CFX_V8ArrayBufferAllocator::Allocate(size_t length) {
   if (length > kMaxAllowedBytes)
     return nullptr;
diff --git a/fxjs/cfx_v8.h b/fxjs/cfx_v8.h
index 2f01d4e..cb152ac 100644
--- a/fxjs/cfx_v8.h
+++ b/fxjs/cfx_v8.h
@@ -15,22 +15,6 @@
 
 class CFX_V8 {
  public:
-  static v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
-                                               ByteStringView str);
-  static v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
-                                               WideStringView str);
-
-  static int ReentrantToInt32Helper(v8::Isolate* pIsolate,
-                                    v8::Local<v8::Value> pValue);
-  static bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
-                                       v8::Local<v8::Value> pValue);
-  static double ReentrantToDoubleHelper(v8::Isolate* pIsolate,
-                                        v8::Local<v8::Value> pValue);
-  static WideString ReentrantToWideStringHelper(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Value> pValue);
-  static ByteString ReentrantToByteStringHelper(v8::Isolate* pIsolate,
-                                                v8::Local<v8::Value> pValue);
-
   explicit CFX_V8(v8::Isolate* pIsolate);
   virtual ~CFX_V8();
 
diff --git a/fxjs/cfxjs_engine.cpp b/fxjs/cfxjs_engine.cpp
index c74f57c..2c05992 100644
--- a/fxjs/cfxjs_engine.cpp
+++ b/fxjs/cfxjs_engine.cpp
@@ -12,6 +12,7 @@
 
 #include "core/fxcrt/unowned_ptr.h"
 #include "fxjs/cjs_object.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_runtimedata.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
@@ -147,7 +148,7 @@
     fn->SetCallHandler(CallHandler, v8::Number::New(isolate, eObjType));
     if (eObjType == FXJSOBJTYPE_GLOBAL) {
       fn->InstanceTemplate()->Set(v8::Symbol::GetToStringTag(isolate),
-                                  CFX_V8::NewStringHelper(isolate, "global"));
+                                  fxv8::NewStringHelper(isolate, "global"));
     }
     m_FunctionTemplate.Reset(isolate, fn);
     m_Signature.Reset(isolate, v8::Signature::New(isolate, fn));
@@ -157,12 +158,12 @@
     v8::Isolate* isolate = info.GetIsolate();
     if (!info.IsConstructCall()) {
       isolate->ThrowException(
-          CFX_V8::NewStringHelper(isolate, "illegal constructor"));
+          fxv8::NewStringHelper(isolate, "illegal constructor"));
       return;
     }
     if (info.Data().As<v8::Int32>()->Value() != FXJSOBJTYPE_DYNAMIC) {
       isolate->ThrowException(
-          CFX_V8::NewStringHelper(isolate, "not a dynamic object"));
+          fxv8::NewStringHelper(isolate, "not a dynamic object"));
       return;
     }
     v8::Local<v8::Object> holder = info.Holder();
@@ -234,7 +235,7 @@
     v8::Local<v8::ObjectTemplate> hGlobalTemplate =
         v8::ObjectTemplate::New(pIsolate);
     hGlobalTemplate->Set(v8::Symbol::GetToStringTag(pIsolate),
-                         CFX_V8::NewStringHelper(pIsolate, "global"));
+                         fxv8::NewStringHelper(pIsolate, "global"));
     g_DefaultGlobalObjectTemplate =
         new v8::Global<v8::ObjectTemplate>(pIsolate, hGlobalTemplate);
   }
diff --git a/fxjs/cjs_globalconsts.cpp b/fxjs/cjs_globalconsts.cpp
index bea5d54..c10a6f5 100644
--- a/fxjs/cjs_globalconsts.cpp
+++ b/fxjs/cjs_globalconsts.cpp
@@ -6,12 +6,13 @@
 
 #include "fxjs/cjs_globalconsts.h"
 
+#include "fxjs/fxv8.h"
+
 #define GLOBAL_STRING(rt, name, value)                              \
   (rt)->DefineGlobalConst(                                          \
       (name), [](const v8::FunctionCallbackInfo<v8::Value>& info) { \
-        const char* pStr = (value);                                 \
         info.GetReturnValue().Set(                                  \
-            CFX_V8::NewStringHelper(info.GetIsolate(), pStr));      \
+            fxv8::NewStringHelper(info.GetIsolate(), (value)));     \
       })
 
 // static
diff --git a/fxjs/cjs_runtime.cpp b/fxjs/cjs_runtime.cpp
index efa2ba6..dba7e32 100644
--- a/fxjs/cjs_runtime.cpp
+++ b/fxjs/cjs_runtime.cpp
@@ -36,6 +36,7 @@
 #include "fxjs/cjs_timerobj.h"
 #include "fxjs/cjs_util.h"
 #include "fxjs/cjs_zoomtype.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/js_define.h"
 #include "third_party/base/ptr_util.h"
 
@@ -181,7 +182,7 @@
   v8::Isolate::Scope isolate_scope(GetIsolate());
   v8::Local<v8::Context> context = GetV8Context();
   v8::Context::Scope context_scope(context);
-  v8::Local<v8::String> str = CFX_V8::NewStringHelper(GetIsolate(), utf8Name);
+  v8::Local<v8::String> str = fxv8::NewStringHelper(GetIsolate(), utf8Name);
   v8::MaybeLocal<v8::Value> maybe_propvalue =
       context->Global()->Get(context, str);
   if (maybe_propvalue.IsEmpty())
@@ -200,7 +201,7 @@
   v8::Isolate::Scope isolate_scope(pIsolate);
   v8::Local<v8::Context> context = GetV8Context();
   v8::Context::Scope context_scope(context);
-  v8::Local<v8::String> str = CFX_V8::NewStringHelper(pIsolate, utf8Name);
+  v8::Local<v8::String> str = fxv8::NewStringHelper(pIsolate, utf8Name);
   v8::Maybe<bool> result = context->Global()->Set(context, str, pValue);
   return result.IsJust() && result.FromJust();
 }
diff --git a/fxjs/fxv8.cpp b/fxjs/fxv8.cpp
new file mode 100644
index 0000000..c30461b
--- /dev/null
+++ b/fxjs/fxv8.cpp
@@ -0,0 +1,67 @@
+// Copyright 2020 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxjs/fxv8.h"
+
+namespace fxv8 {
+
+v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
+                                      ByteStringView str) {
+  return v8::String::NewFromUtf8(pIsolate, str.unterminated_c_str(),
+                                 v8::NewStringType::kNormal, str.GetLength())
+      .ToLocalChecked();
+}
+
+v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
+                                      WideStringView str) {
+  return NewStringHelper(pIsolate, FX_UTF8Encode(str).AsStringView());
+}
+
+int ReentrantToInt32Helper(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) {
+  if (pValue.IsEmpty())
+    return 0;
+  return pValue->Int32Value(pIsolate->GetCurrentContext()).FromMaybe(0);
+}
+
+bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
+                              v8::Local<v8::Value> pValue) {
+  if (pValue.IsEmpty())
+    return false;
+  return pValue->BooleanValue(pIsolate);
+}
+
+double ReentrantToDoubleHelper(v8::Isolate* pIsolate,
+                               v8::Local<v8::Value> pValue) {
+  if (pValue.IsEmpty())
+    return 0.0;
+  return pValue->NumberValue(pIsolate->GetCurrentContext()).FromMaybe(0.0);
+}
+
+WideString ReentrantToWideStringHelper(v8::Isolate* pIsolate,
+                                       v8::Local<v8::Value> pValue) {
+  if (pValue.IsEmpty())
+    return WideString();
+  v8::MaybeLocal<v8::String> maybe_string =
+      pValue->ToString(pIsolate->GetCurrentContext());
+  if (maybe_string.IsEmpty())
+    return WideString();
+  v8::String::Utf8Value s(pIsolate, maybe_string.ToLocalChecked());
+  return WideString::FromUTF8(ByteStringView(*s, s.length()));
+}
+
+ByteString ReentrantToByteStringHelper(v8::Isolate* pIsolate,
+                                       v8::Local<v8::Value> pValue) {
+  if (pValue.IsEmpty())
+    return ByteString();
+  v8::MaybeLocal<v8::String> maybe_string =
+      pValue->ToString(pIsolate->GetCurrentContext());
+  if (maybe_string.IsEmpty())
+    return ByteString();
+  v8::String::Utf8Value s(pIsolate, maybe_string.ToLocalChecked());
+  return ByteString(*s);
+}
+
+}  // namespace fxv8
diff --git a/fxjs/fxv8.h b/fxjs/fxv8.h
new file mode 100644
index 0000000..690beb3
--- /dev/null
+++ b/fxjs/fxv8.h
@@ -0,0 +1,32 @@
+// Copyright 2020 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXJS_FXV8_H_
+#define FXJS_FXV8_H_
+
+#include "core/fxcrt/fx_string.h"
+#include "v8/include/v8.h"
+
+namespace fxv8 {
+
+v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
+                                      ByteStringView str);
+v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate,
+                                      WideStringView str);
+
+int ReentrantToInt32Helper(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue);
+bool ReentrantToBooleanHelper(v8::Isolate* pIsolate,
+                              v8::Local<v8::Value> pValue);
+double ReentrantToDoubleHelper(v8::Isolate* pIsolate,
+                               v8::Local<v8::Value> pValue);
+WideString ReentrantToWideStringHelper(v8::Isolate* pIsolate,
+                                       v8::Local<v8::Value> pValue);
+ByteString ReentrantToByteStringHelper(v8::Isolate* pIsolate,
+                                       v8::Local<v8::Value> pValue);
+
+}  // namespace fxv8
+
+#endif  // FXJS_FXV8_H_
diff --git a/fxjs/js_define.cpp b/fxjs/js_define.cpp
index fbb1e84..352370f 100644
--- a/fxjs/js_define.cpp
+++ b/fxjs/js_define.cpp
@@ -15,6 +15,7 @@
 #include "fxjs/cjs_document.h"
 #include "fxjs/cjs_object.h"
 #include "fxjs/fx_date_helpers.h"
+#include "fxjs/fxv8.h"
 
 void JSDestructor(v8::Local<v8::Object> obj) {
   CFXJS_Engine::SetObjectPrivate(obj, nullptr);
@@ -30,17 +31,17 @@
   // Use the built-in object method.
   v8::Local<v8::Value> v =
       context->Global()
-          ->Get(context, CFX_V8::NewStringHelper(pIsolate, "Date"))
+          ->Get(context, fxv8::NewStringHelper(pIsolate, "Date"))
           .ToLocalChecked();
   if (v->IsObject()) {
     v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked();
-    v = o->Get(context, CFX_V8::NewStringHelper(pIsolate, "parse"))
+    v = o->Get(context, fxv8::NewStringHelper(pIsolate, "parse"))
             .ToLocalChecked();
     if (v->IsFunction()) {
       v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v);
       const int argc = 1;
       v8::Local<v8::String> timeStr =
-          CFX_V8::NewStringHelper(pIsolate, str.AsStringView());
+          fxv8::NewStringHelper(pIsolate, str.AsStringView());
       v8::Local<v8::Value> argv[argc] = {timeStr};
       v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked();
       if (v->IsNumber()) {
diff --git a/fxjs/xfa/cfxjse_class.cpp b/fxjs/xfa/cfxjse_class.cpp
index e4d83b6..75d4081 100644
--- a/fxjs/xfa/cfxjse_class.cpp
+++ b/fxjs/xfa/cfxjse_class.cpp
@@ -11,6 +11,7 @@
 
 #include "fxjs/cfx_v8.h"
 #include "fxjs/cjs_result.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/js_resources.h"
 #include "fxjs/xfa/cfxjse_context.h"
 #include "fxjs/xfa/cfxjse_isolatetracker.h"
@@ -67,7 +68,7 @@
   if (info.This() == info.Holder() && lpClass->name) {
     ByteString szStringVal = ByteString::Format("[object %s]", lpClass->name);
     info.GetReturnValue().Set(
-        CFX_V8::NewStringHelper(info.GetIsolate(), szStringVal.AsStringView()));
+        fxv8::NewStringHelper(info.GetIsolate(), szStringVal.AsStringView()));
     return;
   }
   v8::Local<v8::String> local_str =
@@ -105,7 +106,7 @@
     WideString err = JSFormatErrorString(pClassDescriptor->name, *szPropName,
                                          result.Error());
     v8::Local<v8::String> str =
-        CFX_V8::NewStringHelper(info.GetIsolate(), err.AsStringView());
+        fxv8::NewStringHelper(info.GetIsolate(), err.AsStringView());
     info.GetIsolate()->ThrowException(str);
     return;
   }
@@ -140,7 +141,7 @@
       hCallBackInfo->SetAlignedPointerInInternalField(
           0, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClass));
       hCallBackInfo->SetInternalField(
-          1, CFX_V8::NewStringHelper(pIsolate, szPropName));
+          1, fxv8::NewStringHelper(pIsolate, szPropName));
       pValue->ForceSetValue(
           v8::Function::New(pIsolate->GetCurrentContext(),
                             DynPropGetterAdapter_MethodCallback, hCallBackInfo,
@@ -283,7 +284,7 @@
       v8::External::New(
           pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
   hFunctionTemplate->SetClassName(
-      CFX_V8::NewStringHelper(pIsolate, lpClassDefinition->name));
+      fxv8::NewStringHelper(pIsolate, lpClassDefinition->name));
   hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(2);
   v8::Local<v8::ObjectTemplate> hObjectTemplate =
       hFunctionTemplate->InstanceTemplate();
@@ -297,7 +298,7 @@
                                           lpClassDefinition->methods + i)));
       fun->RemovePrototype();
       hObjectTemplate->Set(
-          CFX_V8::NewStringHelper(pIsolate, lpClassDefinition->methods[i].name),
+          fxv8::NewStringHelper(pIsolate, lpClassDefinition->methods[i].name),
           fun,
           static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
     }
@@ -309,7 +310,7 @@
         v8::External::New(
             pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
     fn->RemovePrototype();
-    hObjectTemplate->Set(CFX_V8::NewStringHelper(pIsolate, "toString"), fn);
+    hObjectTemplate->Set(fxv8::NewStringHelper(pIsolate, "toString"), fn);
   }
   pClass->m_hTemplate.Reset(lpContext->GetIsolate(), hFunctionTemplate);
   CFXJSE_Class* pResult = pClass.get();
diff --git a/fxjs/xfa/cfxjse_context.cpp b/fxjs/xfa/cfxjse_context.cpp
index c5eafbe..a250755 100644
--- a/fxjs/xfa/cfxjse_context.cpp
+++ b/fxjs/xfa/cfxjse_context.cpp
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "fxjs/cfxjs_engine.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_class.h"
 #include "fxjs/xfa/cfxjse_isolatetracker.h"
 #include "fxjs/xfa/cfxjse_runtimedata.h"
@@ -68,18 +69,18 @@
   v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
   v8::Local<v8::Value> hException = trycatch->Exception();
   if (hException->IsObject()) {
-    v8::Local<v8::String> hNameStr = CFX_V8::NewStringHelper(pIsolate, "name");
+    v8::Local<v8::String> hNameStr = fxv8::NewStringHelper(pIsolate, "name");
     v8::Local<v8::Value> hValue =
         hException.As<v8::Object>()->Get(context, hNameStr).ToLocalChecked();
     if (hValue->IsString() || hValue->IsStringObject()) {
       hReturnValue->Set(context, 0, hValue).FromJust();
     } else {
       v8::Local<v8::String> hErrorStr =
-          CFX_V8::NewStringHelper(pIsolate, "Error");
+          fxv8::NewStringHelper(pIsolate, "Error");
       hReturnValue->Set(context, 0, hErrorStr).FromJust();
     }
     v8::Local<v8::String> hMessageStr =
-        CFX_V8::NewStringHelper(pIsolate, "message");
+        fxv8::NewStringHelper(pIsolate, "message");
     hValue =
         hException.As<v8::Object>()->Get(context, hMessageStr).ToLocalChecked();
     if (hValue->IsString() || hValue->IsStringObject())
@@ -87,8 +88,7 @@
     else
       hReturnValue->Set(context, 1, hMessage->Get()).FromJust();
   } else {
-    v8::Local<v8::String> hErrorStr =
-        CFX_V8::NewStringHelper(pIsolate, "Error");
+    v8::Local<v8::String> hErrorStr = fxv8::NewStringHelper(pIsolate, "Error");
     hReturnValue->Set(context, 0, hErrorStr).FromJust();
     hReturnValue->Set(context, 1, hMessage->Get()).FromJust();
   }
@@ -191,7 +191,7 @@
     hObjectTemplate->SetInternalFieldCount(2);
   }
   hObjectTemplate->Set(v8::Symbol::GetToStringTag(pIsolate),
-                       CFX_V8::NewStringHelper(pIsolate, "global"));
+                       fxv8::NewStringHelper(pIsolate, "global"));
 
   v8::Local<v8::Context> hNewContext =
       v8::Context::New(pIsolate, nullptr, hObjectTemplate);
@@ -252,7 +252,7 @@
   v8::Local<v8::Context> hContext = GetIsolate()->GetCurrentContext();
   v8::TryCatch trycatch(GetIsolate());
   v8::Local<v8::String> hScriptString =
-      CFX_V8::NewStringHelper(GetIsolate(), szScript);
+      fxv8::NewStringHelper(GetIsolate(), szScript);
   if (!lpNewThisObject) {
     v8::Local<v8::Script> hScript;
     if (v8::Script::Compile(hContext, hScriptString).ToLocal(&hScript)) {
@@ -273,7 +273,7 @@
   v8::Local<v8::Value> hNewThis = v8::Local<v8::Value>::New(
       GetIsolate(), lpNewThisObject->DirectGetValue());
   ASSERT(!hNewThis.IsEmpty());
-  v8::Local<v8::String> hEval = CFX_V8::NewStringHelper(
+  v8::Local<v8::String> hEval = fxv8::NewStringHelper(
       GetIsolate(), "(function () { return eval(arguments[0]); })");
   v8::Local<v8::Script> hWrapper =
       v8::Script::Compile(hContext, hEval).ToLocalChecked();
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 9d702b6..cad930c 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -14,6 +14,7 @@
 #include "core/fxcrt/cfx_widetextbuf.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_random.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_class.h"
 #include "fxjs/xfa/cfxjse_context.h"
 #include "fxjs/xfa/cfxjse_engine.h"
@@ -1941,7 +1942,7 @@
   ByteString bsFormat =
       GetStandardDateFormat(pThis, iStyle, bsLocale.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
@@ -2050,7 +2051,7 @@
   ByteString bsFormat =
       GetLocalDateFormat(pThis, iStyle, bsLocale.AsStringView(), false);
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
@@ -2088,7 +2089,7 @@
   ByteString bsFormat =
       GetLocalTimeFormat(pThis, iStyle, bsLocale.AsStringView(), false);
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
@@ -2229,7 +2230,7 @@
       ByteString::Format("%d%02d%02d", iYear + i, iMonth, iDay).AsStringView(),
       bsFormat.AsStringView(), bsLocale.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsLocalDate.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsLocalDate.AsStringView()));
 }
 
 // static
@@ -2276,7 +2277,7 @@
   ByteString bsGMTTime = Num2AllTime(pThis, iTime, bsFormat.AsStringView(),
                                      bsLocale.AsStringView(), true);
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsGMTTime.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsGMTTime.AsStringView()));
 }
 
 // static
@@ -2324,7 +2325,7 @@
       Num2AllTime(pThis, static_cast<int32_t>(fTime), bsFormat.AsStringView(),
                   bsLocale.AsStringView(), false);
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsLocalTime.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsLocalTime.AsStringView()));
 }
 
 // static
@@ -2462,7 +2463,7 @@
   ByteString bsFormat =
       GetStandardTimeFormat(pThis, iStyle, bsLocale.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsFormat.AsStringView()));
 }
 
 // static
@@ -3071,16 +3072,16 @@
               propertyValue->ToString().AsStringView(), newPropertyValue.get());
         }
         ByteString bsChosen = ValueToUTF8String(newPropertyValue.get());
-        info.GetReturnValue().Set(CFX_V8::NewStringHelper(
-            info.GetIsolate(), bsChosen.AsStringView()));
+        info.GetReturnValue().Set(
+            fxv8::NewStringHelper(info.GetIsolate(), bsChosen.AsStringView()));
         bFound = true;
       }
     } else {
       iValueIndex++;
       if (iValueIndex == iIndex) {
         ByteString bsChosen = ValueToUTF8String(argIndexValue.get());
-        info.GetReturnValue().Set(CFX_V8::NewStringHelper(
-            info.GetIsolate(), bsChosen.AsStringView()));
+        info.GetReturnValue().Set(
+            fxv8::NewStringHelper(info.GetIsolate(), bsChosen.AsStringView()));
         bFound = true;
       }
     }
@@ -3381,24 +3382,19 @@
   }
   switch (eParserStatus) {
     case VALUETYPE_ISCM:
-      info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), "cm"));
+      info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "cm"));
       break;
     case VALUETYPE_ISMM:
-      info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), "mm"));
+      info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "mm"));
       break;
     case VALUETYPE_ISPT:
-      info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), "pt"));
+      info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "pt"));
       break;
     case VALUETYPE_ISMP:
-      info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), "mp"));
+      info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "mp"));
       break;
     default:
-      info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), "in"));
+      info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "in"));
       break;
   }
 }
@@ -3596,7 +3592,7 @@
     return;
   }
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsResult.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsResult.AsStringView()));
 }
 
 // static
@@ -3620,7 +3616,7 @@
         WideString::FromUTF8(ValueToUTF8String(argOne.get()).AsStringView()));
     auto result = FX_UTF8Encode(decoded.AsStringView());
     info.GetReturnValue().Set(
-        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+        fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
@@ -3646,7 +3642,7 @@
 
   auto result = FX_UTF8Encode(decoded.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
@@ -3668,7 +3664,7 @@
     WideString encoded = EncodeURL(ValueToUTF8String(argOne.get()));
     auto result = FX_UTF8Encode(encoded.AsStringView());
     info.GetReturnValue().Set(
-        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+        fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
@@ -3691,7 +3687,7 @@
 
   auto result = FX_UTF8Encode(encoded.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
@@ -3770,8 +3766,8 @@
     info.GetReturnValue().SetEmptyString();
     return;
   }
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
-      info.GetIsolate(), wsRet.ToUTF8().AsStringView()));
+  info.GetReturnValue().Set(
+      fxv8::NewStringHelper(info.GetIsolate(), wsRet.ToUTF8().AsStringView()));
 }
 
 // static
@@ -3793,7 +3789,7 @@
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), bsSource.First(count).AsStringView()));
 }
 
@@ -3846,7 +3842,7 @@
 
   auto result = FX_UTF8Encode(szLowBuf.AsStringView());
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
 }
 
 // static
@@ -3867,7 +3863,7 @@
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimLeft();
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
 
 // static
@@ -3908,7 +3904,7 @@
     }
     auto result = localeValue.GetValue().ToUTF8();
     info.GetReturnValue().Set(
-        CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+        fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
     return;
   }
 
@@ -3933,7 +3929,7 @@
       }
       auto result = localeValue.GetValue().ToUTF8();
       info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+          fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_DATE: {
@@ -3946,7 +3942,7 @@
       }
       auto result = localeValue.GetValue().ToUTF8();
       info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+          fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_TIME: {
@@ -3959,7 +3955,7 @@
       }
       auto result = localeValue.GetValue().ToUTF8();
       info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+          fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_TEXT: {
@@ -3972,7 +3968,7 @@
       }
       auto result = localeValue.GetValue().ToUTF8();
       info.GetReturnValue().Set(
-          CFX_V8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
+          fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
     case XFA_VT_FLOAT: {
@@ -4003,8 +3999,8 @@
                                      pLocale, pMgr);
         if (localeValue.IsValid()) {
           auto result = localeValue.GetValue().ToUTF8();
-          info.GetReturnValue().Set(CFX_V8::NewStringHelper(
-              info.GetIsolate(), result.AsStringView()));
+          info.GetReturnValue().Set(
+              fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
           return;
         }
       }
@@ -4070,7 +4066,7 @@
     }
   }
   szResult << '\0';
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), ByteStringView(szResult.str().c_str())));
 }
 
@@ -4093,7 +4089,7 @@
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), bsSource.Last(count).AsStringView()));
 }
 
@@ -4115,7 +4111,7 @@
   ByteString bsSource = ValueToUTF8String(argOne.get());
   bsSource.TrimRight();
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
+      fxv8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
 
 // static
@@ -4141,7 +4137,7 @@
     index++;
   }
   spaceString << '\0';
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), ByteStringView(spaceString.str().c_str())));
 }
 
@@ -4202,7 +4198,7 @@
       ++i;
     }
     resultBuf << '\0';
-    info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+    info.GetReturnValue().Set(fxv8::NewStringHelper(
         info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
     return;
   }
@@ -4222,7 +4218,7 @@
       }
       resultBuf << pData;
     }
-    info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+    info.GetReturnValue().Set(fxv8::NewStringHelper(
         info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
     return;
   }
@@ -4259,7 +4255,7 @@
     ++i;
   }
   resultBuf << '\0';
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), ByteStringView(resultBuf.str().c_str())));
 }
 
@@ -4311,7 +4307,7 @@
     ++i;
   }
   szResult << '\0';
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), ByteStringView(szResult.str().c_str())));
   ;
 }
@@ -4353,7 +4349,7 @@
   // Negative values are treated as 0. Can't clamp() due to sign mismatches.
   size_t iCount = std::max(ValueToInteger(pThis, end_value.get()), 0);
   iCount = std::min(iCount, iLength - iStart);
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), bsSource.Substr(iStart, iCount).AsStringView()));
 }
 
@@ -4372,7 +4368,7 @@
     std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, info, 0);
     iNum = static_cast<int32_t>(ValueToFloat(pThis, argOne.get()));
   }
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), GUIDString(!!iNum).AsStringView()));
 }
 
@@ -4409,7 +4405,7 @@
   }
   upperStringBuf.AppendChar(0);
 
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(),
       FX_UTF8Encode(upperStringBuf.AsStringView()).AsStringView()));
 }
@@ -4455,11 +4451,11 @@
 
   if (std::isnan(fNumber) || fNumber < 0.0f ||
       fNumber > 922337203685477550.0f) {
-    info.GetReturnValue().Set(CFX_V8::NewStringHelper(info.GetIsolate(), "*"));
+    info.GetReturnValue().Set(fxv8::NewStringHelper(info.GetIsolate(), "*"));
     return;
   }
 
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(),
       WordUS(ByteString::Format("%.2f", fNumber), iIdentifier).AsStringView()));
 }
@@ -4493,7 +4489,7 @@
   std::vector<uint8_t> dataBuf(size);
   pFile->ReadBlock(dataBuf.data(), size);
   info.GetReturnValue().Set(
-      CFX_V8::NewStringHelper(info.GetIsolate(), ByteStringView(dataBuf)));
+      fxv8::NewStringHelper(info.GetIsolate(), ByteStringView(dataBuf)));
 }
 
 // static
@@ -4549,7 +4545,7 @@
     pContext->ThrowServerDeniedException();
     return;
   }
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(), decodedResponse.ToUTF8().AsStringView()));
 }
 
@@ -5068,7 +5064,7 @@
     pContext->ThrowCompilerErrorException();
     return;
   }
-  info.GetReturnValue().Set(CFX_V8::NewStringHelper(
+  info.GetReturnValue().Set(fxv8::NewStringHelper(
       info.GetIsolate(),
       FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView()));
 }
@@ -5762,11 +5758,11 @@
   }
 
   const ByteString bsName =
-      CFX_V8::ReentrantToByteStringHelper(info.GetIsolate(), info[2]);
+      fxv8::ReentrantToByteStringHelper(info.GetIsolate(), info[2]);
   const bool bHasNoResolveName = bDotAccessor && bsName.IsEmpty();
   ByteString bsSomExp = GenerateSomExpression(
       bsName.AsStringView(),
-      CFX_V8::ReentrantToInt32Helper(info.GetIsolate(), info[3]), iIndexValue,
+      fxv8::ReentrantToInt32Helper(info.GetIsolate(), info[3]), iIndexValue,
       bIsStar);
 
   auto argAccessor =
@@ -5826,7 +5822,7 @@
   XFA_RESOLVENODE_RS resolveNodeRS;
   bool bRet = false;
   ByteString bsAccessorName =
-      CFX_V8::ReentrantToByteStringHelper(info.GetIsolate(), info[1]);
+      fxv8::ReentrantToByteStringHelper(info.GetIsolate(), info[1]);
   if (argAccessor->IsObject() ||
       (argAccessor->IsNull() && bsAccessorName.IsEmpty())) {
     bRet = ResolveObjects(pThis, argAccessor.get(), bsSomExp.AsStringView(),
diff --git a/fxjs/xfa/cfxjse_runtimedata.cpp b/fxjs/xfa/cfxjse_runtimedata.cpp
index 2a7acbf..87ff7eb 100644
--- a/fxjs/xfa/cfxjse_runtimedata.cpp
+++ b/fxjs/xfa/cfxjse_runtimedata.cpp
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "fxjs/cfxjs_engine.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_isolatetracker.h"
 
 CFXJSE_RuntimeData::CFXJSE_RuntimeData() = default;
@@ -25,7 +26,7 @@
   v8::Local<v8::ObjectTemplate> hGlobalTemplate =
       hFuncTemplate->InstanceTemplate();
   hGlobalTemplate->Set(v8::Symbol::GetToStringTag(pIsolate),
-                       CFX_V8::NewStringHelper(pIsolate, "global"));
+                       fxv8::NewStringHelper(pIsolate, "global"));
 
   v8::Local<v8::Context> hContext =
       v8::Context::New(pIsolate, 0, hGlobalTemplate);
diff --git a/fxjs/xfa/cfxjse_value.cpp b/fxjs/xfa/cfxjse_value.cpp
index 40b3d79..97551e5 100644
--- a/fxjs/xfa/cfxjse_value.cpp
+++ b/fxjs/xfa/cfxjse_value.cpp
@@ -9,6 +9,7 @@
 #include <math.h>
 
 #include "fxjs/cfx_v8.h"
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_class.h"
 #include "fxjs/xfa/cfxjse_context.h"
 #include "fxjs/xfa/cfxjse_isolatetracker.h"
@@ -59,8 +60,7 @@
   ASSERT(pIsolate);
 
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::String> hMessage =
-      CFX_V8::NewStringHelper(pIsolate, utf8Message);
+  v8::Local<v8::String> hMessage = fxv8::NewStringHelper(pIsolate, utf8Message);
   v8::Local<v8::Value> hError = v8::Exception::Error(hMessage);
   pIsolate->ThrowException(hError);
 }
@@ -138,7 +138,7 @@
     return false;
 
   v8::Local<v8::String> hPropName =
-      CFX_V8::NewStringHelper(GetIsolate(), szPropName);
+      fxv8::NewStringHelper(GetIsolate(), szPropName);
   v8::Local<v8::Value> hPropValue =
       v8::Local<v8::Value>::New(GetIsolate(), lpPropValue->DirectGetValue());
   v8::Maybe<bool> result = hObject.As<v8::Object>()->Set(
@@ -156,7 +156,7 @@
     return false;
 
   v8::Local<v8::String> hPropName =
-      CFX_V8::NewStringHelper(GetIsolate(), szPropName);
+      fxv8::NewStringHelper(GetIsolate(), szPropName);
   v8::Local<v8::Value> hPropValue =
       hObject.As<v8::Object>()
           ->Get(GetIsolate()->GetCurrentContext(), hPropName)
@@ -188,7 +188,7 @@
   return hObject->IsObject() &&
          hObject.As<v8::Object>()
              ->Delete(GetIsolate()->GetCurrentContext(),
-                      CFX_V8::NewStringHelper(GetIsolate(), szPropName))
+                      fxv8::NewStringHelper(GetIsolate(), szPropName))
              .FromJust();
 }
 
@@ -200,8 +200,7 @@
   if (!hObject->IsObject())
     return false;
 
-  v8::Local<v8::String> hKey =
-      CFX_V8::NewStringHelper(GetIsolate(), szPropName);
+  v8::Local<v8::String> hKey = fxv8::NewStringHelper(GetIsolate(), szPropName);
   return hObject.As<v8::Object>()
              ->HasRealNamedProperty(GetIsolate()->GetCurrentContext(), hKey)
              .FromJust() ||
@@ -221,7 +220,7 @@
     return false;
 
   v8::Local<v8::String> hPropName =
-      CFX_V8::NewStringHelper(GetIsolate(), szPropName);
+      fxv8::NewStringHelper(GetIsolate(), szPropName);
   v8::Local<v8::Value> pValue =
       v8::Local<v8::Value>::New(GetIsolate(), lpPropValue->m_hValue);
   return hObject.As<v8::Object>()
@@ -249,9 +248,9 @@
 
   rgArgs[1] = hNewThis;
   v8::Local<v8::String> hBinderFuncSource =
-      CFX_V8::NewStringHelper(GetIsolate(),
-                              "(function (oldfunction, newthis) { return "
-                              "oldfunction.bind(newthis); })");
+      fxv8::NewStringHelper(GetIsolate(),
+                            "(function (oldfunction, newthis) { return "
+                            "oldfunction.bind(newthis); })");
   v8::Local<v8::Context> hContext = GetIsolate()->GetCurrentContext();
   v8::Local<v8::Function> hBinderFunc =
       v8::Script::Compile(hContext, hBinderFuncSource)
@@ -366,7 +365,7 @@
 bool CFXJSE_Value::ToBoolean() const {
   ASSERT(!IsEmpty());
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(GetIsolate());
-  return CFX_V8::ReentrantToBooleanHelper(
+  return fxv8::ReentrantToBooleanHelper(
       GetIsolate(), v8::Local<v8::Value>::New(GetIsolate(), m_hValue));
 }
 
@@ -377,21 +376,21 @@
 double CFXJSE_Value::ToDouble() const {
   ASSERT(!IsEmpty());
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(GetIsolate());
-  return CFX_V8::ReentrantToDoubleHelper(
+  return fxv8::ReentrantToDoubleHelper(
       GetIsolate(), v8::Local<v8::Value>::New(GetIsolate(), m_hValue));
 }
 
 int32_t CFXJSE_Value::ToInteger() const {
   ASSERT(!IsEmpty());
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(GetIsolate());
-  return CFX_V8::ReentrantToInt32Helper(
+  return fxv8::ReentrantToInt32Helper(
       GetIsolate(), v8::Local<v8::Value>::New(GetIsolate(), m_hValue));
 }
 
 ByteString CFXJSE_Value::ToString() const {
   ASSERT(!IsEmpty());
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(GetIsolate());
-  return CFX_V8::ReentrantToByteStringHelper(
+  return fxv8::ReentrantToByteStringHelper(
       GetIsolate(), v8::Local<v8::Value>::New(GetIsolate(), m_hValue));
 }
 
@@ -427,6 +426,6 @@
 
 void CFXJSE_Value::SetString(ByteStringView szString) {
   CFXJSE_ScopeUtil_IsolateHandle scope(GetIsolate());
-  v8::Local<v8::Value> hValue = CFX_V8::NewStringHelper(GetIsolate(), szString);
+  v8::Local<v8::Value> hValue = fxv8::NewStringHelper(GetIsolate(), szString);
   m_hValue.Reset(GetIsolate(), hValue);
 }
