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_