diff options
author | Henrique Nakashima <hnakashima@chromium.org> | 2018-05-08 20:32:08 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-05-08 20:32:08 +0000 |
commit | 7b094f81483240f50dfc12e51cf545a8f0d5933d (patch) | |
tree | ca0cb1640471aa895ff381def2638f1baf8f309c | |
parent | 55bbb0a2e7a95bf2c08cbd1d7f1563aec7e5b97d (diff) | |
download | pdfium-7b094f81483240f50dfc12e51cf545a8f0d5933d.tar.xz |
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>
-rw-r--r-- | fpdfsdk/fpdf_editpage.cpp | 1 | ||||
-rw-r--r-- | fpdfsdk/fpdf_formfill.cpp | 26 | ||||
-rw-r--r-- | fpdfsdk/fpdfxfa/cpdfxfa_page.cpp | 56 | ||||
-rw-r--r-- | fpdfsdk/fpdfxfa/cpdfxfa_page.h | 2 |
4 files changed, 57 insertions, 28 deletions
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp index 19c301bf12..ce597d6d6e 100644 --- a/fpdfsdk/fpdf_editpage.cpp +++ b/fpdfsdk/fpdf_editpage.cpp @@ -186,6 +186,7 @@ FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV FPDFPage_New(FPDF_DOCUMENT document, 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 a3a471c1f8..8a43fa6e77 100644 --- a/fpdfsdk/fpdf_formfill.cpp +++ b/fpdfsdk/fpdf_formfill.cpp @@ -621,11 +621,7 @@ FPDF_EXPORT void FPDF_CALLCONV FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, 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 @@ FPDF_EXPORT void FPDF_CALLCONV FORM_DoPageAAction(FPDF_PAGE page, UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); - if (!pPDFPage || !pFormFillEnv->GetPageView(pPage, false)) - return; - - CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHandler(); - CPDF_Dictionary* pPageDict = pPDFPage->GetFormDict(); - if (!pPageDict) + if (!pPDFPage) return; - CPDF_Dictionary* pActionDict = pPageDict->GetDictFor("AA"); - if (!pActionDict) + if (!pFormFillEnv->GetPageView(pPage, false)) return; - CPDF_AAction aa(pActionDict); + CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHandler(); + CPDF_Dictionary* pPageDict = pPDFPage->GetFormDict(); + 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 9fe63f435f..da1c1e521a 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 @@ bool CPDFXFA_Page::LoadPage() { 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 faacf3e0b0..4f4d6b0a22 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_page.h +++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.h @@ -27,6 +27,7 @@ class CPDFXFA_Page : public CPDF_Page::Extension { 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 @@ class CPDFXFA_Page : public CPDF_Page::Extension { CPDFXFA_Page(CPDFXFA_Context* pContext, int page_index); ~CPDFXFA_Page() override; + bool LoadPDFPage(); bool LoadXFAPageView(); private: |