summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpdfsdk/cpdfsdk_pageview.cpp25
-rw-r--r--fpdfsdk/cpdfsdk_widget.cpp11
-rw-r--r--fpdfsdk/cpdfsdk_widgethandler.cpp2
-rw-r--r--fpdfsdk/fpdfformfill.cpp41
-rw-r--r--fpdfsdk/fpdfformfill_embeddertest.cpp20
-rw-r--r--fpdfsdk/fpdfsave.cpp10
-rw-r--r--fpdfsdk/fpdfview.cpp16
-rw-r--r--fpdfsdk/fpdfview_c_api_test.c2
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_context.cpp22
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_context.h8
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp25
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_page.cpp69
-rw-r--r--fpdfsdk/javascript/app.cpp3
-rw-r--r--public/fpdf_formfill.h24
-rw-r--r--samples/pdfium_test.cc8
-rw-r--r--testing/embedder_test.cpp8
-rw-r--r--xfa/fxfa/cxfa_ffdoc.cpp6
-rw-r--r--xfa/fxfa/cxfa_ffdoc.h4
-rw-r--r--xfa/fxfa/cxfa_ffdocview.cpp2
-rw-r--r--xfa/fxfa/fxfa.h9
20 files changed, 151 insertions, 164 deletions
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 516b0eb499..c1b5221235 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -88,7 +88,7 @@ void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
if (!pPage)
return;
- if (pPage->GetContext()->GetDocType() == XFA_DocType::kFull) {
+ if (pPage->GetContext()->GetFormType() == FormType::kXFAFull) {
CFX_RectF rectClip(
static_cast<float>(pClip.left), static_cast<float>(pClip.top),
static_cast<float>(pClip.Width()), static_cast<float>(pClip.Height()));
@@ -176,11 +176,8 @@ bool CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
return false;
CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
- if (!pPage ||
- (pPage->GetContext()->GetDocType() != XFA_DocType::kForegroundOnly &&
- pPage->GetContext()->GetDocType() != XFA_DocType::kFull)) {
+ if (!pPage || !pPage->GetContext()->ContainsXFAForm())
return false;
- }
CPDFSDK_Annot::ObservedPtr pObserved(pAnnot);
if (GetFocusAnnot() == pAnnot)
@@ -429,7 +426,7 @@ void CPDFSDK_PageView::LoadFXAnnots() {
#ifdef PDF_ENABLE_XFA
RetainPtr<CPDFXFA_Page> protector(m_page);
- if (m_pFormFillEnv->GetXFAContext()->GetDocType() == XFA_DocType::kFull) {
+ if (m_pFormFillEnv->GetXFAContext()->GetFormType() == FormType::kXFAFull) {
CXFA_FFPageView* pageView = m_page->GetXFAPageView();
std::unique_ptr<IXFA_WidgetIterator> pWidgetHandler(
pageView->CreateWidgetIterator(
@@ -486,20 +483,18 @@ int CPDFSDK_PageView::GetPageIndex() const {
return -1;
#ifdef PDF_ENABLE_XFA
- switch (m_page->GetContext()->GetDocType()) {
- case XFA_DocType::kFull: {
+ switch (m_page->GetContext()->GetFormType()) {
+ case FormType::kXFAFull: {
CXFA_FFPageView* pPageView = m_page->GetXFAPageView();
return pPageView ? pPageView->GetPageIndex() : -1;
}
- case XFA_DocType::kForegroundOnly:
- case XFA_DocType::kNone:
- return GetPageIndexForStaticPDF();
- default:
- return -1;
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
+ break;
}
-#else // PDF_ENABLE_XFA
- return GetPageIndexForStaticPDF();
#endif // PDF_ENABLE_XFA
+ return GetPageIndexForStaticPDF();
}
bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const {
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 0e121e8596..0c525129c4 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -72,7 +72,7 @@ CPDFSDK_Widget::~CPDFSDK_Widget() {}
#ifdef PDF_ENABLE_XFA
CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const {
CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
- if (pContext->GetDocType() == XFA_DocType::kForegroundOnly) {
+ if (pContext->GetFormType() == FormType::kXFAForeground) {
if (!m_hMixXFAWidget) {
if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) {
WideString sName;
@@ -95,7 +95,7 @@ CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const {
CXFA_FFWidget* CPDFSDK_Widget::GetGroupMixXFAWidget() {
CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
- if (pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (pContext->GetFormType() != FormType::kXFAForeground)
return nullptr;
CXFA_FFDocView* pDocView = pContext->GetXFADocView();
@@ -108,7 +108,7 @@ CXFA_FFWidget* CPDFSDK_Widget::GetGroupMixXFAWidget() {
CXFA_FFWidgetHandler* CPDFSDK_Widget::GetXFAWidgetHandler() const {
CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
- if (pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (pContext->GetFormType() != FormType::kXFAForeground)
return nullptr;
if (!m_pWidgetHandler) {
@@ -506,9 +506,8 @@ int CPDFSDK_Widget::GetFieldType() const {
bool CPDFSDK_Widget::IsAppearanceValid() {
#ifdef PDF_ENABLE_XFA
CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
- XFA_DocType nDocType = pContext->GetDocType();
- if (nDocType != XFA_DocType::kNone &&
- nDocType != XFA_DocType::kForegroundOnly)
+ FormType formType = pContext->GetFormType();
+ if (formType == FormType::kXFAFull)
return true;
#endif // PDF_ENABLE_XFA
return CPDFSDK_BAAnnot::IsAppearanceValid();
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 44c1c66b1c..3eb8e5d364 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -242,7 +242,7 @@ void CPDFSDK_WidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {
#ifdef PDF_ENABLE_XFA
CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
CPDFXFA_Context* pContext = pPageView->GetFormFillEnv()->GetXFAContext();
- if (pContext->GetDocType() == XFA_DocType::kForegroundOnly) {
+ if (pContext->GetFormType() == FormType::kXFAForeground) {
if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty())
pWidget->ResetAppearance(false);
}
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index 9e8b69e29e..d70b678206 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -33,13 +33,15 @@
#include "xfa/fxfa/cxfa_ffpageview.h"
#include "xfa/fxfa/cxfa_ffwidget.h"
-static_assert(static_cast<int>(XFA_DocType::kNone) == XFADOCTYPE_NONE,
- "PDF doctype must match");
-static_assert(static_cast<int>(XFA_DocType::kFull) == XFADOCTYPE_FULL,
- "Dynamic XFA doctype must match");
-static_assert(static_cast<int>(XFA_DocType::kForegroundOnly) ==
- XFADOCTYPE_FOREGROUNDONLY,
- "Static XFA doctype must match");
+static_assert(static_cast<int>(FormType::kNone) == FORMTYPE_NONE,
+ "None form types must match");
+static_assert(static_cast<int>(FormType::kAcroForm) == FORMTYPE_ACRO_FORM,
+ "AcroForm form types must match");
+static_assert(static_cast<int>(FormType::kXFAFull) == FORMTYPE_XFA_FULL,
+ "XFA full form types must match");
+static_assert(static_cast<int>(FormType::kXFAForeground) ==
+ FORMTYPE_XFA_FOREGROUND,
+ "XFA foreground form types must match");
#endif // PDF_ENABLE_XFA
namespace {
@@ -457,10 +459,8 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_Undo(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly) {
+ if (!pContext->ContainsXFAForm())
return;
- }
static_cast<CXFA_FFWidget*>(hWidget)->Undo();
}
@@ -471,8 +471,7 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_Redo(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
static_cast<CXFA_FFWidget*>(hWidget)->Redo();
@@ -484,8 +483,7 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_SelectAll(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
static_cast<CXFA_FFWidget*>(hWidget)->SelectAll();
@@ -499,8 +497,7 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_Copy(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
WideString wsCpText;
@@ -531,8 +528,7 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_Cut(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
WideString wsCpText;
@@ -563,8 +559,7 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_Widget_Paste(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
WideString wstr = WideString::FromUTF16LE(wsText, size);
@@ -581,8 +576,7 @@ FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document,
return;
CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
CFX_PointF ptPopup;
@@ -602,8 +596,7 @@ FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document,
return;
auto* pContext = static_cast<CPDFXFA_Context*>(document);
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return;
CFX_PointF ptPopup;
diff --git a/fpdfsdk/fpdfformfill_embeddertest.cpp b/fpdfsdk/fpdfformfill_embeddertest.cpp
index f5151cc456..7a9ebcfdd2 100644
--- a/fpdfsdk/fpdfformfill_embeddertest.cpp
+++ b/fpdfsdk/fpdfformfill_embeddertest.cpp
@@ -565,6 +565,26 @@ TEST_F(FPDFFormFillEmbeddertest, FormText) {
TestAndCloseSaved(300, 300, md5_3);
}
+TEST_F(FPDFFormFillEmbeddertest, HasFormInfoNone) {
+ EXPECT_TRUE(OpenDocument("hello_world.pdf"));
+ EXPECT_EQ(FORMTYPE_NONE, FPDF_GetFormType(document_));
+}
+
+TEST_F(FPDFFormFillEmbeddertest, HasFormInfoAcroForm) {
+ EXPECT_TRUE(OpenDocument("text_form.pdf"));
+ EXPECT_EQ(FORMTYPE_ACRO_FORM, FPDF_GetFormType(document_));
+}
+
+TEST_F(FPDFFormFillEmbeddertest, HasFormInfoXFAFull) {
+ EXPECT_TRUE(OpenDocument("simple_xfa.pdf"));
+ EXPECT_EQ(FORMTYPE_XFA_FULL, FPDF_GetFormType(document_));
+}
+
+TEST_F(FPDFFormFillEmbeddertest, HasFormInfoXFAForeground) {
+ EXPECT_TRUE(OpenDocument("bug_216.pdf"));
+ EXPECT_EQ(FORMTYPE_XFA_FOREGROUND, FPDF_GetFormType(document_));
+}
+
TEST_F(FPDFFormFillTextFormEmbeddertest, GetSelectedTextEmptyAndBasicKeyboard) {
// Test empty selection.
CheckSelection(L"");
diff --git a/fpdfsdk/fpdfsave.cpp b/fpdfsdk/fpdfsave.cpp
index 783a913022..5acdef0a60 100644
--- a/fpdfsdk/fpdfsave.cpp
+++ b/fpdfsdk/fpdfsave.cpp
@@ -48,10 +48,8 @@ bool SaveXFADocumentData(CPDFXFA_Context* pContext,
if (!pContext)
return false;
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly) {
+ if (!pContext->ContainsXFAForm())
return true;
- }
CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
if (!pXFADocView)
@@ -192,8 +190,7 @@ bool SendPostSaveToXFADoc(CPDFXFA_Context* pContext) {
if (!pContext)
return false;
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return true;
CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
@@ -215,8 +212,7 @@ bool SendPostSaveToXFADoc(CPDFXFA_Context* pContext) {
bool SendPreSaveToXFADoc(CPDFXFA_Context* pContext,
std::vector<RetainPtr<IFX_SeekableStream>>* fileList) {
- if (pContext->GetDocType() != XFA_DocType::kFull &&
- pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!pContext->ContainsXFAForm())
return true;
CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 9a8e8eb0b5..98a5b32d96 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -565,30 +565,28 @@ FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password) {
password);
}
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_HasXFAField(FPDF_DOCUMENT document,
- int* docType) {
+FPDF_EXPORT int FPDF_CALLCONV FPDF_GetFormType(FPDF_DOCUMENT document) {
if (!document)
return false;
const CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
- return false;
+ return FORMTYPE_NONE;
const CPDF_Dictionary* pRoot = pDoc->GetRoot();
if (!pRoot)
- return false;
+ return FORMTYPE_NONE;
CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm");
if (!pAcroForm)
- return false;
+ return FORMTYPE_NONE;
CPDF_Object* pXFA = pAcroForm->GetObjectFor("XFA");
if (!pXFA)
- return false;
+ return FORMTYPE_ACRO_FORM;
- bool bDynamicXFA = pRoot->GetBooleanFor("NeedsRendering", false);
- *docType = bDynamicXFA ? XFADOCTYPE_FULL : XFADOCTYPE_FOREGROUNDONLY;
- return true;
+ bool needsRendering = pRoot->GetBooleanFor("NeedsRendering", false);
+ return needsRendering ? FORMTYPE_XFA_FULL : FORMTYPE_XFA_FOREGROUND;
}
#ifdef PDF_ENABLE_XFA
diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c
index bf1a0c4877..1526ffa8ae 100644
--- a/fpdfsdk/fpdfview_c_api_test.c
+++ b/fpdfsdk/fpdfview_c_api_test.c
@@ -210,7 +210,7 @@ int CheckPDFiumCApi() {
CHK(FPDF_SetFormFieldHighlightAlpha);
CHK(FPDF_RemoveFormFieldHighlight);
CHK(FPDF_FFLDraw);
- CHK(FPDF_HasXFAField);
+ CHK(FPDF_GetFormType);
#ifdef PDF_ENABLE_XFA
CHK(FPDF_LoadXFA);
CHK(FPDF_Widget_Undo);
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 692306aebf..95f1efcfca 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -36,7 +36,7 @@ extern int GetLastError();
#endif
CPDFXFA_Context::CPDFXFA_Context(std::unique_ptr<CPDF_Document> pPDFDoc)
- : m_iDocType(XFA_DocType::kNone),
+ : m_FormType(FormType::kNone),
m_pPDFDoc(std::move(pPDFDoc)),
m_pFormFillEnv(nullptr),
m_pXFADocView(nullptr),
@@ -117,10 +117,10 @@ bool CPDFXFA_Context::LoadXFADoc() {
m_pXFADoc->StopLoad();
m_pXFADoc->GetXFADoc()->InitScriptContext(GetJSERuntime());
- if (m_pXFADoc->GetDocType() == XFA_DocType::kFull)
- m_iDocType = XFA_DocType::kFull;
+ if (m_pXFADoc->GetFormType() == FormType::kXFAFull)
+ m_FormType = FormType::kXFAFull;
else
- m_iDocType = XFA_DocType::kForegroundOnly;
+ m_FormType = FormType::kXFAForeground;
m_pXFADocView = m_pXFADoc->CreateDocView();
if (m_pXFADocView->StartLayout() < 0) {
@@ -140,17 +140,17 @@ int CPDFXFA_Context::GetPageCount() const {
if (!m_pPDFDoc && !m_pXFADoc)
return 0;
- switch (m_iDocType) {
- case XFA_DocType::kNone:
- case XFA_DocType::kForegroundOnly:
+ switch (m_FormType) {
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
if (m_pPDFDoc)
return m_pPDFDoc->GetPageCount();
- case XFA_DocType::kFull:
+ case FormType::kXFAFull:
if (m_pXFADoc)
return m_pXFADocView->CountPageViews();
- default:
- return 0;
}
+ return 0;
}
RetainPtr<CPDFXFA_Page> CPDFXFA_Context::GetXFAPage(int page_index) {
@@ -183,7 +183,7 @@ RetainPtr<CPDFXFA_Page> CPDFXFA_Context::GetXFAPage(
if (!m_pXFADoc)
return nullptr;
- if (m_iDocType != XFA_DocType::kFull)
+ if (m_FormType != FormType::kXFAFull)
return nullptr;
for (auto& pTempPage : m_XFAPageList) {
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
index 52af64ac86..f5b62f53da 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
@@ -40,7 +40,11 @@ class CPDFXFA_Context : public IXFA_AppProvider {
CPDF_Document* GetPDFDoc() { return m_pPDFDoc.get(); }
CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); }
CXFA_FFDocView* GetXFADocView() { return m_pXFADocView.Get(); }
- XFA_DocType GetDocType() const { return m_iDocType; }
+ FormType GetFormType() const { return m_FormType; }
+ bool ContainsXFAForm() const {
+ return m_FormType == FormType::kXFAFull ||
+ m_FormType == FormType::kXFAForeground;
+ }
v8::Isolate* GetJSERuntime() const;
CXFA_FFApp* GetXFAApp() { return m_pXFAApp.get(); }
@@ -101,7 +105,7 @@ class CPDFXFA_Context : public IXFA_AppProvider {
private:
void CloseXFADoc();
- XFA_DocType m_iDocType;
+ FormType m_FormType;
std::unique_ptr<CPDF_Document> m_pPDFDoc;
std::unique_ptr<CXFA_FFDoc> m_pXFADoc;
Observable<CPDFSDK_FormFillEnvironment>::ObservedPtr m_pFormFillEnv;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 91322ee103..a5cdd3c8d1 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -55,7 +55,7 @@ void CPDFXFA_DocEnvironment::InvalidateRect(CXFA_FFPageView* pPageView,
if (!m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
return;
- if (m_pContext->GetDocType() != XFA_DocType::kFull)
+ if (m_pContext->GetFormType() != FormType::kXFAFull)
return;
RetainPtr<CPDFXFA_Page> pPage = m_pContext->GetXFAPage(pPageView);
@@ -76,7 +76,7 @@ void CPDFXFA_DocEnvironment::DisplayCaret(CXFA_FFWidget* hWidget,
!m_pContext->GetFormFillEnv() || !m_pContext->GetXFADocView())
return;
- if (m_pContext->GetDocType() != XFA_DocType::kFull)
+ if (m_pContext->GetFormType() != FormType::kXFAFull)
return;
CXFA_FFWidgetHandler* pWidgetHandler =
@@ -289,7 +289,7 @@ void CPDFXFA_DocEnvironment::PageViewEvent(CXFA_FFPageView* pPageView,
void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget,
CXFA_WidgetAcc* pWidgetData) {
- if (m_pContext->GetDocType() != XFA_DocType::kFull || !hWidget)
+ if (m_pContext->GetFormType() != FormType::kXFAFull || !hWidget)
return;
CXFA_FFPageView* pPageView = hWidget->GetPageView();
@@ -307,7 +307,7 @@ void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget,
void CPDFXFA_DocEnvironment::WidgetPreRemove(CXFA_FFWidget* hWidget,
CXFA_WidgetAcc* pWidgetData) {
- if (m_pContext->GetDocType() != XFA_DocType::kFull || !hWidget)
+ if (m_pContext->GetFormType() != FormType::kXFAFull || !hWidget)
return;
CXFA_FFPageView* pPageView = hWidget->GetPageView();
@@ -334,7 +334,7 @@ int32_t CPDFXFA_DocEnvironment::CountPages(CXFA_FFDoc* hDoc) {
int32_t CPDFXFA_DocEnvironment::GetCurrentPage(CXFA_FFDoc* hDoc) {
if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv())
return -1;
- if (m_pContext->GetDocType() != XFA_DocType::kFull)
+ if (m_pContext->GetFormType() != FormType::kXFAFull)
return -1;
CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
@@ -347,7 +347,7 @@ int32_t CPDFXFA_DocEnvironment::GetCurrentPage(CXFA_FFDoc* hDoc) {
void CPDFXFA_DocEnvironment::SetCurrentPage(CXFA_FFDoc* hDoc,
int32_t iCurPage) {
if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv() ||
- m_pContext->GetDocType() != XFA_DocType::kFull || iCurPage < 0 ||
+ m_pContext->GetFormType() != FormType::kXFAFull || iCurPage < 0 ||
iCurPage >= m_pContext->GetFormFillEnv()->GetPageCount()) {
return;
}
@@ -407,10 +407,8 @@ void CPDFXFA_DocEnvironment::ExportData(CXFA_FFDoc* hDoc,
if (hDoc != m_pContext->GetXFADoc())
return;
- if (m_pContext->GetDocType() != XFA_DocType::kFull &&
- m_pContext->GetDocType() != XFA_DocType::kForegroundOnly) {
+ if (!m_pContext->ContainsXFAForm())
return;
- }
CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
if (!pFormFillEnv)
@@ -506,7 +504,7 @@ void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc,
if (hDoc != m_pContext->GetXFADoc())
return;
- if (m_pContext->GetDocType() != XFA_DocType::kFull)
+ if (m_pContext->GetFormType() != FormType::kXFAFull)
return;
CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
@@ -606,10 +604,8 @@ bool CPDFXFA_DocEnvironment::NotifySubmit(bool bPrevOrPost) {
}
bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() {
- if (m_pContext->GetDocType() != XFA_DocType::kFull &&
- m_pContext->GetDocType() != XFA_DocType::kForegroundOnly) {
+ if (!m_pContext->ContainsXFAForm())
return true;
- }
if (!m_pContext->GetXFADocView())
return true;
@@ -658,8 +654,7 @@ bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() {
}
void CPDFXFA_DocEnvironment::OnAfterNotifySubmit() {
- if (m_pContext->GetDocType() != XFA_DocType::kFull &&
- m_pContext->GetDocType() != XFA_DocType::kForegroundOnly)
+ if (!m_pContext->ContainsXFAForm())
return;
if (!m_pContext->GetXFADocView())
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index fa10a925cd..fbea90d9a9 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -64,15 +64,15 @@ bool CPDFXFA_Page::LoadPage() {
if (!m_pContext || m_iPageIndex < 0)
return false;
- switch (m_pContext->GetDocType()) {
- case XFA_DocType::kNone:
- case XFA_DocType::kForegroundOnly:
+ switch (m_pContext->GetFormType()) {
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
return LoadPDFPage();
- case XFA_DocType::kFull:
+ case FormType::kXFAFull:
return LoadXFAPageView();
- default:
- return false;
}
+ return false;
}
bool CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) {
@@ -89,20 +89,15 @@ float CPDFXFA_Page::GetPageWidth() const {
if (!m_pPDFPage && !m_pXFAPageView)
return 0.0f;
- switch (m_pContext->GetDocType()) {
- case XFA_DocType::kFull: {
- if (m_pXFAPageView)
- return m_pXFAPageView->GetPageViewRect().width;
- break;
- }
- case XFA_DocType::kForegroundOnly:
- case XFA_DocType::kNone: {
+ switch (m_pContext->GetFormType()) {
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
if (m_pPDFPage)
return m_pPDFPage->GetPageWidth();
- break;
- }
- default:
- return 0.0f;
+ case FormType::kXFAFull:
+ if (m_pXFAPageView)
+ return m_pXFAPageView->GetPageViewRect().width;
}
return 0.0f;
@@ -112,20 +107,15 @@ float CPDFXFA_Page::GetPageHeight() const {
if (!m_pPDFPage && !m_pXFAPageView)
return 0.0f;
- switch (m_pContext->GetDocType()) {
- case XFA_DocType::kNone:
- case XFA_DocType::kForegroundOnly: {
+ switch (m_pContext->GetFormType()) {
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
if (m_pPDFPage)
return m_pPDFPage->GetPageHeight();
- break;
- }
- case XFA_DocType::kFull: {
+ case FormType::kXFAFull:
if (m_pXFAPageView)
return m_pXFAPageView->GetPageViewRect().height;
- break;
- }
- default:
- return 0.0f;
}
return 0.0f;
@@ -182,22 +172,17 @@ CFX_Matrix CPDFXFA_Page::GetDisplayMatrix(int xPos,
if (!m_pPDFPage && !m_pXFAPageView)
return CFX_Matrix();
- switch (m_pContext->GetDocType()) {
- case XFA_DocType::kFull: {
- if (m_pXFAPageView) {
- return m_pXFAPageView->GetDisplayMatrix(
- CFX_Rect(xPos, yPos, xSize, ySize), iRotate);
- }
- break;
- }
- case XFA_DocType::kNone:
- case XFA_DocType::kForegroundOnly: {
+ switch (m_pContext->GetFormType()) {
+ case FormType::kNone:
+ case FormType::kAcroForm:
+ case FormType::kXFAForeground:
if (m_pPDFPage)
return m_pPDFPage->GetDisplayMatrix(xPos, yPos, xSize, ySize, iRotate);
- break;
- }
- default:
- return CFX_Matrix();
+ case FormType::kXFAFull:
+ if (m_pXFAPageView)
+ return m_pXFAPageView->GetDisplayMatrix(
+ CFX_Rect(xPos, yPos, xSize, ySize), iRotate);
}
+
return CFX_Matrix();
}
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index f29a098fde..eec468186f 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -282,8 +282,7 @@ bool app::viewerVersion(CJS_Runtime* pRuntime,
return false;
#ifdef PDF_ENABLE_XFA
CPDFXFA_Context* pXFAContext = pRuntime->GetFormFillEnv()->GetXFAContext();
- if (pXFAContext->GetDocType() == XFA_DocType::kFull ||
- pXFAContext->GetDocType() == XFA_DocType::kForegroundOnly) {
+ if (pXFAContext->ContainsXFAForm()) {
vp << JS_NUM_VIEWERVERSION_XFA;
return true;
}
diff --git a/public/fpdf_formfill.h b/public/fpdf_formfill.h
index 1e0d305a6f..0204c846d3 100644
--- a/public/fpdf_formfill.h
+++ b/public/fpdf_formfill.h
@@ -12,10 +12,11 @@
typedef void* FPDF_FORMHANDLE;
-#define XFADOCTYPE_NONE 0 // Document contains no XFA forms
-#define XFADOCTYPE_FULL 1 // XFA forms are specified using the entire XFA spec
-#define XFADOCTYPE_FOREGROUNDONLY \
- 2 // XFA forms are specified using the XFAF subset
+#define FORMTYPE_NONE 0 // Document contains no forms
+#define FORMTYPE_ACRO_FORM 1 // Forms are specified using AcroForm spec
+#define FORMTYPE_XFA_FULL 2 // Forms are specified using the entire XFA spec
+#define FORMTYPE_XFA_FOREGROUND \
+ 3 // Forms are specified using the XFAF subset of XFA spec
// Exported Functions
#ifdef __cplusplus
@@ -1607,20 +1608,19 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLRecord(FPDF_FORMHANDLE hHandle,
#endif
/**
- * Function: FPDF_HasXFAField
- * This method is designed to check whether a pdf document
- *has XFA fields.
+ * Experimental API
+ * Function: FPDF_GetFormType
+ * Returns the type of form contained in the PDF document.
* Parameters:
* document - Handle to document.
*Returned by FPDF_LoadDocument function.
* docType - Document type defined as
- *XFADOCTYPE_xxx.
+ *FORMTYPE_xxx.
* Return Value:
- * TRUE indicates that the input document has XFA fields,
- *otherwise FALSE.
+ * Integer value representing one of the FORMTYPE_xxx
+ *values.
**/
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_HasXFAField(FPDF_DOCUMENT document,
- int* docType);
+FPDF_EXPORT int FPDF_CALLCONV FPDF_GetFormType(FPDF_DOCUMENT document);
#ifdef PDF_ENABLE_XFA
/**
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index a638fd0822..644aee7819 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -1430,10 +1430,10 @@ void RenderPdf(const std::string& name,
form_callbacks.form_handle = form.get();
#ifdef PDF_ENABLE_XFA
- int doc_type = XFADOCTYPE_NONE;
- if (FPDF_HasXFAField(doc.get(), &doc_type) && doc_type != XFADOCTYPE_NONE &&
- !FPDF_LoadXFA(doc.get())) {
- fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n");
+ int doc_type = FPDF_GetFormType(doc.get());
+ if (doc_type == FORMTYPE_XFA_FULL || doc_type == FORMTYPE_XFA_FOREGROUND) {
+ if (!FPDF_LoadXFA(doc.get()))
+ fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n");
}
#endif // PDF_ENABLE_XFA
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp
index 41be0c0298..2694977384 100644
--- a/testing/embedder_test.cpp
+++ b/testing/embedder_test.cpp
@@ -205,11 +205,9 @@ bool EmbedderTest::OpenDocumentHelper(const char* password,
}
*form_handle = SetupFormFillEnvironment(*document);
#ifdef PDF_ENABLE_XFA
- int docType = XFADOCTYPE_NONE;
- if (FPDF_HasXFAField(*document, &docType)) {
- if (docType != XFADOCTYPE_NONE)
- (void)FPDF_LoadXFA(*document);
- }
+ int doc_type = FPDF_GetFormType(*document);
+ if (doc_type == FORMTYPE_XFA_FULL || doc_type == FORMTYPE_XFA_FOREGROUND)
+ FPDF_LoadXFA(*document);
#endif // PDF_ENABLE_XFA
(void)FPDF_GetDocPermissions(*document);
return true;
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index 23b3df638e..fed20caaa4 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -160,7 +160,7 @@ CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocEnvironment* pDocEnvironment)
m_pApp(pApp),
m_pNotify(nullptr),
m_pPDFDoc(nullptr),
- m_dwDocType(XFA_DocType::kForegroundOnly) {}
+ m_FormType(FormType::kXFAForeground) {}
CXFA_FFDoc::~CXFA_FFDoc() {
CloseDoc();
@@ -244,7 +244,7 @@ void CXFA_FFDoc::StopLoad() {
m_pPDFFontMgr = pdfium::MakeUnique<CFGAS_PDFFontMgr>(
GetPDFDoc(), GetApp()->GetFDEFontMgr());
- m_dwDocType = XFA_DocType::kForegroundOnly;
+ m_FormType = FormType::kXFAForeground;
CXFA_Node* pConfig = ToNode(
m_pDocumentParser->GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
if (!pConfig)
@@ -265,7 +265,7 @@ void CXFA_FFDoc::StopLoad() {
WideString wsType;
if (pDynamicRender->TryContent(wsType) && wsType == L"required")
- m_dwDocType = XFA_DocType::kFull;
+ m_FormType = FormType::kXFAFull;
}
CXFA_FFDocView* CXFA_FFDoc::CreateDocView() {
diff --git a/xfa/fxfa/cxfa_ffdoc.h b/xfa/fxfa/cxfa_ffdoc.h
index c85c951e04..490b023f0d 100644
--- a/xfa/fxfa/cxfa_ffdoc.h
+++ b/xfa/fxfa/cxfa_ffdoc.h
@@ -54,7 +54,7 @@ class CXFA_FFDoc {
IXFA_DocEnvironment* GetDocEnvironment() const {
return m_pDocEnvironment.Get();
}
- XFA_DocType GetDocType() const { return m_dwDocType; }
+ FormType GetFormType() const { return m_FormType; }
int32_t StartLoad();
int32_t DoLoad();
@@ -91,7 +91,7 @@ class CXFA_FFDoc {
std::map<uint32_t, FX_IMAGEDIB_AND_DPI> m_HashToDibDpiMap;
std::unique_ptr<CXFA_FFDocView> m_DocView;
std::unique_ptr<CFGAS_PDFFontMgr> m_pPDFFontMgr;
- XFA_DocType m_dwDocType;
+ FormType m_FormType;
};
#endif // XFA_FXFA_CXFA_FFDOC_H_
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 0e895b676e..3ac705c8b2 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -622,7 +622,7 @@ void CXFA_FFDocView::DestroyDocView() {
}
bool CXFA_FFDocView::IsStaticNotify() {
- return m_pDoc->GetDocType() == XFA_DocType::kForegroundOnly;
+ return m_pDoc->GetFormType() == FormType::kXFAForeground;
}
void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
diff --git a/xfa/fxfa/fxfa.h b/xfa/fxfa/fxfa.h
index 9f5432e3ad..ee74fc14dd 100644
--- a/xfa/fxfa/fxfa.h
+++ b/xfa/fxfa/fxfa.h
@@ -40,8 +40,13 @@ class IXFA_WidgetIterator;
#define XFA_IDNo 3
#define XFA_IDYes 4
-// Note, values match fpdf_formfill.h XFADOCTYPE_* flags.
-enum class XFA_DocType { kNone = 0, kFull = 1, kForegroundOnly = 2 };
+// Note, values must match fpdf_formfill.h FORMTYPE_* flags.
+enum class FormType {
+ kNone = 0,
+ kAcroForm = 1,
+ kXFAFull = 2,
+ kXFAForeground = 3
+};
#define XFA_PARSESTATUS_StatusErr -3
#define XFA_PARSESTATUS_StreamErr -2