Splitting fpdfdoc/doc_* part I

The first of several CLs to split the core/fpdfdoc/doc_* files up to individual
class files.

Review-Url: https://codereview.chromium.org/2192823002
diff --git a/BUILD.gn b/BUILD.gn
index f7a6007..f482a5b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -202,11 +202,21 @@
   sources = [
     "core/fpdfdoc/clines.cpp",
     "core/fpdfdoc/clines.h",
+    "core/fpdfdoc/cpdf_aaction.cpp",
+    "core/fpdfdoc/cpdf_action.cpp",
+    "core/fpdfdoc/cpdf_actionfields.cpp",
     "core/fpdfdoc/cpdf_annot.cpp",
     "core/fpdfdoc/cpdf_annotlist.cpp",
     "core/fpdfdoc/cpdf_apsettings.h",
+    "core/fpdfdoc/cpdf_bookmark.cpp",
+    "core/fpdfdoc/cpdf_bookmarktree.cpp",
+    "core/fpdfdoc/cpdf_docjsactions.cpp",
+    "core/fpdfdoc/cpdf_link.cpp",
+    "core/fpdfdoc/cpdf_linklist.cpp",
+    "core/fpdfdoc/cpdf_metadata.cpp",
     "core/fpdfdoc/cpdf_pagelabel.h",
     "core/fpdfdoc/cpdf_variabletext.cpp",
+    "core/fpdfdoc/cpdf_viewerpreferences.cpp",
     "core/fpdfdoc/cpvt_color.cpp",
     "core/fpdfdoc/cpvt_color.h",
     "core/fpdfdoc/cpvt_dash.h",
@@ -224,18 +234,13 @@
     "core/fpdfdoc/csection.h",
     "core/fpdfdoc/ctypeset.cpp",
     "core/fpdfdoc/ctypeset.h",
-    "core/fpdfdoc/doc_action.cpp",
     "core/fpdfdoc/doc_basic.cpp",
-    "core/fpdfdoc/doc_bookmark.cpp",
     "core/fpdfdoc/doc_form.cpp",
     "core/fpdfdoc/doc_formcontrol.cpp",
     "core/fpdfdoc/doc_formfield.cpp",
-    "core/fpdfdoc/doc_link.cpp",
-    "core/fpdfdoc/doc_metadata.cpp",
     "core/fpdfdoc/doc_ocg.cpp",
     "core/fpdfdoc/doc_utils.cpp",
     "core/fpdfdoc/doc_utils.h",
-    "core/fpdfdoc/doc_viewerPreferences.cpp",
     "core/fpdfdoc/doc_vt.cpp",
     "core/fpdfdoc/include/cpdf_aaction.h",
     "core/fpdfdoc/include/cpdf_action.h",
diff --git a/core/fpdfdoc/cpdf_aaction.cpp b/core/fpdfdoc/cpdf_aaction.cpp
new file mode 100644
index 0000000..c2d77cf
--- /dev/null
+++ b/core/fpdfdoc/cpdf_aaction.cpp
@@ -0,0 +1,24 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_aaction.h"
+
+namespace {
+
+const FX_CHAR* g_sAATypes[] = {"E",  "X",  "D",  "U",  "Fo", "Bl", "PO", "PC",
+                               "PV", "PI", "O",  "C",  "K",  "F",  "V",  "C",
+                               "WC", "WS", "DS", "WP", "DP", ""};
+
+}  // namespace
+
+FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const {
+  return m_pDict && m_pDict->KeyExist(g_sAATypes[eType]);
+}
+
+CPDF_Action CPDF_AAction::GetAction(AActionType eType) const {
+  return m_pDict ? CPDF_Action(m_pDict->GetDictBy(g_sAATypes[eType]))
+                 : CPDF_Action();
+}
diff --git a/core/fpdfdoc/cpdf_action.cpp b/core/fpdfdoc/cpdf_action.cpp
new file mode 100644
index 0000000..86fc20e
--- /dev/null
+++ b/core/fpdfdoc/cpdf_action.cpp
@@ -0,0 +1,137 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_action.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfdoc/include/cpdf_filespec.h"
+#include "core/fpdfdoc/include/cpdf_nametree.h"
+
+namespace {
+
+const FX_CHAR* const g_sATypes[] = {
+    "Unknown",     "GoTo",       "GoToR",     "GoToE",      "Launch",
+    "Thread",      "URI",        "Sound",     "Movie",      "Hide",
+    "Named",       "SubmitForm", "ResetForm", "ImportData", "JavaScript",
+    "SetOCGState", "Rendition",  "Trans",     "GoTo3DView", nullptr};
+
+}  // namespace
+
+CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const {
+  if (!m_pDict)
+    return CPDF_Dest();
+
+  CFX_ByteString type = m_pDict->GetStringBy("S");
+  if (type != "GoTo" && type != "GoToR")
+    return CPDF_Dest();
+
+  CPDF_Object* pDest = m_pDict->GetDirectObjectBy("D");
+  if (!pDest)
+    return CPDF_Dest();
+  if (pDest->IsString() || pDest->IsName()) {
+    CPDF_NameTree name_tree(pDoc, "Dests");
+    return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString()));
+  }
+  if (CPDF_Array* pArray = pDest->AsArray())
+    return CPDF_Dest(pArray);
+
+  return CPDF_Dest();
+}
+
+CPDF_Action::ActionType CPDF_Action::GetType() const {
+  if (!m_pDict)
+    return Unknown;
+
+  CFX_ByteString csType = m_pDict->GetStringBy("S");
+  if (csType.IsEmpty())
+    return Unknown;
+
+  for (int i = 0; g_sATypes[i]; ++i) {
+    if (csType == g_sATypes[i])
+      return static_cast<ActionType>(i);
+  }
+  return Unknown;
+}
+
+CFX_WideString CPDF_Action::GetFilePath() const {
+  CFX_ByteString type = m_pDict->GetStringBy("S");
+  if (type != "GoToR" && type != "Launch" && type != "SubmitForm" &&
+      type != "ImportData") {
+    return CFX_WideString();
+  }
+
+  CPDF_Object* pFile = m_pDict->GetDirectObjectBy("F");
+  CFX_WideString path;
+  if (!pFile) {
+    if (type == "Launch") {
+      CPDF_Dictionary* pWinDict = m_pDict->GetDictBy("Win");
+      if (pWinDict) {
+        return CFX_WideString::FromLocal(
+            pWinDict->GetStringBy("F").AsStringC());
+      }
+    }
+    return path;
+  }
+
+  CPDF_FileSpec filespec(pFile);
+  filespec.GetFileName(&path);
+  return path;
+}
+
+CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const {
+  CFX_ByteString csURI;
+  if (!m_pDict)
+    return csURI;
+  if (m_pDict->GetStringBy("S") != "URI")
+    return csURI;
+
+  csURI = m_pDict->GetStringBy("URI");
+  CPDF_Dictionary* pRoot = pDoc->GetRoot();
+  CPDF_Dictionary* pURI = pRoot->GetDictBy("URI");
+  if (pURI) {
+    if (csURI.Find(":", 0) < 1)
+      csURI = pURI->GetStringBy("Base") + csURI;
+  }
+  return csURI;
+}
+
+CFX_WideString CPDF_Action::GetJavaScript() const {
+  CFX_WideString csJS;
+  if (!m_pDict)
+    return csJS;
+
+  CPDF_Object* pJS = m_pDict->GetDirectObjectBy("JS");
+  return pJS ? pJS->GetUnicodeText() : csJS;
+}
+
+size_t CPDF_Action::GetSubActionsCount() const {
+  if (!m_pDict || !m_pDict->KeyExist("Next"))
+    return 0;
+
+  CPDF_Object* pNext = m_pDict->GetDirectObjectBy("Next");
+  if (!pNext)
+    return 0;
+  if (pNext->IsDictionary())
+    return 1;
+  if (CPDF_Array* pArray = pNext->AsArray())
+    return pArray->GetCount();
+  return 0;
+}
+
+CPDF_Action CPDF_Action::GetSubAction(size_t iIndex) const {
+  if (!m_pDict || !m_pDict->KeyExist("Next"))
+    return CPDF_Action();
+
+  CPDF_Object* pNext = m_pDict->GetDirectObjectBy("Next");
+  if (CPDF_Dictionary* pDict = ToDictionary(pNext)) {
+    if (iIndex == 0)
+      return CPDF_Action(pDict);
+  } else if (CPDF_Array* pArray = ToArray(pNext)) {
+    return CPDF_Action(pArray->GetDictAt(iIndex));
+  }
+  return CPDF_Action();
+}
diff --git a/core/fpdfdoc/cpdf_actionfields.cpp b/core/fpdfdoc/cpdf_actionfields.cpp
new file mode 100644
index 0000000..1ad1eb4
--- /dev/null
+++ b/core/fpdfdoc/cpdf_actionfields.cpp
@@ -0,0 +1,96 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_actionfields.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
+#include "core/fpdfdoc/include/cpdf_action.h"
+
+size_t CPDF_ActionFields::GetFieldsCount() const {
+  if (!m_pAction)
+    return 0;
+
+  CPDF_Dictionary* pDict = m_pAction->GetDict();
+  if (!pDict)
+    return 0;
+
+  CFX_ByteString csType = pDict->GetStringBy("S");
+  CPDF_Object* pFields = nullptr;
+  if (csType == "Hide")
+    pFields = pDict->GetDirectObjectBy("T");
+  else
+    pFields = pDict->GetArrayBy("Fields");
+
+  if (!pFields)
+    return 0;
+  if (pFields->IsDictionary())
+    return 1;
+  if (pFields->IsString())
+    return 1;
+  if (CPDF_Array* pArray = pFields->AsArray())
+    return pArray->GetCount();
+  return 0;
+}
+
+std::vector<CPDF_Object*> CPDF_ActionFields::GetAllFields() const {
+  std::vector<CPDF_Object*> fields;
+  if (!m_pAction)
+    return fields;
+
+  CPDF_Dictionary* pDict = m_pAction->GetDict();
+  if (!pDict)
+    return fields;
+
+  CFX_ByteString csType = pDict->GetStringBy("S");
+  CPDF_Object* pFields;
+  if (csType == "Hide")
+    pFields = pDict->GetDirectObjectBy("T");
+  else
+    pFields = pDict->GetArrayBy("Fields");
+
+  if (!pFields)
+    return fields;
+
+  if (pFields->IsDictionary() || pFields->IsString()) {
+    fields.push_back(pFields);
+  } else if (CPDF_Array* pArray = pFields->AsArray()) {
+    for (size_t i = 0; i < pArray->GetCount(); ++i) {
+      CPDF_Object* pObj = pArray->GetDirectObjectAt(i);
+      if (pObj)
+        fields.push_back(pObj);
+    }
+  }
+  return fields;
+}
+
+CPDF_Object* CPDF_ActionFields::GetField(size_t iIndex) const {
+  if (!m_pAction)
+    return nullptr;
+
+  CPDF_Dictionary* pDict = m_pAction->GetDict();
+  if (!pDict)
+    return nullptr;
+
+  CFX_ByteString csType = pDict->GetStringBy("S");
+  CPDF_Object* pFields = nullptr;
+  if (csType == "Hide")
+    pFields = pDict->GetDirectObjectBy("T");
+  else
+    pFields = pDict->GetArrayBy("Fields");
+
+  if (!pFields)
+    return nullptr;
+
+  CPDF_Object* pFindObj = nullptr;
+  if (pFields->IsDictionary() || pFields->IsString()) {
+    if (iIndex == 0)
+      pFindObj = pFields;
+  } else if (CPDF_Array* pArray = pFields->AsArray()) {
+    pFindObj = pArray->GetDirectObjectAt(iIndex);
+  }
+  return pFindObj;
+}
diff --git a/core/fpdfdoc/doc_bookmark.cpp b/core/fpdfdoc/cpdf_bookmark.cpp
similarity index 63%
rename from core/fpdfdoc/doc_bookmark.cpp
rename to core/fpdfdoc/cpdf_bookmark.cpp
index 8a0054e..c9a2199 100644
--- a/core/fpdfdoc/doc_bookmark.cpp
+++ b/core/fpdfdoc/cpdf_bookmark.cpp
@@ -1,4 +1,4 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -6,43 +6,11 @@
 
 #include "core/fpdfdoc/include/cpdf_bookmark.h"
 
-#include <memory>
-#include <vector>
-
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
-#include "core/fpdfdoc/include/cpdf_bookmarktree.h"
 #include "core/fpdfdoc/include/cpdf_nametree.h"
 #include "core/fxge/include/fx_dib.h"
 
-CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(
-    const CPDF_Bookmark& parent) const {
-  CPDF_Dictionary* pParentDict = parent.GetDict();
-  if (pParentDict)
-    return CPDF_Bookmark(pParentDict->GetDictBy("First"));
-
-  CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
-  if (!pRoot)
-    return CPDF_Bookmark();
-
-  CPDF_Dictionary* pOutlines = pRoot->GetDictBy("Outlines");
-  if (!pOutlines)
-    return CPDF_Bookmark();
-
-  return CPDF_Bookmark(pOutlines->GetDictBy("First"));
-}
-
-CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(
-    const CPDF_Bookmark& bookmark) const {
-  CPDF_Dictionary* pDict = bookmark.GetDict();
-  if (!pDict)
-    return CPDF_Bookmark();
-
-  CPDF_Dictionary* pNext = pDict->GetDictBy("Next");
-  return pNext == pDict ? CPDF_Bookmark() : CPDF_Bookmark(pNext);
-}
-
 uint32_t CPDF_Bookmark::GetColorRef() const {
   if (!m_pDict)
     return FXSYS_RGB(0, 0, 0);
@@ -62,18 +30,18 @@
 }
 
 CFX_WideString CPDF_Bookmark::GetTitle() const {
-  if (!m_pDict) {
+  if (!m_pDict)
     return CFX_WideString();
-  }
+
   CPDF_String* pString = ToString(m_pDict->GetDirectObjectBy("Title"));
   if (!pString)
     return CFX_WideString();
 
   CFX_WideString title = pString->GetUnicodeText();
   int len = title.GetLength();
-  if (!len) {
+  if (!len)
     return CFX_WideString();
-  }
+
   std::unique_ptr<FX_WCHAR[]> buf(new FX_WCHAR[len]);
   for (int i = 0; i < len; i++) {
     FX_WCHAR w = title[i];
@@ -81,6 +49,7 @@
   }
   return CFX_WideString(buf.get(), len);
 }
+
 CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument) const {
   if (!m_pDict)
     return CPDF_Dest();
@@ -96,9 +65,7 @@
     return CPDF_Dest(pArray);
   return CPDF_Dest();
 }
+
 CPDF_Action CPDF_Bookmark::GetAction() const {
-  if (!m_pDict) {
-    return CPDF_Action();
-  }
-  return CPDF_Action(m_pDict->GetDictBy("A"));
+  return m_pDict ? CPDF_Action(m_pDict->GetDictBy("A")) : CPDF_Action();
 }
diff --git a/core/fpdfdoc/cpdf_bookmarktree.cpp b/core/fpdfdoc/cpdf_bookmarktree.cpp
new file mode 100644
index 0000000..5ebb317
--- /dev/null
+++ b/core/fpdfdoc/cpdf_bookmarktree.cpp
@@ -0,0 +1,34 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_bookmarktree.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+
+CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(
+    const CPDF_Bookmark& parent) const {
+  CPDF_Dictionary* pParentDict = parent.GetDict();
+  if (pParentDict)
+    return CPDF_Bookmark(pParentDict->GetDictBy("First"));
+
+  CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+  if (!pRoot)
+    return CPDF_Bookmark();
+
+  CPDF_Dictionary* pOutlines = pRoot->GetDictBy("Outlines");
+  return pOutlines ? CPDF_Bookmark(pOutlines->GetDictBy("First"))
+                   : CPDF_Bookmark();
+}
+
+CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(
+    const CPDF_Bookmark& bookmark) const {
+  CPDF_Dictionary* pDict = bookmark.GetDict();
+  if (!pDict)
+    return CPDF_Bookmark();
+
+  CPDF_Dictionary* pNext = pDict->GetDictBy("Next");
+  return pNext == pDict ? CPDF_Bookmark() : CPDF_Bookmark(pNext);
+}
diff --git a/core/fpdfdoc/cpdf_docjsactions.cpp b/core/fpdfdoc/cpdf_docjsactions.cpp
new file mode 100644
index 0000000..897cdac
--- /dev/null
+++ b/core/fpdfdoc/cpdf_docjsactions.cpp
@@ -0,0 +1,40 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_docjsactions.h"
+
+#include "core/fpdfdoc/include/cpdf_nametree.h"
+
+CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
+
+int CPDF_DocJSActions::CountJSActions() const {
+  ASSERT(m_pDocument);
+  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
+  return name_tree.GetCount();
+}
+
+CPDF_Action CPDF_DocJSActions::GetJSAction(int index,
+                                           CFX_ByteString& csName) const {
+  ASSERT(m_pDocument);
+  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
+  CPDF_Object* pAction = name_tree.LookupValue(index, csName);
+  return ToDictionary(pAction) ? CPDF_Action(pAction->GetDict())
+                               : CPDF_Action();
+}
+
+CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const {
+  ASSERT(m_pDocument);
+  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
+  CPDF_Object* pAction = name_tree.LookupValue(csName);
+  return ToDictionary(pAction) ? CPDF_Action(pAction->GetDict())
+                               : CPDF_Action();
+}
+
+int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const {
+  ASSERT(m_pDocument);
+  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
+  return name_tree.GetIndex(csName);
+}
diff --git a/core/fpdfdoc/cpdf_link.cpp b/core/fpdfdoc/cpdf_link.cpp
new file mode 100644
index 0000000..4859881
--- /dev/null
+++ b/core/fpdfdoc/cpdf_link.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfdoc/include/cpdf_link.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfdoc/include/cpdf_nametree.h"
+
+CFX_FloatRect CPDF_Link::GetRect() {
+  return m_pDict->GetRectBy("Rect");
+}
+
+CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc) {
+  CPDF_Object* pDest = m_pDict->GetDirectObjectBy("Dest");
+  if (!pDest)
+    return CPDF_Dest();
+
+  if (pDest->IsString() || pDest->IsName()) {
+    CPDF_NameTree name_tree(pDoc, "Dests");
+    return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString()));
+  }
+  if (CPDF_Array* pArray = pDest->AsArray())
+    return CPDF_Dest(pArray);
+  return CPDF_Dest();
+}
+
+CPDF_Action CPDF_Link::GetAction() {
+  return CPDF_Action(m_pDict->GetDictBy("A"));
+}
diff --git a/core/fpdfdoc/doc_link.cpp b/core/fpdfdoc/cpdf_linklist.cpp
similarity index 74%
rename from core/fpdfdoc/doc_link.cpp
rename to core/fpdfdoc/cpdf_linklist.cpp
index aa4e761..5ef8f39 100644
--- a/core/fpdfdoc/doc_link.cpp
+++ b/core/fpdfdoc/cpdf_linklist.cpp
@@ -1,17 +1,13 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfdoc/include/cpdf_link.h"
-
-#include <vector>
+#include "core/fpdfdoc/include/cpdf_linklist.h"
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfdoc/include/cpdf_linklist.h"
-#include "core/fpdfdoc/include/cpdf_nametree.h"
 
 CPDF_LinkList::CPDF_LinkList() {}
 
@@ -72,23 +68,3 @@
     pList->push_back(add_link ? pAnnot : nullptr);
   }
 }
-
-CFX_FloatRect CPDF_Link::GetRect() {
-  return m_pDict->GetRectBy("Rect");
-}
-CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc) {
-  CPDF_Object* pDest = m_pDict->GetDirectObjectBy("Dest");
-  if (!pDest)
-    return CPDF_Dest();
-
-  if (pDest->IsString() || pDest->IsName()) {
-    CPDF_NameTree name_tree(pDoc, "Dests");
-    return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString()));
-  }
-  if (CPDF_Array* pArray = pDest->AsArray())
-    return CPDF_Dest(pArray);
-  return CPDF_Dest();
-}
-CPDF_Action CPDF_Link::GetAction() {
-  return CPDF_Action(m_pDict->GetDictBy("A"));
-}
diff --git a/core/fpdfdoc/doc_metadata.cpp b/core/fpdfdoc/cpdf_metadata.cpp
similarity index 94%
rename from core/fpdfdoc/doc_metadata.cpp
rename to core/fpdfdoc/cpdf_metadata.cpp
index 6273a62..b53da07 100644
--- a/core/fpdfdoc/doc_metadata.cpp
+++ b/core/fpdfdoc/cpdf_metadata.cpp
@@ -1,4 +1,4 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/core/fpdfdoc/doc_viewerPreferences.cpp b/core/fpdfdoc/cpdf_viewerpreferences.cpp
similarity index 96%
rename from core/fpdfdoc/doc_viewerPreferences.cpp
rename to core/fpdfdoc/cpdf_viewerpreferences.cpp
index 3fe638d..4951e5f 100644
--- a/core/fpdfdoc/doc_viewerPreferences.cpp
+++ b/core/fpdfdoc/cpdf_viewerpreferences.cpp
@@ -1,4 +1,4 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/core/fpdfdoc/doc_action.cpp b/core/fpdfdoc/doc_action.cpp
deleted file mode 100644
index 30d4006..0000000
--- a/core/fpdfdoc/doc_action.cpp
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fpdfdoc/include/cpdf_action.h"
-
-#include <vector>
-
-#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/fpdfdoc/include/cpdf_aaction.h"
-#include "core/fpdfdoc/include/cpdf_actionfields.h"
-#include "core/fpdfdoc/include/cpdf_docjsactions.h"
-#include "core/fpdfdoc/include/cpdf_filespec.h"
-#include "core/fpdfdoc/include/cpdf_nametree.h"
-
-namespace {
-
-const FX_CHAR* const g_sATypes[] = {
-    "Unknown",     "GoTo",       "GoToR",     "GoToE",      "Launch",
-    "Thread",      "URI",        "Sound",     "Movie",      "Hide",
-    "Named",       "SubmitForm", "ResetForm", "ImportData", "JavaScript",
-    "SetOCGState", "Rendition",  "Trans",     "GoTo3DView", nullptr};
-
-const FX_CHAR* g_sAATypes[] = {"E",  "X",  "D",  "U",  "Fo", "Bl", "PO", "PC",
-                               "PV", "PI", "O",  "C",  "K",  "F",  "V",  "C",
-                               "WC", "WS", "DS", "WP", "DP", ""};
-
-}  // namespace
-
-CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const {
-  if (!m_pDict) {
-    return CPDF_Dest();
-  }
-  CFX_ByteString type = m_pDict->GetStringBy("S");
-  if (type != "GoTo" && type != "GoToR") {
-    return CPDF_Dest();
-  }
-  CPDF_Object* pDest = m_pDict->GetDirectObjectBy("D");
-  if (!pDest) {
-    return CPDF_Dest();
-  }
-  if (pDest->IsString() || pDest->IsName()) {
-    CPDF_NameTree name_tree(pDoc, "Dests");
-    return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString()));
-  }
-  if (CPDF_Array* pArray = pDest->AsArray())
-    return CPDF_Dest(pArray);
-  return CPDF_Dest();
-}
-
-CPDF_Action::ActionType CPDF_Action::GetType() const {
-  if (!m_pDict)
-    return Unknown;
-
-  CFX_ByteString csType = m_pDict->GetStringBy("S");
-  if (csType.IsEmpty())
-    return Unknown;
-
-  for (int i = 0; g_sATypes[i]; ++i) {
-    if (csType == g_sATypes[i])
-      return static_cast<ActionType>(i);
-  }
-  return Unknown;
-}
-
-CFX_WideString CPDF_Action::GetFilePath() const {
-  CFX_ByteString type = m_pDict->GetStringBy("S");
-  if (type != "GoToR" && type != "Launch" && type != "SubmitForm" &&
-      type != "ImportData") {
-    return CFX_WideString();
-  }
-  CPDF_Object* pFile = m_pDict->GetDirectObjectBy("F");
-  CFX_WideString path;
-  if (!pFile) {
-    if (type == "Launch") {
-      CPDF_Dictionary* pWinDict = m_pDict->GetDictBy("Win");
-      if (pWinDict) {
-        return CFX_WideString::FromLocal(
-            pWinDict->GetStringBy("F").AsStringC());
-      }
-    }
-    return path;
-  }
-  CPDF_FileSpec filespec(pFile);
-  filespec.GetFileName(&path);
-  return path;
-}
-CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const {
-  CFX_ByteString csURI;
-  if (!m_pDict) {
-    return csURI;
-  }
-  if (m_pDict->GetStringBy("S") != "URI") {
-    return csURI;
-  }
-  csURI = m_pDict->GetStringBy("URI");
-  CPDF_Dictionary* pRoot = pDoc->GetRoot();
-  CPDF_Dictionary* pURI = pRoot->GetDictBy("URI");
-  if (pURI) {
-    if (csURI.Find(":", 0) < 1) {
-      csURI = pURI->GetStringBy("Base") + csURI;
-    }
-  }
-  return csURI;
-}
-size_t CPDF_ActionFields::GetFieldsCount() const {
-  if (!m_pAction) {
-    return 0;
-  }
-  CPDF_Dictionary* pDict = m_pAction->GetDict();
-  if (!pDict) {
-    return 0;
-  }
-  CFX_ByteString csType = pDict->GetStringBy("S");
-  CPDF_Object* pFields = nullptr;
-  if (csType == "Hide") {
-    pFields = pDict->GetDirectObjectBy("T");
-  } else {
-    pFields = pDict->GetArrayBy("Fields");
-  }
-  if (!pFields)
-    return 0;
-  if (pFields->IsDictionary())
-    return 1;
-  if (pFields->IsString())
-    return 1;
-  if (CPDF_Array* pArray = pFields->AsArray())
-    return pArray->GetCount();
-  return 0;
-}
-
-std::vector<CPDF_Object*> CPDF_ActionFields::GetAllFields() const {
-  std::vector<CPDF_Object*> fields;
-  if (!m_pAction)
-    return fields;
-
-  CPDF_Dictionary* pDict = m_pAction->GetDict();
-  if (!pDict)
-    return fields;
-
-  CFX_ByteString csType = pDict->GetStringBy("S");
-  CPDF_Object* pFields;
-  if (csType == "Hide")
-    pFields = pDict->GetDirectObjectBy("T");
-  else
-    pFields = pDict->GetArrayBy("Fields");
-  if (!pFields)
-    return fields;
-
-  if (pFields->IsDictionary() || pFields->IsString()) {
-    fields.push_back(pFields);
-  } else if (CPDF_Array* pArray = pFields->AsArray()) {
-    for (size_t i = 0; i < pArray->GetCount(); ++i) {
-      CPDF_Object* pObj = pArray->GetDirectObjectAt(i);
-      if (pObj) {
-        fields.push_back(pObj);
-      }
-    }
-  }
-  return fields;
-}
-
-CPDF_Object* CPDF_ActionFields::GetField(size_t iIndex) const {
-  if (!m_pAction) {
-    return nullptr;
-  }
-  CPDF_Dictionary* pDict = m_pAction->GetDict();
-  if (!pDict) {
-    return nullptr;
-  }
-  CFX_ByteString csType = pDict->GetStringBy("S");
-  CPDF_Object* pFields = nullptr;
-  if (csType == "Hide") {
-    pFields = pDict->GetDirectObjectBy("T");
-  } else {
-    pFields = pDict->GetArrayBy("Fields");
-  }
-  if (!pFields) {
-    return nullptr;
-  }
-  CPDF_Object* pFindObj = nullptr;
-  if (pFields->IsDictionary() || pFields->IsString()) {
-    if (iIndex == 0)
-      pFindObj = pFields;
-  } else if (CPDF_Array* pArray = pFields->AsArray()) {
-    pFindObj = pArray->GetDirectObjectAt(iIndex);
-  }
-  return pFindObj;
-}
-
-CFX_WideString CPDF_Action::GetJavaScript() const {
-  CFX_WideString csJS;
-  if (!m_pDict) {
-    return csJS;
-  }
-  CPDF_Object* pJS = m_pDict->GetDirectObjectBy("JS");
-  return pJS ? pJS->GetUnicodeText() : csJS;
-}
-
-size_t CPDF_Action::GetSubActionsCount() const {
-  if (!m_pDict || !m_pDict->KeyExist("Next"))
-    return 0;
-
-  CPDF_Object* pNext = m_pDict->GetDirectObjectBy("Next");
-  if (!pNext)
-    return 0;
-  if (pNext->IsDictionary())
-    return 1;
-  if (CPDF_Array* pArray = pNext->AsArray())
-    return pArray->GetCount();
-  return 0;
-}
-CPDF_Action CPDF_Action::GetSubAction(size_t iIndex) const {
-  if (!m_pDict || !m_pDict->KeyExist("Next")) {
-    return CPDF_Action();
-  }
-  CPDF_Object* pNext = m_pDict->GetDirectObjectBy("Next");
-  if (CPDF_Dictionary* pDict = ToDictionary(pNext)) {
-    if (iIndex == 0)
-      return CPDF_Action(pDict);
-  } else if (CPDF_Array* pArray = ToArray(pNext)) {
-    return CPDF_Action(pArray->GetDictAt(iIndex));
-  }
-  return CPDF_Action();
-}
-
-FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const {
-  return m_pDict && m_pDict->KeyExist(g_sAATypes[eType]);
-}
-
-CPDF_Action CPDF_AAction::GetAction(AActionType eType) const {
-  if (!m_pDict)
-    return CPDF_Action();
-
-  return CPDF_Action(m_pDict->GetDictBy(g_sAATypes[eType]));
-}
-
-CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
-
-int CPDF_DocJSActions::CountJSActions() const {
-  ASSERT(m_pDocument);
-  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
-  return name_tree.GetCount();
-}
-CPDF_Action CPDF_DocJSActions::GetJSAction(int index,
-                                           CFX_ByteString& csName) const {
-  ASSERT(m_pDocument);
-  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
-  CPDF_Object* pAction = name_tree.LookupValue(index, csName);
-  if (!ToDictionary(pAction)) {
-    return CPDF_Action();
-  }
-  return CPDF_Action(pAction->GetDict());
-}
-CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const {
-  ASSERT(m_pDocument);
-  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
-  CPDF_Object* pAction = name_tree.LookupValue(csName);
-  if (!ToDictionary(pAction)) {
-    return CPDF_Action();
-  }
-  return CPDF_Action(pAction->GetDict());
-}
-int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const {
-  ASSERT(m_pDocument);
-  CPDF_NameTree name_tree(m_pDocument, "JavaScript");
-  return name_tree.GetIndex(csName);
-}
diff --git a/core/fpdfdoc/include/cpdf_actionfields.h b/core/fpdfdoc/include/cpdf_actionfields.h
index ad7962b..0f38e1d 100644
--- a/core/fpdfdoc/include/cpdf_actionfields.h
+++ b/core/fpdfdoc/include/cpdf_actionfields.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFDOC_INCLUDE_CPDF_ACTIONFIELDS_H_
 #define CORE_FPDFDOC_INCLUDE_CPDF_ACTIONFIELDS_H_
 
+#include <stddef.h>
+
 #include <vector>
 
 class CPDF_Action;
diff --git a/pdfium.gyp b/pdfium.gyp
index fe2d176..d0d23b9 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -184,11 +184,21 @@
       'sources': [
         'core/fpdfdoc/clines.cpp',
         'core/fpdfdoc/clines.h',
+        'core/fpdfdoc/cpdf_aaction.cpp',
+        'core/fpdfdoc/cpdf_action.cpp',
+        'core/fpdfdoc/cpdf_actionfields.cpp',
         'core/fpdfdoc/cpdf_apsettings.h',
         'core/fpdfdoc/cpdf_annot.cpp',
         'core/fpdfdoc/cpdf_annotlist.cpp',
+        'core/fpdfdoc/cpdf_bookmark.cpp',
+        'core/fpdfdoc/cpdf_bookmarktree.cpp',
+        'core/fpdfdoc/cpdf_docjsactions.cpp',
+        'core/fpdfdoc/cpdf_link.cpp',
+        'core/fpdfdoc/cpdf_linklist.cpp',
+        'core/fpdfdoc/cpdf_metadata.cpp',
         'core/fpdfdoc/cpdf_pagelabel.h',
         'core/fpdfdoc/cpdf_variabletext.cpp',
+        'core/fpdfdoc/cpdf_viewerpreferences.cpp',
         'core/fpdfdoc/cpvt_color.cpp',
         'core/fpdfdoc/cpvt_color.h',
         'core/fpdfdoc/cpvt_dash.h',
@@ -206,18 +216,13 @@
         'core/fpdfdoc/csection.h',
         'core/fpdfdoc/ctypeset.cpp',
         'core/fpdfdoc/ctypeset.h',
-        'core/fpdfdoc/doc_action.cpp',
         'core/fpdfdoc/doc_basic.cpp',
-        'core/fpdfdoc/doc_bookmark.cpp',
         'core/fpdfdoc/doc_form.cpp',
         'core/fpdfdoc/doc_formcontrol.cpp',
         'core/fpdfdoc/doc_formfield.cpp',
-        'core/fpdfdoc/doc_link.cpp',
-        'core/fpdfdoc/doc_metadata.cpp',
         'core/fpdfdoc/doc_ocg.cpp',
         'core/fpdfdoc/doc_utils.cpp',
         'core/fpdfdoc/doc_utils.h',
-        'core/fpdfdoc/doc_viewerPreferences.cpp',
         'core/fpdfdoc/doc_vt.cpp',
         'core/fpdfdoc/include/cpdf_aaction.h',
         'core/fpdfdoc/include/cpdf_action.h',