Do not cache page views in CPDFXFA_Pages

It might change, so look it up anew by index.

Bug: chromium:892574
Change-Id: I76e2bea4f92225860eaa57e6d7faa4b5e3ad9109
Reviewed-on: https://pdfium-review.googlesource.com/c/47810
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index f4cac98..cb2e9df 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -296,7 +296,7 @@
       continue;
 
     m_pContext->GetFormFillEnv()->RemovePageView(pPage.Get());
-    pPage->SetXFAPageView(pXFADocView->GetPageView(iPageIter));
+    pPage->SetXFAPageViewIndex(iPageIter);
   }
 
   int flag = (nNewCount < m_pContext->GetOriginalPageCount())
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index 7a4befd..4770e1b 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -49,21 +49,9 @@
   return true;
 }
 
-bool CPDFXFA_Page::LoadXFAPageView() {
-  CXFA_FFDoc* pXFADoc = m_pContext->GetXFADoc();
-  if (!pXFADoc)
-    return false;
-
+CXFA_FFPageView* CPDFXFA_Page::GetXFAPageView() const {
   CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView();
-  if (!pXFADocView)
-    return false;
-
-  CXFA_FFPageView* pPageView = pXFADocView->GetPageView(m_iPageIndex);
-  if (!pPageView)
-    return false;
-
-  m_pXFAPageView = pPageView;
-  return true;
+  return pXFADocView ? pXFADocView->GetPageView(m_iPageIndex) : nullptr;
 }
 
 bool CPDFXFA_Page::LoadPage() {
@@ -73,7 +61,7 @@
     case FormType::kXFAForeground:
       return LoadPDFPage();
     case FormType::kXFAFull:
-      return LoadXFAPageView();
+      return !!GetXFAPageView();
   }
   NOTREACHED();
   return false;
@@ -90,7 +78,8 @@
 }
 
 float CPDFXFA_Page::GetPageWidth() const {
-  if (!m_pPDFPage && !m_pXFAPageView)
+  CXFA_FFPageView* pPageView = GetXFAPageView();
+  if (!m_pPDFPage && !pPageView)
     return 0.0f;
 
   switch (m_pContext->GetFormType()) {
@@ -101,8 +90,8 @@
         return m_pPDFPage->GetPageWidth();
       FALLTHROUGH;
     case FormType::kXFAFull:
-      if (m_pXFAPageView)
-        return m_pXFAPageView->GetPageViewRect().width;
+      if (pPageView)
+        return pPageView->GetPageViewRect().width;
       break;
   }
 
@@ -110,7 +99,8 @@
 }
 
 float CPDFXFA_Page::GetPageHeight() const {
-  if (!m_pPDFPage && !m_pXFAPageView)
+  CXFA_FFPageView* pPageView = GetXFAPageView();
+  if (!m_pPDFPage && !pPageView)
     return 0.0f;
 
   switch (m_pContext->GetFormType()) {
@@ -121,8 +111,8 @@
         return m_pPDFPage->GetPageHeight();
       FALLTHROUGH;
     case FormType::kXFAFull:
-      if (m_pXFAPageView)
-        return m_pXFAPageView->GetPageViewRect().height;
+      if (pPageView)
+        return pPageView->GetPageViewRect().height;
       break;
   }
 
@@ -133,7 +123,8 @@
     const FX_RECT& rect,
     int rotate,
     const CFX_PointF& device_point) const {
-  if (!m_pPDFPage && !m_pXFAPageView)
+  CXFA_FFPageView* pPageView = GetXFAPageView();
+  if (!m_pPDFPage && !pPageView)
     return {};
 
   CFX_PointF pos =
@@ -145,7 +136,8 @@
     const FX_RECT& rect,
     int rotate,
     const CFX_PointF& page_point) const {
-  if (!m_pPDFPage && !m_pXFAPageView)
+  CXFA_FFPageView* pPageView = GetXFAPageView();
+  if (!m_pPDFPage && !pPageView)
     return {};
 
   CFX_Matrix page2device = GetDisplayMatrix(rect, rotate);
@@ -154,7 +146,8 @@
 
 CFX_Matrix CPDFXFA_Page::GetDisplayMatrix(const FX_RECT& rect,
                                           int iRotate) const {
-  if (!m_pPDFPage && !m_pXFAPageView)
+  CXFA_FFPageView* pPageView = GetXFAPageView();
+  if (!m_pPDFPage && !pPageView)
     return CFX_Matrix();
 
   switch (m_pContext->GetFormType()) {
@@ -165,8 +158,8 @@
         return m_pPDFPage->GetDisplayMatrix(rect, iRotate);
       FALLTHROUGH;
     case FormType::kXFAFull:
-      if (m_pXFAPageView)
-        return m_pXFAPageView->GetDisplayMatrix(rect, iRotate);
+      if (pPageView)
+        return pPageView->GetDisplayMatrix(rect, iRotate);
       break;
   }
 
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.h b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
index 3e2118d..8db5735 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
@@ -45,10 +45,8 @@
   void LoadPDFPageFromDict(CPDF_Dictionary* pPageDict);
   CPDF_Document::Extension* GetDocumentExtension() const;
   int GetPageIndex() const { return m_iPageIndex; }
-  CXFA_FFPageView* GetXFAPageView() const { return m_pXFAPageView; }
-  void SetXFAPageView(CXFA_FFPageView* pPageView) {
-    m_pXFAPageView = pPageView;
-  }
+  void SetXFAPageViewIndex(int index) { m_iPageIndex = index; }
+  CXFA_FFPageView* GetXFAPageView() const;
 
  private:
   // Refcounted class.
@@ -56,12 +54,10 @@
   ~CPDFXFA_Page() override;
 
   bool LoadPDFPage();
-  bool LoadXFAPageView();
 
   RetainPtr<CPDF_Page> m_pPDFPage;
-  CXFA_FFPageView* m_pXFAPageView = nullptr;
   UnownedPtr<CPDFXFA_Context> const m_pContext;
-  const int m_iPageIndex;
+  int m_iPageIndex;
 };
 
 #endif  // FPDFSDK_FPDFXFA_CPDFXFA_PAGE_H_