blob: 56e166252e13a51595517b5ada0bf6b9f379861b [file] [log] [blame]
Tom Sepeza310e002015-02-27 13:03:07 -08001// Copyright 2015 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Nicolas Pena742977f2017-04-13 15:28:20 -04005#include <memory>
6#include <string>
Diana Gagedce2d722017-06-20 11:17:11 -07007#include <vector>
Nicolas Pena742977f2017-04-13 15:28:20 -04008
Lei Zhang31f7e4b2017-08-26 01:34:42 -07009#include "core/fxcrt/fx_coordinates.h"
Diana Gagedce2d722017-06-20 11:17:11 -070010#include "core/fxcrt/fx_string.h"
Nicolas Pena742977f2017-04-13 15:28:20 -040011#include "core/fxcrt/fx_system.h"
12#include "public/cpp/fpdf_deleters.h"
Lei Zhangb4e7f302015-11-06 15:52:32 -080013#include "public/fpdf_formfill.h"
Diana Gagedce2d722017-06-20 11:17:11 -070014#include "public/fpdf_fwlevent.h"
Wei Li091f7a02015-11-09 12:09:55 -080015#include "testing/embedder_test.h"
16#include "testing/embedder_test_mock_delegate.h"
17#include "testing/embedder_test_timer_handling_delegate.h"
Tom Sepeza310e002015-02-27 13:03:07 -080018#include "testing/gmock/include/gmock/gmock.h"
19#include "testing/gtest/include/gtest/gtest.h"
20
21using testing::_;
Tom Sepeza310e002015-02-27 13:03:07 -080022
Lei Zhang839692f2017-08-25 23:23:57 -070023using FPDFFormFillEmbeddertest = EmbedderTest;
24
25// A base class for many related tests that involve clicking and typing into
26// form fields.
27class FPDFFormFillInteractiveEmbeddertest : public FPDFFormFillEmbeddertest {
Diana Gagedce2d722017-06-20 11:17:11 -070028 protected:
Lei Zhang839692f2017-08-25 23:23:57 -070029 FPDFFormFillInteractiveEmbeddertest() = default;
30 ~FPDFFormFillInteractiveEmbeddertest() override = default;
31
32 void SetUp() override {
33 FPDFFormFillEmbeddertest::SetUp();
34 ASSERT_TRUE(OpenDocument(GetDocumentName()));
35 page_ = LoadPage(0);
36 ASSERT_TRUE(page_);
37 FormSanityChecks();
Diana Gagef8c02762017-07-26 14:20:12 -070038 }
39
Lei Zhang839692f2017-08-25 23:23:57 -070040 void TearDown() override {
41 UnloadPage(page_);
42 FPDFFormFillEmbeddertest::TearDown();
43 }
44
45 // Returns the name of the PDF to use.
46 virtual const char* GetDocumentName() const = 0;
47
Lei Zhang7bec2ff2017-08-25 23:28:23 -070048 // Returns the type of field(s) in the PDF.
49 virtual int GetFormType() const = 0;
50
Lei Zhang839692f2017-08-25 23:23:57 -070051 // Optionally do some sanity check on the document after loading.
52 virtual void FormSanityChecks() {}
53
54 FPDF_PAGE page() { return page_; }
55
Lei Zhang31f7e4b2017-08-26 01:34:42 -070056 int GetFormTypeAtPoint(const CFX_PointF& point) {
57 return FPDFPage_HasFormFieldAtPoint(form_handle(), page_, point.x, point.y);
Lei Zhang839692f2017-08-25 23:23:57 -070058 }
59
Lei Zhang31f7e4b2017-08-26 01:34:42 -070060 void ClickOnFormFieldAtPoint(const CFX_PointF& point) {
61 // Click on the text field or combobox as specified by coordinates.
62 FORM_OnMouseMove(form_handle(), page_, 0, point.x, point.y);
63 FORM_OnLButtonDown(form_handle(), page_, 0, point.x, point.y);
64 FORM_OnLButtonUp(form_handle(), page_, 0, point.x, point.y);
65 }
66
67 void TypeTextIntoTextField(int num_chars, const CFX_PointF& point) {
68 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(point));
69 ClickOnFormFieldAtPoint(point);
Diana Gagedce2d722017-06-20 11:17:11 -070070
71 // Type text starting with 'A' to as many chars as specified by |num_chars|.
72 for (int i = 0; i < num_chars; ++i) {
Lei Zhang839692f2017-08-25 23:23:57 -070073 FORM_OnChar(form_handle(), page_, 'A' + i, 0);
Diana Gagedce2d722017-06-20 11:17:11 -070074 }
75 }
76
Diana Gagecb50b5f2017-06-29 09:54:19 -070077 // Navigates to text field using the mouse and then selects text via the
Diana Gagedce2d722017-06-20 11:17:11 -070078 // shift and specfied left or right arrow key.
Lei Zhang839692f2017-08-25 23:23:57 -070079 void SelectTextWithKeyboard(int num_chars,
Diana Gagedce2d722017-06-20 11:17:11 -070080 int arrow_key,
Lei Zhang31f7e4b2017-08-26 01:34:42 -070081 const CFX_PointF& point) {
Diana Gagedce2d722017-06-20 11:17:11 -070082 // Navigate to starting position for selection.
Lei Zhang31f7e4b2017-08-26 01:34:42 -070083 ClickOnFormFieldAtPoint(point);
Diana Gagedce2d722017-06-20 11:17:11 -070084
85 // Hold down shift (and don't release until entire text is selected).
Lei Zhang839692f2017-08-25 23:23:57 -070086 FORM_OnKeyDown(form_handle(), page_, FWL_VKEY_Shift, 0);
Diana Gagedce2d722017-06-20 11:17:11 -070087
88 // Select text char by char via left or right arrow key.
89 for (int i = 0; i < num_chars; ++i) {
Lei Zhang839692f2017-08-25 23:23:57 -070090 FORM_OnKeyDown(form_handle(), page_, arrow_key, FWL_EVENTFLAG_ShiftKey);
91 FORM_OnKeyUp(form_handle(), page_, arrow_key, FWL_EVENTFLAG_ShiftKey);
Diana Gagedce2d722017-06-20 11:17:11 -070092 }
Lei Zhang839692f2017-08-25 23:23:57 -070093 FORM_OnKeyUp(form_handle(), page_, FWL_VKEY_Shift, 0);
Diana Gagedce2d722017-06-20 11:17:11 -070094 }
95
Diana Gagecb50b5f2017-06-29 09:54:19 -070096 // Uses the mouse to navigate to text field and select text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -070097 void SelectTextWithMouse(const CFX_PointF& start, const CFX_PointF& end) {
98 ASSERT(start.y == end.y);
99
Diana Gagedce2d722017-06-20 11:17:11 -0700100 // Navigate to starting position and click mouse.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700101 FORM_OnMouseMove(form_handle(), page_, 0, start.x, start.y);
102 FORM_OnLButtonDown(form_handle(), page_, 0, start.x, start.y);
Diana Gagedce2d722017-06-20 11:17:11 -0700103
104 // Hold down mouse until reach end of desired selection.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700105 FORM_OnMouseMove(form_handle(), page_, 0, end.x, end.y);
106 FORM_OnLButtonUp(form_handle(), page_, 0, end.x, end.y);
Diana Gagedce2d722017-06-20 11:17:11 -0700107 }
108
Lei Zhang839692f2017-08-25 23:23:57 -0700109 void CheckSelection(const CFX_WideStringC& expected_string) {
Diana Gagedce2d722017-06-20 11:17:11 -0700110 // Calculate expected length for selected text.
111 int num_chars = expected_string.GetLength();
112
113 // Check actual selection against expected selection.
114 const unsigned long expected_length =
115 sizeof(unsigned short) * (num_chars + 1);
116 unsigned long sel_text_len =
Lei Zhang839692f2017-08-25 23:23:57 -0700117 FORM_GetSelectedText(form_handle(), page_, nullptr, 0);
Diana Gagedce2d722017-06-20 11:17:11 -0700118 ASSERT_EQ(expected_length, sel_text_len);
119
120 std::vector<unsigned short> buf(sel_text_len);
Lei Zhang839692f2017-08-25 23:23:57 -0700121 EXPECT_EQ(expected_length, FORM_GetSelectedText(form_handle(), page_,
Diana Gagedce2d722017-06-20 11:17:11 -0700122 buf.data(), sel_text_len));
123
124 EXPECT_EQ(expected_string,
125 CFX_WideString::FromUTF16LE(buf.data(), num_chars));
126 }
Diana Gagecb50b5f2017-06-29 09:54:19 -0700127
Lei Zhang839692f2017-08-25 23:23:57 -0700128 private:
129 FPDF_PAGE page_ = nullptr;
130};
131
132class FPDFFormFillTextFormEmbeddertest
133 : public FPDFFormFillInteractiveEmbeddertest {
134 protected:
135 FPDFFormFillTextFormEmbeddertest() = default;
136 ~FPDFFormFillTextFormEmbeddertest() override = default;
137
138 const char* GetDocumentName() const override {
139 // PDF with several form text fields:
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700140 // - "Text Box" - Regular text box with no special attributes.
Lei Zhang839692f2017-08-25 23:23:57 -0700141 // - "ReadOnly" - Ff: 1.
142 // - "CharLimit" - MaxLen: 10, V: Elephant.
143 return "text_form_multiple.pdf";
144 }
Lei Zhang7bec2ff2017-08-25 23:28:23 -0700145
146 int GetFormType() const override { return FPDF_FORMFIELD_TEXTFIELD; }
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700147
148 void FormSanityChecks() override {
149 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(CharLimitFormBegin()));
150 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(CharLimitFormEnd()));
151 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(RegularFormBegin()));
152 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(RegularFormEnd()));
153 }
154
155 void SelectAllCharLimitFormTextWithMouse() {
156 SelectTextWithMouse(CharLimitFormEnd(), CharLimitFormBegin());
157 }
158
159 void SelectAllRegularFormTextWithMouse() {
160 SelectTextWithMouse(RegularFormEnd(), RegularFormBegin());
161 }
162
163 const CFX_PointF& CharLimitFormBegin() const {
164 static const CFX_PointF point = CharLimitFormAtX(kFormBeginX);
165 return point;
166 }
167
168 const CFX_PointF& CharLimitFormEnd() const {
169 static const CFX_PointF point = CharLimitFormAtX(kFormEndX);
170 return point;
171 }
172
173 const CFX_PointF& RegularFormBegin() const {
174 static const CFX_PointF point = RegularFormAtX(kFormBeginX);
175 return point;
176 }
177
178 const CFX_PointF& RegularFormEnd() const {
179 static const CFX_PointF point = RegularFormAtX(kFormEndX);
180 return point;
181 }
182
183 static CFX_PointF CharLimitFormAtX(float x) {
184 ASSERT(x >= kFormBeginX);
185 ASSERT(x <= kFormEndX);
186 return CFX_PointF(x, kCharLimitFormY);
187 }
188
189 static CFX_PointF RegularFormAtX(float x) {
190 ASSERT(x >= kFormBeginX);
191 ASSERT(x <= kFormEndX);
192 return CFX_PointF(x, kRegularFormY);
193 }
194
195 private:
196 static constexpr float kFormBeginX = 102.0;
197 static constexpr float kFormEndX = 195.0;
198 static constexpr float kCharLimitFormY = 60.0;
199 static constexpr float kRegularFormY = 115.0;
Lei Zhang839692f2017-08-25 23:23:57 -0700200};
201
202class FPDFFormFillComboBoxFormEmbeddertest
203 : public FPDFFormFillInteractiveEmbeddertest {
204 protected:
205 FPDFFormFillComboBoxFormEmbeddertest() = default;
206 ~FPDFFormFillComboBoxFormEmbeddertest() override = default;
207
208 const char* GetDocumentName() const override {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700209 // PDF with form comboboxes:
210 // - "Combo_Editable" - Ff: 393216, 3 options with pair values.
211 // - "Combo1" - Ff: 131072, 3 options with single values.
212 // - "Combo_ReadOnly" - Ff: 131073, 3 options with single values.
Lei Zhang839692f2017-08-25 23:23:57 -0700213 return "combobox_form.pdf";
214 }
215
Lei Zhang7bec2ff2017-08-25 23:28:23 -0700216 int GetFormType() const override { return FPDF_FORMFIELD_COMBOBOX; }
217
Lei Zhang839692f2017-08-25 23:23:57 -0700218 void FormSanityChecks() override {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700219 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(EditableFormBegin()));
220 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(EditableFormEnd()));
221 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(EditableFormDropDown()));
222 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(NonEditableFormBegin()));
223 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(NonEditableFormEnd()));
224 EXPECT_EQ(GetFormType(), GetFormTypeAtPoint(NonEditableFormDropDown()));
Lei Zhang839692f2017-08-25 23:23:57 -0700225 }
226
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700227 void SelectEditableFormOption(int item_index) {
228 SelectOption(item_index, EditableFormDropDown());
229 }
230
231 void SelectNonEditableFormOption(int item_index) {
232 SelectOption(item_index, NonEditableFormDropDown());
233 }
234
235 void SelectAllEditableFormTextWithMouse() {
236 SelectTextWithMouse(EditableFormEnd(), EditableFormBegin());
237 }
238
239 const CFX_PointF& EditableFormBegin() const {
240 static const CFX_PointF point = EditableFormAtX(kFormBeginX);
241 return point;
242 }
243
244 const CFX_PointF& EditableFormEnd() const {
245 static const CFX_PointF point = EditableFormAtX(kFormEndX);
246 return point;
247 }
248
249 const CFX_PointF& EditableFormDropDown() const {
250 static const CFX_PointF point(kFormDropDownX, kEditableFormY);
251 return point;
252 }
253
254 const CFX_PointF& NonEditableFormBegin() const {
255 static const CFX_PointF point = NonEditableFormAtX(kFormBeginX);
256 return point;
257 }
258
259 const CFX_PointF& NonEditableFormEnd() const {
260 static const CFX_PointF point = NonEditableFormAtX(kFormEndX);
261 return point;
262 }
263
264 const CFX_PointF& NonEditableFormDropDown() const {
265 static const CFX_PointF point(kFormDropDownX, kNonEditableFormY);
266 return point;
267 }
268
269 static CFX_PointF EditableFormAtX(float x) {
270 ASSERT(x >= kFormBeginX);
271 ASSERT(x <= kFormEndX);
272 return CFX_PointF(x, kEditableFormY);
273 }
274
275 static CFX_PointF NonEditableFormAtX(float x) {
276 ASSERT(x >= kFormBeginX);
277 ASSERT(x <= kFormEndX);
278 return CFX_PointF(x, kNonEditableFormY);
279 }
280
281 private:
Diana Gagecb50b5f2017-06-29 09:54:19 -0700282 // Selects one of the pre-selected values from a combobox with three options.
283 // Options are specified by |item_index|, which is 0-based.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700284 void SelectOption(int item_index, const CFX_PointF& point) {
Diana Gagecb50b5f2017-06-29 09:54:19 -0700285 // Only relevant for comboboxes with three choices and the same dimensions
286 // as those in combobox_form.pdf.
287 ASSERT(item_index >= 0);
288 ASSERT(item_index < 3);
289
290 // Navigate to button for drop down and click mouse to reveal options.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700291 ClickOnFormFieldAtPoint(point);
Diana Gagecb50b5f2017-06-29 09:54:19 -0700292
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700293 // Calculate to Y-coordinate of dropdown option to be selected.
Diana Gagecb50b5f2017-06-29 09:54:19 -0700294 constexpr double kChoiceHeight = 15;
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700295 CFX_PointF option_point = point;
296 option_point.y -= kChoiceHeight * (item_index + 1);
Diana Gagecb50b5f2017-06-29 09:54:19 -0700297
298 // Navigate to option and click mouse to select it.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700299 ClickOnFormFieldAtPoint(option_point);
Diana Gagecb50b5f2017-06-29 09:54:19 -0700300 }
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700301
302 static constexpr float kFormBeginX = 102.0;
303 static constexpr float kFormEndX = 183.0;
304 static constexpr float kFormDropDownX = 192.0;
305 static constexpr float kEditableFormY = 60.0;
306 static constexpr float kNonEditableFormY = 110.0;
Diana Gagedce2d722017-06-20 11:17:11 -0700307};
Tom Sepeza310e002015-02-27 13:03:07 -0800308
309TEST_F(FPDFFormFillEmbeddertest, FirstTest) {
310 EmbedderTestMockDelegate mock;
311 EXPECT_CALL(mock, Alert(_, _, _, _)).Times(0);
312 EXPECT_CALL(mock, UnsupportedHandler(_)).Times(0);
Tom Sepez6efc0ad2015-06-02 17:11:18 -0700313 EXPECT_CALL(mock, SetTimer(_, _)).Times(0);
314 EXPECT_CALL(mock, KillTimer(_)).Times(0);
Tom Sepeza310e002015-02-27 13:03:07 -0800315 SetDelegate(&mock);
316
Wei Li091f7a02015-11-09 12:09:55 -0800317 EXPECT_TRUE(OpenDocument("hello_world.pdf"));
Tom Sepeza310e002015-02-27 13:03:07 -0800318 FPDF_PAGE page = LoadPage(0);
tsepez8e120292016-08-03 14:03:35 -0700319 EXPECT_TRUE(page);
Lei Zhangd27acae2015-05-15 15:36:02 -0700320 UnloadPage(page);
Tom Sepeza310e002015-02-27 13:03:07 -0800321}
Tom Sepez6efc0ad2015-06-02 17:11:18 -0700322
323TEST_F(FPDFFormFillEmbeddertest, BUG_487928) {
324 EmbedderTestTimerHandlingDelegate delegate;
325 SetDelegate(&delegate);
326
Wei Li091f7a02015-11-09 12:09:55 -0800327 EXPECT_TRUE(OpenDocument("bug_487928.pdf"));
Tom Sepez6efc0ad2015-06-02 17:11:18 -0700328 FPDF_PAGE page = LoadPage(0);
tsepez8e120292016-08-03 14:03:35 -0700329 EXPECT_TRUE(page);
Tom Sepez6efc0ad2015-06-02 17:11:18 -0700330 DoOpenActions();
331 delegate.AdvanceTime(5000);
332 UnloadPage(page);
333}
Tom Sepez0b133982015-07-28 11:23:22 -0700334
Tom Sepez396e8722015-09-09 10:16:08 -0700335TEST_F(FPDFFormFillEmbeddertest, BUG_507316) {
336 EmbedderTestTimerHandlingDelegate delegate;
337 SetDelegate(&delegate);
338
Wei Li091f7a02015-11-09 12:09:55 -0800339 EXPECT_TRUE(OpenDocument("bug_507316.pdf"));
weili0dadcc62016-08-23 21:10:57 -0700340 FPDF_PAGE page = LoadPage(2);
tsepez8e120292016-08-03 14:03:35 -0700341 EXPECT_TRUE(page);
Tom Sepez396e8722015-09-09 10:16:08 -0700342 DoOpenActions();
343 delegate.AdvanceTime(4000);
344 UnloadPage(page);
345}
346
Tom Sepez0b133982015-07-28 11:23:22 -0700347TEST_F(FPDFFormFillEmbeddertest, BUG_514690) {
Wei Li091f7a02015-11-09 12:09:55 -0800348 EXPECT_TRUE(OpenDocument("hello_world.pdf"));
Tom Sepez0b133982015-07-28 11:23:22 -0700349 FPDF_PAGE page = LoadPage(0);
tsepez8e120292016-08-03 14:03:35 -0700350 EXPECT_TRUE(page);
Tom Sepez0b133982015-07-28 11:23:22 -0700351
352 // Test that FORM_OnMouseMove() etc. permit null HANDLES and PAGES.
353 FORM_OnMouseMove(nullptr, page, 0, 10.0, 10.0);
354 FORM_OnMouseMove(form_handle(), nullptr, 0, 10.0, 10.0);
355
356 UnloadPage(page);
357}
Lei Zhang79e893a2015-11-04 16:02:47 -0800358
Tom Sepez4d071792016-02-04 16:53:26 -0800359#ifdef PDF_ENABLE_V8
Lei Zhang79e893a2015-11-04 16:02:47 -0800360TEST_F(FPDFFormFillEmbeddertest, BUG_551248) {
tsepez8e120292016-08-03 14:03:35 -0700361 // Test that timers fire once and intervals fire repeatedly.
Lei Zhang79e893a2015-11-04 16:02:47 -0800362 EmbedderTestTimerHandlingDelegate delegate;
363 SetDelegate(&delegate);
364
Wei Li091f7a02015-11-09 12:09:55 -0800365 EXPECT_TRUE(OpenDocument("bug_551248.pdf"));
Lei Zhang79e893a2015-11-04 16:02:47 -0800366 FPDF_PAGE page = LoadPage(0);
tsepez8e120292016-08-03 14:03:35 -0700367 EXPECT_TRUE(page);
368 DoOpenActions();
369
370 const auto& alerts = delegate.GetAlerts();
371 EXPECT_EQ(0U, alerts.size());
372
373 delegate.AdvanceTime(1000);
374 EXPECT_EQ(0U, alerts.size()); // nothing fired.
375 delegate.AdvanceTime(1000);
376 EXPECT_EQ(1U, alerts.size()); // interval fired.
377 delegate.AdvanceTime(1000);
378 EXPECT_EQ(2U, alerts.size()); // timer fired.
379 delegate.AdvanceTime(1000);
380 EXPECT_EQ(3U, alerts.size()); // interval fired again.
381 delegate.AdvanceTime(1000);
382 EXPECT_EQ(3U, alerts.size()); // nothing fired.
383 delegate.AdvanceTime(1000);
384 EXPECT_EQ(4U, alerts.size()); // interval fired again.
385 delegate.AdvanceTime(1000);
386 EXPECT_EQ(4U, alerts.size()); // nothing fired.
387 UnloadPage(page);
388
389 ASSERT_EQ(4U, alerts.size()); // nothing else fired.
390
391 EXPECT_STREQ(L"interval fired", alerts[0].message.c_str());
392 EXPECT_STREQ(L"Alert", alerts[0].title.c_str());
393 EXPECT_EQ(0, alerts[0].type);
394 EXPECT_EQ(0, alerts[0].icon);
395
396 EXPECT_STREQ(L"timer fired", alerts[1].message.c_str());
397 EXPECT_STREQ(L"Alert", alerts[1].title.c_str());
398 EXPECT_EQ(0, alerts[1].type);
399 EXPECT_EQ(0, alerts[1].icon);
400
401 EXPECT_STREQ(L"interval fired", alerts[2].message.c_str());
402 EXPECT_STREQ(L"Alert", alerts[2].title.c_str());
403 EXPECT_EQ(0, alerts[2].type);
404 EXPECT_EQ(0, alerts[2].icon);
405
406 EXPECT_STREQ(L"interval fired", alerts[3].message.c_str());
407 EXPECT_STREQ(L"Alert", alerts[3].title.c_str());
408 EXPECT_EQ(0, alerts[3].type);
409 EXPECT_EQ(0, alerts[3].icon);
410}
411
412TEST_F(FPDFFormFillEmbeddertest, BUG_620428) {
413 // Test that timers and intervals are cancelable.
414 EmbedderTestTimerHandlingDelegate delegate;
415 SetDelegate(&delegate);
416
417 EXPECT_TRUE(OpenDocument("bug_620428.pdf"));
418 FPDF_PAGE page = LoadPage(0);
419 EXPECT_TRUE(page);
Lei Zhang79e893a2015-11-04 16:02:47 -0800420 DoOpenActions();
421 delegate.AdvanceTime(5000);
422 UnloadPage(page);
423
424 const auto& alerts = delegate.GetAlerts();
tsepez0fa54b82016-08-04 12:07:28 -0700425 ASSERT_EQ(1U, alerts.size());
426 EXPECT_STREQ(L"done", alerts[0].message.c_str());
Lei Zhang79e893a2015-11-04 16:02:47 -0800427}
tsepez8e120292016-08-03 14:03:35 -0700428
tsepez32e693f2016-08-04 12:47:42 -0700429TEST_F(FPDFFormFillEmbeddertest, BUG_634394) {
430 // Cancel timer inside timer callback.
431 EmbedderTestTimerHandlingDelegate delegate;
432 SetDelegate(&delegate);
433
434 EXPECT_TRUE(OpenDocument("bug_634394.pdf"));
435 FPDF_PAGE page = LoadPage(0);
436 EXPECT_TRUE(page);
437 DoOpenActions();
438
439 // Timers fire at most once per AdvanceTime(), allow intervals
440 // to fire several times if possible.
441 delegate.AdvanceTime(1000);
442 delegate.AdvanceTime(1000);
443 delegate.AdvanceTime(1000);
444 delegate.AdvanceTime(1000);
445 delegate.AdvanceTime(1000);
446 UnloadPage(page);
447
448 const auto& alerts = delegate.GetAlerts();
449 EXPECT_EQ(2U, alerts.size());
450}
451
tsepez8ca63de2016-08-05 17:12:27 -0700452TEST_F(FPDFFormFillEmbeddertest, BUG_634716) {
453 EmbedderTestTimerHandlingDelegate delegate;
454 SetDelegate(&delegate);
455
456 EXPECT_TRUE(OpenDocument("bug_634716.pdf"));
457 FPDF_PAGE page = LoadPage(0);
458 EXPECT_TRUE(page);
459 DoOpenActions();
460
461 // Timers fire at most once per AdvanceTime(), allow intervals
462 // to fire several times if possible.
463 delegate.AdvanceTime(1000);
464 delegate.AdvanceTime(1000);
465 delegate.AdvanceTime(1000);
466 delegate.AdvanceTime(1000);
467 delegate.AdvanceTime(1000);
468 UnloadPage(page);
469
470 const auto& alerts = delegate.GetAlerts();
471 EXPECT_EQ(2U, alerts.size());
472}
473
tsepez6cf5eca2017-01-12 11:21:12 -0800474TEST_F(FPDFFormFillEmbeddertest, BUG_679649) {
475 EmbedderTestTimerHandlingDelegate delegate;
476 SetDelegate(&delegate);
477
478 EXPECT_TRUE(OpenDocument("bug_679649.pdf"));
479 FPDF_PAGE page = LoadPage(0);
480 EXPECT_TRUE(page);
481
482 delegate.SetFailNextTimer();
483 DoOpenActions();
484 delegate.AdvanceTime(2000);
485 UnloadPage(page);
486
487 const auto& alerts = delegate.GetAlerts();
488 EXPECT_EQ(0u, alerts.size());
489}
490
Tom Sepezfb7021c2017-05-31 10:29:25 -0700491TEST_F(FPDFFormFillEmbeddertest, BUG_707673) {
492 EmbedderTestTimerHandlingDelegate delegate;
493 SetDelegate(&delegate);
494
495 EXPECT_TRUE(OpenDocument("bug_707673.pdf"));
496 FPDF_PAGE page = LoadPage(0);
497 EXPECT_TRUE(page);
498
499 DoOpenActions();
500 FORM_OnLButtonDown(form_handle(), page, 0, 140, 590);
501 FORM_OnLButtonUp(form_handle(), page, 0, 140, 590);
502 delegate.AdvanceTime(1000);
503 UnloadPage(page);
504
505 const auto& alerts = delegate.GetAlerts();
506 EXPECT_EQ(0u, alerts.size());
507}
508
Tom Sepezb1f92052017-09-14 17:03:12 -0700509TEST_F(FPDFFormFillEmbeddertest, BUG_765384) {
510 EXPECT_TRUE(OpenDocument("bug_765384.pdf"));
511 FPDF_PAGE page = LoadPage(0);
512 EXPECT_TRUE(page);
513
514 DoOpenActions();
515 FORM_OnLButtonDown(form_handle(), page, 0, 140, 590);
516 FORM_OnLButtonUp(form_handle(), page, 0, 140, 590);
517 UnloadPage(page);
518}
519
Tom Sepez4d071792016-02-04 16:53:26 -0800520#endif // PDF_ENABLE_V8
Nicolas Pena742977f2017-04-13 15:28:20 -0400521
522TEST_F(FPDFFormFillEmbeddertest, FormText) {
523#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
524 const char md5_1[] = "5f11dbe575fe197a37c3fb422559f8ff";
525 const char md5_2[] = "35b1a4b679eafc749a0b6fda750c0e8d";
526 const char md5_3[] = "65c64a7c355388f719a752aa1e23f6fe";
527#else
Nicolas Pena00c3cfd2017-07-10 17:29:54 -0400528 const char md5_1[] = "a5e3ac74c2ee123ec6710e2f0ef8424a";
529 const char md5_2[] = "4526b09382e144d5506ad92149399de6";
530 const char md5_3[] = "80356067d860088864cf50ff85d8459e";
Nicolas Pena742977f2017-04-13 15:28:20 -0400531#endif
532 {
533 EXPECT_TRUE(OpenDocument("text_form.pdf"));
534 FPDF_PAGE page = LoadPage(0);
535 ASSERT_TRUE(page);
536 std::unique_ptr<void, FPDFBitmapDeleter> bitmap1(RenderPage(page));
537 CompareBitmap(bitmap1.get(), 300, 300, md5_1);
538
539 // Click on the textfield
540 EXPECT_EQ(FPDF_FORMFIELD_TEXTFIELD,
541 FPDFPage_HasFormFieldAtPoint(form_handle(), page, 120.0, 120.0));
542 FORM_OnMouseMove(form_handle(), page, 0, 120.0, 120.0);
543 FORM_OnLButtonDown(form_handle(), page, 0, 120.0, 120.0);
544 FORM_OnLButtonUp(form_handle(), page, 0, 120.0, 120.0);
545
546 // Write "ABC"
547 FORM_OnChar(form_handle(), page, 65, 0);
548 FORM_OnChar(form_handle(), page, 66, 0);
549 FORM_OnChar(form_handle(), page, 67, 0);
550 std::unique_ptr<void, FPDFBitmapDeleter> bitmap2(RenderPage(page));
551 CompareBitmap(bitmap2.get(), 300, 300, md5_2);
552
553 // Take out focus by clicking out of the textfield
554 FORM_OnMouseMove(form_handle(), page, 0, 15.0, 15.0);
555 FORM_OnLButtonDown(form_handle(), page, 0, 15.0, 15.0);
556 FORM_OnLButtonUp(form_handle(), page, 0, 15.0, 15.0);
557 std::unique_ptr<void, FPDFBitmapDeleter> bitmap3(RenderPage(page));
558 CompareBitmap(bitmap3.get(), 300, 300, md5_3);
559
560 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
561
Nicolas Pena3ff54002017-07-05 11:55:35 -0400562 // Close page
Nicolas Pena742977f2017-04-13 15:28:20 -0400563 UnloadPage(page);
Nicolas Pena742977f2017-04-13 15:28:20 -0400564 }
565 // Check saved document
Nicolas Pena3ff54002017-07-05 11:55:35 -0400566 TestAndCloseSaved(300, 300, md5_3);
Nicolas Pena742977f2017-04-13 15:28:20 -0400567}
Diana Gagedce2d722017-06-20 11:17:11 -0700568
Lei Zhang839692f2017-08-25 23:23:57 -0700569TEST_F(FPDFFormFillTextFormEmbeddertest, GetSelectedTextEmptyAndBasicKeyboard) {
Diana Gagedce2d722017-06-20 11:17:11 -0700570 // Test empty selection.
Lei Zhang839692f2017-08-25 23:23:57 -0700571 CheckSelection(L"");
Diana Gagedce2d722017-06-20 11:17:11 -0700572
573 // Test basic selection.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700574 TypeTextIntoTextField(3, RegularFormBegin());
575 SelectTextWithKeyboard(3, FWL_VKEY_Left, RegularFormAtX(123.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700576 CheckSelection(L"ABC");
Diana Gagedce2d722017-06-20 11:17:11 -0700577}
578
Lei Zhang839692f2017-08-25 23:23:57 -0700579TEST_F(FPDFFormFillTextFormEmbeddertest, GetSelectedTextEmptyAndBasicMouse) {
Diana Gagedce2d722017-06-20 11:17:11 -0700580 // Test empty selection.
Lei Zhang839692f2017-08-25 23:23:57 -0700581 CheckSelection(L"");
Diana Gagedce2d722017-06-20 11:17:11 -0700582
583 // Test basic selection.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700584 TypeTextIntoTextField(3, RegularFormBegin());
585 SelectTextWithMouse(RegularFormAtX(125.0), RegularFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700586 CheckSelection(L"ABC");
Diana Gagedce2d722017-06-20 11:17:11 -0700587}
588
Lei Zhang839692f2017-08-25 23:23:57 -0700589TEST_F(FPDFFormFillTextFormEmbeddertest, GetSelectedTextFragmentsKeyBoard) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700590 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gagedce2d722017-06-20 11:17:11 -0700591
592 // Test selecting first character in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700593 SelectTextWithKeyboard(1, FWL_VKEY_Right, RegularFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700594 CheckSelection(L"A");
Diana Gagedce2d722017-06-20 11:17:11 -0700595
596 // Test selecting entire long string in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700597 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700598 CheckSelection(L"ABCDEFGHIJKL");
Diana Gagedce2d722017-06-20 11:17:11 -0700599
600 // Test selecting middle section in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700601 SelectTextWithKeyboard(6, FWL_VKEY_Left, RegularFormAtX(170.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700602 CheckSelection(L"DEFGHI");
Diana Gagedce2d722017-06-20 11:17:11 -0700603
604 // Test selecting middle selection in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700605 SelectTextWithKeyboard(6, FWL_VKEY_Right, RegularFormAtX(125.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700606 CheckSelection(L"DEFGHI");
Diana Gagedce2d722017-06-20 11:17:11 -0700607
608 // Test selecting last character in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700609 SelectTextWithKeyboard(1, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700610 CheckSelection(L"L");
Diana Gagedce2d722017-06-20 11:17:11 -0700611}
612
Lei Zhang839692f2017-08-25 23:23:57 -0700613TEST_F(FPDFFormFillTextFormEmbeddertest, GetSelectedTextFragmentsMouse) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700614 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gagedce2d722017-06-20 11:17:11 -0700615
616 // Test selecting first character in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700617 SelectTextWithMouse(RegularFormBegin(), RegularFormAtX(106.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700618 CheckSelection(L"A");
Diana Gagedce2d722017-06-20 11:17:11 -0700619
620 // Test selecting entire long string in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700621 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700622 CheckSelection(L"ABCDEFGHIJKL");
Diana Gagedce2d722017-06-20 11:17:11 -0700623
624 // Test selecting middle section in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700625 SelectTextWithMouse(RegularFormAtX(170.0), RegularFormAtX(125.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700626 CheckSelection(L"DEFGHI");
Diana Gagedce2d722017-06-20 11:17:11 -0700627
628 // Test selecting middle selection in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700629 SelectTextWithMouse(RegularFormAtX(125.0), RegularFormAtX(170.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700630 CheckSelection(L"DEFGHI");
Diana Gagedce2d722017-06-20 11:17:11 -0700631
632 // Test selecting last character in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700633 SelectTextWithMouse(RegularFormEnd(), RegularFormAtX(186.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700634 CheckSelection(L"L");
Diana Gagedce2d722017-06-20 11:17:11 -0700635}
Diana Gagecb50b5f2017-06-29 09:54:19 -0700636
Lei Zhang839692f2017-08-25 23:23:57 -0700637TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
638 GetSelectedTextEmptyAndBasicNormalComboBox) {
Diana Gagecb50b5f2017-06-29 09:54:19 -0700639 // Test empty selection.
Lei Zhang839692f2017-08-25 23:23:57 -0700640 CheckSelection(L"");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700641
642 // Non-editable comboboxes don't allow selection with keyboard.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700643 SelectTextWithMouse(NonEditableFormBegin(), NonEditableFormAtX(142.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700644 CheckSelection(L"Banana");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700645
646 // Select other another provided option.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700647 SelectNonEditableFormOption(0);
Lei Zhang839692f2017-08-25 23:23:57 -0700648 CheckSelection(L"Apple");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700649}
650
Lei Zhang839692f2017-08-25 23:23:57 -0700651TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gagecb50b5f2017-06-29 09:54:19 -0700652 GetSelectedTextEmptyAndBasicEditableComboBoxKeyboard) {
Diana Gagecb50b5f2017-06-29 09:54:19 -0700653 // Test empty selection.
Lei Zhang839692f2017-08-25 23:23:57 -0700654 CheckSelection(L"");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700655
656 // Test basic selection of text within user editable combobox using keyboard.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700657 TypeTextIntoTextField(3, EditableFormBegin());
658 SelectTextWithKeyboard(3, FWL_VKEY_Left, EditableFormAtX(128.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700659 CheckSelection(L"ABC");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700660
661 // Select a provided option.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700662 SelectEditableFormOption(1);
Lei Zhang839692f2017-08-25 23:23:57 -0700663 CheckSelection(L"Bar");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700664}
665
Lei Zhang839692f2017-08-25 23:23:57 -0700666TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gagecb50b5f2017-06-29 09:54:19 -0700667 GetSelectedTextEmptyAndBasicEditableComboBoxMouse) {
Diana Gagecb50b5f2017-06-29 09:54:19 -0700668 // Test empty selection.
Lei Zhang839692f2017-08-25 23:23:57 -0700669 CheckSelection(L"");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700670
671 // Test basic selection of text within user editable combobox using mouse.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700672 TypeTextIntoTextField(3, EditableFormBegin());
673 SelectTextWithMouse(EditableFormAtX(128.0), EditableFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700674 CheckSelection(L"ABC");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700675
676 // Select a provided option.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700677 SelectEditableFormOption(2);
Lei Zhang839692f2017-08-25 23:23:57 -0700678 CheckSelection(L"Qux");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700679}
680
Lei Zhang839692f2017-08-25 23:23:57 -0700681TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
682 GetSelectedTextFragmentsNormalComboBox) {
Diana Gagecb50b5f2017-06-29 09:54:19 -0700683 // Test selecting first character in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700684 SelectTextWithMouse(NonEditableFormBegin(), NonEditableFormAtX(107.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700685 CheckSelection(L"B");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700686
687 // Test selecting entire string in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700688 SelectTextWithMouse(NonEditableFormAtX(142.0), NonEditableFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700689 CheckSelection(L"Banana");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700690
691 // Test selecting middle section in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700692 SelectTextWithMouse(NonEditableFormAtX(135.0), NonEditableFormAtX(117.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700693 CheckSelection(L"nan");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700694
695 // Test selecting middle section in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700696 SelectTextWithMouse(NonEditableFormAtX(117.0), NonEditableFormAtX(135.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700697 CheckSelection(L"nan");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700698
699 // Test selecting last character in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700700 SelectTextWithMouse(NonEditableFormAtX(142.0), NonEditableFormAtX(138.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700701 CheckSelection(L"a");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700702
703 // Select another option and then reset selection as first three chars.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700704 SelectNonEditableFormOption(2);
Lei Zhang839692f2017-08-25 23:23:57 -0700705 CheckSelection(L"Cherry");
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700706 SelectTextWithMouse(NonEditableFormBegin(), NonEditableFormAtX(122.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700707 CheckSelection(L"Che");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700708}
709
Lei Zhang839692f2017-08-25 23:23:57 -0700710TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gagecb50b5f2017-06-29 09:54:19 -0700711 GetSelectedTextFragmentsEditableComboBoxKeyboard) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700712 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gagecb50b5f2017-06-29 09:54:19 -0700713
714 // Test selecting first character in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700715 SelectTextWithKeyboard(1, FWL_VKEY_Right, EditableFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700716 CheckSelection(L"A");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700717
718 // Test selecting entire long string in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700719 SelectTextWithKeyboard(10, FWL_VKEY_Left, EditableFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700720 CheckSelection(L"ABCDEFGHIJ");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700721
722 // Test selecting middle section in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700723 SelectTextWithKeyboard(5, FWL_VKEY_Left, EditableFormAtX(168.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700724 CheckSelection(L"DEFGH");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700725
726 // Test selecting middle selection in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700727 SelectTextWithKeyboard(5, FWL_VKEY_Right, EditableFormAtX(127.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700728 CheckSelection(L"DEFGH");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700729
730 // Test selecting last character in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700731 SelectTextWithKeyboard(1, FWL_VKEY_Left, EditableFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700732 CheckSelection(L"J");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700733
734 // Select a provided option and then reset selection as first two chars.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700735 SelectEditableFormOption(0);
Lei Zhang839692f2017-08-25 23:23:57 -0700736 CheckSelection(L"Foo");
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700737 SelectTextWithKeyboard(2, FWL_VKEY_Right, EditableFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700738 CheckSelection(L"Fo");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700739}
740
Lei Zhang839692f2017-08-25 23:23:57 -0700741TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gagecb50b5f2017-06-29 09:54:19 -0700742 GetSelectedTextFragmentsEditableComboBoxMouse) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700743 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gagecb50b5f2017-06-29 09:54:19 -0700744
745 // Test selecting first character in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700746 SelectTextWithMouse(EditableFormBegin(), EditableFormAtX(107.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700747 CheckSelection(L"A");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700748
749 // Test selecting entire long string in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700750 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700751 CheckSelection(L"ABCDEFGHIJ");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700752
753 // Test selecting middle section in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700754 SelectTextWithMouse(EditableFormAtX(168.0), EditableFormAtX(127.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700755 CheckSelection(L"DEFGH");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700756
757 // Test selecting middle selection in forward direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700758 SelectTextWithMouse(EditableFormAtX(127.0), EditableFormAtX(168.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700759 CheckSelection(L"DEFGH");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700760
761 // Test selecting last character in backwards direction.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700762 SelectTextWithMouse(EditableFormEnd(), EditableFormAtX(174.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700763 CheckSelection(L"J");
Diana Gagecb50b5f2017-06-29 09:54:19 -0700764}
Diana Gage1c7f1422017-07-24 11:19:52 -0700765
Lei Zhang839692f2017-08-25 23:23:57 -0700766TEST_F(FPDFFormFillTextFormEmbeddertest, DeleteTextFieldEntireSelection) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700767 // Select entire contents of text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700768 TypeTextIntoTextField(12, RegularFormBegin());
769 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700770 CheckSelection(L"ABCDEFGHIJKL");
Diana Gage1c7f1422017-07-24 11:19:52 -0700771
772 // Test deleting current text selection. Select what remains after deletion to
773 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700774 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Diana Gageab390972017-07-28 17:07:39 -0700775
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700776 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700777 CheckSelection(L"");
Diana Gage1c7f1422017-07-24 11:19:52 -0700778}
779
Lei Zhang839692f2017-08-25 23:23:57 -0700780TEST_F(FPDFFormFillTextFormEmbeddertest, DeleteTextFieldSelectionMiddle) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700781 // Select middle section of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700782 TypeTextIntoTextField(12, RegularFormBegin());
783 SelectTextWithMouse(RegularFormAtX(170.0), RegularFormAtX(125.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700784 CheckSelection(L"DEFGHI");
Diana Gage1c7f1422017-07-24 11:19:52 -0700785
786 // Test deleting current text selection. Select what remains after deletion to
787 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700788 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700789 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700790 CheckSelection(L"ABCJKL");
Diana Gage1c7f1422017-07-24 11:19:52 -0700791}
792
Lei Zhang839692f2017-08-25 23:23:57 -0700793TEST_F(FPDFFormFillTextFormEmbeddertest, DeleteTextFieldSelectionLeft) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700794 // Select first few characters of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700795 TypeTextIntoTextField(12, RegularFormBegin());
796 SelectTextWithMouse(RegularFormBegin(), RegularFormAtX(132.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700797 CheckSelection(L"ABCD");
Diana Gage1c7f1422017-07-24 11:19:52 -0700798
799 // Test deleting current text selection. Select what remains after deletion to
800 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700801 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700802 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700803 CheckSelection(L"EFGHIJKL");
Diana Gage1c7f1422017-07-24 11:19:52 -0700804}
805
Lei Zhang839692f2017-08-25 23:23:57 -0700806TEST_F(FPDFFormFillTextFormEmbeddertest, DeleteTextFieldSelectionRight) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700807 // Select last few characters of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700808 TypeTextIntoTextField(12, RegularFormBegin());
809 SelectTextWithMouse(RegularFormEnd(), RegularFormAtX(165.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700810 CheckSelection(L"IJKL");
Diana Gage1c7f1422017-07-24 11:19:52 -0700811
812 // Test deleting current text selection. Select what remains after deletion to
813 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700814 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700815 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700816 CheckSelection(L"ABCDEFGH");
Diana Gage1c7f1422017-07-24 11:19:52 -0700817}
818
Lei Zhang839692f2017-08-25 23:23:57 -0700819TEST_F(FPDFFormFillTextFormEmbeddertest, DeleteEmptyTextFieldSelection) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700820 // Do not select text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700821 TypeTextIntoTextField(12, RegularFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700822 CheckSelection(L"");
Diana Gage1c7f1422017-07-24 11:19:52 -0700823
824 // Test that attempt to delete empty text selection has no effect.
Lei Zhang839692f2017-08-25 23:23:57 -0700825 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700826 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700827 CheckSelection(L"ABCDEFGHIJKL");
Diana Gage1c7f1422017-07-24 11:19:52 -0700828}
829
Lei Zhang839692f2017-08-25 23:23:57 -0700830TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
831 DeleteEditableComboBoxEntireSelection) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700832 // Select entire contents of user-editable combobox text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700833 TypeTextIntoTextField(10, EditableFormBegin());
834 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700835 CheckSelection(L"ABCDEFGHIJ");
Diana Gage1c7f1422017-07-24 11:19:52 -0700836
837 // Test deleting current text selection. Select what remains after deletion to
838 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700839 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700840 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700841 CheckSelection(L"");
Diana Gage1c7f1422017-07-24 11:19:52 -0700842}
843
Lei Zhang839692f2017-08-25 23:23:57 -0700844TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
845 DeleteEditableComboBoxSelectionMiddle) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700846 // Select middle section of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700847 TypeTextIntoTextField(10, EditableFormBegin());
848 SelectTextWithMouse(EditableFormAtX(168.0), EditableFormAtX(127.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700849 CheckSelection(L"DEFGH");
Diana Gage1c7f1422017-07-24 11:19:52 -0700850
851 // Test deleting current text selection. Select what remains after deletion to
852 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700853 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700854 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700855 CheckSelection(L"ABCIJ");
Diana Gage1c7f1422017-07-24 11:19:52 -0700856}
857
Lei Zhang839692f2017-08-25 23:23:57 -0700858TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
859 DeleteEditableComboBoxSelectionLeft) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700860 // Select first few characters of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700861 TypeTextIntoTextField(10, EditableFormBegin());
862 SelectTextWithMouse(EditableFormBegin(), EditableFormAtX(132.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700863 CheckSelection(L"ABCD");
Diana Gage1c7f1422017-07-24 11:19:52 -0700864
865 // Test deleting current text selection. Select what remains after deletion to
866 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700867 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700868 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700869 CheckSelection(L"EFGHIJ");
Diana Gage1c7f1422017-07-24 11:19:52 -0700870}
871
Lei Zhang839692f2017-08-25 23:23:57 -0700872TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
873 DeleteEditableComboBoxSelectionRight) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700874 // Select last few characters of text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700875 TypeTextIntoTextField(10, EditableFormBegin());
876 SelectTextWithMouse(EditableFormEnd(), EditableFormAtX(152.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700877 CheckSelection(L"GHIJ");
Diana Gage1c7f1422017-07-24 11:19:52 -0700878
879 // Test deleting current text selection. Select what remains after deletion to
880 // check that remaining text is as expected.
Lei Zhang839692f2017-08-25 23:23:57 -0700881 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700882 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700883 CheckSelection(L"ABCDEF");
Diana Gage1c7f1422017-07-24 11:19:52 -0700884}
885
Lei Zhang839692f2017-08-25 23:23:57 -0700886TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
887 DeleteEmptyEditableComboBoxSelection) {
Diana Gage1c7f1422017-07-24 11:19:52 -0700888 // Do not select text.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700889 TypeTextIntoTextField(10, EditableFormBegin());
Lei Zhang839692f2017-08-25 23:23:57 -0700890 CheckSelection(L"");
Diana Gage1c7f1422017-07-24 11:19:52 -0700891
892 // Test that attempt to delete empty text selection has no effect.
Lei Zhang839692f2017-08-25 23:23:57 -0700893 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700894 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700895 CheckSelection(L"ABCDEFGHIJ");
Diana Gage1c7f1422017-07-24 11:19:52 -0700896}
Diana Gageab390972017-07-28 17:07:39 -0700897
Lei Zhang839692f2017-08-25 23:23:57 -0700898TEST_F(FPDFFormFillTextFormEmbeddertest, InsertTextInEmptyTextField) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700899 ClickOnFormFieldAtPoint(RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700900
901 // Test inserting text into empty text field.
902 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
903 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700904 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700905
906 // Select entire contents of text field to check that insertion worked
907 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700908 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700909 CheckSelection(L"Hello");
Diana Gageab390972017-07-28 17:07:39 -0700910}
911
Lei Zhang839692f2017-08-25 23:23:57 -0700912TEST_F(FPDFFormFillTextFormEmbeddertest, InsertTextInPopulatedTextFieldLeft) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700913 TypeTextIntoTextField(8, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700914
915 // Click on the leftmost part of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700916 ClickOnFormFieldAtPoint(RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700917
918 // Test inserting text in front of existing text in text field.
919 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
920 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700921 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700922
923 // Select entire contents of text field to check that insertion worked
924 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700925 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700926 CheckSelection(L"HelloABCDEFGH");
Diana Gageab390972017-07-28 17:07:39 -0700927}
928
Lei Zhang839692f2017-08-25 23:23:57 -0700929TEST_F(FPDFFormFillTextFormEmbeddertest, InsertTextInPopulatedTextFieldMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700930 TypeTextIntoTextField(8, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700931
932 // Click on the middle of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700933 ClickOnFormFieldAtPoint(RegularFormAtX(134.0));
Diana Gageab390972017-07-28 17:07:39 -0700934
935 // Test inserting text in the middle of existing text in text field.
936 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
937 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700938 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700939
940 // Select entire contents of text field to check that insertion worked
941 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700942 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700943 CheckSelection(L"ABCDHelloEFGH");
Diana Gageab390972017-07-28 17:07:39 -0700944}
945
Lei Zhang839692f2017-08-25 23:23:57 -0700946TEST_F(FPDFFormFillTextFormEmbeddertest, InsertTextInPopulatedTextFieldRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700947 TypeTextIntoTextField(8, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700948
949 // Click on the rightmost part of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700950 ClickOnFormFieldAtPoint(RegularFormAtX(166.0));
Diana Gageab390972017-07-28 17:07:39 -0700951
952 // Test inserting text behind existing text in text field.
953 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
954 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700955 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700956
957 // Select entire contents of text field to check that insertion worked
958 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700959 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700960 CheckSelection(L"ABCDEFGHHello");
Diana Gageab390972017-07-28 17:07:39 -0700961}
962
Lei Zhang839692f2017-08-25 23:23:57 -0700963TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -0700964 InsertTextAndReplaceSelectionInPopulatedTextFieldWhole) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700965 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700966
967 // Select entire string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700968 SelectTextWithKeyboard(12, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -0700969 CheckSelection(L"ABCDEFGHIJKL");
Diana Gageab390972017-07-28 17:07:39 -0700970
971 // Test replacing text selection with text to be inserted.
972 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
973 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700974 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700975
976 // Select entire contents of text field to check that insertion worked
977 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700978 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700979 CheckSelection(L"Hello");
Diana Gageab390972017-07-28 17:07:39 -0700980}
981
Lei Zhang839692f2017-08-25 23:23:57 -0700982TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -0700983 InsertTextAndReplaceSelectionInPopulatedTextFieldLeft) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700984 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -0700985
986 // Select left portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700987 SelectTextWithKeyboard(6, FWL_VKEY_Left, RegularFormAtX(148.0));
Lei Zhang839692f2017-08-25 23:23:57 -0700988 CheckSelection(L"ABCDEF");
Diana Gageab390972017-07-28 17:07:39 -0700989
990 // Test replacing text selection with text to be inserted.
991 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
992 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -0700993 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -0700994
995 // Select entire contents of text field to check that insertion worked
996 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -0700997 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -0700998 CheckSelection(L"HelloGHIJKL");
Diana Gageab390972017-07-28 17:07:39 -0700999}
1000
Lei Zhang839692f2017-08-25 23:23:57 -07001001TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001002 InsertTextAndReplaceSelectionInPopulatedTextFieldMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001003 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001004
1005 // Select middle portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001006 SelectTextWithKeyboard(6, FWL_VKEY_Left, RegularFormAtX(171.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001007 CheckSelection(L"DEFGHI");
Diana Gageab390972017-07-28 17:07:39 -07001008
1009 // Test replacing text selection with text to be inserted.
1010 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1011 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001012 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001013
1014 // Select entire contents of text field to check that insertion worked
1015 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001016 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001017 CheckSelection(L"ABCHelloJKL");
Diana Gageab390972017-07-28 17:07:39 -07001018}
1019
Lei Zhang839692f2017-08-25 23:23:57 -07001020TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001021 InsertTextAndReplaceSelectionInPopulatedTextFieldRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001022 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001023
1024 // Select right portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001025 SelectTextWithKeyboard(6, FWL_VKEY_Left, RegularFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -07001026 CheckSelection(L"GHIJKL");
Diana Gageab390972017-07-28 17:07:39 -07001027
1028 // Test replacing text selection with text to be inserted.
1029 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1030 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001031 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001032
1033 // Select entire contents of text field to check that insertion worked
1034 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001035 SelectAllRegularFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001036 CheckSelection(L"ABCDEFHello");
Diana Gageab390972017-07-28 17:07:39 -07001037}
1038
Lei Zhang839692f2017-08-25 23:23:57 -07001039TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
1040 InsertTextInEmptyEditableComboBox) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001041 ClickOnFormFieldAtPoint(EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001042
1043 // Test inserting text into empty user-editable combobox.
1044 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1045 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001046 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001047
1048 // Select entire contents of user-editable combobox text field to check that
1049 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001050 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001051 CheckSelection(L"Hello");
Diana Gageab390972017-07-28 17:07:39 -07001052}
1053
Lei Zhang839692f2017-08-25 23:23:57 -07001054TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
1055 InsertTextInPopulatedEditableComboBoxLeft) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001056 TypeTextIntoTextField(6, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001057
1058 // Click on the leftmost part of the user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001059 ClickOnFormFieldAtPoint(EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001060
1061 // Test inserting text in front of existing text in user-editable combobox.
1062 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1063 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001064 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001065
1066 // Select entire contents of user-editable combobox text field to check that
1067 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001068 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001069 CheckSelection(L"HelloABCDEF");
Diana Gageab390972017-07-28 17:07:39 -07001070}
1071
Lei Zhang839692f2017-08-25 23:23:57 -07001072TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
1073 InsertTextInPopulatedEditableComboBoxMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001074 TypeTextIntoTextField(6, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001075
1076 // Click on the middle of the user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001077 ClickOnFormFieldAtPoint(EditableFormAtX(126.0));
Diana Gageab390972017-07-28 17:07:39 -07001078
1079 // Test inserting text in the middle of existing text in user-editable
1080 // combobox.
1081 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1082 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001083 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001084
1085 // Select entire contents of user-editable combobox text field to check that
1086 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001087 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001088 CheckSelection(L"ABCHelloDEF");
Diana Gageab390972017-07-28 17:07:39 -07001089}
1090
Lei Zhang839692f2017-08-25 23:23:57 -07001091TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
1092 InsertTextInPopulatedEditableComboBoxRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001093 TypeTextIntoTextField(6, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001094
1095 // Click on the rightmost part of the user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001096 ClickOnFormFieldAtPoint(EditableFormEnd());
Diana Gageab390972017-07-28 17:07:39 -07001097
1098 // Test inserting text behind existing text in user-editable combobox.
1099 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1100 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001101 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001102
1103 // Select entire contents of user-editable combobox text field to check that
1104 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001105 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001106 CheckSelection(L"ABCDEFHello");
Diana Gageab390972017-07-28 17:07:39 -07001107}
1108
Lei Zhang839692f2017-08-25 23:23:57 -07001109TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001110 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxWhole) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001111 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001112
1113 // Select entire string in user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001114 SelectTextWithKeyboard(10, FWL_VKEY_Left, EditableFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -07001115 CheckSelection(L"ABCDEFGHIJ");
Diana Gageab390972017-07-28 17:07:39 -07001116
1117 // Test replacing text selection with text to be inserted.
1118 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1119 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001120 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001121
1122 // Select entire contents of user-editable combobox text field to check that
1123 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001124 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001125 CheckSelection(L"Hello");
Diana Gageab390972017-07-28 17:07:39 -07001126}
1127
Lei Zhang839692f2017-08-25 23:23:57 -07001128TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001129 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxLeft) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001130 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001131
1132 // Select left portion of string in user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001133 SelectTextWithKeyboard(5, FWL_VKEY_Left, EditableFormAtX(142.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001134 CheckSelection(L"ABCDE");
Diana Gageab390972017-07-28 17:07:39 -07001135
1136 // Test replacing text selection with text to be inserted.
1137 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1138 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001139 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001140
1141 // Select entire contents of user-editable combobox text field to check that
1142 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001143 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001144 CheckSelection(L"HelloFGHIJ");
Diana Gageab390972017-07-28 17:07:39 -07001145}
1146
Lei Zhang839692f2017-08-25 23:23:57 -07001147TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001148 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001149 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001150
1151 // Select middle portion of string in user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001152 SelectTextWithKeyboard(5, FWL_VKEY_Left, EditableFormAtX(167.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001153 CheckSelection(L"DEFGH");
Diana Gageab390972017-07-28 17:07:39 -07001154
1155 // Test replacing text selection with text to be inserted.
1156 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1157 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001158 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001159
1160 // Select entire contents of user-editable combobox text field to check that
1161 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001162 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001163 CheckSelection(L"ABCHelloIJ");
Diana Gageab390972017-07-28 17:07:39 -07001164}
1165
Lei Zhang839692f2017-08-25 23:23:57 -07001166TEST_F(FPDFFormFillComboBoxFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001167 InsertTextAndReplaceSelectionInPopulatedEditableComboBoxRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001168 TypeTextIntoTextField(10, EditableFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001169
1170 // Select right portion of string in user-editable combobox.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001171 SelectTextWithKeyboard(5, FWL_VKEY_Left, EditableFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -07001172 CheckSelection(L"FGHIJ");
Diana Gageab390972017-07-28 17:07:39 -07001173
1174 // Test replacing text selection with text to be inserted.
1175 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1176 GetFPDFWideString(L"Hello");
Lei Zhang839692f2017-08-25 23:23:57 -07001177 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001178
1179 // Select entire contents of user-editable combobox text field to check that
1180 // insertion worked as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001181 SelectAllEditableFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001182 CheckSelection(L"ABCDEHello");
Diana Gageab390972017-07-28 17:07:39 -07001183}
1184
Lei Zhang839692f2017-08-25 23:23:57 -07001185TEST_F(FPDFFormFillTextFormEmbeddertest,
1186 InsertTextInEmptyCharLimitTextFieldOverflow) {
Diana Gageab390972017-07-28 17:07:39 -07001187 // Click on the textfield.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001188 ClickOnFormFieldAtPoint(CharLimitFormEnd());
Diana Gageab390972017-07-28 17:07:39 -07001189
1190 // Delete pre-filled contents of text field with char limit.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001191 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001192 CheckSelection(L"Elephant");
1193 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Diana Gageab390972017-07-28 17:07:39 -07001194
1195 // Test inserting text into now empty text field so text to be inserted
1196 // exceeds the char limit and is cut off.
1197 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1198 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001199 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001200
1201 // Select entire contents of text field to check that insertion worked
1202 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001203 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001204 CheckSelection(L"Hippopotam");
Diana Gageab390972017-07-28 17:07:39 -07001205}
1206
Lei Zhang839692f2017-08-25 23:23:57 -07001207TEST_F(FPDFFormFillTextFormEmbeddertest,
1208 InsertTextInEmptyCharLimitTextFieldFit) {
Diana Gageab390972017-07-28 17:07:39 -07001209 // Click on the textfield.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001210 ClickOnFormFieldAtPoint(CharLimitFormEnd());
Diana Gageab390972017-07-28 17:07:39 -07001211
1212 // Delete pre-filled contents of text field with char limit.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001213 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001214 CheckSelection(L"Elephant");
1215 FORM_ReplaceSelection(form_handle(), page(), nullptr);
Diana Gageab390972017-07-28 17:07:39 -07001216
1217 // Test inserting text into now empty text field so text to be inserted
1218 // exceeds the char limit and is cut off.
1219 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1220 GetFPDFWideString(L"Zebra");
Lei Zhang839692f2017-08-25 23:23:57 -07001221 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001222
1223 // Select entire contents of text field to check that insertion worked
1224 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001225 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001226 CheckSelection(L"Zebra");
Diana Gageab390972017-07-28 17:07:39 -07001227}
1228
Lei Zhang839692f2017-08-25 23:23:57 -07001229TEST_F(FPDFFormFillTextFormEmbeddertest,
1230 InsertTextInPopulatedCharLimitTextFieldLeft) {
Diana Gageab390972017-07-28 17:07:39 -07001231 // Click on the leftmost part of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001232 ClickOnFormFieldAtPoint(CharLimitFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001233
1234 // Test inserting text in front of existing text in text field.
1235 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1236 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001237 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001238
1239 // Select entire contents of text field to check that insertion worked
1240 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001241 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001242 CheckSelection(L"HiElephant");
Diana Gageab390972017-07-28 17:07:39 -07001243}
1244
Lei Zhang839692f2017-08-25 23:23:57 -07001245TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001246 InsertTextInPopulatedCharLimitTextFieldMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001247 TypeTextIntoTextField(8, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001248
1249 // Click on the middle of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001250 ClickOnFormFieldAtPoint(CharLimitFormAtX(134.0));
Diana Gageab390972017-07-28 17:07:39 -07001251
1252 // Test inserting text in the middle of existing text in text field.
1253 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1254 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001255 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001256
1257 // Select entire contents of text field to check that insertion worked
1258 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001259 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001260 CheckSelection(L"ElephHiant");
Diana Gageab390972017-07-28 17:07:39 -07001261}
1262
Lei Zhang839692f2017-08-25 23:23:57 -07001263TEST_F(FPDFFormFillTextFormEmbeddertest,
1264 InsertTextInPopulatedCharLimitTextFieldRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001265 TypeTextIntoTextField(8, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001266
1267 // Click on the rightmost part of the text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001268 ClickOnFormFieldAtPoint(CharLimitFormAtX(166.0));
Diana Gageab390972017-07-28 17:07:39 -07001269
1270 // Test inserting text behind existing text in text field.
1271 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1272 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001273 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001274
1275 // Select entire contents of text field to check that insertion worked
1276 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001277 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001278 CheckSelection(L"ElephantHi");
Diana Gageab390972017-07-28 17:07:39 -07001279}
1280
Lei Zhang839692f2017-08-25 23:23:57 -07001281TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001282 InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldWhole) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001283 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001284
1285 // Select entire string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001286 SelectTextWithKeyboard(12, FWL_VKEY_Left, CharLimitFormEnd());
Lei Zhang839692f2017-08-25 23:23:57 -07001287 CheckSelection(L"Elephant");
Diana Gageab390972017-07-28 17:07:39 -07001288
1289 // Test replacing text selection with text to be inserted.
1290 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1291 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001292 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001293
1294 // Select entire contents of text field to check that insertion worked
1295 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001296 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001297 CheckSelection(L"Hippopotam");
Diana Gageab390972017-07-28 17:07:39 -07001298}
1299
Lei Zhang839692f2017-08-25 23:23:57 -07001300TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001301 InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldLeft) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001302 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001303
1304 // Select left portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001305 SelectTextWithKeyboard(4, FWL_VKEY_Left, CharLimitFormAtX(122.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001306 CheckSelection(L"Elep");
Diana Gageab390972017-07-28 17:07:39 -07001307
1308 // Test replacing text selection with text to be inserted.
1309 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1310 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001311 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001312
1313 // Select entire contents of text field to check that insertion worked
1314 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001315 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001316 CheckSelection(L"Hippophant");
Diana Gageab390972017-07-28 17:07:39 -07001317}
1318
Lei Zhang839692f2017-08-25 23:23:57 -07001319TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001320 InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldMiddle) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001321 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001322
1323 // Select middle portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001324 SelectTextWithKeyboard(4, FWL_VKEY_Left, CharLimitFormAtX(136.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001325 CheckSelection(L"epha");
Diana Gageab390972017-07-28 17:07:39 -07001326
1327 // Test replacing text selection with text to be inserted.
1328 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1329 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001330 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001331
1332 // Select entire contents of text field to check that insertion worked
1333 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001334 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001335 CheckSelection(L"ElHippopnt");
Diana Gageab390972017-07-28 17:07:39 -07001336}
1337
Lei Zhang839692f2017-08-25 23:23:57 -07001338TEST_F(FPDFFormFillTextFormEmbeddertest,
Diana Gageab390972017-07-28 17:07:39 -07001339 InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldRight) {
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001340 TypeTextIntoTextField(12, RegularFormBegin());
Diana Gageab390972017-07-28 17:07:39 -07001341
1342 // Select right portion of string in text field.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001343 SelectTextWithKeyboard(4, FWL_VKEY_Left, CharLimitFormAtX(152.0));
Lei Zhang839692f2017-08-25 23:23:57 -07001344 CheckSelection(L"hant");
Diana Gageab390972017-07-28 17:07:39 -07001345
1346 // Test replacing text selection with text to be inserted.
1347 std::unique_ptr<unsigned short, pdfium::FreeDeleter> text_to_insert =
1348 GetFPDFWideString(L"Hippopotamus");
Lei Zhang839692f2017-08-25 23:23:57 -07001349 FORM_ReplaceSelection(form_handle(), page(), text_to_insert.get());
Diana Gageab390972017-07-28 17:07:39 -07001350
1351 // Select entire contents of text field to check that insertion worked
1352 // as expected.
Lei Zhang31f7e4b2017-08-26 01:34:42 -07001353 SelectAllCharLimitFormTextWithMouse();
Lei Zhang839692f2017-08-25 23:23:57 -07001354 CheckSelection(L"ElepHippop");
Diana Gageab390972017-07-28 17:07:39 -07001355}