From ccd9421589922b8f35ee5330d7fdac7edea081db Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Thu, 3 May 2018 13:53:02 +0000 Subject: Add CPDF_Page::Extension::GetDocExtension() In turn, add CPDF_Document::Extension::GetPDFDoc() so that we can use the abstract return type in more places. Mark an internal-only cpdfxfa_context method as private while we're at it. Change-Id: I08e64f4b9438bf2f731c3a37cf2a41152bbbd8fa Reviewed-on: https://pdfium-review.googlesource.com/31916 Commit-Queue: dsinclair Reviewed-by: dsinclair --- core/fpdfapi/page/cpdf_page.h | 7 ++++++- core/fpdfapi/parser/cpdf_document.h | 1 + fpdfsdk/cpdfsdk_pageview.cpp | 15 +++++++++++---- fpdfsdk/fpdf_formfill.cpp | 6 +++--- fpdfsdk/fpdf_text.cpp | 2 +- fpdfsdk/fpdfxfa/cpdfxfa_context.cpp | 4 ++++ fpdfsdk/fpdfxfa/cpdfxfa_context.h | 4 ++-- fpdfsdk/fpdfxfa/cpdfxfa_page.cpp | 4 ++++ fpdfsdk/fpdfxfa/cpdfxfa_page.h | 5 ++++- 9 files changed, 36 insertions(+), 12 deletions(-) diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index 47c5ed94f5..c26c42fc1f 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h @@ -10,6 +10,7 @@ #include #include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" @@ -25,7 +26,11 @@ class CPDF_PageRenderContext; class CPDF_Page : public CPDF_PageObjectHolder { public: class View {}; // Caller implements as desired, empty here due to layering. - class Extension : public Retainable {}; // XFA page parent class, layering. + + // XFA page parent class, layering. + class Extension : public Retainable { + virtual CPDF_Document::Extension* GetDocumentExtension() const = 0; + }; CPDF_Page(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 759dd682a6..5ee3c77bb5 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -45,6 +45,7 @@ class CPDF_Document : public CPDF_IndirectObjectHolder { class Extension { public: virtual ~Extension() {} + virtual CPDF_Document* GetPDFDoc() const = 0; virtual int GetPageCount() const = 0; virtual void DeletePage(int page_index) = 0; }; diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index e648e596c4..87856fb0f0 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp @@ -89,7 +89,8 @@ void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, if (!pPage) return; - if (pPage->GetContext()->GetFormType() == FormType::kXFAFull) { + auto* pContext = static_cast(pPage->GetDocumentExtension()); + if (pContext->GetFormType() == FormType::kXFAFull) { CFX_RectF rectClip( static_cast(pClip.left), static_cast(pClip.top), static_cast(pClip.Width()), static_cast(pClip.Height())); @@ -177,7 +178,11 @@ bool CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { return false; CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage(); - if (!pPage || !pPage->GetContext()->ContainsXFAForm()) + if (!pPage) + return false; + + auto* pContext = static_cast(pPage->GetDocumentExtension()); + if (!pContext->ContainsXFAForm()) return false; CPDFSDK_Annot::ObservedPtr pObserved(pAnnot); @@ -204,7 +209,7 @@ bool CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { CPDF_Document* CPDFSDK_PageView::GetPDFDocument() { if (m_page) { #ifdef PDF_ENABLE_XFA - return m_page->GetContext()->GetPDFDoc(); + return m_page->GetDocumentExtension()->GetPDFDoc(); #else // PDF_ENABLE_XFA return m_page->m_pDocument.Get(); #endif // PDF_ENABLE_XFA @@ -530,7 +535,9 @@ int CPDFSDK_PageView::GetPageIndex() const { return -1; #ifdef PDF_ENABLE_XFA - switch (m_page->GetContext()->GetFormType()) { + auto* pContext = + static_cast(m_page->GetDocumentExtension()); + switch (pContext->GetFormType()) { case FormType::kXFAFull: { CXFA_FFPageView* pPageView = m_page->GetXFAPageView(); return pPageView ? pPageView->GetPageIndex() : -1; diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp index 202835cb57..b99bd5f40d 100644 --- a/fpdfsdk/fpdf_formfill.cpp +++ b/fpdfsdk/fpdf_formfill.cpp @@ -138,10 +138,10 @@ void FFLCommon(FPDF_FORMHANDLE hHandle, return; #ifdef PDF_ENABLE_XFA - CPDFXFA_Context* pContext = pPage->GetContext(); - if (!pContext) + CPDF_Document::Extension* pExtension = pPage->GetDocumentExtension(); + if (!pExtension) return; - CPDF_Document* pPDFDoc = pContext->GetPDFDoc(); + CPDF_Document* pPDFDoc = pExtension->GetPDFDoc(); if (!pPDFDoc) return; CPDFSDK_FormFillEnvironment* pFormFillEnv = diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp index dade84a005..c06885a1a7 100644 --- a/fpdfsdk/fpdf_text.cpp +++ b/fpdfsdk/fpdf_text.cpp @@ -52,7 +52,7 @@ FPDF_EXPORT FPDF_TEXTPAGE FPDF_CALLCONV FPDFText_LoadPage(FPDF_PAGE page) { #ifdef PDF_ENABLE_XFA CPDFXFA_Page* pPage = UnderlyingFromFPDFPage(page); - CPDFXFA_Context* pContext = pPage->GetContext(); + auto* pContext = static_cast(pPage->GetDocumentExtension()); CPDF_ViewerPreferences viewRef(pContext->GetPDFDoc()); #else // PDF_ENABLE_XFA CPDF_ViewerPreferences viewRef(pPDFPage->m_pDocument.Get()); diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp index 97288c67f0..05bb56ca99 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp @@ -180,6 +180,10 @@ RetainPtr CPDFXFA_Context::GetXFAPage( return nullptr; } +CPDF_Document* CPDFXFA_Context::GetPDFDoc() const { + return m_pPDFDoc.get(); +} + void CPDFXFA_Context::DeletePage(int page_index) { // Delete from the document first because, if GetPage was never called for // this |page_index| then |m_XFAPageList| may have size < |page_index| even diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h index 23f1ac2220..c7fe02d8fb 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h +++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h @@ -40,7 +40,6 @@ class CPDFXFA_Context : public CPDF_Document::Extension, ~CPDFXFA_Context() override; bool LoadXFADoc(); - CPDF_Document* GetPDFDoc() { return m_pPDFDoc.get(); } CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); } CXFA_FFDocView* GetXFADocView() { return m_pXFADocView.Get(); } FormType GetFormType() const { return m_FormType; } @@ -48,7 +47,6 @@ class CPDFXFA_Context : public CPDF_Document::Extension, return m_FormType == FormType::kXFAFull || m_FormType == FormType::kXFAForeground; } - CJS_Runtime* GetCJSRuntime() const; CXFA_FFApp* GetXFAApp() { return m_pXFAApp.get(); } CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { @@ -61,6 +59,7 @@ class CPDFXFA_Context : public CPDF_Document::Extension, void ClearChangeMark(); // CPDF_Document::Extension: + CPDF_Document* GetPDFDoc() const override; int GetPageCount() const override; void DeletePage(int page_index) override; @@ -108,6 +107,7 @@ class CPDFXFA_Context : public CPDF_Document::Extension, } private: + CJS_Runtime* GetCJSRuntime() const; void CloseXFADoc(); FormType m_FormType = FormType::kNone; diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp index 8268ed8759..809214dec6 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp @@ -86,6 +86,10 @@ bool CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) { return true; } +CPDF_Document::Extension* CPDFXFA_Page::GetDocumentExtension() const { + return m_pContext.Get(); +} + float CPDFXFA_Page::GetPageWidth() const { if (!m_pPDFPage && !m_pXFAPageView) return 0.0f; diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.h b/fpdfsdk/fpdfxfa/cpdfxfa_page.h index 030b0684b6..4f4d6b0a22 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_page.h +++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.h @@ -10,6 +10,7 @@ #include #include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" @@ -28,7 +29,9 @@ class CPDFXFA_Page : public CPDF_Page::Extension { bool LoadPage(); bool LoadPDFPage(CPDF_Dictionary* pageDict); - CPDFXFA_Context* GetContext() const { return m_pContext.Get(); } + // CPDF_Page::Extension: + CPDF_Document::Extension* GetDocumentExtension() const override; + int GetPageIndex() const { return m_iPageIndex; } CPDF_Page* GetPDFPage() const { return m_pPDFPage.get(); } CXFA_FFPageView* GetXFAPageView() const { return m_pXFAPageView; } -- cgit v1.2.3