Remove some CPDFXFA_Context usage from top-level fpdfsdk layer.
The CPDF_Document::Extension is intended to keep non-xfa code
blissfully ignorant of the XFA feature bolted onto the side of it.
The cost is a few static_casts<> until the Extension gains a
few more virtual methods to cover these cases.
Use IPDF_Page abstraction in a few places where knowledge of
the underlying CPDFXFA_Page isn't required.
CJS_App becomes unaware of XFA while we're at it, with some
small changes for corner cases in the XFA case when no FFI,
etc.
Change-Id: Ie5d484d1c391d9f82947528b4856d7882f8cfad2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59250
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index 7bd94f5..543611d 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -45,6 +45,7 @@
virtual int GetPageCount() const = 0;
virtual void DeletePage(int page_index) = 0;
virtual uint32_t GetUserPermissions() const = 0;
+ virtual bool ContainsExtensionForm() const = 0;
};
class LinkListIface {
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 7bf6162..634fd70 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -24,10 +24,6 @@
#include "third_party/base/ptr_util.h"
#include "third_party/base/stl_util.h"
-#ifdef PDF_ENABLE_XFA
-#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
-#endif
-
FPDF_WIDESTRING AsFPDFWideString(ByteString* bsUTF16LE) {
// Force a private version of the string, since we're about to hand it off
// to the embedder. Should the embedder modify it by accident, it won't
@@ -106,6 +102,63 @@
}
#ifdef PDF_ENABLE_V8
+CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() {
+ IPDF_Page* pPage = IPDFPageFromFPDFPage(GetCurrentPage());
+ return pPage ? GetPageView(pPage, true) : nullptr;
+}
+
+FPDF_PAGE CPDFSDK_FormFillEnvironment::GetCurrentPage() const {
+ if (m_pInfo && m_pInfo->FFI_GetCurrentPage) {
+ return m_pInfo->FFI_GetCurrentPage(
+ m_pInfo, FPDFDocumentFromCPDFDocument(m_pCPDFDoc.Get()));
+ }
+ return nullptr;
+}
+
+WideString CPDFSDK_FormFillEnvironment::GetLanguage() {
+#ifdef PDF_ENABLE_XFA
+ if (!m_pInfo || !m_pInfo->FFI_GetLanguage)
+ return WideString();
+
+ int nRequiredLen = m_pInfo->FFI_GetLanguage(m_pInfo, nullptr, 0);
+ if (nRequiredLen <= 0)
+ return WideString();
+
+ std::vector<uint8_t> pBuff(nRequiredLen);
+ int nActualLen =
+ m_pInfo->FFI_GetLanguage(m_pInfo, pBuff.data(), nRequiredLen);
+ if (nActualLen <= 0 || nActualLen > nRequiredLen)
+ return WideString();
+
+ return WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.data()),
+ nActualLen / sizeof(uint16_t));
+#else // PDF_ENABLE_XFA
+ return WideString();
+#endif // PDF_ENABLE_XFA
+}
+
+WideString CPDFSDK_FormFillEnvironment::GetPlatform() {
+#ifdef PDF_ENABLE_XFA
+ if (!m_pInfo || !m_pInfo->FFI_GetPlatform)
+ return WideString();
+
+ int nRequiredLen = m_pInfo->FFI_GetPlatform(m_pInfo, nullptr, 0);
+ if (nRequiredLen <= 0)
+ return WideString();
+
+ std::vector<uint8_t> pBuff(nRequiredLen);
+ int nActualLen =
+ m_pInfo->FFI_GetPlatform(m_pInfo, pBuff.data(), nRequiredLen);
+ if (nActualLen <= 0 || nActualLen > nRequiredLen)
+ return WideString();
+
+ return WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.data()),
+ nActualLen / sizeof(uint16_t));
+#else // PDF_ENABLE_XFA
+ return WideString();
+#endif // PDF_ENABLE_XFA
+}
+
int CPDFSDK_FormFillEnvironment::JS_appAlert(const WideString& Msg,
const WideString& Title,
int Type,
@@ -311,16 +364,6 @@
m_pInfo->FFI_OnChange(m_pInfo);
}
-#ifdef PDF_ENABLE_V8
-FPDF_PAGE CPDFSDK_FormFillEnvironment::GetCurrentPage() const {
- if (m_pInfo && m_pInfo->FFI_GetCurrentPage) {
- return m_pInfo->FFI_GetCurrentPage(
- m_pInfo, FPDFDocumentFromCPDFDocument(m_pCPDFDoc.Get()));
- }
- return nullptr;
-}
-#endif
-
void CPDFSDK_FormFillEnvironment::ExecuteNamedAction(const char* namedAction) {
if (m_pInfo && m_pInfo->FFI_ExecuteNamedAction)
m_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction);
@@ -350,7 +393,11 @@
}
#ifdef PDF_ENABLE_XFA
-void CPDFSDK_FormFillEnvironment::DisplayCaret(CPDFXFA_Page* page,
+int CPDFSDK_FormFillEnvironment::GetPageViewCount() const {
+ return pdfium::CollectionSize<int>(m_PageMap);
+}
+
+void CPDFSDK_FormFillEnvironment::DisplayCaret(IPDF_Page* page,
FPDF_BOOL bVisible,
double left,
double top,
@@ -376,24 +423,6 @@
m_pInfo, FPDFDocumentFromCPDFDocument(m_pCPDFDoc.Get()), iCurPage);
}
-WideString CPDFSDK_FormFillEnvironment::GetPlatform() {
- if (!m_pInfo || !m_pInfo->FFI_GetPlatform)
- return WideString();
-
- int nRequiredLen = m_pInfo->FFI_GetPlatform(m_pInfo, nullptr, 0);
- if (nRequiredLen <= 0)
- return WideString();
-
- std::vector<uint8_t> pBuff(nRequiredLen);
- int nActualLen =
- m_pInfo->FFI_GetPlatform(m_pInfo, pBuff.data(), nRequiredLen);
- if (nActualLen <= 0 || nActualLen > nRequiredLen)
- return WideString();
-
- return WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.data()),
- nActualLen / sizeof(uint16_t));
-}
-
void CPDFSDK_FormFillEnvironment::GotoURL(const WideString& wsURL) {
if (!m_pInfo || !m_pInfo->FFI_GotoURL)
return;
@@ -403,7 +432,7 @@
AsFPDFWideString(&bsTo));
}
-FS_RECTF CPDFSDK_FormFillEnvironment::GetPageViewRect(CPDFXFA_Page* page) {
+FS_RECTF CPDFSDK_FormFillEnvironment::GetPageViewRect(IPDF_Page* page) {
FS_RECTF rect = {0.0f, 0.0f, 0.0f, 0.0f};
if (!m_pInfo || !m_pInfo->FFI_GetPageViewRect)
return rect;
@@ -422,7 +451,7 @@
return rect;
}
-bool CPDFSDK_FormFillEnvironment::PopupMenu(CPDFXFA_Page* page,
+bool CPDFSDK_FormFillEnvironment::PopupMenu(IPDF_Page* page,
FPDF_WIDGET hWidget,
int menuFlag,
const CFX_PointF& pt) {
@@ -514,24 +543,6 @@
AsFPDFWideString(&bsEncode));
}
-WideString CPDFSDK_FormFillEnvironment::GetLanguage() {
- if (!m_pInfo || !m_pInfo->FFI_GetLanguage)
- return WideString();
-
- int nRequiredLen = m_pInfo->FFI_GetLanguage(m_pInfo, nullptr, 0);
- if (nRequiredLen <= 0)
- return WideString();
-
- std::vector<uint8_t> pBuff(nRequiredLen);
- int nActualLen =
- m_pInfo->FFI_GetLanguage(m_pInfo, pBuff.data(), nRequiredLen);
- if (nActualLen <= 0 || nActualLen > nRequiredLen)
- return WideString();
-
- return WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.data()),
- nActualLen / sizeof(uint16_t));
-}
-
void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount,
uint32_t dwEventType) const {
if (m_pInfo && m_pInfo->FFI_PageEvent)
@@ -565,13 +576,6 @@
return pPageView;
}
-#ifdef PDF_ENABLE_V8
-CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() {
- IPDF_Page* pPage = IPDFPageFromFPDFPage(GetCurrentPage());
- return pPage ? GetPageView(pPage, true) : nullptr;
-}
-#endif
-
CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView(int nIndex) {
IPDF_Page* pTempPage = GetPage(nIndex);
if (!pTempPage)
@@ -729,22 +733,6 @@
return !m_pFocusAnnot;
}
-#ifdef PDF_ENABLE_XFA
-CPDFXFA_Context* CPDFSDK_FormFillEnvironment::GetXFAContext() const {
- if (!m_pCPDFDoc)
- return nullptr;
- return static_cast<CPDFXFA_Context*>(m_pCPDFDoc->GetExtension());
-}
-
-int CPDFSDK_FormFillEnvironment::GetPageViewCount() const {
- return pdfium::CollectionSize<int>(m_PageMap);
-}
-
-bool CPDFSDK_FormFillEnvironment::ContainsXFAForm() const {
- return GetXFAContext()->ContainsXFAForm();
-}
-#endif // PDF_ENABLE_XFA
-
int CPDFSDK_FormFillEnvironment::GetPageCount() const {
CPDF_Document::Extension* pExtension = m_pCPDFDoc->GetExtension();
return pExtension ? pExtension->GetPageCount() : m_pCPDFDoc->GetPageCount();
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h
index e815cf5..abafcef 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.h
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.h
@@ -27,10 +27,6 @@
class CPDFSDK_PageView;
class IJS_Runtime;
-#if defined(PDF_ENABLE_XFA)
-class CPDFXFA_Context;
-#endif // defined(PDF_ENABLE_XFA)
-
// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
// since modifying the result would impact |bsUTF16LE|.
FPDF_WIDESTRING AsFPDFWideString(ByteString* bsUTF16LE);
@@ -67,9 +63,7 @@
CPDFSDK_PageView* GetPageView(IPDF_Page* pUnderlyingPage, bool renew);
CPDFSDK_PageView* GetPageView(int nIndex);
-#ifdef PDF_ENABLE_V8
- CPDFSDK_PageView* GetCurrentView();
-#endif
+
void RemovePageView(IPDF_Page* pUnderlyingPage);
void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
@@ -98,10 +92,6 @@
bool ProcOpenAction();
void Invalidate(IPDF_Page* page, const FX_RECT& rect);
-#ifdef PDF_ENABLE_V8
- FPDF_PAGE GetCurrentPage() const;
-#endif
-
void OnChange();
void ExecuteNamedAction(const char* namedAction);
void OnSetFieldInputFocus(FPDF_WIDESTRING focusText,
@@ -114,58 +104,18 @@
int sizeOfArray);
CPDF_Document* GetPDFDocument() const { return m_pCPDFDoc.Get(); }
+ CPDF_Document::Extension* GetDocExtension() const {
+ return m_pCPDFDoc->GetExtension();
+ }
+
+ bool IsJSPlatformPresent() const { return m_pInfo && m_pInfo->m_pJsPlatform; }
#ifdef PDF_ENABLE_V8
-#ifdef PDF_ENABLE_XFA
- CPDFXFA_Context* GetXFAContext() const;
- int GetPageViewCount() const;
- bool ContainsXFAForm() const;
+ CPDFSDK_PageView* GetCurrentView();
+ FPDF_PAGE GetCurrentPage() const;
- void DisplayCaret(CPDFXFA_Page* page,
- FPDF_BOOL bVisible,
- double left,
- double top,
- double right,
- double bottom);
- int GetCurrentPageIndex() const;
- void SetCurrentPage(int iCurPage);
-
- // TODO(dsinclair): This should probably change to PDFium?
- WideString FFI_GetAppName() const { return WideString(L"Acrobat"); }
-
- WideString GetPlatform();
- void GotoURL(const WideString& wsURL);
- FS_RECTF GetPageViewRect(CPDFXFA_Page* page);
- bool PopupMenu(CPDFXFA_Page* page,
- FPDF_WIDGET hWidget,
- int menuFlag,
- const CFX_PointF& pt);
-
- void EmailTo(FPDF_FILEHANDLER* fileHandler,
- FPDF_WIDESTRING pTo,
- FPDF_WIDESTRING pSubject,
- FPDF_WIDESTRING pCC,
- FPDF_WIDESTRING pBcc,
- FPDF_WIDESTRING pMsg);
- void UploadTo(FPDF_FILEHANDLER* fileHandler,
- int fileFlag,
- FPDF_WIDESTRING uploadTo);
- FPDF_FILEHANDLER* OpenFile(int fileType,
- FPDF_WIDESTRING wsURL,
- const char* mode);
- RetainPtr<IFX_SeekableReadStream> DownloadFromURL(const WideString& url);
- WideString PostRequestURL(const WideString& wsURL,
- const WideString& wsData,
- const WideString& wsContentType,
- const WideString& wsEncode,
- const WideString& wsHeader);
- FPDF_BOOL PutRequestURL(const WideString& wsURL,
- const WideString& wsData,
- const WideString& wsEncode);
WideString GetLanguage();
-
- void PageEvent(int iPageCount, uint32_t dwEventType) const;
-#endif // PDF_ENABLE_XFA
+ WideString GetPlatform();
int JS_appAlert(const WideString& Msg,
const WideString& Title,
@@ -198,9 +148,52 @@
FPDF_BOOL bAnnotations);
void JS_docgotoPage(int nPageNum);
WideString JS_docGetFilePath();
-#endif // PDF_ENABLE_V8
- bool IsJSPlatformPresent() const { return m_pInfo && m_pInfo->m_pJsPlatform; }
+#ifdef PDF_ENABLE_XFA
+ int GetPageViewCount() const;
+ void DisplayCaret(IPDF_Page* page,
+ FPDF_BOOL bVisible,
+ double left,
+ double top,
+ double right,
+ double bottom);
+ int GetCurrentPageIndex() const;
+ void SetCurrentPage(int iCurPage);
+
+ // TODO(dsinclair): This should probably change to PDFium?
+ WideString FFI_GetAppName() const { return WideString(L"Acrobat"); }
+
+ void GotoURL(const WideString& wsURL);
+ FS_RECTF GetPageViewRect(IPDF_Page* page);
+ bool PopupMenu(IPDF_Page* page,
+ FPDF_WIDGET hWidget,
+ int menuFlag,
+ const CFX_PointF& pt);
+ void EmailTo(FPDF_FILEHANDLER* fileHandler,
+ FPDF_WIDESTRING pTo,
+ FPDF_WIDESTRING pSubject,
+ FPDF_WIDESTRING pCC,
+ FPDF_WIDESTRING pBcc,
+ FPDF_WIDESTRING pMsg);
+ void UploadTo(FPDF_FILEHANDLER* fileHandler,
+ int fileFlag,
+ FPDF_WIDESTRING uploadTo);
+ FPDF_FILEHANDLER* OpenFile(int fileType,
+ FPDF_WIDESTRING wsURL,
+ const char* mode);
+ RetainPtr<IFX_SeekableReadStream> DownloadFromURL(const WideString& url);
+ WideString PostRequestURL(const WideString& wsURL,
+ const WideString& wsData,
+ const WideString& wsContentType,
+ const WideString& wsEncode,
+ const WideString& wsHeader);
+ FPDF_BOOL PutRequestURL(const WideString& wsURL,
+ const WideString& wsData,
+ const WideString& wsEncode);
+
+ void PageEvent(int iPageCount, uint32_t dwEventType) const;
+#endif // PDF_ENABLE_XFA
+#endif // PDF_ENABLE_V8
WideString GetFilePath() const;
ByteString GetAppName() const { return ByteString(); }
diff --git a/fpdfsdk/cpdfsdk_helpers.h b/fpdfsdk/cpdfsdk_helpers.h
index fc93d7c..0f7947a 100644
--- a/fpdfsdk/cpdfsdk_helpers.h
+++ b/fpdfsdk/cpdfsdk_helpers.h
@@ -45,7 +45,6 @@
struct CPDF_JavaScript;
#ifdef PDF_ENABLE_XFA
-class CPDFXFA_Context;
class CPDFXFA_Page;
class CXFA_FFWidget;
#endif // PDF_ENABLE_XFA
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 2a5f179..45ef17a 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -146,8 +146,8 @@
if (!pPage)
return false;
- auto* pContext = static_cast<CPDFXFA_Context*>(pPage->GetDocumentExtension());
- if (!pContext->ContainsXFAForm())
+ CPDF_Document::Extension* pContext = pPage->GetDocumentExtension();
+ if (!pContext->ContainsExtensionForm())
return false;
ObservedPtr<CPDFSDK_Annot> pObserved(pAnnot);
@@ -475,7 +475,9 @@
#ifdef PDF_ENABLE_XFA
RetainPtr<CPDFXFA_Page> protector(ToXFAPage(m_page));
- if (m_pFormFillEnv->GetXFAContext()->GetFormType() == FormType::kXFAFull) {
+ auto* pContext =
+ static_cast<CPDFXFA_Context*>(m_pFormFillEnv->GetDocExtension());
+ if (pContext->GetFormType() == FormType::kXFAFull) {
CXFA_FFPageView* pageView = protector->GetXFAPageView();
std::unique_ptr<IXFA_WidgetIterator> pWidgetHandler(
pageView->CreateWidgetIterator(
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 05c00f7..db60d89 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -51,7 +51,8 @@
#ifdef PDF_ENABLE_XFA
CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const {
- CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
+ auto* pContext = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
if (pContext->GetFormType() != FormType::kXFAForeground)
return nullptr;
@@ -75,7 +76,8 @@
}
CXFA_FFWidget* CPDFSDK_Widget::GetGroupMixXFAWidget() const {
- CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
+ auto* pContext = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
if (pContext->GetFormType() != FormType::kXFAForeground)
return nullptr;
@@ -88,7 +90,8 @@
}
CXFA_FFWidgetHandler* CPDFSDK_Widget::GetXFAWidgetHandler() const {
- CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
+ auto* pContext = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
if (pContext->GetFormType() != FormType::kXFAForeground)
return nullptr;
@@ -210,7 +213,8 @@
bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
CPDFSDK_FieldAction* data,
CPDFSDK_PageView* pPageView) {
- CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
+ auto* pContext = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
ObservedPtr<CXFA_FFWidget> pWidget(GetMixXFAWidget());
if (!pWidget)
@@ -306,7 +310,8 @@
}
if (bSynchronizeElse) {
- CPDFXFA_Context* context = m_pPageView->GetFormFillEnv()->GetXFAContext();
+ auto* context = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
context->GetXFADocView()->ProcessValueChanged(node);
}
}
@@ -358,9 +363,9 @@
bool CPDFSDK_Widget::IsAppearanceValid() {
#ifdef PDF_ENABLE_XFA
- CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
- FormType formType = pContext->GetFormType();
- if (formType == FormType::kXFAFull)
+ auto* pContext = static_cast<CPDFXFA_Context*>(
+ m_pPageView->GetFormFillEnv()->GetDocExtension());
+ if (pContext->GetFormType() == FormType::kXFAFull)
return true;
#endif // PDF_ENABLE_XFA
return CPDFSDK_BAAnnot::IsAppearanceValid();
@@ -804,7 +809,8 @@
CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
#ifdef PDF_ENABLE_XFA
- CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext();
+ auto* pContext =
+ static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
XFA_EVENTTYPE eEventType = GetXFAEventType(type, data->bWillCommit);
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 74e7512..77353b0 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -221,7 +221,8 @@
#ifdef PDF_ENABLE_XFA
CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
- CPDFXFA_Context* pContext = pPageView->GetFormFillEnv()->GetXFAContext();
+ CPDFXFA_Context* pContext = static_cast<CPDFXFA_Context*>(
+ pPageView->GetFormFillEnv()->GetDocExtension());
if (pContext->GetFormType() == FormType::kXFAForeground) {
if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty())
pWidget->ResetXFAAppearance(false);
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 166497f..d260754 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -329,8 +329,10 @@
pFormFillEnv->ClearAllFocusedAnnots();
// If the document was closed first, it's possible the XFA document
// is now a nullptr.
- if (pFormFillEnv->GetXFAContext())
- pFormFillEnv->GetXFAContext()->SetFormFillEnv(nullptr);
+ auto* pContext =
+ static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
+ if (pContext)
+ pContext->SetFormFillEnv(nullptr);
#endif // PDF_ENABLE_XFA
delete pFormFillEnv;
}
diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp
index 6275c01..2dfd759 100644
--- a/fpdfsdk/fpdf_save.cpp
+++ b/fpdfsdk/fpdf_save.cpp
@@ -47,7 +47,7 @@
if (!pContext)
return false;
- if (!pContext->ContainsXFAForm())
+ if (!pContext->ContainsExtensionForm())
return true;
CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 88605ca..bc3a357 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -204,6 +204,11 @@
return 0xFFFFFFFF;
}
+bool CPDFXFA_Context::ContainsExtensionForm() const {
+ return m_FormType == FormType::kXFAFull ||
+ m_FormType == FormType::kXFAForeground;
+}
+
void CPDFXFA_Context::ClearChangeMark() {
if (m_pFormFillEnv)
m_pFormFillEnv->ClearChangeMark();
@@ -305,7 +310,7 @@
}
void CPDFXFA_Context::SendPostSaveToXFADoc() {
- if (!ContainsXFAForm())
+ if (!ContainsExtensionForm())
return;
CXFA_FFDocView* pXFADocView = GetXFADocView();
@@ -325,7 +330,7 @@
void CPDFXFA_Context::SendPreSaveToXFADoc(
std::vector<RetainPtr<IFX_SeekableStream>>* fileList) {
- if (!ContainsXFAForm())
+ if (!ContainsExtensionForm())
return;
CXFA_FFDocView* pXFADocView = GetXFADocView();
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
index 0617d19..d81d983 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
@@ -43,11 +43,6 @@
CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); }
CXFA_FFDocView* GetXFADocView() const { return m_pXFADocView.Get(); }
FormType GetFormType() const { return m_FormType; }
- bool ContainsXFAForm() const {
- return m_FormType == FormType::kXFAFull ||
- m_FormType == FormType::kXFAForeground;
- }
-
CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
return m_pFormFillEnv.Get();
}
@@ -62,6 +57,7 @@
int GetPageCount() const override;
void DeletePage(int page_index) override;
uint32_t GetUserPermissions() const override;
+ bool ContainsExtensionForm() const override;
// IFXA_AppProvider:
WideString GetLanguage() override;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 8dd06a5..fe51b80 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -365,7 +365,7 @@
void CPDFXFA_DocEnvironment::SetCurrentPage(CXFA_FFDoc* hDoc,
int32_t iCurPage) {
if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv() ||
- !m_pContext->ContainsXFAForm() || iCurPage < 0 ||
+ !m_pContext->ContainsExtensionForm() || iCurPage < 0 ||
iCurPage >= m_pContext->GetFormFillEnv()->GetPageCount()) {
return;
}
@@ -420,7 +420,7 @@
if (hDoc != m_pContext->GetXFADoc())
return;
- if (!m_pContext->ContainsXFAForm())
+ if (!m_pContext->ContainsExtensionForm())
return;
CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv();
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_widgethandler.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_widgethandler.cpp
index 5c5b9e9..98c4541 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_widgethandler.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_widgethandler.cpp
@@ -329,7 +329,8 @@
if (!pFormFillEnv)
return false;
- CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext();
+ auto* pContext =
+ static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
if (!pContext)
return false;
@@ -570,7 +571,7 @@
if (!pFormFillEnv)
return nullptr;
- CPDFXFA_Context* pDoc = pFormFillEnv->GetXFAContext();
+ auto* pDoc = static_cast<CPDFXFA_Context*>(pFormFillEnv->GetDocExtension());
if (!pDoc)
return nullptr;
diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp
index 3b79ced..992fd98 100644
--- a/fxjs/cjs_app.cpp
+++ b/fxjs/cjs_app.cpp
@@ -22,9 +22,7 @@
#define JS_STR_PLATFORM L"WIN"
#define JS_STR_LANGUAGE L"ENU"
#define JS_NUM_VIEWERVERSION 8
-#ifdef PDF_ENABLE_XFA
#define JS_NUM_VIEWERVERSION_XFA 11
-#endif // PDF_ENABLE_XFA
#define JS_NUM_FORMSVERSION 7
const JSPropertySpec CJS_App::PropertySpecs[] = {
@@ -146,11 +144,12 @@
}
CJS_Result CJS_App::get_viewer_version(CJS_Runtime* pRuntime) {
-#ifdef PDF_ENABLE_XFA
- if (pRuntime->GetFormFillEnv()->ContainsXFAForm())
- return CJS_Result::Success(pRuntime->NewNumber(JS_NUM_VIEWERVERSION_XFA));
-#endif // PDF_ENABLE_XFA
- return CJS_Result::Success(pRuntime->NewNumber(JS_NUM_VIEWERVERSION));
+ CPDF_Document::Extension* pContext =
+ pRuntime->GetFormFillEnv()->GetDocExtension();
+ int version = pContext && pContext->ContainsExtensionForm()
+ ? JS_NUM_VIEWERVERSION_XFA
+ : JS_NUM_VIEWERVERSION;
+ return CJS_Result::Success(pRuntime->NewNumber(version));
}
CJS_Result CJS_App::set_viewer_version(CJS_Runtime* pRuntime,
@@ -159,15 +158,12 @@
}
CJS_Result CJS_App::get_platform(CJS_Runtime* pRuntime) {
-#ifdef PDF_ENABLE_XFA
CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
- if (!pFormFillEnv)
- return CJS_Result::Failure(JSMessage::kBadObjectError);
-
- WideString platform = pFormFillEnv->GetPlatform();
- if (!platform.IsEmpty())
- return CJS_Result::Success(pRuntime->NewString(platform.AsStringView()));
-#endif
+ if (pFormFillEnv) {
+ WideString platform = pFormFillEnv->GetPlatform();
+ if (!platform.IsEmpty())
+ return CJS_Result::Success(pRuntime->NewString(platform.AsStringView()));
+ }
return CJS_Result::Success(pRuntime->NewString(JS_STR_PLATFORM));
}
@@ -177,15 +173,12 @@
}
CJS_Result CJS_App::get_language(CJS_Runtime* pRuntime) {
-#ifdef PDF_ENABLE_XFA
CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
- if (!pFormFillEnv)
- return CJS_Result::Failure(JSMessage::kBadObjectError);
-
- WideString language = pFormFillEnv->GetLanguage();
- if (!language.IsEmpty())
- return CJS_Result::Success(pRuntime->NewString(language.AsStringView()));
-#endif
+ if (pFormFillEnv) {
+ WideString language = pFormFillEnv->GetLanguage();
+ if (!language.IsEmpty())
+ return CJS_Result::Success(pRuntime->NewString(language.AsStringView()));
+ }
return CJS_Result::Success(pRuntime->NewString(JS_STR_LANGUAGE));
}