Split creation of ordinary object and bound objects in FXJS.

One can be performed by the CJS_V8 layer, the other requires the
full FXJS mechanism. Avoids using -1 as a special case.

Change-Id: I4a14ccb6a7fea393f84b70a07ada03b1a83c7d36
Reviewed-on: https://pdfium-review.googlesource.com/25830
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp
index 1df0146..5bd41e8 100644
--- a/fxjs/cjs_app.cpp
+++ b/fxjs/cjs_app.cpp
@@ -317,7 +317,7 @@
   m_Timers.insert(std::unique_ptr<GlobalTimer>(timerRef));
 
   v8::Local<v8::Object> pRetObj =
-      pRuntime->NewFxDynamicObj(CJS_TimerObj::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_TimerObj::GetObjDefnID());
   if (pRetObj.IsEmpty())
     return CJS_Return(false);
 
@@ -344,7 +344,7 @@
   m_Timers.insert(std::unique_ptr<GlobalTimer>(timerRef));
 
   v8::Local<v8::Object> pRetObj =
-      pRuntime->NewFxDynamicObj(CJS_TimerObj::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_TimerObj::GetObjDefnID());
   if (pRetObj.IsEmpty())
     return CJS_Return(false);
 
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index c4a5ff4..83711e1 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -254,7 +254,7 @@
     return CJS_Return(pRuntime->NewUndefined());
 
   v8::Local<v8::Object> pFieldObj =
-      pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Field::GetObjDefnID());
   if (pFieldObj.IsEmpty())
     return CJS_Return(false);
 
@@ -672,7 +672,7 @@
   WideString cwModDate = pDictionary->GetUnicodeTextFor("ModDate");
   WideString cwTrapped = pDictionary->GetUnicodeTextFor("Trapped");
 
-  v8::Local<v8::Object> pObj = pRuntime->NewFxDynamicObj(-1);
+  v8::Local<v8::Object> pObj = pRuntime->NewObject();
   pRuntime->PutObjectProperty(pObj, L"Author",
                               pRuntime->NewString(cwAuthor.AsStringView()));
   pRuntime->PutObjectProperty(pObj, L"Title",
@@ -1031,7 +1031,7 @@
     return CJS_Return(false);
 
   v8::Local<v8::Object> pObj =
-      pRuntime->NewFxDynamicObj(CJS_Annot::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Annot::GetObjDefnID());
   if (pObj.IsEmpty())
     return CJS_Return(false);
 
@@ -1066,7 +1066,7 @@
         return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
       v8::Local<v8::Object> pObj =
-          pRuntime->NewFxDynamicObj(CJS_Annot::GetObjDefnID());
+          pRuntime->NewFXJSBoundObject(CJS_Annot::GetObjDefnID());
       if (pObj.IsEmpty())
         return CJS_Return(false);
 
@@ -1143,7 +1143,7 @@
   int i = 0;
   for (const auto& name : m_IconNames) {
     v8::Local<v8::Object> pObj =
-        pRuntime->NewFxDynamicObj(CJS_Icon::GetObjDefnID());
+        pRuntime->NewFXJSBoundObject(CJS_Icon::GetObjDefnID());
     if (pObj.IsEmpty())
       return CJS_Return(false);
 
@@ -1175,7 +1175,7 @@
     return CJS_Return(false);
 
   v8::Local<v8::Object> pObj =
-      pRuntime->NewFxDynamicObj(CJS_Icon::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Icon::GetObjDefnID());
   if (pObj.IsEmpty())
     return CJS_Return(false);
 
@@ -1325,7 +1325,7 @@
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   v8::Local<v8::Object> pRetObj =
-      pRuntime->NewFxDynamicObj(CJS_PrintParamsObj::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_PrintParamsObj::GetObjDefnID());
   if (pRetObj.IsEmpty())
     return CJS_Return(false);
 
diff --git a/fxjs/cjs_eventhandler.cpp b/fxjs/cjs_eventhandler.cpp
index 6e7e840..b09ca7e 100644
--- a/fxjs/cjs_eventhandler.cpp
+++ b/fxjs/cjs_eventhandler.cpp
@@ -590,12 +590,12 @@
 CJS_Field* CJS_EventHandler::Source() {
   CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime();
   v8::Local<v8::Object> pDocObj =
-      pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Document::GetObjDefnID());
   if (pDocObj.IsEmpty())
     return nullptr;
 
   v8::Local<v8::Object> pFieldObj =
-      pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Field::GetObjDefnID());
   if (pFieldObj.IsEmpty())
     return nullptr;
 
@@ -615,12 +615,12 @@
 CJS_Field* CJS_EventHandler::Target_Field() {
   CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime();
   v8::Local<v8::Object> pDocObj =
-      pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Document::GetObjDefnID());
   if (pDocObj.IsEmpty())
     return nullptr;
 
   v8::Local<v8::Object> pFieldObj =
-      pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Field::GetObjDefnID());
   if (pFieldObj.IsEmpty())
     return nullptr;
 
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 9138d93..7b4c064 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -2284,7 +2284,7 @@
     return CJS_Return(false);
 
   v8::Local<v8::Object> pObj =
-      pRuntime->NewFxDynamicObj(CJS_Icon::GetObjDefnID());
+      pRuntime->NewFXJSBoundObject(CJS_Icon::GetObjDefnID());
   if (pObj.IsEmpty())
     return CJS_Return(false);
 
@@ -2404,7 +2404,7 @@
   int j = 0;
   for (const auto& pStr : swSort) {
     v8::Local<v8::Object> pObj =
-        pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID());
+        pRuntime->NewFXJSBoundObject(CJS_Field::GetObjDefnID());
     if (pObj.IsEmpty())
       return CJS_Return(false);
 
diff --git a/fxjs/cjs_global.cpp b/fxjs/cjs_global.cpp
index fbc6bf9..729190f 100644
--- a/fxjs/cjs_global.cpp
+++ b/fxjs/cjs_global.cpp
@@ -333,7 +333,7 @@
             pRuntime->NewString(pData->data.sData.UTF8Decode().AsStringView()));
         break;
       case JS_GlobalDataType::OBJECT: {
-        v8::Local<v8::Object> pObj = pRuntime->NewFxDynamicObj(-1);
+        v8::Local<v8::Object> pObj = pRuntime->NewObject();
         if (!pObj.IsEmpty()) {
           PutObjectProperty(pObj, &pData->data);
           SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0,
@@ -461,7 +461,7 @@
             pRuntime->NewString(pObjData->sData.UTF8Decode().AsStringView()));
         break;
       case JS_GlobalDataType::OBJECT: {
-        v8::Local<v8::Object> pNewObj = pRuntime->NewFxDynamicObj(-1);
+        v8::Local<v8::Object> pNewObj = pRuntime->NewObject();
         if (!pNewObj.IsEmpty()) {
           PutObjectProperty(pNewObj, pObjData);
           pRuntime->PutObjectProperty(pObj, pObjData->sKey.UTF8Decode(),
diff --git a/fxjs/cjs_v8.cpp b/fxjs/cjs_v8.cpp
index 7855813..0a16740 100644
--- a/fxjs/cjs_v8.cpp
+++ b/fxjs/cjs_v8.cpp
@@ -60,6 +60,10 @@
   return v8::Array::New(m_isolate);
 }
 
+v8::Local<v8::Object> CJS_V8::NewObject() {
+  return v8::Object::New(m_isolate);
+}
+
 unsigned CJS_V8::PutArrayElement(v8::Local<v8::Array> pArray,
                                  unsigned index,
                                  v8::Local<v8::Value> pValue) {
diff --git a/fxjs/cjs_v8.h b/fxjs/cjs_v8.h
index 1359309..b8a1e13 100644
--- a/fxjs/cjs_v8.h
+++ b/fxjs/cjs_v8.h
@@ -30,6 +30,7 @@
   v8::Local<v8::Value> NewNull();
   v8::Local<v8::Value> NewUndefined();
   v8::Local<v8::Array> NewArray();
+  v8::Local<v8::Object> NewObject();
   v8::Local<v8::Number> NewNumber(int number);
   v8::Local<v8::Number> NewNumber(double number);
   v8::Local<v8::Number> NewNumber(float number);
diff --git a/fxjs/fxjs_v8.cpp b/fxjs/fxjs_v8.cpp
index 773f902..8a04a068 100644
--- a/fxjs/fxjs_v8.cpp
+++ b/fxjs/fxjs_v8.cpp
@@ -414,7 +414,7 @@
       }
     } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) {
       v8::Local<v8::String> pObjName = NewString(pObjDef->m_ObjName);
-      v8::Local<v8::Object> obj = NewFxDynamicObj(i, true);
+      v8::Local<v8::Object> obj = NewFXJSBoundObject(i, true);
       if (!obj.IsEmpty()) {
         v8Context->Global()->Set(v8Context, pObjName, obj).FromJust();
         m_StaticObjects[i] = v8::Global<v8::Object>(GetIsolate(), obj);
@@ -484,19 +484,10 @@
   return 0;
 }
 
-v8::Local<v8::Object> CFXJS_Engine::NewFxDynamicObj(int nObjDefnID,
-                                                    bool bStatic) {
+v8::Local<v8::Object> CFXJS_Engine::NewFXJSBoundObject(int nObjDefnID,
+                                                       bool bStatic) {
   v8::Isolate::Scope isolate_scope(GetIsolate());
   v8::Local<v8::Context> context = GetIsolate()->GetCurrentContext();
-  if (nObjDefnID == -1) {
-    v8::Local<v8::ObjectTemplate> objTempl =
-        v8::ObjectTemplate::New(GetIsolate());
-    v8::Local<v8::Object> obj;
-    if (!objTempl->NewInstance(context).ToLocal(&obj))
-      return v8::Local<v8::Object>();
-    return obj;
-  }
-
   FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(GetIsolate());
   if (!pData)
     return v8::Local<v8::Object>();
diff --git a/fxjs/fxjs_v8.h b/fxjs/fxjs_v8.h
index 3e8e861..0592847 100644
--- a/fxjs/fxjs_v8.h
+++ b/fxjs/fxjs_v8.h
@@ -176,7 +176,8 @@
   int Execute(const WideString& script, FXJSErr* perror);
 
   v8::Local<v8::Object> GetThisObj();
-  v8::Local<v8::Object> NewFxDynamicObj(int nObjDefnID, bool bStatic = false);
+  v8::Local<v8::Object> NewFXJSBoundObject(int nObjDefnID,
+                                           bool bStatic = false);
 
   // Native object binding.
   void SetObjectPrivate(v8::Local<v8::Object> pObj,
diff --git a/fxjs/fxjs_v8_embeddertest.cpp b/fxjs/fxjs_v8_embeddertest.cpp
index 9e90663..acc4366 100644
--- a/fxjs/fxjs_v8_embeddertest.cpp
+++ b/fxjs/fxjs_v8_embeddertest.cpp
@@ -226,7 +226,7 @@
   v8::HandleScope handle_scope(isolate());
   v8::Context::Scope context_scope(GetV8Context());
 
-  auto object = engine()->NewFxDynamicObj(-1);
+  auto object = engine()->NewObject();
   ASSERT_FALSE(object.IsEmpty());
   EXPECT_EQ(0u, engine()->GetObjectPropertyNames(object).size());
   EXPECT_FALSE(engine()->GetObjectProperty(object, L"clams").IsEmpty());