Continue limiting xfa/fxfa includes to fpdfsdk/fpdfxfa.
Move some code from top-level fpdfsdk/fpdf_formfill.cpp to
fpdfsdk/fpdfxfa/cpdfxfa_page.cpp.
Change-Id: I18c31999fce0f5d650218904a4fa97ab284ef448
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58990
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 935191c..166497f 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -29,9 +29,6 @@
#ifdef PDF_ENABLE_XFA
#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
-#include "xfa/fxfa/cxfa_ffdocview.h"
-#include "xfa/fxfa/cxfa_ffpageview.h"
-#include "xfa/fxfa/cxfa_ffwidget.h"
static_assert(static_cast<int>(AlertButton::kDefault) ==
JSPLATFORM_ALERT_BUTTON_DEFAULT,
@@ -249,45 +246,14 @@
return pFormField ? static_cast<int>(pFormField->GetFieldType()) : -1;
}
- if (!hHandle)
- return -1;
-
#ifdef PDF_ENABLE_XFA
CPDFXFA_Page* pXFAPage = ToXFAPage(IPDFPageFromFPDFPage(page));
- if (!pXFAPage)
- return -1;
-
- CXFA_FFPageView* pPageView = pXFAPage->GetXFAPageView();
- if (!pPageView)
- return -1;
-
- CXFA_FFDocView* pDocView = pPageView->GetDocView();
- if (!pDocView)
- return -1;
-
- CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
- if (!pWidgetHandler)
- return -1;
-
- std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
- pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form,
- XFA_WidgetStatus_Viewable));
- if (!pWidgetIterator)
- return -1;
-
- CXFA_FFWidget* pXFAAnnot;
- while ((pXFAAnnot = pWidgetIterator->MoveToNext()) != nullptr) {
- if (pXFAAnnot->GetFormFieldType() == FormFieldType::kXFA)
- continue;
-
- CFX_FloatRect rcWidget = pXFAAnnot->GetWidgetRect().ToFloatRect();
- rcWidget.Inflate(1.0f, 1.0f);
- if (rcWidget.Contains(CFX_PointF(static_cast<float>(page_x),
- static_cast<float>(page_y)))) {
- return static_cast<int>(pXFAAnnot->GetFormFieldType());
- }
+ if (pXFAPage) {
+ return pXFAPage->HasFormFieldAtPoint(
+ CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)));
}
#endif // PDF_ENABLE_XFA
+
return -1;
}
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index 45ed01e..19e1fe1 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -17,6 +17,7 @@
#include "third_party/base/ptr_util.h"
#include "xfa/fxfa/cxfa_ffdocview.h"
#include "xfa/fxfa/cxfa_ffpageview.h"
+#include "xfa/fxfa/cxfa_ffwidget.h"
#include "xfa/fxfa/cxfa_ffwidgethandler.h"
#include "xfa/fxfa/cxfa_rendercontext.h"
#include "xfa/fxgraphics/cxfa_graphics.h"
@@ -196,6 +197,39 @@
return pPageView->GetAnnotByXFAWidget(hNextFocus);
}
+int CPDFXFA_Page::HasFormFieldAtPoint(const CFX_PointF& point) const {
+ CXFA_FFPageView* pPageView = GetXFAPageView();
+ if (!pPageView)
+ return -1;
+
+ CXFA_FFDocView* pDocView = pPageView->GetDocView();
+ if (!pDocView)
+ return -1;
+
+ CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
+ if (!pWidgetHandler)
+ return -1;
+
+ std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
+ pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form,
+ XFA_WidgetStatus_Viewable));
+ if (!pWidgetIterator)
+ return -1;
+
+ CXFA_FFWidget* pXFAAnnot;
+ while ((pXFAAnnot = pWidgetIterator->MoveToNext()) != nullptr) {
+ if (pXFAAnnot->GetFormFieldType() == FormFieldType::kXFA)
+ continue;
+
+ CFX_FloatRect rcWidget = pXFAAnnot->GetWidgetRect().ToFloatRect();
+ rcWidget.Inflate(1.0f, 1.0f);
+ if (rcWidget.Contains(point))
+ return static_cast<int>(pXFAAnnot->GetFormFieldType());
+ }
+
+ return -1;
+}
+
void CPDFXFA_Page::DrawFocusAnnot(CFX_RenderDevice* pDevice,
CPDFSDK_Annot* pAnnot,
const CFX_Matrix& mtUser2Device,
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.h b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
index 2e68285..5bc5f61 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.h
@@ -50,6 +50,7 @@
void SetXFAPageViewIndex(int index) { m_iPageIndex = index; }
CXFA_FFPageView* GetXFAPageView() const;
CPDFSDK_Annot* GetNextXFAAnnot(CPDFSDK_Annot* pSDKAnnot, bool bNext);
+ int HasFormFieldAtPoint(const CFX_PointF& point) const;
void DrawFocusAnnot(CFX_RenderDevice* pDevice,
CPDFSDK_Annot* pAnnot,
const CFX_Matrix& mtUser2Device,