From e85107bc8ab5bbd5b2d3f97fd6071d7ce4a78bcc Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Tue, 24 Oct 2017 15:29:22 -0400 Subject: 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 Reviewed-by: Tom Sepez --- fpdfsdk/javascript/Field.cpp | 2 +- fpdfsdk/javascript/JS_Value.cpp | 22 ---------------------- fpdfsdk/javascript/JS_Value.h | 4 ---- fpdfsdk/javascript/PublicMethods.cpp | 4 ++-- fpdfsdk/javascript/cjs_runtime.cpp | 25 +++++++++++++++++++++++++ fpdfsdk/javascript/cjs_runtime.h | 4 ++++ 6 files changed, 32 insertions(+), 29 deletions(-) (limited to 'fpdfsdk') diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp index 35b808c733..93017c4da9 100644 --- a/fpdfsdk/javascript/Field.cpp +++ b/fpdfsdk/javascript/Field.cpp @@ -2331,7 +2331,7 @@ bool Field::get_value(CJS_Runtime* pRuntime, 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 9275de3d52..ddea0a4caa 100644 --- a/fpdfsdk/javascript/JS_Value.cpp +++ b/fpdfsdk/javascript/JS_Value.cpp @@ -194,28 +194,6 @@ v8::Local CJS_Value::ToV8Value() const { 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 maybeNum = - m_pValue->ToNumber(pIsolate->GetCurrentContext()); - if (maybeNum.IsEmpty()) - return; - v8::Local num = maybeNum.ToLocalChecked(); - if (std::isnan(num->Value()) && !bAllowNaN) - return; - m_pValue = num; -} - CJS_Array::CJS_Array() {} CJS_Array::CJS_Array(v8::Local pArray) : m_pArray(pArray) {} diff --git a/fpdfsdk/javascript/JS_Value.h b/fpdfsdk/javascript/JS_Value.h index ff3bf9c51e..d098812361 100644 --- a/fpdfsdk/javascript/JS_Value.h +++ b/fpdfsdk/javascript/JS_Value.h @@ -29,10 +29,6 @@ class CJS_Value { v8::Local 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 m_pValue; }; diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp index 200e7d1046..867a265b80 100644 --- a/fpdfsdk/javascript/PublicMethods.cpp +++ b/fpdfsdk/javascript/PublicMethods.cpp @@ -1658,8 +1658,8 @@ bool CJS_PublicMethods::AFMakeNumber(CJS_Runtime* pRuntime, 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 720a15b4bd..c1ec5feac6 100644 --- a/fpdfsdk/javascript/cjs_runtime.cpp +++ b/fpdfsdk/javascript/cjs_runtime.cpp @@ -254,3 +254,28 @@ bool CJS_Runtime::SetValueByName(const ByteStringView& utf8Name, return true; } #endif + +v8::Local CJS_Runtime::MaybeCoerceToNumber( + const v8::Local& 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 maybeNum = + value->ToNumber(pIsolate->GetCurrentContext()); + if (maybeNum.IsEmpty()) + return value; + + v8::Local 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 0d6951f8c0..90ec23ee7a 100644 --- a/fpdfsdk/javascript/cjs_runtime.h +++ b/fpdfsdk/javascript/cjs_runtime.h @@ -48,6 +48,10 @@ class CJS_Runtime : public IJS_Runtime, 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 MaybeCoerceToNumber(const v8::Local& value); + #ifdef PDF_ENABLE_XFA bool GetValueByName(const ByteStringView& utf8Name, CFXJSE_Value* pValue) override; -- cgit v1.2.3