Reuse existing CPDF_InteractiveForm in two more APIs. This is the same change as https://pdfium-review.googlesource.com/c/50710, but for FPDFAnnot_GetFormFieldFlags() and FPDFAnnot_GetFormFieldAtPoint(). This breaks API compatibility for FPDFAnnot_GetFormFieldFlags(), which is marked experimental. Change-Id: I50117a6ea0d5f22ec97787521fd0953a6700c017 Reviewed-on: https://pdfium-review.googlesource.com/c/50711 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 7e39154..46a7c1c 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -16,6 +16,7 @@ #include "core/fpdfdoc/cpdf_annot.h" #include "core/fpdfdoc/cpdf_interactiveform.h" #include "core/fpdfdoc/cpdf_metadata.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "public/fpdf_ext.h" #ifdef PDF_ENABLE_XFA @@ -175,6 +176,12 @@ return page ? IPDFPageFromFPDFPage(page)->AsPDFPage() : nullptr; } +CPDFSDK_InteractiveForm* FormHandleToInteractiveForm(FPDF_FORMHANDLE hHandle) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle); + return pFormFillEnv ? pFormFillEnv->GetInteractiveForm() : nullptr; +} + ByteString ByteStringFromFPDFWideString(FPDF_WIDESTRING wide_string) { return WideStringFromFPDFWideString(wide_string).ToUTF8(); }
diff --git a/fpdfsdk/cpdfsdk_helpers.h b/fpdfsdk/cpdfsdk_helpers.h index 31ffc9d..8f837f3 100644 --- a/fpdfsdk/cpdfsdk_helpers.h +++ b/fpdfsdk/cpdfsdk_helpers.h
@@ -38,6 +38,7 @@ class CPDF_TextPage; class CPDF_TextPageFind; class CPDFSDK_FormFillEnvironment; +class CPDFSDK_InteractiveForm; class IPDFSDK_PauseAdapter; class FX_PATHPOINT; @@ -206,6 +207,8 @@ return reinterpret_cast<CPDFSDK_FormFillEnvironment*>(handle); } +CPDFSDK_InteractiveForm* FormHandleToInteractiveForm(FPDF_FORMHANDLE hHandle); + ByteString ByteStringFromFPDFWideString(FPDF_WIDESTRING wide_string); WideString WideStringFromFPDFWideString(FPDF_WIDESTRING wide_string);
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 9517997..a9f1a78 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp
@@ -25,6 +25,7 @@ #include "core/fxge/cfx_color.h" #include "fpdfsdk/cpdf_annotcontext.h" #include "fpdfsdk/cpdfsdk_helpers.h" +#include "fpdfsdk/cpdfsdk_interactiveform.h" #include "third_party/base/ptr_util.h" #include "third_party/base/stl_util.h" @@ -868,7 +869,13 @@ } FPDF_EXPORT int FPDF_CALLCONV -FPDFAnnot_GetFormFieldFlags(FPDF_PAGE page, FPDF_ANNOTATION annot) { +FPDFAnnot_GetFormFieldFlags(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + FPDF_ANNOTATION annot) { + CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle); + if (!pForm) + return FPDF_FORMFLAG_NONE; + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage || !annot) return FPDF_FORMFLAG_NONE; @@ -878,8 +885,8 @@ if (!pAnnotDict) return FPDF_FORMFLAG_NONE; - CPDF_InteractiveForm interactive_form(pPage->GetDocument()); - CPDF_FormField* pFormField = interactive_form.GetFieldByDict(pAnnotDict); + CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm(); + CPDF_FormField* pFormField = pPDFForm->GetFieldByDict(pAnnotDict); return pFormField ? pFormField->GetFieldFlags() : FPDF_FORMFLAG_NONE; } @@ -888,13 +895,17 @@ FPDF_PAGE page, double page_x, double page_y) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!hHandle || !pPage) + CPDFSDK_InteractiveForm* pForm = FormHandleToInteractiveForm(hHandle); + if (!pForm) return nullptr; - CPDF_InteractiveForm interactive_form(pPage->GetDocument()); + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return nullptr; + + CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm(); int annot_index = -1; - CPDF_FormControl* pFormCtrl = interactive_form.GetControlAtPoint( + CPDF_FormControl* pFormCtrl = pPDFForm->GetControlAtPoint( pPage, CFX_PointF(static_cast<float>(page_x), static_cast<float>(page_y)), &annot_index); if (!pFormCtrl || annot_index == -1)
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 185974b..d78e08e 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -1386,7 +1386,7 @@ ASSERT_TRUE(annot); // Check that the flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); } @@ -1396,7 +1396,7 @@ ASSERT_TRUE(annot); // Check that the flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_TRUE(flags & FPDF_FORMFLAG_READONLY); } @@ -1415,7 +1415,7 @@ ASSERT_TRUE(annot); // Check that the flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_EDIT); @@ -1427,7 +1427,7 @@ ASSERT_TRUE(annot); // Check that the flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT); @@ -1439,7 +1439,7 @@ ASSERT_TRUE(annot); // Check that the flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_TRUE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT); @@ -1485,7 +1485,7 @@ ASSERT_TRUE(annot); // Check that interactive form annotation flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); } @@ -1496,7 +1496,7 @@ ASSERT_TRUE(annot); // Check that interactive form annotation flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_TRUE(flags & FPDF_FORMFLAG_READONLY); } @@ -1516,7 +1516,7 @@ ASSERT_TRUE(annot); // Check that interactive form annotation flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_EDIT); @@ -1529,7 +1529,7 @@ ASSERT_TRUE(annot); // Check that interactive form annotation flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_FALSE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT); @@ -1542,7 +1542,7 @@ ASSERT_TRUE(annot); // Check that interactive form annotation flag values are as expected. - int flags = FPDFAnnot_GetFormFieldFlags(page, annot.get()); + int flags = FPDFAnnot_GetFormFieldFlags(form_handle(), page, annot.get()); EXPECT_TRUE(flags & FPDF_FORMFLAG_READONLY); EXPECT_TRUE(flags & FPDF_FORMFLAG_CHOICE_COMBO); EXPECT_FALSE(flags & FPDF_FORMFLAG_CHOICE_EDIT);
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp index 41ce671..b84d906 100644 --- a/fpdfsdk/fpdf_formfill.cpp +++ b/fpdfsdk/fpdf_formfill.cpp
@@ -159,12 +159,6 @@ namespace { -CPDFSDK_InteractiveForm* FormHandleToInteractiveForm(FPDF_FORMHANDLE hHandle) { - CPDFSDK_FormFillEnvironment* pFormFillEnv = - CPDFSDKFormFillEnvironmentFromFPDFFormHandle(hHandle); - return pFormFillEnv ? pFormFillEnv->GetInteractiveForm() : nullptr; -} - CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, FPDF_PAGE fpdf_page) { IPDF_Page* pPage = IPDFPageFromFPDFPage(fpdf_page);
diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 8e9b93e..22d46fa 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h
@@ -506,12 +506,16 @@ // Get the annotation flags of |annot|, which is an interactive form // annotation in |page|. // -// page - handle to a page. -// annot - handle to an interactive form annotation. +// hHandle - handle to the form fill module, returned by +// FPDFDOC_InitFormFillEnvironment(). +// page - handle to a page. +// annot - handle to an interactive form annotation. // // Returns the annotation flags specific to interactive forms. FPDF_EXPORT int FPDF_CALLCONV -FPDFAnnot_GetFormFieldFlags(FPDF_PAGE page, FPDF_ANNOTATION annot); +FPDFAnnot_GetFormFieldFlags(FPDF_FORMHANDLE handle, + FPDF_PAGE page, + FPDF_ANNOTATION annot); // Experimental API. // Retrieves an interactive form annotation whose rectangle contains a given @@ -520,7 +524,7 @@ // // // hHandle - handle to the form fill module, returned by -// FPDFDOC_InitFormFillEnvironment. +// FPDFDOC_InitFormFillEnvironment(). // page - handle to the page, returned by FPDF_LoadPage function. // page_x - X position in PDF "user space". // page_y - Y position in PDF "user space".