M68: Check GetObjDefnID() in various JS functions.

Consolidate all the checks into JSGetObject(), and add GetObjDefnID()
methods for classes that are missing it.

BUG=chromium:862059

Change-Id: I2c2b725a01dcd259ef712d2513fcf740cc410b15
Reviewed-on: https://pdfium-review.googlesource.com/37510
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
(cherry picked from commit ad1f7b410cd6885bd22d9ee49d9f80d3017f131f)
Reviewed-on: https://pdfium-review.googlesource.com/38030
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/JS_Define.h b/fxjs/JS_Define.h
index d9ab139..3e9c873 100644
--- a/fxjs/JS_Define.h
+++ b/fxjs/JS_Define.h
@@ -58,6 +58,18 @@
 // CJS_Object has vitual dtor, template not required.
 void JSDestructor(v8::Local<v8::Object> obj);
 
+template <class C>
+C* JSGetObject(CJS_Runtime* pRuntime, v8::Local<v8::Object> obj) {
+  if (CFXJS_Engine::GetObjDefnID(obj) != C::GetObjDefnID())
+    return nullptr;
+
+  CJS_Object* pJSObj = pRuntime->GetObjectPrivate(obj);
+  if (!pJSObj)
+    return nullptr;
+
+  return static_cast<C*>(pJSObj);
+}
+
 template <class C, CJS_Return (C::*M)(CJS_Runtime*)>
 void JSPropGetter(const char* prop_name_string,
                   const char* class_name_string,
@@ -68,11 +80,10 @@
   if (!pRuntime)
     return;
 
-  CJS_Object* pJSObj = pRuntime->GetObjectPrivate(info.Holder());
-  if (!pJSObj)
+  C* pObj = JSGetObject<C>(pRuntime, info.Holder());
+  if (!pObj)
     return;
 
-  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, prop_name_string,
@@ -95,11 +106,10 @@
   if (!pRuntime)
     return;
 
-  CJS_Object* pJSObj = pRuntime->GetObjectPrivate(info.Holder());
-  if (!pJSObj)
+  C* pObj = JSGetObject<C>(pRuntime, info.Holder());
+  if (!pObj)
     return;
 
-  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime, value);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, prop_name_string,
@@ -118,15 +128,14 @@
   if (!pRuntime)
     return;
 
-  CJS_Object* pJSObj = pRuntime->GetObjectPrivate(info.Holder());
-  if (!pJSObj)
+  C* pObj = JSGetObject<C>(pRuntime, info.Holder());
+  if (!pObj)
     return;
 
   std::vector<v8::Local<v8::Value>> parameters;
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++)
     parameters.push_back(info[i]);
 
-  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime, parameters);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, method_name_string,
diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp
index 6c04c03..a791e77 100644
--- a/fxjs/cjs_app.cpp
+++ b/fxjs/cjs_app.cpp
@@ -84,6 +84,11 @@
 const char CJS_App::kName[] = "app";
 
 // static
+int CJS_App::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_App::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj(CJS_App::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_App>, JSDestructor);
diff --git a/fxjs/cjs_app.h b/fxjs/cjs_app.h
index e195c6d..96db148 100644
--- a/fxjs/cjs_app.h
+++ b/fxjs/cjs_app.h
@@ -18,6 +18,7 @@
 
 class CJS_App : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_App(v8::Local<v8::Object> pObject);
diff --git a/fxjs/cjs_color.cpp b/fxjs/cjs_color.cpp
index a0cb02a..6478b6f 100644
--- a/fxjs/cjs_color.cpp
+++ b/fxjs/cjs_color.cpp
@@ -35,6 +35,11 @@
 const char CJS_Color::kName[] = "color";
 
 // static
+int CJS_Color::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Color::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj(CJS_Color::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Color>, JSDestructor);
diff --git a/fxjs/cjs_color.h b/fxjs/cjs_color.h
index 667a13c..c1557ce 100644
--- a/fxjs/cjs_color.h
+++ b/fxjs/cjs_color.h
@@ -14,6 +14,7 @@
 
 class CJS_Color : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
   static v8::Local<v8::Array> ConvertPWLColorToArray(CJS_Runtime* pRuntime,
                                                      const CFX_Color& color);
diff --git a/fxjs/cjs_console.cpp b/fxjs/cjs_console.cpp
index 2b7c84a..5e16081 100644
--- a/fxjs/cjs_console.cpp
+++ b/fxjs/cjs_console.cpp
@@ -22,6 +22,11 @@
 const char CJS_Console::kName[] = "console";
 
 // static
+int CJS_Console::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Console::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj(CJS_Console::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Console>, JSDestructor);
diff --git a/fxjs/cjs_console.h b/fxjs/cjs_console.h
index 56243cf..09de94b 100644
--- a/fxjs/cjs_console.h
+++ b/fxjs/cjs_console.h
@@ -13,6 +13,7 @@
 
 class CJS_Console : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_Console(v8::Local<v8::Object> pObject);
diff --git a/fxjs/cjs_event.cpp b/fxjs/cjs_event.cpp
index 341bcc4..4263689 100644
--- a/fxjs/cjs_event.cpp
+++ b/fxjs/cjs_event.cpp
@@ -38,6 +38,11 @@
 const char CJS_Event::kName[] = "event";
 
 // static
+int CJS_Event::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Event::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj(CJS_Event::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Event>, JSDestructor);
diff --git a/fxjs/cjs_event.h b/fxjs/cjs_event.h
index 291b6eb..cb6b3fd 100644
--- a/fxjs/cjs_event.h
+++ b/fxjs/cjs_event.h
@@ -11,6 +11,7 @@
 
 class CJS_Event : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_Event(v8::Local<v8::Object> pObject);
diff --git a/fxjs/cjs_global.cpp b/fxjs/cjs_global.cpp
index 282b262..bf0f5ef 100644
--- a/fxjs/cjs_global.cpp
+++ b/fxjs/cjs_global.cpp
@@ -198,6 +198,11 @@
 }
 
 // static
+int CJS_Global::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Global::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj("global", FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Global>, JSDestructor);
diff --git a/fxjs/cjs_global.h b/fxjs/cjs_global.h
index 15ef603..7768405 100644
--- a/fxjs/cjs_global.h
+++ b/fxjs/cjs_global.h
@@ -18,6 +18,7 @@
 
 class CJS_Global : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
   static void DefineAllProperties(CFXJS_Engine* pEngine);
 
diff --git a/fxjs/cjs_report.cpp b/fxjs/cjs_report.cpp
index 2f5490c..137ad4f 100644
--- a/fxjs/cjs_report.cpp
+++ b/fxjs/cjs_report.cpp
@@ -19,6 +19,11 @@
 const char CJS_Report::kName[] = "Report";
 
 // static
+int CJS_Report::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Report::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   ObjDefnID = pEngine->DefineObj(CJS_Report::kName, eObjType,
                                  JSConstructor<CJS_Report>, JSDestructor);
diff --git a/fxjs/cjs_report.h b/fxjs/cjs_report.h
index 2a59206..9c7d665 100644
--- a/fxjs/cjs_report.h
+++ b/fxjs/cjs_report.h
@@ -13,6 +13,7 @@
 
 class CJS_Report : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 
   explicit CJS_Report(v8::Local<v8::Object> pObject);
diff --git a/fxjs/cjs_util.cpp b/fxjs/cjs_util.cpp
index 883d022..0184d44 100644
--- a/fxjs/cjs_util.cpp
+++ b/fxjs/cjs_util.cpp
@@ -68,6 +68,11 @@
 const char CJS_Util::kName[] = "util";
 
 // static
+int CJS_Util::GetObjDefnID() {
+  return ObjDefnID;
+}
+
+// static
 void CJS_Util::DefineJSObjects(CFXJS_Engine* pEngine) {
   ObjDefnID = pEngine->DefineObj(CJS_Util::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Util>, JSDestructor);
diff --git a/fxjs/cjs_util.h b/fxjs/cjs_util.h
index 0ad0fa1..4055711 100644
--- a/fxjs/cjs_util.h
+++ b/fxjs/cjs_util.h
@@ -19,6 +19,7 @@
 
 class CJS_Util : public CJS_Object {
  public:
+  static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_Util(v8::Local<v8::Object> pObject);