xref: /aosp_15_r20/external/pdfium/fxjs/cjs_publicmethods_embeddertest.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2015 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #include <math.h>
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_string.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_event_context.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_publicmethods.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "testing/external_engine_embedder_test.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-container.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-context.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-isolate.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-local-handle.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-value.h"
20*3ac0a46fSAndroid Build Coastguard Worker 
21*3ac0a46fSAndroid Build Coastguard Worker namespace {
22*3ac0a46fSAndroid Build Coastguard Worker 
RoundDownDate(double date)23*3ac0a46fSAndroid Build Coastguard Worker double RoundDownDate(double date) {
24*3ac0a46fSAndroid Build Coastguard Worker   return date - fmod(date, 86400000);
25*3ac0a46fSAndroid Build Coastguard Worker }
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
28*3ac0a46fSAndroid Build Coastguard Worker 
29*3ac0a46fSAndroid Build Coastguard Worker class CJS_PublicMethodsEmbedderTest : public ExternalEngineEmbedderTest {};
30*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(CJS_PublicMethodsEmbedderTest,ParseDateUsingFormat)31*3ac0a46fSAndroid Build Coastguard Worker TEST_F(CJS_PublicMethodsEmbedderTest, ParseDateUsingFormat) {
32*3ac0a46fSAndroid Build Coastguard Worker   v8::Isolate::Scope isolate_scope(isolate());
33*3ac0a46fSAndroid Build Coastguard Worker   v8::HandleScope handle_scope(isolate());
34*3ac0a46fSAndroid Build Coastguard Worker   v8::Context::Scope context_scope(GetV8Context());
35*3ac0a46fSAndroid Build Coastguard Worker   bool bWrongFormat;
36*3ac0a46fSAndroid Build Coastguard Worker   double date;
37*3ac0a46fSAndroid Build Coastguard Worker 
38*3ac0a46fSAndroid Build Coastguard Worker   // 1968
39*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
40*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"06/25/1968",
41*3ac0a46fSAndroid Build Coastguard Worker                                                  L"mm/dd/yyyy", &bWrongFormat);
42*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
43*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(-47865600000, date);
44*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
45*3ac0a46fSAndroid Build Coastguard Worker 
46*3ac0a46fSAndroid Build Coastguard Worker   // 1968
47*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
48*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"25061968",
49*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyyyy", &bWrongFormat);
50*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
51*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(-47865600000, date);
52*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
53*3ac0a46fSAndroid Build Coastguard Worker 
54*3ac0a46fSAndroid Build Coastguard Worker   // 1968
55*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
56*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"19680625",
57*3ac0a46fSAndroid Build Coastguard Worker                                                  L"yyyymmdd", &bWrongFormat);
58*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
59*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(-47865600000, date);
60*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
61*3ac0a46fSAndroid Build Coastguard Worker 
62*3ac0a46fSAndroid Build Coastguard Worker   // 1985
63*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
64*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"31121985",
65*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyyyy", &bWrongFormat);
66*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
67*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(504835200000.0, date);
68*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
69*3ac0a46fSAndroid Build Coastguard Worker 
70*3ac0a46fSAndroid Build Coastguard Worker   // 2085, the other '85.
71*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
72*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"311285",
73*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyy", &bWrongFormat);
74*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
75*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(3660595200000.0, date);
76*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
77*3ac0a46fSAndroid Build Coastguard Worker 
78*3ac0a46fSAndroid Build Coastguard Worker   // 1995
79*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
80*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"01021995",
81*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyyyy", &bWrongFormat);
82*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
83*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(791596800000.0, date);
84*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
85*3ac0a46fSAndroid Build Coastguard Worker 
86*3ac0a46fSAndroid Build Coastguard Worker   // 2095, the other '95.
87*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
88*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"010295",
89*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyy", &bWrongFormat);
90*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
91*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(3947356800000.0, date);
92*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
93*3ac0a46fSAndroid Build Coastguard Worker 
94*3ac0a46fSAndroid Build Coastguard Worker   // 2005
95*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
96*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"01022005",
97*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyyyy", &bWrongFormat);
98*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
99*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(1107216000000.0, date);
100*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
101*3ac0a46fSAndroid Build Coastguard Worker 
102*3ac0a46fSAndroid Build Coastguard Worker   // 2005
103*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
104*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"010205",
105*3ac0a46fSAndroid Build Coastguard Worker                                                  L"ddmmyy", &bWrongFormat);
106*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
107*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(1107216000000.0, date);
108*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
109*3ac0a46fSAndroid Build Coastguard Worker 
110*3ac0a46fSAndroid Build Coastguard Worker   // 2005 in a different format. https://crbug.com/436572
111*3ac0a46fSAndroid Build Coastguard Worker   bWrongFormat = false;
112*3ac0a46fSAndroid Build Coastguard Worker   date = CJS_PublicMethods::ParseDateUsingFormat(isolate(), L"050201",
113*3ac0a46fSAndroid Build Coastguard Worker                                                  L"yymmdd", &bWrongFormat);
114*3ac0a46fSAndroid Build Coastguard Worker   date = RoundDownDate(date);
115*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(1107216000000.0, date);
116*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(bWrongFormat);
117*3ac0a46fSAndroid Build Coastguard Worker }
118*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(CJS_PublicMethodsEmbedderTest,PrintDateUsingFormat)119*3ac0a46fSAndroid Build Coastguard Worker TEST_F(CJS_PublicMethodsEmbedderTest, PrintDateUsingFormat) {
120*3ac0a46fSAndroid Build Coastguard Worker   v8::Isolate::Scope isolate_scope(isolate());
121*3ac0a46fSAndroid Build Coastguard Worker   v8::HandleScope handle_scope(isolate());
122*3ac0a46fSAndroid Build Coastguard Worker   v8::Context::Scope context_scope(GetV8Context());
123*3ac0a46fSAndroid Build Coastguard Worker   WideString formatted_date;
124*3ac0a46fSAndroid Build Coastguard Worker 
125*3ac0a46fSAndroid Build Coastguard Worker   // 1968-06-25
126*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
127*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(-47952000000, L"ddmmyy");
128*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"250668", formatted_date.c_str());
129*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
130*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(-47952000000, L"yy/mm/dd");
131*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"68/06/25", formatted_date.c_str());
132*3ac0a46fSAndroid Build Coastguard Worker 
133*3ac0a46fSAndroid Build Coastguard Worker   // 1969-12-31
134*3ac0a46fSAndroid Build Coastguard Worker   formatted_date = CJS_PublicMethods::PrintDateUsingFormat(-0.0001, L"ddmmyy");
135*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"311269", formatted_date.c_str());
136*3ac0a46fSAndroid Build Coastguard Worker   formatted_date = CJS_PublicMethods::PrintDateUsingFormat(-0.0001, L"yy!mmdd");
137*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"69!1231", formatted_date.c_str());
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker   // 1970-01-01
140*3ac0a46fSAndroid Build Coastguard Worker   formatted_date = CJS_PublicMethods::PrintDateUsingFormat(0, L"ddmmyy");
141*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"010170", formatted_date.c_str());
142*3ac0a46fSAndroid Build Coastguard Worker   formatted_date = CJS_PublicMethods::PrintDateUsingFormat(0, L"mm-yyyy-dd");
143*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"01-1970-01", formatted_date.c_str());
144*3ac0a46fSAndroid Build Coastguard Worker 
145*3ac0a46fSAndroid Build Coastguard Worker   // 1985-12-31
146*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
147*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(504835200000.0, L"ddmmyy");
148*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"311285", formatted_date.c_str());
149*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
150*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(504835200000.0, L"yymmdd");
151*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"851231", formatted_date.c_str());
152*3ac0a46fSAndroid Build Coastguard Worker 
153*3ac0a46fSAndroid Build Coastguard Worker   // 1995-02-01
154*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
155*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(791596800000.0, L"ddmmyy");
156*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"010295", formatted_date.c_str());
157*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
158*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(791596800000.0, L"yyyymmdd");
159*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"19950201", formatted_date.c_str());
160*3ac0a46fSAndroid Build Coastguard Worker 
161*3ac0a46fSAndroid Build Coastguard Worker   // 2005-02-01
162*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
163*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(1107216000000.0, L"ddmmyy");
164*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"010205", formatted_date.c_str());
165*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
166*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(1107216000000.0, L"yyyyddmm");
167*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"20050102", formatted_date.c_str());
168*3ac0a46fSAndroid Build Coastguard Worker 
169*3ac0a46fSAndroid Build Coastguard Worker   // 2085-12-31
170*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
171*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(3660595200000.0, L"ddmmyy");
172*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"311285", formatted_date.c_str());
173*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
174*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(3660595200000.0, L"yyyydd");
175*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"208531", formatted_date.c_str());
176*3ac0a46fSAndroid Build Coastguard Worker 
177*3ac0a46fSAndroid Build Coastguard Worker   // 2095-02-01
178*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
179*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(3947356800000.0, L"ddmmyy");
180*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"010295", formatted_date.c_str());
181*3ac0a46fSAndroid Build Coastguard Worker   formatted_date =
182*3ac0a46fSAndroid Build Coastguard Worker       CJS_PublicMethods::PrintDateUsingFormat(3947356800000.0, L"mmddyyyy");
183*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_STREQ(L"02012095", formatted_date.c_str());
184*3ac0a46fSAndroid Build Coastguard Worker }
185*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(CJS_PublicMethodsEmbedderTest,AFSimple_CalculateSum)186*3ac0a46fSAndroid Build Coastguard Worker TEST_F(CJS_PublicMethodsEmbedderTest, AFSimple_CalculateSum) {
187*3ac0a46fSAndroid Build Coastguard Worker   v8::Isolate::Scope isolate_scope(isolate());
188*3ac0a46fSAndroid Build Coastguard Worker   v8::HandleScope handle_scope(isolate());
189*3ac0a46fSAndroid Build Coastguard Worker   v8::Context::Scope context_scope(GetV8Context());
190*3ac0a46fSAndroid Build Coastguard Worker 
191*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(OpenDocument("calculate.pdf"));
192*3ac0a46fSAndroid Build Coastguard Worker   auto* page = LoadPage(0);
193*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(page);
194*3ac0a46fSAndroid Build Coastguard Worker 
195*3ac0a46fSAndroid Build Coastguard Worker   CJS_Runtime runtime(
196*3ac0a46fSAndroid Build Coastguard Worker       CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle()));
197*3ac0a46fSAndroid Build Coastguard Worker   runtime.NewEventContext();
198*3ac0a46fSAndroid Build Coastguard Worker 
199*3ac0a46fSAndroid Build Coastguard Worker   WideString result;
200*3ac0a46fSAndroid Build Coastguard Worker   runtime.GetCurrentEventContext()->SetValueForTest(&result);
201*3ac0a46fSAndroid Build Coastguard Worker 
202*3ac0a46fSAndroid Build Coastguard Worker   auto ary = runtime.NewArray();
203*3ac0a46fSAndroid Build Coastguard Worker   runtime.PutArrayElement(ary, 0, runtime.NewString("Calc1_A"));
204*3ac0a46fSAndroid Build Coastguard Worker   runtime.PutArrayElement(ary, 1, runtime.NewString("Calc1_B"));
205*3ac0a46fSAndroid Build Coastguard Worker 
206*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> params;
207*3ac0a46fSAndroid Build Coastguard Worker   params.push_back(runtime.NewString("SUM"));
208*3ac0a46fSAndroid Build Coastguard Worker   params.push_back(ary);
209*3ac0a46fSAndroid Build Coastguard Worker 
210*3ac0a46fSAndroid Build Coastguard Worker   CJS_Result ret = CJS_PublicMethods::AFSimple_Calculate(&runtime, params);
211*3ac0a46fSAndroid Build Coastguard Worker   UnloadPage(page);
212*3ac0a46fSAndroid Build Coastguard Worker 
213*3ac0a46fSAndroid Build Coastguard Worker   runtime.GetCurrentEventContext()->SetValueForTest(nullptr);
214*3ac0a46fSAndroid Build Coastguard Worker 
215*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(!ret.HasError());
216*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(!ret.HasReturn());
217*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_EQ(L"7", result);
218*3ac0a46fSAndroid Build Coastguard Worker }
219*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(CJS_PublicMethodsEmbedderTest,AFNumber_Keystroke)220*3ac0a46fSAndroid Build Coastguard Worker TEST_F(CJS_PublicMethodsEmbedderTest, AFNumber_Keystroke) {
221*3ac0a46fSAndroid Build Coastguard Worker   v8::Isolate::Scope isolate_scope(isolate());
222*3ac0a46fSAndroid Build Coastguard Worker   v8::HandleScope handle_scope(isolate());
223*3ac0a46fSAndroid Build Coastguard Worker   v8::Context::Scope context_scope(GetV8Context());
224*3ac0a46fSAndroid Build Coastguard Worker 
225*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(OpenDocument("calculate.pdf"));
226*3ac0a46fSAndroid Build Coastguard Worker   auto* page = LoadPage(0);
227*3ac0a46fSAndroid Build Coastguard Worker   ASSERT_TRUE(page);
228*3ac0a46fSAndroid Build Coastguard Worker 
229*3ac0a46fSAndroid Build Coastguard Worker   CJS_Runtime runtime(
230*3ac0a46fSAndroid Build Coastguard Worker       CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle()));
231*3ac0a46fSAndroid Build Coastguard Worker   runtime.NewEventContext();
232*3ac0a46fSAndroid Build Coastguard Worker 
233*3ac0a46fSAndroid Build Coastguard Worker   auto* handler = runtime.GetCurrentEventContext();
234*3ac0a46fSAndroid Build Coastguard Worker 
235*3ac0a46fSAndroid Build Coastguard Worker   bool valid = true;
236*3ac0a46fSAndroid Build Coastguard Worker   WideString result = L"-10";
237*3ac0a46fSAndroid Build Coastguard Worker   WideString change = L"";
238*3ac0a46fSAndroid Build Coastguard Worker 
239*3ac0a46fSAndroid Build Coastguard Worker   handler->SetValueForTest(&result);
240*3ac0a46fSAndroid Build Coastguard Worker   handler->SetRCForTest(&valid);
241*3ac0a46fSAndroid Build Coastguard Worker   handler->SetStrChangeForTest(&change);
242*3ac0a46fSAndroid Build Coastguard Worker 
243*3ac0a46fSAndroid Build Coastguard Worker   handler->ResetWillCommitForTest();
244*3ac0a46fSAndroid Build Coastguard Worker   handler->SetSelStart(0);
245*3ac0a46fSAndroid Build Coastguard Worker   handler->SetSelEnd(0);
246*3ac0a46fSAndroid Build Coastguard Worker 
247*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> params;
248*3ac0a46fSAndroid Build Coastguard Worker   params.push_back(runtime.NewString("-10"));
249*3ac0a46fSAndroid Build Coastguard Worker   params.push_back(runtime.NewString(""));
250*3ac0a46fSAndroid Build Coastguard Worker 
251*3ac0a46fSAndroid Build Coastguard Worker   CJS_Result ret = CJS_PublicMethods::AFNumber_Keystroke(&runtime, params);
252*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(valid);
253*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(!ret.HasError());
254*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_TRUE(!ret.HasReturn());
255*3ac0a46fSAndroid Build Coastguard Worker 
256*3ac0a46fSAndroid Build Coastguard Worker   UnloadPage(page);
257*3ac0a46fSAndroid Build Coastguard Worker 
258*3ac0a46fSAndroid Build Coastguard Worker   // Keep the *SAN bots happy. One of these is an UnownedPtr, another seems to
259*3ac0a46fSAndroid Build Coastguard Worker   // used during destruction. Clear them all to be safe and consistent.
260*3ac0a46fSAndroid Build Coastguard Worker   handler->SetValueForTest(nullptr);
261*3ac0a46fSAndroid Build Coastguard Worker   handler->SetRCForTest(nullptr);
262*3ac0a46fSAndroid Build Coastguard Worker   handler->SetStrChangeForTest(nullptr);
263*3ac0a46fSAndroid Build Coastguard Worker }
264