Merge to XFA: Use std::set to track visited dictionaries in fsdk_actionhandler.

Original Review URL: https://codereview.chromium.org/1610303002 .
(cherry picked from commit f409da4b8a3e6a3885605a47bed4f8798c4703b9)

TBR=ochang@chromium.org

Review URL: https://codereview.chromium.org/1611733002 .
diff --git a/fpdfsdk/include/fsdk_actionhandler.h b/fpdfsdk/include/fsdk_actionhandler.h
index 33f127d..b5672d1 100644
--- a/fpdfsdk/include/fsdk_actionhandler.h
+++ b/fpdfsdk/include/fsdk_actionhandler.h
@@ -8,12 +8,12 @@
 #define FPDFSDK_INCLUDE_FSDK_ACTIONHANDLER_H_
 
 #include <memory>
+#include <set>
 
 #include "core/include/fpdfdoc/fpdf_doc.h"
 #include "core/include/fxcrt/fx_string.h"
 #include "fsdk_baseform.h"
 
-class CFX_PtrList;
 class CPDFSDK_Annot;
 class CPDFSDK_Document;
 class CPDF_Bookmark;
@@ -68,29 +68,29 @@
  private:
   FX_BOOL ExecuteDocumentOpenAction(const CPDF_Action& action,
                                     CPDFSDK_Document* pDocument,
-                                    CFX_PtrList& list);
+                                    std::set<CPDF_Dictionary*>* visited);
   FX_BOOL ExecuteDocumentPageAction(const CPDF_Action& action,
                                     CPDF_AAction::AActionType type,
                                     CPDFSDK_Document* pDocument,
-                                    CFX_PtrList& list);
+                                    std::set<CPDF_Dictionary*>* visited);
   FX_BOOL ExecuteFieldAction(const CPDF_Action& action,
                              CPDF_AAction::AActionType type,
                              CPDFSDK_Document* pDocument,
                              CPDF_FormField* pFormField,
                              PDFSDK_FieldAction& data,
-                             CFX_PtrList& list);
+                             std::set<CPDF_Dictionary*>* visited);
   FX_BOOL ExecuteScreenAction(const CPDF_Action& action,
                               CPDF_AAction::AActionType type,
                               CPDFSDK_Document* pDocument,
                               CPDFSDK_Annot* pScreen,
-                              CFX_PtrList& list);
+                              std::set<CPDF_Dictionary*>* visited);
   FX_BOOL ExecuteBookMark(const CPDF_Action& action,
                           CPDFSDK_Document* pDocument,
                           CPDF_Bookmark* pBookmark,
-                          CFX_PtrList& list);
+                          std::set<CPDF_Dictionary*>* visited);
   FX_BOOL ExecuteLinkAction(const CPDF_Action& action,
                             CPDFSDK_Document* pDocument,
-                            CFX_PtrList& list);
+                            std::set<CPDF_Dictionary*>* visited);
 
   void DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument);
   void RunDocumentPageJavaScript(CPDFSDK_Document* pDocument,
diff --git a/fpdfsdk/src/fsdk_actionhandler.cpp b/fpdfsdk/src/fsdk_actionhandler.cpp
index 9524b2a..a1ab632 100644
--- a/fpdfsdk/src/fsdk_actionhandler.cpp
+++ b/fpdfsdk/src/fsdk_actionhandler.cpp
@@ -8,6 +8,7 @@
 #include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/javascript/IJavaScript.h"
+#include "third_party/base/stl_util.h"
 
 CPDFSDK_ActionHandler::CPDFSDK_ActionHandler()
     : m_pFormActionHandler(new CPDFSDK_FormActionHandler) {
@@ -15,8 +16,8 @@
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action,
                                                 CPDFSDK_Document* pDocument) {
-  CFX_PtrList list;
-  return ExecuteDocumentOpenAction(action, pDocument, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteDocumentOpenAction(action, pDocument, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(
@@ -56,38 +57,38 @@
     const CPDF_Action& action,
     enum CPDF_AAction::AActionType eType,
     CPDFSDK_Document* pDocument) {
-  CFX_PtrList list;
-  return ExecuteDocumentPageAction(action, eType, pDocument, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(
     const CPDF_Action& action,
     enum CPDF_AAction::AActionType eType,
     CPDFSDK_Document* pDocument) {
-  CFX_PtrList list;
-  return ExecuteDocumentPageAction(action, eType, pDocument, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark* pBookMark,
                                                  const CPDF_Action& action,
                                                  CPDF_AAction::AActionType type,
                                                  CPDFSDK_Document* pDocument) {
-  CFX_PtrList list;
-  return ExecuteBookMark(action, pDocument, pBookMark, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteBookMark(action, pDocument, pBookMark, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action,
                                                CPDF_AAction::AActionType type,
                                                CPDFSDK_Document* pDocument,
                                                CPDFSDK_Annot* pScreen) {
-  CFX_PtrList list;
-  return ExecuteScreenAction(action, type, pDocument, pScreen, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteScreenAction(action, type, pDocument, pScreen, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
                                              CPDFSDK_Document* pDocument) {
-  CFX_PtrList list;
-  return ExecuteLinkAction(action, pDocument, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteLinkAction(action, pDocument, &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action,
@@ -95,19 +96,20 @@
                                               CPDFSDK_Document* pDocument,
                                               CPDF_FormField* pFormField,
                                               PDFSDK_FieldAction& data) {
-  CFX_PtrList list;
-  return ExecuteFieldAction(action, type, pDocument, pFormField, data, list);
+  std::set<CPDF_Dictionary*> visited;
+  return ExecuteFieldAction(action, type, pDocument, pFormField, data,
+                            &visited);
 }
 
 FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
     const CPDF_Action& action,
     CPDFSDK_Document* pDocument,
-    CFX_PtrList& list) {
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -124,21 +126,22 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteDocumentOpenAction(subaction, pDocument, list))
+    if (!ExecuteDocumentOpenAction(subaction, pDocument, visited))
       return FALSE;
   }
 
   return TRUE;
 }
 
-FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action,
-                                                 CPDFSDK_Document* pDocument,
-                                                 CFX_PtrList& list) {
+FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(
+    const CPDF_Action& action,
+    CPDFSDK_Document* pDocument,
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -167,7 +170,7 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteLinkAction(subaction, pDocument, list))
+    if (!ExecuteLinkAction(subaction, pDocument, visited))
       return FALSE;
   }
 
@@ -178,12 +181,12 @@
     const CPDF_Action& action,
     CPDF_AAction::AActionType type,
     CPDFSDK_Document* pDocument,
-    CFX_PtrList& list) {
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -203,7 +206,7 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteDocumentPageAction(subaction, type, pDocument, list))
+    if (!ExecuteDocumentPageAction(subaction, type, pDocument, visited))
       return FALSE;
   }
 
@@ -225,12 +228,12 @@
     CPDFSDK_Document* pDocument,
     CPDF_FormField* pFormField,
     PDFSDK_FieldAction& data,
-    CFX_PtrList& list) {
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -249,7 +252,8 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data, list))
+    if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data,
+                            visited))
       return FALSE;
   }
 
@@ -261,12 +265,12 @@
     CPDF_AAction::AActionType type,
     CPDFSDK_Document* pDocument,
     CPDFSDK_Annot* pScreen,
-    CFX_PtrList& list) {
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -293,22 +297,23 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, list))
+    if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, visited))
       return FALSE;
   }
 
   return TRUE;
 }
 
-FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action,
-                                               CPDFSDK_Document* pDocument,
-                                               CPDF_Bookmark* pBookmark,
-                                               CFX_PtrList& list) {
+FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(
+    const CPDF_Action& action,
+    CPDFSDK_Document* pDocument,
+    CPDF_Bookmark* pBookmark,
+    std::set<CPDF_Dictionary*>* visited) {
   CPDF_Dictionary* pDict = action.GetDict();
-  if (list.Find(pDict))
+  if (pdfium::ContainsKey(*visited, pDict))
     return FALSE;
 
-  list.AddTail(pDict);
+  visited->insert(pDict);
 
   CPDFDoc_Environment* pEnv = pDocument->GetEnv();
   ASSERT(pEnv);
@@ -337,7 +342,7 @@
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteBookMark(subaction, pDocument, pBookmark, list))
+    if (!ExecuteBookMark(subaction, pDocument, pBookmark, visited))
       return FALSE;
   }