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_