blob: ef50ef4a7380cdcf3d50b83e2ecfea2aba81f29d [file] [log] [blame]
// 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());
}