Make cfx_globalarray a move-only type.

Prevents the need for a complicated deep-copy in copy assignment.

Change-Id: I06bfb12768ddcfc05a14e200a91e5c090bcc2be5
Reviewed-on: https://pdfium-review.googlesource.com/c/45110
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cfx_globalarray.cpp b/fxjs/cfx_globalarray.cpp
index 4fbaba1..6d0b6e5 100644
--- a/fxjs/cfx_globalarray.cpp
+++ b/fxjs/cfx_globalarray.cpp
@@ -13,54 +13,11 @@
 
 CFX_GlobalArray::CFX_GlobalArray() = default;
 
+CFX_GlobalArray::CFX_GlobalArray(CFX_GlobalArray&& that) = default;
+
 CFX_GlobalArray::~CFX_GlobalArray() = default;
 
-CFX_GlobalArray& CFX_GlobalArray::operator=(const CFX_GlobalArray& that) {
-  if (this == &that)
-    return *this;
-
-  m_Array.clear();
-  for (size_t i = 0, sz = that.Count(); i < sz; i++) {
-    CFX_KeyValue* pOldObjData = that.GetAt(i);
-    switch (pOldObjData->nType) {
-      case CFX_KeyValue::DataType::NUMBER: {
-        auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>();
-        pNewObjData->sKey = pOldObjData->sKey;
-        pNewObjData->nType = pOldObjData->nType;
-        pNewObjData->dData = pOldObjData->dData;
-        Add(std::move(pNewObjData));
-      } break;
-      case CFX_KeyValue::DataType::BOOLEAN: {
-        auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>();
-        pNewObjData->sKey = pOldObjData->sKey;
-        pNewObjData->nType = pOldObjData->nType;
-        pNewObjData->bData = pOldObjData->bData;
-        Add(std::move(pNewObjData));
-      } break;
-      case CFX_KeyValue::DataType::STRING: {
-        auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>();
-        pNewObjData->sKey = pOldObjData->sKey;
-        pNewObjData->nType = pOldObjData->nType;
-        pNewObjData->sData = pOldObjData->sData;
-        Add(std::move(pNewObjData));
-      } break;
-      case CFX_KeyValue::DataType::OBJECT: {
-        auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>();
-        pNewObjData->sKey = pOldObjData->sKey;
-        pNewObjData->nType = pOldObjData->nType;
-        pNewObjData->objData = pOldObjData->objData;
-        Add(std::move(pNewObjData));
-      } break;
-      case CFX_KeyValue::DataType::NULLOBJ: {
-        auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>();
-        pNewObjData->sKey = pOldObjData->sKey;
-        pNewObjData->nType = pOldObjData->nType;
-        Add(std::move(pNewObjData));
-      } break;
-    }
-  }
-  return *this;
-}
+CFX_GlobalArray& CFX_GlobalArray::operator=(CFX_GlobalArray&& array) = default;
 
 void CFX_GlobalArray::Add(std::unique_ptr<CFX_KeyValue> pKeyValue) {
   m_Array.push_back(std::move(pKeyValue));
diff --git a/fxjs/cfx_globalarray.h b/fxjs/cfx_globalarray.h
index a943860..e7e0bde 100644
--- a/fxjs/cfx_globalarray.h
+++ b/fxjs/cfx_globalarray.h
@@ -15,9 +15,12 @@
 class CFX_GlobalArray {
  public:
   CFX_GlobalArray();
+  CFX_GlobalArray(const CFX_GlobalArray& that) = delete;
+  CFX_GlobalArray(CFX_GlobalArray&& that);
   ~CFX_GlobalArray();
 
-  CFX_GlobalArray& operator=(const CFX_GlobalArray& array);
+  CFX_GlobalArray& operator=(const CFX_GlobalArray& array) = delete;
+  CFX_GlobalArray& operator=(CFX_GlobalArray&& array);
 
   void Add(std::unique_ptr<CFX_KeyValue> pKeyValue);
   size_t Count() const;
diff --git a/fxjs/cfx_globaldata.cpp b/fxjs/cfx_globaldata.cpp
index f199025..c6f9e91 100644
--- a/fxjs/cfx_globaldata.cpp
+++ b/fxjs/cfx_globaldata.cpp
@@ -147,20 +147,20 @@
 }
 
 void CFX_GlobalData::SetGlobalVariableObject(ByteString sPropName,
-                                             const CFX_GlobalArray& array) {
+                                             CFX_GlobalArray array) {
   if (!TrimPropName(&sPropName))
     return;
 
   CFX_GlobalData::Element* pData = GetGlobalVariable(sPropName);
   if (pData) {
     pData->data.nType = CFX_KeyValue::DataType::OBJECT;
-    pData->data.objData = array;
+    pData->data.objData = std::move(array);
     return;
   }
   auto pNewData = pdfium::MakeUnique<CFX_GlobalData::Element>();
   pNewData->data.sKey = std::move(sPropName);
   pNewData->data.nType = CFX_KeyValue::DataType::OBJECT;
-  pNewData->data.objData = array;
+  pNewData->data.objData = std::move(array);
   m_arrayGlobalData.push_back(std::move(pNewData));
 }
 
diff --git a/fxjs/cfx_globaldata.h b/fxjs/cfx_globaldata.h
index dac044c..b567017 100644
--- a/fxjs/cfx_globaldata.h
+++ b/fxjs/cfx_globaldata.h
@@ -44,8 +44,7 @@
   void SetGlobalVariableNumber(ByteString propname, double dData);
   void SetGlobalVariableBoolean(ByteString propname, bool bData);
   void SetGlobalVariableString(ByteString propname, const ByteString& sData);
-  void SetGlobalVariableObject(ByteString propname,
-                               const CFX_GlobalArray& array);
+  void SetGlobalVariableObject(ByteString propname, CFX_GlobalArray array);
   void SetGlobalVariableNull(ByteString propname);
   bool SetGlobalVariablePersistent(ByteString propname, bool bPersistent);
   bool DeleteGlobalVariable(ByteString propname);
diff --git a/fxjs/cjs_global.cpp b/fxjs/cjs_global.cpp
index 5b548cd..fd3a9ac 100644
--- a/fxjs/cjs_global.cpp
+++ b/fxjs/cjs_global.cpp
@@ -400,7 +400,7 @@
         v8::Local<v8::Object> obj =
             v8::Local<v8::Object>::New(GetIsolate(), pData->pData);
         ObjectToArray(pRuntime, obj, &array);
-        m_pGlobalData->SetGlobalVariableObject(name, array);
+        m_pGlobalData->SetGlobalVariableObject(name, std::move(array));
         m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
       } break;
       case CFX_KeyValue::DataType::NULLOBJ: