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;