Merge to XFA: CFX_MapByteStringToPtr considered harmful (combo patch).

New manual edits: two unused members deleted, one adapted.
    fde_csscache.cpp
    fde_csscache.h
    fpdfxfa_doc.h
    fx_ge_fontmap.cpp

(cherry picked from commit 1d9dbd53b205b2b4d9e75a7eeb95e80837917ea3)
(cherry picked from commit cb4d0ea68308e3c51a6ba9551b393bb2f639afc4)
(cherry picked from commit 9cf44c2ed09a8b2ff243eb6dbb72a8cceae1b5ff)
(cherry picked from commit 2a2a6aa7f51352fc481e78f6ad9d41f2738bcc48)
(cherry picked from commit ce4ffb8183af3fa2bb5133f0f7370a88e064c516)
Original Review URL: https://codereview.chromium.org/1297723002 .

R=thestig@chromium.org

Review URL: https://codereview.chromium.org/1301793002 .
diff --git a/fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h b/fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h
index 27e7a91..1ddb990 100644
--- a/fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h
+++ b/fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h
@@ -40,7 +40,6 @@
 

   void FXRect2PDFRect(const CFX_RectF& fxRectF, CPDF_Rect& pdfRect);

 

- public:

   virtual void SetChangeMark(IXFA_Doc* hDoc);

   virtual FX_BOOL GetChangeMark(IXFA_Doc* hDoc);

   // used in dynamic xfa, dwFlags refer to XFA_INVALIDATE_XXX macros.

@@ -220,16 +219,9 @@
   IXFA_Doc* m_pXFADoc;

   IXFA_DocView* m_pXFADocView;

   CFX_ArrayTemplate<CPDFXFA_Page*> m_XFAPageList;

-

   CPDFSDK_Document* m_pSDKDoc;

   CPDFXFA_App* m_pApp;

-

-  CFX_MapByteStringToPtr m_XfaGlobalProperty;

-

-  CFX_MapByteStringToPtr m_ValueMap;

-

   IFXJS_Context* m_pJSContext;

-

   int m_iDocType;

 };

 

diff --git a/fpdfsdk/include/fsdk_annothandler.h b/fpdfsdk/include/fsdk_annothandler.h
index 266c458..c15681d 100644
--- a/fpdfsdk/include/fsdk_annothandler.h
+++ b/fpdfsdk/include/fsdk_annothandler.h
@@ -7,6 +7,8 @@
 #ifndef FPDFSDK_INCLUDE_FSDK_ANNOTHANDLER_H_
 #define FPDFSDK_INCLUDE_FSDK_ANNOTHANDLER_H_
 
+#include <map>
+
 #include "../../core/include/fxcrt/fx_basic.h"
 
 #define FSDK_XFAWIDGET_TYPENAME "XFAWidget"
@@ -427,7 +429,7 @@
 
  private:
   CBA_AnnotHandlerArray m_Handlers;
-  CFX_MapByteStringToPtr m_mapType2Handler;
+  std::map<CFX_ByteString, IPDFSDK_AnnotHandler*> m_mapType2Handler;
   CPDFDoc_Environment* m_pApp;
 };
 
diff --git a/fpdfsdk/include/javascript/global.h b/fpdfsdk/include/javascript/global.h
index e881625..7f78bb6 100644
--- a/fpdfsdk/include/javascript/global.h
+++ b/fpdfsdk/include/javascript/global.h
@@ -7,6 +7,8 @@
 #ifndef FPDFSDK_INCLUDE_JAVASCRIPT_GLOBAL_H_
 #define FPDFSDK_INCLUDE_JAVASCRIPT_GLOBAL_H_
 
+#include <map>
+
 #include "JS_Define.h"
 
 class CJS_GlobalData;
@@ -69,7 +71,7 @@
   void PutObjectProperty(v8::Local<v8::Object> obj, CJS_KeyValue* pData);
 
  private:
-  CFX_MapByteStringToPtr m_mapGlobal;
+  std::map<CFX_ByteString, JSGlobalData*> m_mapGlobal;
   CFX_WideString m_sFilePath;
   CJS_GlobalData* m_pGlobalData;
   CPDFDoc_Environment* m_pApp;
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp
index 55d4629..287a26b 100644
--- a/fpdfsdk/src/fsdk_annothandler.cpp
+++ b/fpdfsdk/src/fsdk_annothandler.cpp
@@ -29,25 +29,20 @@
     delete pHandler;
   }
   m_Handlers.RemoveAll();
-  m_mapType2Handler.RemoveAll();
+  m_mapType2Handler.clear();
 }
 
 void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(
     IPDFSDK_AnnotHandler* pAnnotHandler) {
-  ASSERT(pAnnotHandler != NULL);
-
-  ASSERT(GetAnnotHandler(pAnnotHandler->GetType()) == NULL);
+  ASSERT(!GetAnnotHandler(pAnnotHandler->GetType()));
 
   m_Handlers.Add(pAnnotHandler);
-  m_mapType2Handler.SetAt(pAnnotHandler->GetType(), (void*)pAnnotHandler);
+  m_mapType2Handler[pAnnotHandler->GetType()] = pAnnotHandler;
 }
 
 void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(
     IPDFSDK_AnnotHandler* pAnnotHandler) {
-  ASSERT(pAnnotHandler != NULL);
-
-  m_mapType2Handler.RemoveKey(pAnnotHandler->GetType());
-
+  m_mapType2Handler.erase(pAnnotHandler->GetType());
   for (int i = 0, sz = m_Handlers.GetSize(); i < sz; i++) {
     if (m_Handlers.GetAt(i) == pAnnotHandler) {
       m_Handlers.RemoveAt(i);
@@ -131,9 +126,8 @@
 
 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
     const CFX_ByteString& sType) const {
-  void* pRet = NULL;
-  m_mapType2Handler.Lookup(sType, pRet);
-  return (IPDFSDK_AnnotHandler*)pRet;
+  auto it = m_mapType2Handler.find(sType);
+  return it != m_mapType2Handler.end() ? it->second : nullptr;
 }
 
 void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
index f03c4d1..dea2b58 100644
--- a/fpdfsdk/src/javascript/global.cpp
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -127,15 +127,12 @@
 FX_BOOL JSGlobalAlternate::DelProperty(IFXJS_Context* cc,
                                        const FX_WCHAR* propname,
                                        CFX_WideString& sError) {
-  JSGlobalData* pData = NULL;
-  CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+  auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname));
+  if (it == m_mapGlobal.end())
+    return FALSE;
 
-  if (m_mapGlobal.Lookup(sPropName, (void*&)pData)) {
-    pData->bDeleted = TRUE;
-    return TRUE;
-  }
-
-  return FALSE;
+  it->second->bDeleted = TRUE;
+  return TRUE;
 }
 
 FX_BOOL JSGlobalAlternate::DoProperty(IFXJS_Context* cc,
@@ -181,19 +178,16 @@
         break;
     }
   } else {
-    void* pVoid = nullptr;
-    if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid)) {
+    auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname));
+    if (it == m_mapGlobal.end()) {
       vp.SetNull();
       return TRUE;
     }
-    if (!pVoid) {
+    JSGlobalData* pData = it->second;
+    if (pData->bDeleted) {
       vp.SetNull();
       return TRUE;
     }
-    JSGlobalData* pData = (JSGlobalData*)pVoid;
-    if (pData->bDeleted)
-      return TRUE;
-
     switch (pData->nType) {
       case JS_GLOBALDATA_TYPE_NUMBER:
         vp << pData->dData;
@@ -230,11 +224,10 @@
     return FALSE;
   }
 
-  CFX_ByteString sName = params[0].ToCFXByteString();
-
-  JSGlobalData* pData = NULL;
-  if (m_mapGlobal.Lookup(sName, (void*&)pData)) {
-    if (pData && !pData->bDeleted) {
+  auto it = m_mapGlobal.find(params[0].ToCFXByteString());
+  if (it != m_mapGlobal.end()) {
+    JSGlobalData* pData = it->second;
+    if (!pData->bDeleted) {
       pData->bPersistent = params[1].ToBool();
       return TRUE;
     }
@@ -300,52 +293,42 @@
 }
 
 void JSGlobalAlternate::CommitGlobalPersisitentVariables() {
-  ASSERT(m_pGlobalData != NULL);
-
-  FX_POSITION pos = m_mapGlobal.GetStartPosition();
-  while (pos) {
-    CFX_ByteString name;
-    JSGlobalData* pData = NULL;
-    m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
-
-    if (pData) {
-      if (pData->bDeleted) {
-        m_pGlobalData->DeleteGlobalVariable(name);
-      } else {
-        switch (pData->nType) {
-          case JS_GLOBALDATA_TYPE_NUMBER:
-            m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
+  ASSERT(m_pGlobalData);
+  for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) {
+    CFX_ByteString name = it->first;
+    JSGlobalData* pData = it->second;
+    if (pData->bDeleted) {
+      m_pGlobalData->DeleteGlobalVariable(name);
+    } else {
+      switch (pData->nType) {
+        case JS_GLOBALDATA_TYPE_NUMBER:
+          m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
+          m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+          break;
+        case JS_GLOBALDATA_TYPE_BOOLEAN:
+          m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
+          m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+          break;
+        case JS_GLOBALDATA_TYPE_STRING:
+          m_pGlobalData->SetGlobalVariableString(name, pData->sData);
+          m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+          break;
+        case JS_GLOBALDATA_TYPE_OBJECT:
+          // if (pData->pData)
+          {
+            CJS_GlobalVariableArray array;
+            v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
+                GetJSObject()->GetIsolate(), pData->pData);
+            ObjectToArray(obj, array);
+            m_pGlobalData->SetGlobalVariableObject(name, array);
             m_pGlobalData->SetGlobalVariablePersistent(name,
                                                        pData->bPersistent);
-            break;
-          case JS_GLOBALDATA_TYPE_BOOLEAN:
-            m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
-            m_pGlobalData->SetGlobalVariablePersistent(name,
-                                                       pData->bPersistent);
-            break;
-          case JS_GLOBALDATA_TYPE_STRING:
-            m_pGlobalData->SetGlobalVariableString(name, pData->sData);
-            m_pGlobalData->SetGlobalVariablePersistent(name,
-                                                       pData->bPersistent);
-            break;
-          case JS_GLOBALDATA_TYPE_OBJECT:
-            // if (pData->pData)
-            {
-              CJS_GlobalVariableArray array;
-              v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
-                  GetJSObject()->GetIsolate(), pData->pData);
-              ObjectToArray(obj, array);
-              m_pGlobalData->SetGlobalVariableObject(name, array);
-              m_pGlobalData->SetGlobalVariablePersistent(name,
-                                                         pData->bPersistent);
-            }
-            break;
-          case JS_GLOBALDATA_TYPE_NULL:
-            m_pGlobalData->SetGlobalVariableNull(name);
-            m_pGlobalData->SetGlobalVariablePersistent(name,
-                                                       pData->bPersistent);
-            break;
-        }
+          }
+          break;
+        case JS_GLOBALDATA_TYPE_NULL:
+          m_pGlobalData->SetGlobalVariableNull(name);
+          m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+          break;
       }
     }
   }
@@ -449,15 +432,10 @@
 }
 
 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() {
-  FX_POSITION pos = m_mapGlobal.GetStartPosition();
-  while (pos) {
-    CFX_ByteString name;
-    JSGlobalData* pData = NULL;
-    m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
-    delete pData;
+  for (const auto& pair : m_mapGlobal) {
+    delete pair.second;
   }
-
-  m_mapGlobal.RemoveAll();
+  m_mapGlobal.clear();
 }
 
 FX_BOOL JSGlobalAlternate::SetGlobalVariables(const FX_CHAR* propname,
@@ -467,13 +445,12 @@
                                               const CFX_ByteString& sData,
                                               JSObject pData,
                                               bool bDefaultPersistent) {
-  if (propname == NULL)
+  if (!propname)
     return FALSE;
 
-  JSGlobalData* pTemp = NULL;
-  m_mapGlobal.Lookup(propname, (void*&)pTemp);
-
-  if (pTemp) {
+  auto it = m_mapGlobal.find(propname);
+  if (it != m_mapGlobal.end()) {
+    JSGlobalData* pTemp = it->second;
     if (pTemp->bDeleted || pTemp->nType != nType) {
       pTemp->dData = 0;
       pTemp->bData = 0;
@@ -482,7 +459,6 @@
     }
 
     pTemp->bDeleted = FALSE;
-
     switch (nType) {
       case JS_GLOBALDATA_TYPE_NUMBER: {
         pTemp->dData = dData;
@@ -501,7 +477,6 @@
       default:
         return FALSE;
     }
-
     return TRUE;
   }
 
@@ -541,8 +516,7 @@
       return FALSE;
   }
 
-  m_mapGlobal.SetAt(propname, (void*)pNewData);
-
+  m_mapGlobal[propname] = pNewData;
   return TRUE;
 }