Move MaybeCoerceToNumber to CJS_Runtime

This CL moves MaybeCoerceToNumber from CJS_Value to CJS_Runtime.

Change-Id: I22bb605045daa63f405ef256e4b8a5c7ffb78425
Reviewed-on: https://pdfium-review.googlesource.com/16617
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 35b808c..93017c4 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -2331,7 +2331,7 @@
       vp->Set(pRuntime->NewString(pFormField->GetValue().c_str()));
       break;
   }
-  vp->MaybeCoerceToNumber(pRuntime);
+  vp->Set(pRuntime->MaybeCoerceToNumber(vp->ToV8Value()));
   return true;
 }
 
diff --git a/fpdfsdk/javascript/JS_Value.cpp b/fpdfsdk/javascript/JS_Value.cpp
index 9275de3..ddea0a4 100644
--- a/fpdfsdk/javascript/JS_Value.cpp
+++ b/fpdfsdk/javascript/JS_Value.cpp
@@ -194,28 +194,6 @@
   return m_pValue;
 }
 
-void CJS_Value::MaybeCoerceToNumber(CJS_Runtime* pRuntime) {
-  bool bAllowNaN = false;
-  if (ToV8Value()->IsString()) {
-    ByteString bstr =
-        ByteString::FromUnicode(pRuntime->ToWideString(ToV8Value()));
-    if (bstr.GetLength() == 0)
-      return;
-    if (bstr == "NaN")
-      bAllowNaN = true;
-  }
-  v8::Isolate* pIsolate = pRuntime->GetIsolate();
-  v8::TryCatch try_catch(pIsolate);
-  v8::MaybeLocal<v8::Number> maybeNum =
-      m_pValue->ToNumber(pIsolate->GetCurrentContext());
-  if (maybeNum.IsEmpty())
-    return;
-  v8::Local<v8::Number> num = maybeNum.ToLocalChecked();
-  if (std::isnan(num->Value()) && !bAllowNaN)
-    return;
-  m_pValue = num;
-}
-
 CJS_Array::CJS_Array() {}
 
 CJS_Array::CJS_Array(v8::Local<v8::Array> pArray) : m_pArray(pArray) {}
diff --git a/fpdfsdk/javascript/JS_Value.h b/fpdfsdk/javascript/JS_Value.h
index ff3bf9c..d098812 100644
--- a/fpdfsdk/javascript/JS_Value.h
+++ b/fpdfsdk/javascript/JS_Value.h
@@ -29,10 +29,6 @@
 
   v8::Local<v8::Value> ToV8Value() const;
 
-  // Replace the current |m_pValue| with a v8::Number if possible
-  // to make one from the current |m_pValue|.
-  void MaybeCoerceToNumber(CJS_Runtime* pRuntime);
-
  private:
   v8::Local<v8::Value> m_pValue;
 };
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index 200e7d1..867a265 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -1658,8 +1658,8 @@
 
   WideString ws = pRuntime->ToWideString(params[0].ToV8Value());
   ws.Replace(L",", L".");
-  vRet = CJS_Value(pRuntime->NewString(ws.c_str()));
-  vRet.MaybeCoerceToNumber(pRuntime);
+  vRet =
+      CJS_Value(pRuntime->MaybeCoerceToNumber(pRuntime->NewString(ws.c_str())));
   if (!vRet.ToV8Value()->IsNumber())
     vRet = CJS_Value(pRuntime->NewNumber(0));
   return true;
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index 720a15b..c1ec5fe 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -254,3 +254,28 @@
   return true;
 }
 #endif
+
+v8::Local<v8::Value> CJS_Runtime::MaybeCoerceToNumber(
+    const v8::Local<v8::Value>& value) {
+  bool bAllowNaN = false;
+  if (value->IsString()) {
+    ByteString bstr = ByteString::FromUnicode(ToWideString(value));
+    if (bstr.GetLength() == 0)
+      return value;
+    if (bstr == "NaN")
+      bAllowNaN = true;
+  }
+
+  v8::Isolate* pIsolate = GetIsolate();
+  v8::TryCatch try_catch(pIsolate);
+  v8::MaybeLocal<v8::Number> maybeNum =
+      value->ToNumber(pIsolate->GetCurrentContext());
+  if (maybeNum.IsEmpty())
+    return value;
+
+  v8::Local<v8::Number> num = maybeNum.ToLocalChecked();
+  if (std::isnan(num->Value()) && !bAllowNaN)
+    return value;
+
+  return num;
+}
diff --git a/fpdfsdk/javascript/cjs_runtime.h b/fpdfsdk/javascript/cjs_runtime.h
index 0d6951f..90ec23e 100644
--- a/fpdfsdk/javascript/cjs_runtime.h
+++ b/fpdfsdk/javascript/cjs_runtime.h
@@ -48,6 +48,10 @@
   void EndBlock() { m_bBlocking = false; }
   bool IsBlocking() const { return m_bBlocking; }
 
+  // Attempt to convert the |value| into a number. If successful the number
+  // value will be returned, otherwise |value| is returned.
+  v8::Local<v8::Value> MaybeCoerceToNumber(const v8::Local<v8::Value>& value);
+
 #ifdef PDF_ENABLE_XFA
   bool GetValueByName(const ByteStringView& utf8Name,
                       CFXJSE_Value* pValue) override;