Revert "Ensure that XFA Pages always have a corresponding PDF page"

This reverts commit e7207f33f8024b59fc85abb1b4594b0fbab5361b.

Reason for revert: Causes crash in some XFA forms - crbug.com/840922

This is a merge, not a clean revert.

Original change's description:
> Ensure that XFA Pages always have a corresponding PDF page
>
> The PDF page may be blank, un-numbered, or untracked by CPDF, but
> this provides a place for all XFA pages to "extend" from down the
> road.
>
> Change-Id: If1003be0f261154e61e9793ccba7e1f43cd73104
> Reviewed-on: https://pdfium-review.googlesource.com/31771
> Commit-Queue: Tom Sepez <tsepez@chromium.org>
> Reviewed-by: dsinclair <dsinclair@chromium.org>

Change-Id: Ia7f286321552b225a95f461aa8a6aef979f5c991
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: chromium:840922
Reviewed-on: https://pdfium-review.googlesource.com/32210
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index 19c301b..ce597d6 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -186,6 +186,7 @@
   auto* pContext = static_cast<CPDFXFA_Context*>(pDoc->GetExtension());
   if (pContext) {
     auto pXFAPage = pdfium::MakeRetain<CPDFXFA_Page>(pContext, page_index);
+    pXFAPage->LoadPDFPage(pPageDict);
     return FPDFPageFromUnderlying(pXFAPage.Leak());  // Caller takes ownership.
   }
   // Eventually, fallthru into non-XFA case once page type is consistent.
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index a3a471c..8a43fa6 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -621,11 +621,7 @@
   if (!pDict)
     return;
 
-  CPDF_Dictionary* pActionDict = pDict->GetDictFor("AA");
-  if (!pActionDict)
-    return;
-
-  CPDF_AAction aa(pActionDict);
+  CPDF_AAction aa(pDict->GetDictFor("AA"));
   auto type = static_cast<CPDF_AAction::AActionType>(aaType);
   if (aa.ActionExist(type)) {
     CPDF_Action action = aa.GetAction(type);
@@ -645,22 +641,20 @@
 
   UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page);
   CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page);
-  if (!pPDFPage || !pFormFillEnv->GetPageView(pPage, false))
+  if (!pPDFPage)
+    return;
+
+  if (!pFormFillEnv->GetPageView(pPage, false))
     return;
 
   CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHandler();
   CPDF_Dictionary* pPageDict = pPDFPage->GetFormDict();
-  if (!pPageDict)
-    return;
-
-  CPDF_Dictionary* pActionDict = pPageDict->GetDictFor("AA");
-  if (!pActionDict)
-    return;
-
-  CPDF_AAction aa(pActionDict);
+  CPDF_AAction aa(pPageDict->GetDictFor("AA"));
   CPDF_AAction::AActionType type = aaType == FPDFPAGE_AACTION_OPEN
                                        ? CPDF_AAction::OpenPage
                                        : CPDF_AAction::ClosePage;
-  if (aa.ActionExist(type))
-    pActionHandler->DoAction_Page(aa.GetAction(type), type, pFormFillEnv);
+  if (aa.ActionExist(type)) {
+    CPDF_Action action = aa.GetAction(type);
+    pActionHandler->DoAction_Page(action, type, pFormFillEnv);
+  }
 }
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index 9fe63f4..da1c1e5 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -18,25 +18,32 @@
 #include "xfa/fxfa/cxfa_ffpageview.h"
 
 CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Context* pContext, int page_index)
-    : m_pXFAPageView(nullptr), m_pContext(pContext), m_iPageIndex(page_index) {
-  CPDF_Document* pPDFDoc = m_pContext->GetPDFDoc();
-  CPDF_Dictionary* pDict = nullptr;
-  if (pPDFDoc && m_pContext->GetFormType() != FormType::kXFAFull)
-    pDict = pPDFDoc->GetPageDictionary(m_iPageIndex);
-  m_pPDFPage = pdfium::MakeUnique<CPDF_Page>(pPDFDoc, pDict, true);
-  m_pPDFPage->SetPageExtension(this);
-}
+    : m_pXFAPageView(nullptr), m_pContext(pContext), m_iPageIndex(page_index) {}
 
 CPDFXFA_Page::~CPDFXFA_Page() {}
 
-bool CPDFXFA_Page::LoadPage() {
-  if (!m_pContext || m_iPageIndex < 0)
+bool CPDFXFA_Page::LoadPDFPage() {
+  if (!m_pContext)
     return false;
 
-  if (m_pContext->GetFormType() != FormType::kXFAFull) {
+  CPDF_Document* pPDFDoc = m_pContext->GetPDFDoc();
+  if (!pPDFDoc)
+    return false;
+
+  CPDF_Dictionary* pDict = pPDFDoc->GetPageDictionary(m_iPageIndex);
+  if (!pDict)
+    return false;
+
+  if (!m_pPDFPage || m_pPDFPage->GetFormDict() != pDict) {
+    m_pPDFPage = pdfium::MakeUnique<CPDF_Page>(pPDFDoc, pDict, true);
     m_pPDFPage->ParseContent();
-    return true;
   }
+  return true;
+}
+
+bool CPDFXFA_Page::LoadXFAPageView() {
+  if (!m_pContext)
+    return false;
 
   CXFA_FFDoc* pXFADoc = m_pContext->GetXFADoc();
   if (!pXFADoc)
@@ -54,6 +61,31 @@
   return true;
 }
 
+bool CPDFXFA_Page::LoadPage() {
+  if (!m_pContext || m_iPageIndex < 0)
+    return false;
+
+  switch (m_pContext->GetFormType()) {
+    case FormType::kNone:
+    case FormType::kAcroForm:
+    case FormType::kXFAForeground:
+      return LoadPDFPage();
+    case FormType::kXFAFull:
+      return LoadXFAPageView();
+  }
+  return false;
+}
+
+bool CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) {
+  if (!m_pContext || m_iPageIndex < 0 || !pageDict)
+    return false;
+
+  m_pPDFPage =
+      pdfium::MakeUnique<CPDF_Page>(m_pContext->GetPDFDoc(), pageDict, true);
+  m_pPDFPage->ParseContent();
+  return true;
+}
+
 CPDF_Document::Extension* CPDFXFA_Page::GetDocumentExtension() const {
   return m_pContext.Get();
 }
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.h b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
index faacf3e..4f4d6b0 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
@@ -27,6 +27,7 @@
   friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
 
   bool LoadPage();
+  bool LoadPDFPage(CPDF_Dictionary* pageDict);
 
   // CPDF_Page::Extension:
   CPDF_Document::Extension* GetDocumentExtension() const override;
@@ -56,6 +57,7 @@
   CPDFXFA_Page(CPDFXFA_Context* pContext, int page_index);
   ~CPDFXFA_Page() override;
 
+  bool LoadPDFPage();
   bool LoadXFAPageView();
 
  private: