1 // Copyright 2017 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "fpdfsdk/pwl/cpwl_combo_box_embeddertest.h"
6
7 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
8 #include "fpdfsdk/cpdfsdk_helpers.h"
9 #include "fpdfsdk/cpdfsdk_widget.h"
10 #include "fpdfsdk/formfiller/cffl_formfield.h"
11 #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
12 #include "fpdfsdk/pwl/cpwl_combo_box.h"
13 #include "fpdfsdk/pwl/cpwl_wnd.h"
14 #include "public/fpdf_fwlevent.h"
15 #include "testing/embedder_test.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 class CPWLComboBoxEditEmbedderTest : public CPWLComboBoxEmbedderTest {};
19
TEST_F(CPWLComboBoxEditEmbedderTest,GetSelectedTextEmptyAndBasicNormal)20 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicNormal) {
21 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
22 ASSERT_TRUE(page);
23
24 FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
25
26 // Automatically pre-filled with "Banana".
27 EXPECT_FALSE(GetCPWLComboBox()->GetText().IsEmpty());
28 EXPECT_EQ(L"Banana", GetCPWLComboBox()->GetText());
29
30 // Check that selection is initially empty, then select entire word.
31 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
32 GetCPWLComboBox()->SetSelectText();
33 EXPECT_EQ(L"Banana", GetCPWLComboBox()->GetSelectedText());
34
35 // Select other options.
36 GetCPWLComboBox()->SetSelect(0);
37 EXPECT_EQ(L"Apple", GetCPWLComboBox()->GetSelectedText());
38 GetCPWLComboBox()->SetSelect(2);
39 EXPECT_EQ(L"Cherry", GetCPWLComboBox()->GetSelectedText());
40
41 // Verify that combobox text cannot be edited.
42 EXPECT_FALSE(GetCFFLFormField()->OnChar(GetCPDFSDKAnnotNormal(), 'a', {}));
43 }
44
TEST_F(CPWLComboBoxEditEmbedderTest,GetSelectedTextFragmentsNormal)45 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsNormal) {
46 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
47 ASSERT_TRUE(page);
48
49 FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal());
50 EXPECT_EQ(L"Banana", GetCPWLComboBox()->GetText());
51
52 GetCPWLComboBox()->SetEditSelection(0, 0);
53 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
54
55 GetCPWLComboBox()->SetEditSelection(0, 1);
56 EXPECT_EQ(L"B", GetCPWLComboBox()->GetSelectedText());
57
58 GetCPWLComboBox()->SetEditSelection(0, -1);
59 EXPECT_EQ(L"Banana", GetCPWLComboBox()->GetSelectedText());
60
61 GetCPWLComboBox()->SetEditSelection(-8, -1);
62 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
63
64 GetCPWLComboBox()->SetEditSelection(4, 1);
65 EXPECT_EQ(L"ana", GetCPWLComboBox()->GetSelectedText());
66
67 GetCPWLComboBox()->SetEditSelection(1, 4);
68 EXPECT_EQ(L"ana", GetCPWLComboBox()->GetSelectedText());
69
70 GetCPWLComboBox()->SetEditSelection(5, 6);
71 EXPECT_EQ(L"a", GetCPWLComboBox()->GetSelectedText());
72 }
73
TEST_F(CPWLComboBoxEditEmbedderTest,GetSelectedTextEmptyAndBasicEditable)74 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicEditable) {
75 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
76 ASSERT_TRUE(page);
77
78 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
79 EXPECT_TRUE(GetCPWLComboBox()->GetText().IsEmpty());
80
81 // Check selection is initially empty, then select a provided option.
82 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
83 GetCPWLComboBox()->SetSelect(0);
84 GetCPWLComboBox()->SetSelectText();
85 EXPECT_EQ(L"Foo", GetCPWLComboBox()->GetSelectedText());
86
87 // Select another option and then select last char of that option.
88 GetCPWLComboBox()->SetSelect(1);
89 EXPECT_EQ(L"Bar", GetCPWLComboBox()->GetSelectedText());
90 GetCPWLComboBox()->SetEditSelection(2, 3);
91 EXPECT_EQ(L"r", GetCPWLComboBox()->GetSelectedText());
92
93 // Type into editable combobox text field and select new text.
94 EXPECT_TRUE(
95 GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'a', {}));
96 EXPECT_TRUE(
97 GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'b', {}));
98 EXPECT_TRUE(
99 GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'c', {}));
100
101 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
102 GetCPWLComboBox()->SetEditSelection(0, 5);
103 EXPECT_EQ(L"Baabc", GetCPWLComboBox()->GetSelectedText());
104 }
105
TEST_F(CPWLComboBoxEditEmbedderTest,GetSelectedTextFragmentsEditable)106 TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsEditable) {
107 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
108 ASSERT_TRUE(page);
109
110 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
111 TypeTextIntoTextField(50);
112
113 GetCPWLComboBox()->SetEditSelection(0, 0);
114 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
115
116 GetCPWLComboBox()->SetEditSelection(0, 1);
117 EXPECT_EQ(L"A", GetCPWLComboBox()->GetSelectedText());
118
119 GetCPWLComboBox()->SetEditSelection(0, -1);
120 EXPECT_EQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr",
121 GetCPWLComboBox()->GetSelectedText());
122
123 GetCPWLComboBox()->SetEditSelection(-8, -1);
124 EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty());
125
126 GetCPWLComboBox()->SetEditSelection(23, 12);
127 EXPECT_EQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText());
128
129 GetCPWLComboBox()->SetEditSelection(12, 23);
130 EXPECT_EQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText());
131
132 GetCPWLComboBox()->SetEditSelection(49, 50);
133 EXPECT_EQ(L"r", GetCPWLComboBox()->GetSelectedText());
134
135 GetCPWLComboBox()->SetEditSelection(49, 55);
136 EXPECT_EQ(L"r", GetCPWLComboBox()->GetSelectedText());
137 }
138
TEST_F(CPWLComboBoxEditEmbedderTest,DeleteEntireTextSelection)139 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEntireTextSelection) {
140 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
141 ASSERT_TRUE(page);
142
143 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
144 TypeTextIntoTextField(50);
145
146 GetCPWLComboBox()->SetEditSelection(0, -1);
147 EXPECT_EQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr",
148 GetCPWLComboBox()->GetSelectedText());
149
150 GetCPWLComboBox()->ReplaceSelection(L"");
151 EXPECT_TRUE(GetCPWLComboBox()->GetText().IsEmpty());
152 }
153
TEST_F(CPWLComboBoxEditEmbedderTest,DeleteTextSelectionMiddle)154 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionMiddle) {
155 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
156 ASSERT_TRUE(page);
157
158 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
159 TypeTextIntoTextField(50);
160
161 GetCPWLComboBox()->SetEditSelection(12, 23);
162 EXPECT_EQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText());
163
164 GetCPWLComboBox()->ReplaceSelection(L"");
165 EXPECT_EQ(L"ABCDEFGHIJKLXYZ[\\]^_`abcdefghijklmnopqr",
166 GetCPWLComboBox()->GetText());
167 }
168
TEST_F(CPWLComboBoxEditEmbedderTest,DeleteTextSelectionLeft)169 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionLeft) {
170 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
171 ASSERT_TRUE(page);
172
173 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
174 TypeTextIntoTextField(50);
175
176 GetCPWLComboBox()->SetEditSelection(0, 5);
177 EXPECT_EQ(L"ABCDE", GetCPWLComboBox()->GetSelectedText());
178
179 GetCPWLComboBox()->ReplaceSelection(L"");
180 EXPECT_EQ(L"FGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr",
181 GetCPWLComboBox()->GetText());
182 }
183
TEST_F(CPWLComboBoxEditEmbedderTest,DeleteTextSelectionRight)184 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionRight) {
185 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
186 ASSERT_TRUE(page);
187
188 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
189 TypeTextIntoTextField(50);
190
191 GetCPWLComboBox()->SetEditSelection(45, 50);
192 EXPECT_EQ(L"nopqr", GetCPWLComboBox()->GetSelectedText());
193
194 GetCPWLComboBox()->ReplaceSelection(L"");
195 EXPECT_EQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklm",
196 GetCPWLComboBox()->GetText());
197 }
198
TEST_F(CPWLComboBoxEditEmbedderTest,DeleteEmptyTextSelection)199 TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEmptyTextSelection) {
200 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
201 ASSERT_TRUE(page);
202
203 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
204 TypeTextIntoTextField(50);
205
206 GetCPWLComboBox()->ReplaceSelection(L"");
207 EXPECT_EQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr",
208 GetCPWLComboBox()->GetText());
209 }
210
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextInEmptyEditableComboBox)211 TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInEmptyEditableComboBox) {
212 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
213 ASSERT_TRUE(page);
214
215 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
216 GetCPWLComboBox()->ReplaceSelection(L"Hello");
217 EXPECT_EQ(L"Hello", GetCPWLComboBox()->GetText());
218 }
219
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextInPopulatedEditableComboBoxLeft)220 TEST_F(CPWLComboBoxEditEmbedderTest,
221 InsertTextInPopulatedEditableComboBoxLeft) {
222 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
223 ASSERT_TRUE(page);
224
225 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
226 TypeTextIntoTextField(10);
227
228 // Move cursor to beginning of user-editable combobox text field.
229 EXPECT_TRUE(GetCFFLFormField()->OnKeyDown(FWL_VKEY_Home, {}));
230
231 GetCPWLComboBox()->ReplaceSelection(L"Hello");
232 EXPECT_EQ(L"HelloABCDEFGHIJ", GetCPWLComboBox()->GetText());
233 }
234
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextInPopulatedEditableComboBoxMiddle)235 TEST_F(CPWLComboBoxEditEmbedderTest,
236 InsertTextInPopulatedEditableComboBoxMiddle) {
237 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
238 ASSERT_TRUE(page);
239
240 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
241 TypeTextIntoTextField(10);
242
243 // Move cursor to middle of user-editable combobox text field.
244 for (int i = 0; i < 5; ++i) {
245 EXPECT_TRUE(GetCFFLFormField()->OnKeyDown(FWL_VKEY_Left, {}));
246 }
247
248 GetCPWLComboBox()->ReplaceSelection(L"Hello");
249 EXPECT_EQ(L"ABCDEHelloFGHIJ", GetCPWLComboBox()->GetText());
250 }
251
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextInPopulatedEditableComboBoxRight)252 TEST_F(CPWLComboBoxEditEmbedderTest,
253 InsertTextInPopulatedEditableComboBoxRight) {
254 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
255 ASSERT_TRUE(page);
256
257 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
258 TypeTextIntoTextField(10);
259
260 GetCPWLComboBox()->ReplaceSelection(L"Hello");
261 EXPECT_EQ(L"ABCDEFGHIJHello", GetCPWLComboBox()->GetText());
262 }
263
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextAndReplaceSelectionInPopulatedEditableComboBoxWhole)264 TEST_F(CPWLComboBoxEditEmbedderTest,
265 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxWhole) {
266 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
267 ASSERT_TRUE(page);
268
269 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
270 TypeTextIntoTextField(10);
271
272 GetCPWLComboBox()->SetEditSelection(0, -1);
273 EXPECT_EQ(L"ABCDEFGHIJ", GetCPWLComboBox()->GetSelectedText());
274 GetCPWLComboBox()->ReplaceSelection(L"Hello");
275 EXPECT_EQ(L"Hello", GetCPWLComboBox()->GetText());
276 }
277
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextAndReplaceSelectionInPopulatedEditableComboBoxLeft)278 TEST_F(CPWLComboBoxEditEmbedderTest,
279 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxLeft) {
280 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
281 ASSERT_TRUE(page);
282
283 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
284 TypeTextIntoTextField(10);
285
286 GetCPWLComboBox()->SetEditSelection(0, 5);
287 EXPECT_EQ(L"ABCDE", GetCPWLComboBox()->GetSelectedText());
288 GetCPWLComboBox()->ReplaceSelection(L"Hello");
289 EXPECT_EQ(L"HelloFGHIJ", GetCPWLComboBox()->GetText());
290 }
291
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextAndReplaceSelectionInPopulatedEditableComboBoxMiddle)292 TEST_F(CPWLComboBoxEditEmbedderTest,
293 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxMiddle) {
294 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
295 ASSERT_TRUE(page);
296
297 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
298 TypeTextIntoTextField(10);
299
300 GetCPWLComboBox()->SetEditSelection(2, 7);
301 EXPECT_EQ(L"CDEFG", GetCPWLComboBox()->GetSelectedText());
302 GetCPWLComboBox()->ReplaceSelection(L"Hello");
303 EXPECT_EQ(L"ABHelloHIJ", GetCPWLComboBox()->GetText());
304 }
305
TEST_F(CPWLComboBoxEditEmbedderTest,InsertTextAndReplaceSelectionInPopulatedEditableComboBoxRight)306 TEST_F(CPWLComboBoxEditEmbedderTest,
307 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxRight) {
308 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
309 ASSERT_TRUE(page);
310
311 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
312 TypeTextIntoTextField(10);
313
314 GetCPWLComboBox()->SetEditSelection(5, 10);
315 EXPECT_EQ(L"FGHIJ", GetCPWLComboBox()->GetSelectedText());
316 GetCPWLComboBox()->ReplaceSelection(L"Hello");
317 EXPECT_EQ(L"ABCDEHello", GetCPWLComboBox()->GetText());
318 }
319
TEST_F(CPWLComboBoxEditEmbedderTest,ReplaceAndKeepSelection)320 TEST_F(CPWLComboBoxEditEmbedderTest, ReplaceAndKeepSelection) {
321 ScopedEmbedderTestPage page = CreateAndInitializeFormComboboxPDF();
322 ASSERT_TRUE(page);
323
324 FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable());
325 TypeTextIntoTextField(10);
326
327 GetCPWLComboBox()->SetEditSelection(1, 3);
328 EXPECT_EQ(L"ABCDEFGHIJ", GetCPWLComboBox()->GetText());
329 GetCPWLComboBox()->ReplaceAndKeepSelection(L"xyz");
330 EXPECT_EQ(L"AxyzDEFGHIJ", GetCPWLComboBox()->GetText());
331 EXPECT_EQ(L"xyz", GetCPWLComboBox()->GetSelectedText());
332
333 GetCPWLComboBox()->SetEditSelection(4, 1);
334 GetCPWLComboBox()->ReplaceAndKeepSelection(L"12");
335 EXPECT_EQ(L"A12DEFGHIJ", GetCPWLComboBox()->GetText());
336 EXPECT_EQ(L"12", GetCPWLComboBox()->GetSelectedText());
337 }
338