// Copyright 2020 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "fpdfsdk/cpdfsdk_annotiterator.h" #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_widget.h" #include "fpdfsdk/formfiller/cffl_formfield.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. widget_readonly_checkbox_ = ToCPDFSDKWidget(it.GetFirstAnnot()); ASSERT_TRUE(widget_readonly_checkbox_); ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, widget_readonly_checkbox_->GetAnnotSubtype()); // Check box. widget_checkbox_ = ToCPDFSDKWidget(it.GetNextAnnot(widget_readonly_checkbox_)); ASSERT_TRUE(widget_checkbox_); ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, widget_checkbox_->GetAnnotSubtype()); // Read only radio button. widget_readonly_radiobutton_ = ToCPDFSDKWidget(it.GetNextAnnot(widget_checkbox_)); ASSERT_TRUE(widget_readonly_radiobutton_); ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, widget_readonly_radiobutton_->GetAnnotSubtype()); // Tabbing three times from read only radio button to unselected normal // radio button. widget_radiobutton_ = widget_readonly_radiobutton_; ASSERT_TRUE(widget_radiobutton_); for (int i = 0; i < 3; i++) { widget_radiobutton_ = ToCPDFSDKWidget(it.GetNextAnnot(widget_radiobutton_)); ASSERT_TRUE(widget_radiobutton_); } ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, widget_radiobutton_->GetAnnotSubtype()); } void FormFillerAndWindowSetup(CPDFSDK_Widget* widget) { CFFL_InteractiveFormFiller* interactive_formfiller = formfill_env_->GetInteractiveFormFiller(); { ObservedPtr observed(widget); EXPECT_TRUE(interactive_formfiller->OnSetFocus(observed, {})); } form_filler_ = interactive_formfiller->GetFormFieldForTesting(widget); ASSERT_TRUE(form_filler_); window_ = form_filler_->CreateOrUpdatePWLWindow( formfill_env_->GetPageViewAtIndex(0)); ASSERT_TRUE(window_); } CPDFSDK_Widget* GetCPDFSDKWidgetCheckBox() const { return widget_checkbox_; } CPDFSDK_Widget* GetCPDFSDKWidgetReadOnlyCheckBox() const { return widget_readonly_checkbox_; } CPDFSDK_Widget* GetCPDFSDKWidgetRadioButton() const { return widget_radiobutton_; } CPDFSDK_Widget* GetCPDFSDKWidgetReadOnlyRadioButton() const { return widget_readonly_radiobutton_; } CPDFSDK_FormFillEnvironment* GetCPDFSDKFormFillEnv() const { return formfill_env_; } CPWL_Wnd* GetWindow() const { return window_; } private: FPDF_PAGE page_; CFFL_FormField* form_filler_; CPDFSDK_Widget* widget_checkbox_; CPDFSDK_Widget* widget_readonly_checkbox_; CPDFSDK_Widget* widget_radiobutton_; CPDFSDK_Widget* widget_readonly_radiobutton_; CPDFSDK_FormFillEnvironment* formfill_env_; CPWL_Wnd* window_; }; TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyCheckBox) { FormFillerAndWindowSetup(GetCPDFSDKWidgetReadOnlyCheckBox()); CPWL_CheckBox* check_box = static_cast(GetWindow()); EXPECT_TRUE(check_box->IsChecked()); EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( GetCPDFSDKWidgetReadOnlyCheckBox(), '\r', {})); EXPECT_TRUE(check_box->IsChecked()); } TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnCheckBox) { FormFillerAndWindowSetup(GetCPDFSDKWidgetCheckBox()); CPWL_CheckBox* check_box = static_cast(GetWindow()); EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( GetCPDFSDKWidgetCheckBox(), '\r', {})); EXPECT_TRUE(check_box->IsChecked()); EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( GetCPDFSDKWidgetCheckBox(), '\r', {})); EXPECT_FALSE(check_box->IsChecked()); } TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnReadOnlyRadioButton) { FormFillerAndWindowSetup(GetCPDFSDKWidgetReadOnlyRadioButton()); CPWL_RadioButton* radio_button = static_cast(GetWindow()); EXPECT_FALSE(radio_button->IsChecked()); EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( GetCPDFSDKWidgetReadOnlyRadioButton(), '\r', {})); EXPECT_FALSE(radio_button->IsChecked()); } TEST_F(CPWLSpecialButtonEmbedderTest, EnterOnRadioButton) { FormFillerAndWindowSetup(GetCPDFSDKWidgetRadioButton()); CPWL_RadioButton* radio_button = static_cast(GetWindow()); EXPECT_TRUE(GetCPDFSDKFormFillEnv()->GetInteractiveFormFiller()->OnChar( GetCPDFSDKWidgetRadioButton(), '\r', {})); EXPECT_TRUE(radio_button->IsChecked()); }