Fix CJS_PublicMethods::IsNumber() with unit test and some cleanup

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1797423002 .
diff --git a/BUILD.gn b/BUILD.gn
index a089708..a4ea471 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1488,6 +1488,15 @@
       "xfa/fxfa/parser/xfa_utils_imp_unittest.cpp",
     ]
   }
+  if (pdf_enable_v8) {
+    sources += [
+      "fpdfsdk/javascript/public_methods_unittest.cpp",
+    ]
+    include_dirs += [
+      "//v8",
+      "//v8/include",
+    ]
+  }
   configs += [ ":pdfium_config" ]
 }
 
diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h
index dda6a5c..0deb426 100644
--- a/core/include/fxcrt/fx_ext.h
+++ b/core/include/fxcrt/fx_ext.h
@@ -30,10 +30,10 @@
 int32_t FXSYS_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count);
 int32_t FXSYS_strnicmp(const FX_CHAR* s1, const FX_CHAR* s2, size_t count);
 
-inline FX_BOOL FXSYS_islower(int32_t ch) {
+inline bool FXSYS_islower(int32_t ch) {
   return ch >= 'a' && ch <= 'z';
 }
-inline FX_BOOL FXSYS_isupper(int32_t ch) {
+inline bool FXSYS_isupper(int32_t ch) {
   return ch >= 'A' && ch <= 'Z';
 }
 inline int32_t FXSYS_tolower(int32_t ch) {
@@ -42,13 +42,13 @@
 inline int32_t FXSYS_toupper(int32_t ch) {
   return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);
 }
-inline FX_BOOL FXSYS_iswalpha(wchar_t wch) {
+inline bool FXSYS_iswalpha(wchar_t wch) {
   return (wch >= L'A' && wch <= L'Z') || (wch >= L'a' && wch <= L'z');
 }
-inline FX_BOOL FXSYS_iswdigit(wchar_t wch) {
+inline bool FXSYS_iswdigit(wchar_t wch) {
   return wch >= L'0' && wch <= L'9';
 }
-inline FX_BOOL FXSYS_iswalnum(wchar_t wch) {
+inline bool FXSYS_iswalnum(wchar_t wch) {
   return FXSYS_iswalpha(wch) || FXSYS_iswdigit(wch);
 }
 
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index d154fc1..6097369 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -62,44 +62,44 @@
     L"May",       L"June",     L"July",     L"August",
     L"September", L"October",  L"November", L"December"};
 
-FX_BOOL CJS_PublicMethods::IsNumber(const FX_WCHAR* str) {
+bool CJS_PublicMethods::IsNumber(const FX_WCHAR* str) {
   CFX_WideString sTrim = StrTrim(str);
   const FX_WCHAR* pTrim = sTrim.c_str();
   const FX_WCHAR* p = pTrim;
 
-  FX_BOOL bDot = FALSE;
-  FX_BOOL bKXJS = FALSE;
+  bool bDot = false;
+  bool bKXJS = false;
 
   wchar_t c;
-  while ((c = *p)) {
-    if (c == '.' || c == ',') {
+  while ((c = *p) != L'\0') {
+    if (c == L'.' || c == L',') {
       if (bDot)
-        return FALSE;
-      bDot = TRUE;
-    } else if (c == '-' || c == '+') {
+        return false;
+      bDot = true;
+    } else if (c == L'-' || c == L'+') {
       if (p != pTrim)
-        return FALSE;
-    } else if (c == 'e' || c == 'E') {
+        return false;
+    } else if (c == L'e' || c == L'E') {
       if (bKXJS)
-        return FALSE;
+        return false;
 
       p++;
       c = *p;
-      if (c == '+' || c == '-') {
-        bKXJS = TRUE;
+      if (c == L'+' || c == L'-') {
+        bKXJS = true;
       } else {
-        return FALSE;
+        return false;
       }
     } else if (!FXSYS_iswdigit(c)) {
-      return FALSE;
+      return false;
     }
     p++;
   }
 
-  return TRUE;
+  return true;
 }
 
-FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change, wchar_t c_Mask) {
+bool CJS_PublicMethods::maskSatisfied(wchar_t c_Change, wchar_t c_Mask) {
   switch (c_Mask) {
     case L'9':
       return FXSYS_iswdigit(c_Change);
@@ -108,13 +108,13 @@
     case L'O':
       return FXSYS_iswalnum(c_Change);
     case L'X':
-      return TRUE;
+      return true;
     default:
       return (c_Change == c_Mask);
   }
 }
 
-FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch) {
+bool CJS_PublicMethods::isReservedMaskChar(wchar_t ch) {
   return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
 }
 
diff --git a/fpdfsdk/javascript/PublicMethods.h b/fpdfsdk/javascript/PublicMethods.h
index 8961c5a..16cc5bc 100644
--- a/fpdfsdk/javascript/PublicMethods.h
+++ b/fpdfsdk/javascript/PublicMethods.h
@@ -18,7 +18,6 @@
       : CJS_Object(pObject) {}
   ~CJS_PublicMethods() override {}
 
- public:
   static FX_BOOL AFNumber_Format(IJS_Context* cc,
                                  const std::vector<CJS_Value>& params,
                                  CJS_Value& vRet,
@@ -108,7 +107,6 @@
                                CJS_Value& vRet,
                                CFX_WideString& sError);
 
- public:
   JS_STATIC_GLOBAL_FUN(AFNumber_Format);
   JS_STATIC_GLOBAL_FUN(AFNumber_Keystroke);
   JS_STATIC_GLOBAL_FUN(AFPercent_Format);
@@ -134,7 +132,6 @@
 
   JS_STATIC_DECLARE_GLOBAL_FUN();
 
- public:
   static int ParseStringInteger(const CFX_WideString& string,
                                 int nStart,
                                 int& nSkip,
@@ -151,7 +148,6 @@
                                 bool* bWrongFormat);
   static double MakeInterDate(CFX_WideString strValue);
 
- public:
   static CFX_WideString StrLTrim(const FX_WCHAR* pStr);
   static CFX_WideString StrRTrim(const FX_WCHAR* pStr);
   static CFX_WideString StrTrim(const FX_WCHAR* pStr);
@@ -160,11 +156,10 @@
   static CFX_ByteString StrRTrim(const FX_CHAR* pStr);
   static CFX_ByteString StrTrim(const FX_CHAR* pStr);
 
-  static FX_BOOL IsNumber(const FX_CHAR* string);
-  static FX_BOOL IsNumber(const FX_WCHAR* string);
+  static bool IsNumber(const FX_WCHAR* string);
 
-  static FX_BOOL maskSatisfied(wchar_t c_Change, wchar_t c_Mask);
-  static FX_BOOL isReservedMaskChar(wchar_t ch);
+  static bool maskSatisfied(wchar_t c_Change, wchar_t c_Mask);
+  static bool isReservedMaskChar(wchar_t ch);
 
   static double AF_Simple(const FX_WCHAR* sFuction,
                           double dValue1,
diff --git a/fpdfsdk/javascript/public_methods_unittest.cpp b/fpdfsdk/javascript/public_methods_unittest.cpp
new file mode 100644
index 0000000..ace0920
--- /dev/null
+++ b/fpdfsdk/javascript/public_methods_unittest.cpp
@@ -0,0 +1,51 @@
+// Copyright 2016 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.
+
+#include "fpdfsdk/javascript/PublicMethods.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/test_support.h"
+
+TEST(CJS_PublicMethods, IsNumber) {
+  // TODO(weili): Check whether results from case 0, 1, 10, 15 are intended.
+  struct {
+    const wchar_t* input;
+    bool expected;
+  } test_data[] = {
+      // Empty string.
+      {L"", true},
+      // Only whitespaces.
+      {L"  ", true},
+      // Content with invalid characters.
+      {L"xyz00", false},
+      {L"1%", false},
+      // Hex string.
+      {L"0x234", false},
+      // Signed numbers.
+      {L"+123", true},
+      {L"-98765", true},
+      // Numbers with whitespaces.
+      {L"  345 ", true},
+      // Float numbers.
+      {L"-1e5", false},
+      {L"-2e", false},
+      {L"e-5", true},
+      {L"0.023", true},
+      {L".356089", true},
+      {L"1e-9", true},
+      {L"-1.23e+23", true},
+      // Numbers with commas.
+      {L"1,000,000", false},
+      {L"560,024", true},
+      // Regular numbers.
+      {L"0", true},
+      {L"0123", true},
+      {L"9876123", true},
+  };
+  for (size_t i = 0; i < FX_ArraySize(test_data); ++i) {
+    EXPECT_EQ(test_data[i].expected,
+              CJS_PublicMethods::IsNumber(test_data[i].input))
+        << "for case " << i;
+  }
+}
diff --git a/pdfium.gyp b/pdfium.gyp
index f440b9e..cdbf184 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -853,6 +853,15 @@
             'xfa/fxfa/parser/xfa_utils_imp_unittest.cpp',
           ],
         }],
+        ['pdf_enable_v8==1', {
+          'include_dirs': [
+            '<(DEPTH)/v8',
+            '<(DEPTH)/v8/include',
+          ],
+          'sources': [
+            'fpdfsdk/javascript/public_methods_unittest.cpp',
+          ],
+        }],
       ],
     },
     {