| // Copyright 2020 PDFium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "fpdfsdk/cpdfsdk_annot.h" | |
| #include "fpdfsdk/cpdfsdk_annotiterator.h" | |
| #include "fpdfsdk/cpdfsdk_formfillenvironment.h" | |
| #include "fpdfsdk/cpdfsdk_helpers.h" | |
| #include "fpdfsdk/formfiller/cffl_formfiller.h" | |
| #include "fpdfsdk/pwl/cpwl_special_button.h" | |
| #include "fpdfsdk/pwl/cpwl_wnd.h" | |
| #include "testing/embedder_test.h" | |
| class CPWLSpecialButtonEmbedderTest : public EmbedderTest { | |
| protected: | |
| void SetUp() override { | |
| EmbedderTest::SetUp(); | |
| CreateAndInitializeFormPDF(); | |
| } | |
| void TearDown() override { | |
| UnloadPage(page_); | |
| EmbedderTest::TearDown(); | |
| } | |
| void CreateAndInitializeFormPDF() { | |
| ASSERT_TRUE(OpenDocument("click_form.pdf")); | |
| page_ = LoadPage(0); | |
| ASSERT_TRUE(page_); | |
| formfill_env_ = CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle()); | |
| CPDFSDK_AnnotIterator it(formfill_env_->GetPageViewAtIndex(0), | |
| CPDF_Annot::Subtype::WIDGET); | |
| // Read only check box. | |
| annot_readonly_checkbox_ = it.GetFirstAnnot(); | |
| ASSERT_TRUE(annot_readonly_checkbox_); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, | |
| annot_readonly_checkbox_->GetAnnotSubtype()); | |
| // Check box. | |
| annot_checkbox_ = it.GetNextAnnot(annot_readonly_checkbox_); | |
| ASSERT_TRUE(annot_checkbox_); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, annot_checkbox_->GetAnnotSubtype()); | |
| // Read only radio button. | |
| annot_readonly_radiobutton_ = it.GetNextAnnot(annot_checkbox_); | |
| ASSERT_TRUE(annot_readonly_radiobutton_); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, | |
| annot_readonly_radiobutton_->GetAnnotSubtype()); | |
| // Tabbing three times from read only radio button to unselected normal | |
| // radio button. | |
| annot_radiobutton_ = annot_readonly_radiobutton_; | |
| ASSERT_TRUE(annot_radiobutton_); | |
| for (int i = 0; i < 3; i++) { | |
| annot_radiobutton_ = it.GetNextAnnot(annot_radiobutton_); | |
| ASSERT_TRUE(annot_radiobutton_); | |
| } | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, | |
| annot_radiobutton_->GetAnnotSubtype()); | |
| } | |
| void FormFillerAndWindowSetup(CPDFSDK_Annot* annot) { | |
| CFFL_InteractiveFormFiller* interactive_formfiller = | |
| formfill_env_->GetInteractiveFormFiller(); | |
| { | |
| ObservedPtr<CPDFSDK_Annot> observed(annot); | |
| EXPECT_TRUE(interactive_formfiller->OnSetFocus(&observed, 0)); | |
| } | |
| form_filler_ = interactive_formfiller->GetFormFillerForTesting(annot); | |
| ASSERT_TRUE(form_filler_); | |
| window_ = | |
| form_filler_->GetPWLWindow(formfill_env_->GetPageViewAtIndex(0), true); | |
| ASSERT_TRUE(window_); | |
| } | |
| CPDFSDK_Annot* GetCPDFSDKAnnotCheckBox() const { return annot_checkbox_; } | |
| CPDFSDK_Annot* GetCPDFSDKAnnotReadOnlyCheckBox() const { | |
| return annot_readonly_checkbox_; | |
| } | |
| CPDFSDK_Annot* GetCPDFSDKAnnotRadioButton() const { | |
| return annot_radiobutton_; | |
| } | |
| CPDFSDK_Annot* GetCPDFSDKAnnotReadOnlyRadioButton() const { | |
| return annot_readonly_radiobutton_; | |
| } | |
| CPDFSDK_FormFillEnvironment* GetCPDFSDKFormFillEnv() const { | |
| return formfill_env_; | |
| } | |
| CPWL_Wnd* GetWindow() const { return window_; } | |
| private: | |
| FPDF_PAGE page_; | |
| CFFL_FormFiller* form_filler_; | |
| CPDFSDK_Annot* annot_checkbox_; | |
| CPDFSDK_Annot* annot_readonly_checkbox_; | |
| CPDFSDK_Annot* annot_radiobutton_; | |
| CPDFSDK_Annot* annot_readonly_radiobutton_; | |
| CPDFSDK_FormFillEnvironment* formfill_env_; | |
| CPWL_Wnd* window_; | |
| }; | |
| TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyCheckBox) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotReadOnlyCheckBox()); | |
| CPWL_CheckBox* check_box = static_cast<CPWL_CheckBox*>(GetWindow()); | |
| EXPECT_TRUE(check_box->IsChecked()); | |
| EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( | |
| GetCPDFSDKAnnotReadOnlyCheckBox(), '\r', 0)); | |
| EXPECT_TRUE(check_box->IsChecked()); | |
| } | |
| TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnCheckBox) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCheckBox()); | |
| CPWL_CheckBox* check_box = static_cast<CPWL_CheckBox*>(GetWindow()); | |
| EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( | |
| GetCPDFSDKAnnotCheckBox(), '\r', 0)); | |
| EXPECT_TRUE(check_box->IsChecked()); | |
| EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( | |
| GetCPDFSDKAnnotCheckBox(), '\r', 0)); | |
| EXPECT_FALSE(check_box->IsChecked()); | |
| } | |
| TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyRadioButton) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotReadOnlyRadioButton()); | |
| CPWL_RadioButton* radio_button = static_cast<CPWL_RadioButton*>(GetWindow()); | |
| EXPECT_FALSE(radio_button->IsChecked()); | |
| EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( | |
| GetCPDFSDKAnnotReadOnlyRadioButton(), '\r', 0)); | |
| EXPECT_FALSE(radio_button->IsChecked()); | |
| } | |
| TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnRadioButton) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotRadioButton()); | |
| CPWL_RadioButton* radio_button = static_cast<CPWL_RadioButton*>(GetWindow()); | |
| EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( | |
| GetCPDFSDKAnnotRadioButton(), '\r', 0)); | |
| EXPECT_TRUE(radio_button->IsChecked()); | |
| } |