1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
// Copyright 2017 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/cba_annotiterator.h"
#include "fpdfsdk/cpdfsdk_annot.h"
#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
#include "fpdfsdk/pdfwindow/cpwl_wnd.h"
#include "testing/embedder_test.h"
#include "testing/gtest/include/gtest/gtest.h"
class CPWLEditEmbeddertest : public EmbedderTest {
protected:
void SetUp() override {
EmbedderTest::SetUp();
CreateAndInitializeFormPDF();
}
void TearDown() override {
UnloadPage(GetPage());
EmbedderTest::TearDown();
}
void CreateAndInitializeFormPDF() {
EXPECT_TRUE(OpenDocument("text_form.pdf"));
m_page = LoadPage(0);
ASSERT_TRUE(m_page);
CPDFSDK_FormFillEnvironment* pFormFillEnv =
static_cast<CPDFSDK_FormFillEnvironment*>(form_handle());
{
CBA_AnnotIterator iter(pFormFillEnv->GetPageView(0),
CPDF_Annot::Subtype::WIDGET);
m_pAnnot = iter.GetFirstAnnot();
CPDFSDK_Annot* pLastAnnot = iter.GetLastAnnot();
ASSERT_EQ(m_pAnnot, pLastAnnot);
ASSERT_TRUE(m_pAnnot);
ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, m_pAnnot->GetAnnotSubtype());
}
CFFL_InteractiveFormFiller* pInteractiveFormFiller =
pFormFillEnv->GetInteractiveFormFiller();
{
CPDFSDK_Annot::ObservedPtr pObserved(m_pAnnot);
EXPECT_TRUE(pInteractiveFormFiller->OnSetFocus(&pObserved, 0));
}
m_pFormFiller = pInteractiveFormFiller->GetFormFiller(m_pAnnot, false);
ASSERT_TRUE(m_pFormFiller);
CPWL_Wnd* pWindow =
m_pFormFiller->GetPDFWindow(pFormFillEnv->GetPageView(0), false);
ASSERT_TRUE(pWindow);
ASSERT_EQ(PWL_CLASSNAME_EDIT, pWindow->GetClassName());
m_pEdit = static_cast<CPWL_Edit*>(pWindow);
}
FPDF_PAGE GetPage() { return m_page; }
CPWL_Edit* GetCPWLEdit() { return m_pEdit; }
CFFL_FormFiller* GetCFFLFormFiller() { return m_pFormFiller; }
CPDFSDK_Annot* GetCPDFSDKAnnot() { return m_pAnnot; }
private:
FPDF_PAGE m_page;
CPWL_Edit* m_pEdit;
CFFL_FormFiller* m_pFormFiller;
CPDFSDK_Annot* m_pAnnot;
};
TEST_F(CPWLEditEmbeddertest, TypeText) {
EXPECT_TRUE(GetCPWLEdit()->GetText().IsEmpty());
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'a', 0));
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'b', 0));
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'c', 0));
EXPECT_STREQ(L"abc", GetCPWLEdit()->GetText().c_str());
}
TEST_F(CPWLEditEmbeddertest, GetSelectedTextEmptyAndBasic) {
// Attempt to set selection before text has been typed to test that
// selection is identified as empty.
//
// Select from character index [0, 3) within form text field.
GetCPWLEdit()->SetSel(0, 3);
EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty());
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'a', 0));
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'b', 0));
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'c', 0));
GetCPWLEdit()->SetSel(0, 2);
EXPECT_STREQ(L"ab", GetCPWLEdit()->GetSelectedText().c_str());
}
TEST_F(CPWLEditEmbeddertest, GetSelectedTextFragments) {
for (int i = 0; i < 50; ++i) {
EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), i + 'A', 0));
}
GetCPWLEdit()->SetSel(0, 0);
EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty());
GetCPWLEdit()->SetSel(0, 1);
EXPECT_STREQ(L"A", GetCPWLEdit()->GetSelectedText().c_str());
GetCPWLEdit()->SetSel(0, -1);
EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr",
GetCPWLEdit()->GetSelectedText().c_str());
GetCPWLEdit()->SetSel(-8, -1);
EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty());
GetCPWLEdit()->SetSel(23, 12);
EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLEdit()->GetSelectedText().c_str());
GetCPWLEdit()->SetSel(12, 23);
EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLEdit()->GetSelectedText().c_str());
GetCPWLEdit()->SetSel(49, 50);
EXPECT_STREQ(L"r", GetCPWLEdit()->GetSelectedText().c_str());
}
|